diff --git a/lang/ru/ru.po b/lang/ru/ru.po index 18045ccd617305d4f618c86d1bc5ae43e91c3548..14b3aa5dd8b52a0d5e0d4baafc1ee6278b5fe18f 100644 --- a/lang/ru/ru.po +++ b/lang/ru/ru.po @@ -8,16 +8,15 @@ msgstr "" "Project-Id-Version: SFLphone 0.9.6\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-12-03 10:22-0500\n" -"PO-Revision-Date: 2009-10-26 20:46+0000\n" -"Last-Translator: Emmanuel Milou <emmanuel.milou@savoirfairelinux.com>\n" +"PO-Revision-Date: 2009-12-08 20:46+0000\n" +"Last-Translator: Hussein Abdallah <hussein.abdallah@savoirfairelinux.com>\n" "Language-Team: Savoir-Faire Linux Inc <sflphoneteam@savoirfairelinux.com>\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-Launchpad-Export-Date: 2009-12-03 15:32+0000\n" -"X-Generator: Launchpad (build Unknown)\n" +"X-Generator: \n" #: ../sflphone-client-gnome/src/accountlist.c:175 msgid "Registered" @@ -29,7 +28,7 @@ msgstr "Не зарегистрирован" #: ../sflphone-client-gnome/src/accountlist.c:181 msgid "Trying..." -msgstr "Пытаюсь..." +msgstr "Подключение..." #: ../sflphone-client-gnome/src/accountlist.c:184 #: ../sflphone-client-gnome/src/sflnotify.c:131 @@ -59,15 +58,15 @@ msgstr "Неверный сервер Stun" #: ../sflphone-client-gnome/src/accountlist.c:202 msgid "Invalid" -msgstr "Неверный" +msgstr "Ошибка" #: ../sflphone-client-gnome/src/actions.c:98 msgid "Using account" -msgstr "Используя учетную запись" +msgstr "Используется учетная запись" #: ../sflphone-client-gnome/src/actions.c:104 msgid "No registered accounts" -msgstr "У вас нет зарегистрированных аккаунтов" +msgstr "Нет зарегистрированных учëтных записей" #: ../sflphone-client-gnome/src/actions.c:285 msgid "" @@ -127,11 +126,11 @@ msgstr "" #: ../sflphone-client-gnome/src/mainwindow.c:73 msgid "There is one call in progress." -msgstr "Звонок ещё не окончен." +msgstr "Один текущий разговор." #: ../sflphone-client-gnome/src/mainwindow.c:77 msgid "There are calls in progress." -msgstr "Несколько звонков ещё не окончены." +msgstr "Несколько текущих разговоров." #: ../sflphone-client-gnome/src/mainwindow.c:86 msgid "Do you still want to quit?" @@ -144,11 +143,11 @@ msgstr "Ошибка SFLphone." #: ../sflphone-client-gnome/src/mainwindow.c:392 #, c-format msgid "ZRTP is not supported by peer %s\n" -msgstr "не поддерживается устройством %s\n" +msgstr "ZRTP не поддерживается устройством %s\n" #: ../sflphone-client-gnome/src/mainwindow.c:393 msgid "Secure Communication Unavailable" -msgstr "Зашифрованная связь недоступна." +msgstr "Зашифрованная связь недоступна" #: ../sflphone-client-gnome/src/mainwindow.c:394 #: ../sflphone-client-gnome/src/mainwindow.c:416 @@ -213,19 +212,19 @@ msgstr[2] "%d голосовые письма" #: ../sflphone-client-gnome/src/sflnotify.c:111 #, c-format msgid "Calling with %s account <i>%s</i>" -msgstr "Звонок с аккаунтом %s <i>%s</i>" +msgstr "Звонок с учëтной записью %s <i>%s</i>" #: ../sflphone-client-gnome/src/sflnotify.c:115 msgid "Current account" -msgstr "Нынешний аккаунт" +msgstr "Нынешняя учëтная запись" #: ../sflphone-client-gnome/src/sflnotify.c:130 msgid "You have no accounts set up" -msgstr "Вы не настроили ни одного аккаунта" +msgstr "Вы не настроили ни одной учëтной записи" #: ../sflphone-client-gnome/src/sflnotify.c:147 msgid "You have no registered accounts" -msgstr "У вас нет зарегистрированных аккаунтов" +msgstr "У вас нет зарегистрированных учëтных записей" #: ../sflphone-client-gnome/src/sflnotify.c:190 #, c-format @@ -271,9 +270,9 @@ msgstr "SFLphone" #, c-format msgid "%i account configured" msgid_plural "%i accounts configured" -msgstr[0] "%i аккаунт настроен." -msgstr[1] "%i аккаунтов настроены" -msgstr[2] "%i аккаунтов настроены" +msgstr[0] "Настроена одна учëтная запись" +msgstr[1] "Настроены %i учëтные записи" +msgstr[2] "Настроены %i учëтные записи" #: ../sflphone-client-gnome/src/toolbar.c:38 #: ../sflphone-client-gnome/src/uimanager.c:693 @@ -283,7 +282,7 @@ msgstr "Автоответчик" #: ../sflphone-client-gnome/src/uimanager.c:117 msgid "No address book selected" -msgstr "Адресная книга" +msgstr "Нет выбранных адресных книг" #: ../sflphone-client-gnome/src/uimanager.c:137 #: ../sflphone-client-gnome/src/uimanager.c:756 @@ -292,7 +291,7 @@ msgstr "Адресная книга" #: ../sflphone-client-gnome/src/uimanager.c:279 msgid "Voicemail (%i)" -msgstr "Автоответчик" +msgstr "Автоответчик (%i)" #: ../sflphone-client-gnome/src/uimanager.c:342 msgid "SFLphone is a VoIP client compatible with SIP and IAX2 protocols." @@ -313,7 +312,7 @@ msgstr "_Новый звонок" #: ../sflphone-client-gnome/src/uimanager.c:720 msgid "Place a new call" -msgstr "" +msgstr "Позвонить" #: ../sflphone-client-gnome/src/uimanager.c:721 #: ../sflphone-client-gnome/src/uimanager.c:979 @@ -322,7 +321,7 @@ msgstr "_Взять трубку" #: ../sflphone-client-gnome/src/uimanager.c:721 msgid "Answer the call" -msgstr "" +msgstr "Ответить" #: ../sflphone-client-gnome/src/uimanager.c:722 #: ../sflphone-client-gnome/src/uimanager.c:991 @@ -332,7 +331,7 @@ msgstr "_Положить трубку" #: ../sflphone-client-gnome/src/uimanager.c:722 msgid "Finish the call" -msgstr "" +msgstr "Закончить звонок" #: ../sflphone-client-gnome/src/uimanager.c:723 msgid "O_n hold" @@ -340,15 +339,15 @@ msgstr "_Удержать звонок" #: ../sflphone-client-gnome/src/uimanager.c:723 msgid "Place the call on hold" -msgstr "" +msgstr "Удержать звонок" #: ../sflphone-client-gnome/src/uimanager.c:724 msgid "O_ff hold" -msgstr "" +msgstr "_Возобновить разговор" #: ../sflphone-client-gnome/src/uimanager.c:724 msgid "Place the call off hold" -msgstr "" +msgstr "Возобновить разговор" #: ../sflphone-client-gnome/src/uimanager.c:725 #: ../sflphone-client-gnome/src/uimanager.c:1015 @@ -357,15 +356,15 @@ msgstr "Записать" #: ../sflphone-client-gnome/src/uimanager.c:725 msgid "Record the current conversation" -msgstr "" +msgstr "Записать переговор" #: ../sflphone-client-gnome/src/uimanager.c:726 msgid "Configuration _Assistant" -msgstr "Файл конфигурации" +msgstr "Мастер настройки" #: ../sflphone-client-gnome/src/uimanager.c:726 msgid "Run the configuration assistant" -msgstr "Ошибка конфигурации Stun" +msgstr "Запустить мастер настройки" #: ../sflphone-client-gnome/src/uimanager.c:727 msgid "Call your voicemail" @@ -373,11 +372,11 @@ msgstr "%d голосовое письмо" #: ../sflphone-client-gnome/src/uimanager.c:728 msgid "_Close" -msgstr "" +msgstr "_Закрыть" #: ../sflphone-client-gnome/src/uimanager.c:728 msgid "Minimize to system tray" -msgstr "" +msgstr "Уменьшить в значок" #: ../sflphone-client-gnome/src/uimanager.c:729 msgid "_Quit" @@ -385,7 +384,7 @@ msgstr "_Правка" #: ../sflphone-client-gnome/src/uimanager.c:729 msgid "Quit the program" -msgstr "" +msgstr "Выйти из программы" #: ../sflphone-client-gnome/src/uimanager.c:732 msgid "_Edit" @@ -393,19 +392,19 @@ msgstr "_Правка" #: ../sflphone-client-gnome/src/uimanager.c:733 msgid "_Copy" -msgstr "" +msgstr "_Копировать" #: ../sflphone-client-gnome/src/uimanager.c:733 msgid "Copy the selection" -msgstr "Удалить выбранную учетную запись" +msgstr "Копировать видимое" #: ../sflphone-client-gnome/src/uimanager.c:734 msgid "_Paste" -msgstr "" +msgstr "_Вставить" #: ../sflphone-client-gnome/src/uimanager.c:734 msgid "Paste the clipboard" -msgstr "" +msgstr "Вставить из буфера обмена" #: ../sflphone-client-gnome/src/uimanager.c:735 msgid "Clear _history" @@ -417,19 +416,19 @@ msgstr "Очистить историю" #: ../sflphone-client-gnome/src/uimanager.c:736 msgid "_Accounts" -msgstr "_Аккаунты" +msgstr "_Учëтные записи" #: ../sflphone-client-gnome/src/uimanager.c:736 msgid "Edit your accounts" -msgstr "Нынешний аккаунт" +msgstr "Изменить ваши учëтные записи" #: ../sflphone-client-gnome/src/uimanager.c:737 msgid "_Preferences" -msgstr "Предпочтения" +msgstr "_Предпочтения" #: ../sflphone-client-gnome/src/uimanager.c:737 msgid "Change your preferences" -msgstr "" +msgstr "Изменить ваши предпочтении" #: ../sflphone-client-gnome/src/uimanager.c:740 msgid "_View" @@ -445,7 +444,7 @@ msgstr "Продолжить" #: ../sflphone-client-gnome/src/uimanager.c:744 msgid "Open the manual" -msgstr "" +msgstr "Открыть справочник " #: ../sflphone-client-gnome/src/uimanager.c:745 msgid "About this application" @@ -457,23 +456,23 @@ msgstr "Переслать звонок на другой номер" #: ../sflphone-client-gnome/src/uimanager.c:751 msgid "Transfer the call" -msgstr "Передать : " +msgstr "Переслать звонок на другой номер" #: ../sflphone-client-gnome/src/uimanager.c:752 msgid "_Show toolbar" -msgstr "" +msgstr "Показать панель инструментов" #: ../sflphone-client-gnome/src/uimanager.c:752 msgid "Show the toolbar" -msgstr "" +msgstr "Показать панель инструментов" #: ../sflphone-client-gnome/src/uimanager.c:753 msgid "_Dialpad" -msgstr "Отключен" +msgstr "Панель набора номера" #: ../sflphone-client-gnome/src/uimanager.c:753 msgid "Show the dialpad" -msgstr "" +msgstr "Показать панель набора номера" #: ../sflphone-client-gnome/src/uimanager.c:754 msgid "_Volume controls" @@ -489,7 +488,7 @@ msgstr "Журнал" #: ../sflphone-client-gnome/src/uimanager.c:755 msgid "Calls history" -msgstr "История звонков" +msgstr "Журнал звонков" #: ../sflphone-client-gnome/src/uimanager.c:756 msgid "_Address book" @@ -552,7 +551,7 @@ msgstr "Па_роль" #: ../sflphone-client-gnome/src/config/assistant.c:363 #: ../sflphone-client-gnome/src/config/assistant.c:473 msgid "Show password" -msgstr "Пароль" +msgstr "Показать пароль" #: ../sflphone-client-gnome/src/config/accountconfigdialog.c:274 #: ../sflphone-client-gnome/src/config/assistant.c:368 @@ -589,7 +588,7 @@ msgstr "Безопасность" #: ../sflphone-client-gnome/src/config/accountconfigdialog.c:687 #: ../sflphone-client-gnome/src/config/preferencesdialog.c:333 msgid "Use TLS transport (sips)" -msgstr "Имя для аутентификации" +msgstr "Использовать TLS-транспорт (sips)" #: ../sflphone-client-gnome/src/config/accountconfigdialog.c:693 #: ../sflphone-client-gnome/src/config/preferencesdialog.c:338 @@ -607,7 +606,7 @@ msgstr "Регистрация" #: ../sflphone-client-gnome/src/config/accountconfigdialog.c:800 msgid "Registration expire" -msgstr "Истек срок регистрации" +msgstr "Срок истечения регистрации" #: ../sflphone-client-gnome/src/config/accountconfigdialog.c:809 msgid "_Comply with RFC 3263" @@ -616,7 +615,7 @@ msgstr "_Соотвествует RFC 3263" #: ../sflphone-client-gnome/src/config/accountconfigdialog.c:816 #: ../sflphone-client-gnome/src/config/preferencesdialog.c:234 msgid "Network Interface" -msgstr "Сеть недоступна" +msgstr "Сетевые настройки" #: ../sflphone-client-gnome/src/config/accountconfigdialog.c:830 #: ../sflphone-client-gnome/src/config/preferencesdialog.c:249 @@ -631,7 +630,7 @@ msgstr "Локальный порт" #: ../sflphone-client-gnome/src/config/accountconfigdialog.c:893 #: ../sflphone-client-gnome/src/config/accountconfigdialog.c:928 msgid "Published address" -msgstr "издаваемый адрес" +msgstr "Сетевые настройки для Интернета" #: ../sflphone-client-gnome/src/config/accountconfigdialog.c:899 msgid "Using STUN" @@ -651,11 +650,11 @@ msgstr "Настроить видимый адрес и порт :" #: ../sflphone-client-gnome/src/config/accountconfigdialog.c:936 msgid "Published port" -msgstr "издаваемый порт" +msgstr "Публичный порт" #: ../sflphone-client-gnome/src/config/accountconfigdialog.c:1027 msgid "Account settings" -msgstr "Настройки аккаунта" +msgstr "Настройки учëтной записи" #: ../sflphone-client-gnome/src/config/accountconfigdialog.c:1046 msgid "Basic" @@ -683,18 +682,18 @@ msgstr "Учётные записи" #: ../sflphone-client-gnome/src/config/accountlistconfigdialog.c:484 msgid "Configured Accounts" -msgstr "Нынешний аккаунт" +msgstr "Настроенные учëтные записи" #: ../sflphone-client-gnome/src/config/accountlistconfigdialog.c:501 msgid "There is %d active account" msgid_plural "There are %d active accounts" -msgstr[0] " действующий аккаунт" -msgstr[1] " действующий аккаунт" -msgstr[2] " действующий аккаунт" +msgstr[0] "Одна действующая учëтная запись" +msgstr[1] "%d действующих учëтных записей" +msgstr[2] "%d действующих учëтных записей" #: ../sflphone-client-gnome/src/config/accountlistconfigdialog.c:507 msgid "You have no active account" -msgstr "У вас нет активного аккаунта" +msgstr "У вас нет активной учëтной записи" #: ../sflphone-client-gnome/src/config/addressbook-config.c:306 #: ../sflphone-client-gnome/src/config/preferencesdialog.c:556 @@ -707,7 +706,7 @@ msgstr "_Использовать адресную книгу Evolution" #: ../sflphone-client-gnome/src/config/addressbook-config.c:319 msgid "Download limit :" -msgstr "Ограничение скорости скачивания:" +msgstr "Показывать не более " #: ../sflphone-client-gnome/src/config/addressbook-config.c:327 msgid "cards" @@ -719,7 +718,7 @@ msgstr "_Показать фотографию контакта (если име #: ../sflphone-client-gnome/src/config/addressbook-config.c:341 msgid "Fields from Evolution's address books" -msgstr "Исполоьзовать следующие поля из адресной книги Evolution:" +msgstr "Исполоьзовать следующие номера из адресной книги Evolution" #: ../sflphone-client-gnome/src/config/addressbook-config.c:345 msgid "_Work" @@ -756,8 +755,8 @@ msgid "" "You can at any time check your registration state or modify your accounts " "parameters in the Options/Accounts window." msgstr "" -"Вы можете в любое время проверить статус регистрации или изменитьпараметры " -"ваших аккаунтов в меню Правка / Аккаунты." +"Вы можете в любое время проверить статус регистрации или изменить параметры " +"ваших учëтных записей в меню Правка / Учëтные записи" #: ../sflphone-client-gnome/src/config/assistant.c:80 msgid "Alias" @@ -773,7 +772,7 @@ msgstr "Пользователь" #: ../sflphone-client-gnome/src/config/assistant.c:92 msgid "Security: " -msgstr "Безопасность " +msgstr "Безопасность:" #: ../sflphone-client-gnome/src/config/assistant.c:94 msgid "SRTP/ZRTP draft-zimmermann" @@ -793,7 +792,7 @@ msgstr "Добро пожаловать в SFLphone!" #: ../sflphone-client-gnome/src/config/assistant.c:256 msgid "This installation wizard will help you configure an account." -msgstr "Этот мастер установки поможет вам настроить ваш аккаунт." +msgstr "Этот мастер установки поможет вам настроить вашу учëтную запись" #: ../sflphone-client-gnome/src/config/assistant.c:270 msgid "VoIP Protocols" @@ -801,7 +800,7 @@ msgstr "VoIP-протоколы" #: ../sflphone-client-gnome/src/config/assistant.c:270 msgid "Select an account type" -msgstr "Выберите тип аккаунта" +msgstr "Выберите тип учëтной записи" #: ../sflphone-client-gnome/src/config/assistant.c:272 msgid "SIP (Session Initiation Protocol)" @@ -813,7 +812,7 @@ msgstr "IAX2 (InterAsterix Exchange)" #: ../sflphone-client-gnome/src/config/assistant.c:288 msgid "Account" -msgstr "Аккаунты" +msgstr "Учëтная запись" #: ../sflphone-client-gnome/src/config/assistant.c:288 msgid "Please select one of the following options" @@ -821,15 +820,15 @@ msgstr "Введите пожалуйста следующие данные" #: ../sflphone-client-gnome/src/config/assistant.c:290 msgid "Create a free SIP/IAX2 account on sflphone.org" -msgstr "Создать бесплатный SIP/IAX2-аккаунт на sflphone.org" +msgstr "Создать бесплатную SIP/IAX2-учëтную запись на sflphone.org" #: ../sflphone-client-gnome/src/config/assistant.c:292 msgid "Register an existing SIP or IAX2 account" -msgstr "Зарегистрировать существующий SIP или IAX2 аккаунт" +msgstr "Зарегистрировать существующею SIP или IAX2 учëтную запись" #: ../sflphone-client-gnome/src/config/assistant.c:306 msgid "SIP account settings" -msgstr "Настройка SIP-аккаунта" +msgstr "Настройка учëтной записи SIP" #: ../sflphone-client-gnome/src/config/assistant.c:306 #: ../sflphone-client-gnome/src/config/assistant.c:419 @@ -855,7 +854,7 @@ msgstr "_Адрес эл. почты" #: ../sflphone-client-gnome/src/config/assistant.c:419 msgid "IAX2 account settings" -msgstr "Настройка IAX2-аккаунта" +msgstr "Настройка учëтной записи IAX2" #: ../sflphone-client-gnome/src/config/assistant.c:496 msgid "Network Address Translation (NAT)" @@ -875,7 +874,7 @@ msgstr "_STUN-сервер" #: ../sflphone-client-gnome/src/config/assistant.c:526 msgid "Account Registration" -msgstr "Регистрация аккаунта" +msgstr "Регистрация учëтной записи" #: ../sflphone-client-gnome/src/config/assistant.c:526 msgid "Congratulations!" @@ -1000,7 +999,7 @@ msgid "" "sip URI such as <b>sip:remotepeer</b>. The settings you define here will " "also be used if no account can be matched to an incoming or outgoing call." msgstr "" -"Этот профиль используется когда бы хотите достичь удалëнное устройство " +"Этот профиль используется когда вы хотите достичь удалëнное устройство " "просто набрав SIP URI (адрес) типа <b>sip:удалëнное устройство</b>. Эти " "настройки так-же будут использованы если не будет подходящего аккаунта для " "входящего или выходящего звонка." @@ -1015,7 +1014,7 @@ msgstr "Включить звонок" #: ../sflphone-client-gnome/src/config/preferencesdialog.c:450 msgid "System Tray Icon" -msgstr "System Tray Icon" +msgstr "Поведение окна SFLPhone" #: ../sflphone-client-gnome/src/config/preferencesdialog.c:453 msgid "_Popup main window on incoming call" diff --git a/sflphone-client-gnome/doc/C/figures/accounts_security.png b/sflphone-client-gnome/doc/C/figures/accounts_security.png new file mode 100644 index 0000000000000000000000000000000000000000..ca3f76c3d9a899589dc29b299a3117ae8ebe110f Binary files /dev/null and b/sflphone-client-gnome/doc/C/figures/accounts_security.png differ diff --git a/sflphone-client-gnome/doc/C/figures/addressbook-button.png b/sflphone-client-gnome/doc/C/figures/addressbook-button.png index acf0c185b7621d0b4b05d58c16b118ff62eeeca3..90d6d8a0413e4bc0970bc6847fc0b7d74a3e0f72 100644 Binary files a/sflphone-client-gnome/doc/C/figures/addressbook-button.png and b/sflphone-client-gnome/doc/C/figures/addressbook-button.png differ diff --git a/sflphone-client-gnome/doc/C/figures/answer.png b/sflphone-client-gnome/doc/C/figures/answer.png index 14fda5f03aeac15f9819631a2d0d631b1516cbfa..cef5996aa2621a5494fb888e5a607521f86a3d2e 100644 Binary files a/sflphone-client-gnome/doc/C/figures/answer.png and b/sflphone-client-gnome/doc/C/figures/answer.png differ diff --git a/sflphone-client-gnome/doc/C/figures/call-second.png b/sflphone-client-gnome/doc/C/figures/call-second.png index e6527821f6c6b05d05b9697b5a80166a3539ed08..7b1d8df4f674a26c6102c0bc64ddb7eedef395a7 100644 Binary files a/sflphone-client-gnome/doc/C/figures/call-second.png and b/sflphone-client-gnome/doc/C/figures/call-second.png differ diff --git a/sflphone-client-gnome/doc/C/figures/call.png b/sflphone-client-gnome/doc/C/figures/call.png index 6361dec67a85d9a4df7a35eb79fe6d1a6d6d7b4a..e80b4eafa4a4167048e66693d3cb5ef8c0128e0a 100644 Binary files a/sflphone-client-gnome/doc/C/figures/call.png and b/sflphone-client-gnome/doc/C/figures/call.png differ diff --git a/sflphone-client-gnome/doc/C/figures/dial.png b/sflphone-client-gnome/doc/C/figures/dial.png index 2baf736e3072d38a4deba2fdb603ba59b8ed9ac4..0b3d44b95b0c18e74c18ee2888792e7401978283 100644 Binary files a/sflphone-client-gnome/doc/C/figures/dial.png and b/sflphone-client-gnome/doc/C/figures/dial.png differ diff --git a/sflphone-client-gnome/doc/C/figures/hangup.png b/sflphone-client-gnome/doc/C/figures/hangup.png index c2c2ef61c740f1fba7f10c926607f0916402b26a..dd895bb497821889d86c4540cfcda27ecb94ad6a 100644 Binary files a/sflphone-client-gnome/doc/C/figures/hangup.png and b/sflphone-client-gnome/doc/C/figures/hangup.png differ diff --git a/sflphone-client-gnome/doc/C/figures/history.png b/sflphone-client-gnome/doc/C/figures/history.png index e56aa52a5cd28a2006eb880593aec0458ad11d12..32b98810da8eb9cb75ca527c88356d29e4117d2c 100644 Binary files a/sflphone-client-gnome/doc/C/figures/history.png and b/sflphone-client-gnome/doc/C/figures/history.png differ diff --git a/sflphone-client-gnome/doc/C/figures/holdoff.png b/sflphone-client-gnome/doc/C/figures/holdoff.png index 73e02b9a992cb6eeb8c3c28dd345bc972b359726..7ecd9b4799bba0adff103aec8784b886ecd2d76c 100644 Binary files a/sflphone-client-gnome/doc/C/figures/holdoff.png and b/sflphone-client-gnome/doc/C/figures/holdoff.png differ diff --git a/sflphone-client-gnome/doc/C/figures/holdon.png b/sflphone-client-gnome/doc/C/figures/holdon.png index da849b9f525dbc7916cc254a39b8fdf019e7d425..78f39f8312f45adaccd0a0aebd5ea61cfa54a45a 100644 Binary files a/sflphone-client-gnome/doc/C/figures/holdon.png and b/sflphone-client-gnome/doc/C/figures/holdon.png differ diff --git a/sflphone-client-gnome/doc/C/figures/record.png b/sflphone-client-gnome/doc/C/figures/record.png index d10233a7597daa8d57493fb117842e6065057851..dc5635c3d5cd3bcbccdad13c38190dd2fcd3373f 100644 Binary files a/sflphone-client-gnome/doc/C/figures/record.png and b/sflphone-client-gnome/doc/C/figures/record.png differ diff --git a/sflphone-client-gnome/doc/C/figures/refuse.png b/sflphone-client-gnome/doc/C/figures/refuse.png index 8c5a0d2f9bfae155efcb5a17c8122694d25cc1cb..0b644fe9cf6996be804db2fb09508a0f5ff1cc09 100644 Binary files a/sflphone-client-gnome/doc/C/figures/refuse.png and b/sflphone-client-gnome/doc/C/figures/refuse.png differ diff --git a/sflphone-client-gnome/doc/C/figures/srtp_enabled.png b/sflphone-client-gnome/doc/C/figures/srtp_enabled.png new file mode 100644 index 0000000000000000000000000000000000000000..68dabf1d368e614c3bf2326a0d8331eea4736154 Binary files /dev/null and b/sflphone-client-gnome/doc/C/figures/srtp_enabled.png differ diff --git a/sflphone-client-gnome/doc/C/figures/transfer-go.png b/sflphone-client-gnome/doc/C/figures/transfer-go.png index ba8633c279b7114584962c12bc88e7b17eda2501..a349431542843913866963826fdaae12d3cf389d 100644 Binary files a/sflphone-client-gnome/doc/C/figures/transfer-go.png and b/sflphone-client-gnome/doc/C/figures/transfer-go.png differ diff --git a/sflphone-client-gnome/doc/C/figures/transfer.png b/sflphone-client-gnome/doc/C/figures/transfer.png index 5da94915812aa22203ac012f673026bf4e6958c1..fcb2c4a33a3bdeb8e2a6b762b2e5ca155a35b7eb 100644 Binary files a/sflphone-client-gnome/doc/C/figures/transfer.png and b/sflphone-client-gnome/doc/C/figures/transfer.png differ diff --git a/sflphone-client-gnome/doc/C/figures/voicemail.png b/sflphone-client-gnome/doc/C/figures/voicemail.png index bcc3591335341d322f706495ba2f5b7fb1003855..77a4d4872ec4649ad828ae81b88238982d25c5d3 100644 Binary files a/sflphone-client-gnome/doc/C/figures/voicemail.png and b/sflphone-client-gnome/doc/C/figures/voicemail.png differ diff --git a/sflphone-client-gnome/doc/C/figures/zrtp_options.png b/sflphone-client-gnome/doc/C/figures/zrtp_options.png new file mode 100644 index 0000000000000000000000000000000000000000..b9229d7b81f31aa6e4a66759bd1856959c82f233 Binary files /dev/null and b/sflphone-client-gnome/doc/C/figures/zrtp_options.png differ diff --git a/sflphone-client-gnome/doc/C/sflphone-usermanual.pot b/sflphone-client-gnome/doc/C/sflphone-usermanual.pot index 337598a62af903f823e212a357d4d48fa0ee08dd..5783d55d7c0d10f7c17df63ab9ef0153cf55b91c 100644 --- a/sflphone-client-gnome/doc/C/sflphone-usermanual.pot +++ b/sflphone-client-gnome/doc/C/sflphone-usermanual.pot @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 2009-10-26 15:41-0400\n" +"POT-Creation-Date: 2009-12-08 13:58-0500\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" @@ -17,121 +17,163 @@ msgstr "" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. -#: sflphone.xml:296(None) +#: sflphone.xml:281(None) +msgid "@@image: 'figures/accounts_security.png'; md5=14161ae9857c046d571e5e9501c35fa5" +msgstr "" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:312(None) msgid "@@image: 'figures/dial.png'; md5=81ff4280c293e62a49fad3a4b61b9bb5" msgstr "" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. -#: sflphone.xml:311(None) +#: sflphone.xml:327(None) msgid "@@image: 'figures/call-second.png'; md5=fa490e3b07eebaa9f4ff719f579d68ef" msgstr "" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. -#: sflphone.xml:330(None) +#: sflphone.xml:346(None) msgid "@@image: 'figures/call.png'; md5=ecd96beec76f808b5c1469ecc1293237" msgstr "" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. -#: sflphone.xml:348(None) +#: sflphone.xml:364(None) msgid "@@image: 'figures/answer.png'; md5=c168995c6b36b5d200c49d1c02c2ea52" msgstr "" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. -#: sflphone.xml:365(None) +#: sflphone.xml:381(None) msgid "@@image: 'figures/hangup.png'; md5=0cac4dfe3a9a4bdf4d12229f77e3723a" msgstr "" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. -#: sflphone.xml:385(None) +#: sflphone.xml:401(None) msgid "@@image: 'figures/refuse.png'; md5=34b6cbf068e56163058e79de3ca70c59" msgstr "" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. -#: sflphone.xml:403(None) +#: sflphone.xml:419(None) msgid "@@image: 'figures/holdon.png'; md5=655078b8b495ada29f65b58501187d16" msgstr "" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. -#: sflphone.xml:415(None) +#: sflphone.xml:431(None) msgid "@@image: 'figures/holdoff.png'; md5=e06b8eba03f1545cd18891630b22f281" msgstr "" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. -#: sflphone.xml:430(None) +#: sflphone.xml:446(None) msgid "@@image: 'figures/transfer.png'; md5=92f921c7c6ba4ee2487ccf6e02226d9a" msgstr "" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. -#: sflphone.xml:444(None) +#: sflphone.xml:460(None) msgid "@@image: 'figures/transfer-go.png'; md5=553b57d5a9fc9f248ba15cecc32d343f" msgstr "" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. -#: sflphone.xml:465(None) +#: sflphone.xml:481(None) msgid "@@image: 'figures/rec-settings.png'; md5=27d51e45ff23dde58b0512f90773f6ce" msgstr "" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. -#: sflphone.xml:478(None) +#: sflphone.xml:494(None) msgid "@@image: 'figures/record.png'; md5=7a594660924940e8def9ecfcee0e8cb4" msgstr "" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. -#: sflphone.xml:496(None) +#: sflphone.xml:512(None) msgid "@@image: 'figures/voicemail.png'; md5=36dbeb4bcc6a68519d474552a888ce1e" msgstr "" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. -#: sflphone.xml:684(None) +#: sflphone.xml:548(None) +msgid "@@image: 'figures/drag_n_drop.png'; md5=fed5f0da9f162ca96bda0d49935a5354" +msgstr "" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:560(None) +msgid "@@image: 'figures/conference.png'; md5=36f68c0a1fd7450487009126fff544bd" +msgstr "" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:582(None) +msgid "@@image: 'figures/conference_detached.png'; md5=145189452009ea3110bb569c92997a4c" +msgstr "" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:594(None) +msgid "@@image: 'figures/conference_attached.png'; md5=73411e05f2f2b185c34b5935ef7c49f0" +msgstr "" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:663(None) +msgid "@@image: 'figures/srtp_enabled.png'; md5=6d4679f6afec1a8b84ce69f617cb4fa7" +msgstr "" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:683(None) +msgid "@@image: 'figures/zrtp_options.png'; md5=2468eca925b188356bcc0c341c3fd912" +msgstr "" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:849(None) msgid "@@image: 'figures/addressbook-button.png'; md5=b4a820013ef8b8f48e7de780a66c7800" msgstr "" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. -#: sflphone.xml:719(None) +#: sflphone.xml:884(None) msgid "@@image: 'figures/desktop-notif-settings.png'; md5=2bca85d6d9871883399481b994bd3384" msgstr "" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. -#: sflphone.xml:738(None) +#: sflphone.xml:903(None) msgid "@@image: 'figures/notif-example.png'; md5=d09008bedcaee435b12cd165d42e39b7" msgstr "" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. -#: sflphone.xml:755(None) +#: sflphone.xml:920(None) msgid "@@image: 'figures/voicemail-notif.png'; md5=a33ed4ce4b693d67ee453b4ef1fa6c30" msgstr "" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. -#: sflphone.xml:774(None) +#: sflphone.xml:939(None) msgid "@@image: 'figures/systemtray-settings.png'; md5=638612a08eb31eb768c4f08ace9c909a" msgstr "" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. -#: sflphone.xml:814(None) +#: sflphone.xml:979(None) msgid "@@image: 'figures/callshistory-settings.png'; md5=287d8aed7d7c71752257c64e89a9127d" msgstr "" #. When image changes, this message will be marked fuzzy or untranslated for you. #. It doesn't matter what you translate it to: it's not used at all. -#: sflphone.xml:838(None) +#: sflphone.xml:1003(None) msgid "@@image: 'figures/configfile-settings.png'; md5=eb4a5545f137b825dcdaf0396a9f1a7d" msgstr "" @@ -196,7 +238,7 @@ msgid "emmanuel.milou@savoirfairelinux.com" msgstr "" #: sflphone.xml:58(firstname) -msgid "Jérémy" +msgid "Jeremy" msgstr "" #: sflphone.xml:59(surname) @@ -315,7 +357,7 @@ msgstr "" msgid "To create a new account, perform the following steps:" msgstr "" -#: sflphone.xml:153(para) sflphone.xml:191(para) sflphone.xml:201(para) +#: sflphone.xml:153(para) sflphone.xml:191(para) sflphone.xml:201(para) sflphone.xml:652(para) msgid "Choose <menuchoice><guimenu>Edit</guimenu><guimenuitem>Manage accounts</guimenuitem></menuchoice>." msgstr "" @@ -387,7 +429,7 @@ msgstr "" msgid "To edit an existing account, perform the following steps:" msgstr "" -#: sflphone.xml:192(para) +#: sflphone.xml:192(para) sflphone.xml:653(para) msgid "Select in the list the account you would like to edit, then click on the <guilabel>Edit</guilabel> button." msgstr "" @@ -463,7 +505,7 @@ msgstr "" msgid "To register to some VoIP services, you will need to set this value at at least 1600 seconds (Example: French VoIP server freephonie.net)." msgstr "" -#: sflphone.xml:244(title) sflphone.xml:873(title) +#: sflphone.xml:244(title) sflphone.xml:1038(title) msgid "Network" msgstr "" @@ -507,429 +549,589 @@ msgstr "" msgid "Manually" msgstr "" -#: sflphone.xml:272(title) +#: sflphone.xml:272(title) sflphone.xml:627(title) msgid "Security features" msgstr "" -#: sflphone.xml:275(title) -msgid "Secure RTP" +#: sflphone.xml:274(para) +msgid "Follow the indications to <link linkend=\"account_edit\">edit an account</link> and choose the <guimenu>Security</guimenu> tab." msgstr "" -#: sflphone.xml:278(title) -msgid "TLS" +#: sflphone.xml:277(title) +msgid "Security features configuration panel" +msgstr "" + +#: sflphone.xml:289(title) +msgid "Credentials" msgstr "" -#: sflphone.xml:285(title) +#: sflphone.xml:290(para) +msgid "SFLphone supports multiple realms." +msgstr "" + +#: sflphone.xml:294(title) +msgid "Security" +msgstr "" + +#: sflphone.xml:295(para) +msgid "Please refer to the section <link linkend=\"detailed_security_features\">Security features</link> for detailed information about security features." +msgstr "" + +#: sflphone.xml:301(title) msgid "Call features" msgstr "" -#: sflphone.xml:287(para) +#: sflphone.xml:303(para) msgid "All the following features are available with both SIP and IAX2 accounts." msgstr "" -#: sflphone.xml:292(title) +#: sflphone.xml:308(title) msgid "Dial button" msgstr "" #. ==== End of Figure ==== -#: sflphone.xml:303(para) +#: sflphone.xml:319(para) msgid "You may have an unlimited number of calls at the same time, even with different accounts." msgstr "" -#: sflphone.xml:304(para) +#: sflphone.xml:320(para) msgid "To create a new call when you already have a current call, just click on the <guilabel>Dial</guilabel> button. The current call will automatically be put on hold." msgstr "" -#: sflphone.xml:307(title) +#: sflphone.xml:323(title) msgid "Make an other call" msgstr "" #. ==== End of Figure ==== -#: sflphone.xml:318(para) +#: sflphone.xml:334(para) msgid "Keyboard shortcut to perform this action: <accel>NUMPAD</accel> or almost any keys." msgstr "" -#: sflphone.xml:326(title) +#: sflphone.xml:342(title) msgid "Call button" msgstr "" #. ==== End of Figure ==== -#: sflphone.xml:337(para) sflphone.xml:355(para) +#: sflphone.xml:353(para) sflphone.xml:371(para) msgid "Keyboard shortcut to perform this action: <accel>Enter</accel>." msgstr "" -#: sflphone.xml:344(title) +#: sflphone.xml:360(title) msgid "Answer button" msgstr "" -#: sflphone.xml:361(title) +#: sflphone.xml:377(title) msgid "Hangup button" msgstr "" #. ==== End of Figure ==== -#: sflphone.xml:372(para) sflphone.xml:392(para) +#: sflphone.xml:388(para) sflphone.xml:408(para) msgid "Keyboard shortcut to perform this action: <accel>ESC</accel>." msgstr "" -#: sflphone.xml:377(para) +#: sflphone.xml:393(para) msgid "When you refuse a call, your caller is automatically redirected to your voicemail box, if applicable." msgstr "" -#: sflphone.xml:381(title) +#: sflphone.xml:397(title) msgid "Refuse button" msgstr "" -#: sflphone.xml:399(title) +#: sflphone.xml:415(title) msgid "Hold on button" msgstr "" -#: sflphone.xml:411(title) +#: sflphone.xml:427(title) msgid "Hold off button" msgstr "" -#: sflphone.xml:426(title) +#: sflphone.xml:442(title) msgid "Transfer button" msgstr "" #. ==== End of Figure ==== -#: sflphone.xml:437(para) +#: sflphone.xml:453(para) msgid "Then type the number you want to transfer the current call to." msgstr "" -#: sflphone.xml:440(title) +#: sflphone.xml:456(title) msgid "Validate the transfer" msgstr "" #. ==== End of Figure ==== -#: sflphone.xml:451(para) +#: sflphone.xml:467(para) msgid "And press <accel>Enter</accel>. Clicking again on the transfer button cancels the transfer." msgstr "" -#: sflphone.xml:457(para) +#: sflphone.xml:473(para) msgid "Go to <menuchoice><guimenu>Edit</guimenu><guimenuitem>Preferences</guimenuitem><guimenuitem>Audio</guimenuitem></menuchoice> to configure the recordings destination folder." msgstr "" -#: sflphone.xml:461(title) +#: sflphone.xml:477(title) msgid "Record settings" msgstr "" -#: sflphone.xml:474(title) +#: sflphone.xml:490(title) msgid "Record button" msgstr "" -#: sflphone.xml:488(caution) +#: sflphone.xml:504(caution) msgid "This feature is available only if you fill out the voicemail number information for your default account." msgstr "" -#: sflphone.xml:492(title) +#: sflphone.xml:508(title) msgid "Voicemail button" msgstr "" -#: sflphone.xml:506(para) +#: sflphone.xml:522(para) msgid "A direct IP call is a call established between two peers without any accounts. When dialing, such a call must prefixed with <guilabel>sip:</guilabel>." msgstr "" -#: sflphone.xml:508(para) +#: sflphone.xml:524(para) msgid "Direct IP calls use SIP protocol to establish communication and RTP to transport data. It is right now not available with IAX2." msgstr "" -#: sflphone.xml:510(para) +#: sflphone.xml:526(para) msgid "Go to <menuchoice><guimenu>Edit</guimenu><guimenuitem>Preferences</guimenuitem><guimenuitem>Direct IP calls</guimenuitem></menuchoice> to configure the advanced security features for this kind of calls." msgstr "" -#: sflphone.xml:514(para) +#: sflphone.xml:530(para) msgid "SFLphone now supports conference call hosting integrating server like features in a simple GUI." msgstr "" -#: sflphone.xml:520(guilabel) +#: sflphone.xml:536(guilabel) msgid "Create a conference" msgstr "" -#: sflphone.xml:521(para) +#: sflphone.xml:537(para) msgid "To host a conference, simply drag and drop one call on another. Additional participants are added the same way, dragging a call on the conference icon." msgstr "" -#: sflphone.xml:528(guilabel) +#: sflphone.xml:544(title) +msgid "Creating a new conference" +msgstr "" + +#: sflphone.xml:556(title) +msgid "Conference call" +msgstr "" + +#: sflphone.xml:568(guilabel) msgid "Leave a conference" msgstr "" -#: sflphone.xml:529(para) -msgid "SFLphone conference model let you leave a conference that you are currently hosting to answer any other incoming communication or even initiate new ones. The conference is not interupted Double clicking the conference icon let you reintroduce the conference." +#: sflphone.xml:569(para) +msgid "SFLphone conference model let you leave a conference that you are currently hosting to answer any other incoming communication or even initiate new ones. The conference is not interupted, double clicking the conference icon let you reintroduce it at any momment." +msgstr "" + +#: sflphone.xml:578(title) +msgid "Conference detached" +msgstr "" + +#: sflphone.xml:590(title) +msgid "Conference attached" msgstr "" -#: sflphone.xml:538(guilabel) +#: sflphone.xml:602(guilabel) msgid "Multiple conference" msgstr "" -#: sflphone.xml:539(para) +#: sflphone.xml:603(para) msgid "SFLphone supports multiple conferences running simultaneously. Two conferences can be joined the same way they are created, dragging one on the other." msgstr "" -#: sflphone.xml:547(guilabel) +#: sflphone.xml:611(guilabel) msgid "Hangup/Hold a conference" msgstr "" -#: sflphone.xml:548(para) -msgid "Right click the conference icon. Holding the conference put all participants on hold. Hangup a conference hangup all participants." +#: sflphone.xml:612(para) +msgid "Select the conference icon and press hangup/hold button on the toolbar. The selected action is applied on every conference participants." +msgstr "" + +#: sflphone.xml:629(title) +msgid "SRTP/ZRTP" +msgstr "" + +#: sflphone.xml:631(title) +msgid "SRTP and ZRTP, the big picture" +msgstr "" + +#: sflphone.xml:632(para) +msgid "RTP is the underlying protocol that is used in pair with the widely used SIP protocol to carry voice data. RTP alone does not provide any security features." +msgstr "" + +#: sflphone.xml:633(para) +msgid "Details for implementing Secure RTP (SRTP) were described independently in a separate document (RFC). However, in this paper, one aspect was deliberately left unspecified: how should the encryption keys be exchanged between the two parties involved in a secure RTP session ?" +msgstr "" + +#: sflphone.xml:635(para) +msgid "Mutiple solutions were proposed to fill in that blank. Among them, are SDES (RFC4568) and ZRTP which are probably the most popular today. For the 0.9.7 release, SFLphone integrates support for Secure RTP through the ZRTP protocol, and SDES is expected to be implemented in the very few next releases." +msgstr "" + +#: sflphone.xml:637(para) +msgid "As of today, blueprints for ZRTP are still laid out and are recognized under the name \"zrtp-draftzimmerman\" in the RFC machine. The author of ZRTP is Phil Zimmermann, that same person who brought us PGP. Therefore, it is not suprising that he designed ZRTP as an anti-PKI solution for key exchange." +msgstr "" + +#: sflphone.xml:639(para) +msgid "ZRTP makes possible for two parties to automatically establish a shared secret in a very simple way from the users's point of view. Indeed under SFLphone no special configuration is needed, appart from enabling the option itself." msgstr "" -#: sflphone.xml:565(title) +#: sflphone.xml:641(para) +msgid "If you want to use ZRTP, please take note that if you are connecting to a PBX, this one must have been configured to support ZRTP. Unfortunately, security for VoIP communications is still young and chances are that your PBX software won't support it." +msgstr "" + +#: sflphone.xml:643(para) +msgid "This does not mean that you want be able to benefit from ZRTP ! In fact, it turns out that you will be able to use it, as long as the server does not need to decode the RTP stream. This is often the case when the person you are calling to uses a codec that you don't support. In that case, the server will need to transcode the RTP packets and obviously need to be able to handle the ZRTP stream." +msgstr "" + +#: sflphone.xml:645(para) +msgid "Obviously, if you are calling another user (for example by prefixing the number with \"sip:\") directly, then this one will have to support ZRTP as well if you want to use it." +msgstr "" + +#: sflphone.xml:649(title) +msgid "Enabling SRTP/ZRTP" +msgstr "" + +#: sflphone.xml:650(para) +msgid "To enable ZRTP per account basis, perform the following steps:" +msgstr "" + +#: sflphone.xml:654(para) +msgid "Select the <guilabel>Security</guilabel> tab." +msgstr "" + +#: sflphone.xml:655(para) +msgid "Select <guilabel>ZRTP</guilabel> from the select box named <guilabel>SRTP Key Exchange</guilabel>." +msgstr "" + +#: sflphone.xml:659(title) +msgid "Enabling SRTP" +msgstr "" + +#: sflphone.xml:672(title) +msgid "Configuration options" +msgstr "" + +#: sflphone.xml:674(para) +msgid "After enabling SRTP, click the <guilabel>Preferences</guilabel> button." +msgstr "" + +#: sflphone.xml:675(para) +msgid "For basic usage, one don't have to worry about that." +msgstr "" + +#: sflphone.xml:679(title) +msgid "ZRTP configuration panel" +msgstr "" + +#: sflphone.xml:693(guilabel) +msgid "Send Hello Hash in SDP" +msgstr "" + +#: sflphone.xml:694(para) +msgid "Selecting this option will cause the program to compute an hash function over the \"Hello\" packet and send it as an SDP field \"zrtp-hash:\". The remote end might be interested in getting this value to add an additional layer of protection based on another communication channel. Upon receiving this value, the remote point can compute the hash function on the received hello packet and compare it." +msgstr "" + +#: sflphone.xml:695(para) +msgid "Take note that for 0.9.7, SFLPhone does not perform the comparasion on its side." +msgstr "" + +#: sflphone.xml:699(guilabel) +msgid "Ask user to confirm SAS" +msgstr "" + +#: sflphone.xml:700(para) +msgid "The short authentication mechanism is at the heart of the ZRTP protocol. Not requirering the user to manually check the SAS value presents a security risk over Man in the Middle type of attacks." +msgstr "" + +#: sflphone.xml:702(para) +msgid "Disabling this option will stop the program from prompting the user with the SAS." +msgstr "" + +#: sflphone.xml:704(para) +msgid "Such an option was motivated to be developped at that time by the the state of the libzrtpcpp library that SFLPhone was making use of. It is only from version x.x that this library can cache results of SAS computation between two peers." +msgstr "" + +#: sflphone.xml:709(guilabel) +msgid "Display SAS once for hold event" +msgstr "" + +#: sflphone.xml:710(para) +msgid "When call is put on hold, the RTP stream is stopped and reinitiated later. From the ZRTP point of view, this appears as a \"new call\". Therefore, the SAS will be redisplayed unless this option is selected." +msgstr "" + +#: sflphone.xml:713(guilabel) +msgid "ZRTP for direct peer-to-peer calls" +msgstr "" + +#: sflphone.xml:714(para) +msgid "If you want to use ZRTP for calls that are placed directly to a user (without an intervening PBX), you must enable the option under the \"Direct IP Calls\" tab in the \"configuration\" window, available from the \"edit\" menu." +msgstr "" + +#: sflphone.xml:716(para) +msgid "Configuration instruction from that point are the same as for configured accounts." +msgstr "" + +#: sflphone.xml:723(title) +msgid "TLS" +msgstr "" + +#: sflphone.xml:730(title) msgid "Audio configuration" msgstr "" -#: sflphone.xml:566(para) +#: sflphone.xml:731(para) msgid "ALSA and Pulseaudio native interfaces are available." msgstr "" -#: sflphone.xml:582(title) +#: sflphone.xml:747(title) msgid "Codecs overview" msgstr "" -#: sflphone.xml:583(para) +#: sflphone.xml:748(para) msgid "SFLphone supports several widely used audio codec:" msgstr "" -#: sflphone.xml:587(guilabel) +#: sflphone.xml:752(guilabel) msgid "PCMU/PCMA" msgstr "" -#: sflphone.xml:588(para) +#: sflphone.xml:753(para) msgid "ITU-T telefony standard PCM formats, 8kHz, 64 kbit/s, using logarithmic byte compression algorithm." msgstr "" -#: sflphone.xml:594(guilabel) +#: sflphone.xml:759(guilabel) msgid "GSM" msgstr "" -#: sflphone.xml:595(para) +#: sflphone.xml:760(para) msgid "Global System for Mobile communications (GSM) narrowband 8kHz standard based on linear prediction encoding." msgstr "" -#: sflphone.xml:601(guilabel) +#: sflphone.xml:766(guilabel) msgid "G722" msgstr "" -#: sflphone.xml:602(para) +#: sflphone.xml:767(para) msgid "ITU-T standard wideband 16kHz standard based on linear prediction." msgstr "" -#: sflphone.xml:607(guilabel) +#: sflphone.xml:772(guilabel) msgid "SPEEX" msgstr "" -#: sflphone.xml:608(para) +#: sflphone.xml:773(para) msgid "High quality voice encoding/decoding available in narrowband 8Khz, wideband 16khz (HD Voice), and ultra-wideband 32 kHz. Integrate additional features such as Variable Bit Rate (VBR) and noise reduction." msgstr "" -#: sflphone.xml:617(guilabel) +#: sflphone.xml:782(guilabel) msgid "CELT" msgstr "" -#: sflphone.xml:628(title) +#: sflphone.xml:793(title) msgid "Address books" msgstr "" -#: sflphone.xml:630(title) +#: sflphone.xml:795(title) msgid "Enable the address book support" msgstr "" -#: sflphone.xml:631(para) +#: sflphone.xml:796(para) msgid "To enable the address book, perform the following steps:" msgstr "" -#: sflphone.xml:634(para) +#: sflphone.xml:799(para) msgid "Choose <menuchoice><guimenu>Edit</guimenu><guimenuitem>Preferences</guimenuitem></menuchoice>." msgstr "" -#: sflphone.xml:638(para) +#: sflphone.xml:803(para) msgid "Select the <menuchoice><guimenu>Address book</guimenu></menuchoice> tab." msgstr "" -#: sflphone.xml:642(para) +#: sflphone.xml:807(para) msgid "Check the <guilabel>Use Evolution address books</guilabel> box." msgstr "" -#: sflphone.xml:645(para) +#: sflphone.xml:810(para) msgid "Every address books you configured in Evolution will be now available in <application>SFLphone</application>. Please be sure you selected at least one address book." msgstr "" -#: sflphone.xml:649(title) +#: sflphone.xml:814(title) msgid "Available options" msgstr "" -#: sflphone.xml:650(para) +#: sflphone.xml:815(para) msgid "In <menuchoice><guimenu>Edit</guimenu><guimenuitem>Preferences</guimenuitem><guimenuitem>Address book</guimenuitem></menuchoice>, you may select one or all of the following options:" msgstr "" -#: sflphone.xml:653(guilabel) +#: sflphone.xml:818(guilabel) msgid "Display contact photo if available" msgstr "" -#: sflphone.xml:654(para) +#: sflphone.xml:819(para) msgid "The contact photo will be displayed as a thumbnail beside the phone number." msgstr "" -#: sflphone.xml:659(guilabel) +#: sflphone.xml:824(guilabel) msgid "Fields from Evolution's address book" msgstr "" -#: sflphone.xml:660(para) +#: sflphone.xml:825(para) msgid "You may use one or all of these following information from your contact." msgstr "" -#: sflphone.xml:663(listitem) +#: sflphone.xml:828(listitem) msgid "Work phone number" msgstr "" -#: sflphone.xml:664(listitem) +#: sflphone.xml:829(listitem) msgid "Home phone number" msgstr "" -#: sflphone.xml:665(listitem) +#: sflphone.xml:830(listitem) msgid "Mobile phone number" msgstr "" -#: sflphone.xml:673(title) +#: sflphone.xml:838(title) msgid "Using the address book" msgstr "" -#: sflphone.xml:676(para) +#: sflphone.xml:841(para) msgid "On the toolbar, click on the following button to display the address book window:" msgstr "" -#: sflphone.xml:680(title) +#: sflphone.xml:845(title) msgid "Address book toolbar button" msgstr "" -#: sflphone.xml:693(para) +#: sflphone.xml:858(para) msgid "Search for a contact" msgstr "" -#: sflphone.xml:697(para) +#: sflphone.xml:862(para) msgid "New entries should have appeared in the window. Double click on it to call the contact. You may also <menuchoice><guimenu>Right click</guimenu><guimenuitem>Edit before calling</guimenuitem></menuchoice> to modify the entry before calling." msgstr "" -#: sflphone.xml:704(title) +#: sflphone.xml:869(title) msgid "Preferences" msgstr "" -#: sflphone.xml:706(para) +#: sflphone.xml:871(para) msgid "Go to <menuchoice><guimenu>Edit</guimenu><guimenuitem>Preferences</guimenuitem></menuchoice> to access the configuration panel." msgstr "" -#: sflphone.xml:707(para) +#: sflphone.xml:872(para) msgid "Each section is detailed below." msgstr "" -#: sflphone.xml:710(title) +#: sflphone.xml:875(title) msgid "General" msgstr "" -#: sflphone.xml:711(para) +#: sflphone.xml:876(para) msgid "This section provides the user general settings regarding the application." msgstr "" -#: sflphone.xml:715(title) +#: sflphone.xml:880(title) msgid "Desktop notifications options" msgstr "" -#: sflphone.xml:729(guilabel) +#: sflphone.xml:894(guilabel) msgid "Enable notifications" msgstr "" -#: sflphone.xml:730(para) +#: sflphone.xml:895(para) msgid "Both clients use their desktop environment notification system. If checked, you will receive desktop notifications for events such as incoming calls and system messages." msgstr "" -#: sflphone.xml:734(title) +#: sflphone.xml:899(title) msgid "Example of an incoming call notification" msgstr "" -#: sflphone.xml:746(guilabel) +#: sflphone.xml:911(guilabel) msgid "Enable voicemail notifications" msgstr "" -#: sflphone.xml:747(para) +#: sflphone.xml:912(para) msgid "The voicemail notifications are handled separatly. If checked, you will be notified with the number of unread voicemails for your accounts." msgstr "" -#: sflphone.xml:751(title) +#: sflphone.xml:916(title) msgid "Example of a voicemail notification" msgstr "" -#: sflphone.xml:770(title) +#: sflphone.xml:935(title) msgid "System tray options" msgstr "" -#: sflphone.xml:784(guilabel) +#: sflphone.xml:949(guilabel) msgid "Popup main window on incoming call" msgstr "" -#: sflphone.xml:785(para) +#: sflphone.xml:950(para) msgid "If SFLphone is closed on the system tray, pops the main window up on foreground when receiving an incoming call." msgstr "" -#: sflphone.xml:790(guilabel) +#: sflphone.xml:955(guilabel) msgid "Never popup main window" msgstr "" -#: sflphone.xml:791(para) +#: sflphone.xml:956(para) msgid "If SFLphone is closed on the system tray, never pops the main window up on foreground when receiving an incoming call." msgstr "" -#: sflphone.xml:796(guilabel) +#: sflphone.xml:961(guilabel) msgid "Hide SFLphone window on startup" msgstr "" -#: sflphone.xml:797(para) +#: sflphone.xml:962(para) msgid "On startup, SFLphone will go directly on the system tray." msgstr "" -#: sflphone.xml:810(title) +#: sflphone.xml:975(title) msgid "Calls history options" msgstr "" -#: sflphone.xml:823(guilabel) +#: sflphone.xml:988(guilabel) msgid "Keep my history for at least n days" msgstr "" -#: sflphone.xml:824(para) +#: sflphone.xml:989(para) msgid "If checked, calls will be kept up to N days in the history. You may select a custom number of days. Do not check it if you don't want to use this feature." msgstr "" -#: sflphone.xml:834(title) +#: sflphone.xml:999(title) msgid "Configuration file options" msgstr "" -#: sflphone.xml:847(guilabel) +#: sflphone.xml:1012(guilabel) msgid "Store SIP credentials as MD5 hash" msgstr "" -#: sflphone.xml:848(para) +#: sflphone.xml:1013(para) msgid "If checked, your password information will be encrypted in the configuration file, instead of plain text." msgstr "" -#: sflphone.xml:859(title) +#: sflphone.xml:1024(title) msgid "Audio" msgstr "" -#: sflphone.xml:863(title) +#: sflphone.xml:1028(title) msgid "Address book" msgstr "" -#: sflphone.xml:865(para) +#: sflphone.xml:1030(para) msgid "Refer to the <link linkend=\"addressbook\">Address books</link> section for more information." msgstr "" -#: sflphone.xml:869(title) +#: sflphone.xml:1034(title) msgid "Hooks" msgstr "" -#: sflphone.xml:877(title) +#: sflphone.xml:1042(title) msgid "Direct IP calls" msgstr "" -#: sflphone.xml:878(para) +#: sflphone.xml:1043(para) msgid "Refer to the <link linkend=\"directip\">Direct IP calls</link> section for more information." msgstr "" diff --git a/sflphone-client-gnome/doc/C/sflphone.xml b/sflphone-client-gnome/doc/C/sflphone.xml index b104b8b2f8493a28a289d5a41f861170ddbadcf5..64861bea86727339f40c9243d92b5e718a580399 100644 --- a/sflphone-client-gnome/doc/C/sflphone.xml +++ b/sflphone-client-gnome/doc/C/sflphone.xml @@ -1,7 +1,8 @@ <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V4.1//EN" "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [ <!ENTITY app "SFLphone"> - <!ENTITY appversion "0.9.7 beta"> + <!ENTITY appversion "0.9.7"> + <!ENTITY docversion "1.0"> ]> <!-- =============Document Header ============================= --> @@ -9,7 +10,7 @@ <!-- please do not change the id; for translations, change lang to --> <!-- appropriate code --> <articleinfo> - <title>SFLphone Manual v1.0</title> + <title>SFLphone Manual v&docversion;</title> <copyright> <year>2006</year> @@ -73,7 +74,7 @@ <revhistory> <revision> - <revnumber>SFLphone Manual V1.0</revnumber> + <revnumber>SFLphone Manual v1.0</revnumber> <date>September 2009</date> <revdescription> <para role="author">SFLphone team</para> @@ -82,7 +83,7 @@ </revision> </revhistory> -<releaseinfo>This manual describes version 0.9.7 of SFLphone.</releaseinfo> +<releaseinfo>This manual describes SFLphone version &appversion;.</releaseinfo> </articleinfo> @@ -117,7 +118,7 @@ <sect1 id="getting-started"> <title>Getting started</title> <para> - The first time you start up sflphone, you will be ask to complete a wizard to set up your(s) account(s). This account configuration manager offers you two possibilities: + The first time you start up SFLphone, you will be ask to complete a wizard to set up your(s) account(s). This account configuration manager offers you two possibilities: <itemizedlist> <listitem> <para><guilabel>Create a free SIP/IAX2 account on sflphone.org</guilabel></para> @@ -159,7 +160,7 @@ </listitem> <listitem> <para><guilabel>Protocol</guilabel></para> - <para>Select SIP or IAX2. The most commons are SIP accounts.</para> + <para>Select SIP or IAX2. The most commonly used protocol is SIP.</para> </listitem> <listitem> <para><guilabel>Host name</guilabel></para> @@ -181,7 +182,8 @@ </listitem> <listitem><para>Click the <menuchoice><guimenu>Apply</guimenu></menuchoice> button.</para></listitem> </orderedlist> - <para>You may now check the state of your account(s). You may have as many setup accounts as you wish. If it is registered, you may now use it to make calls.</para> + <para>You may now check the state of your account(s). If it is registered, you may now use it to make calls.</para> + <note>You can setup as many accounts as you wish.</note> </sect3> <sect3 id="account_edit"> @@ -205,7 +207,7 @@ <sect3 id="account_selection"> <title>Selecting a default account</title> - <para>As it is possible to have an unlimited number of registered accounts at the same time, which account will be used when making a call ? You can not only set up a default account to be used every time you are making a call, but an entire priority list. To do that, perform the following steps:</para> + <para>Since it is possible to have an unlimited number of registered accounts at the same time, which account will be used when making a call ? You can not only set up a default account to be used every time you are making a call, but an entire priority list. To do that, perform the following steps:</para> <orderedlist> <listitem><para>Choose <menuchoice><guimenu>Edit</guimenu><guimenuitem>Manage accounts</guimenuitem></menuchoice> to access the accounts list.</para></listitem> <listitem> @@ -236,8 +238,8 @@ <sect3 id="accounts_registration"> <title>Registration</title> <para>You may set the expires header for a contact.</para> - <para>It basically represents the duration your registration will remain active. If you don't register again within that time, calls will no longer be routed to you. it should be not used as a keepalive mechanism though. The default value is 600 seconds (ten minutes).</para> - <note>To register to some VoIP services, you will need to set this value at at least 1600 seconds (Example: French VoIP server freephonie.net). + <para>It basically represents the duration your registration will remain active. If you don't register again within that time, calls will no longer be routed to you. It should not be used as a keepalive mechanism though. The default value is 600 seconds (ten minutes).</para> + <note>Some VoIP services requires that you set this value at at least 1600 seconds (e.g. the French VoIP server freephonie.net). </note> </sect3> <sect3 id="accounts_stun"> @@ -270,21 +272,37 @@ </sect2> <sect2 id="account_security"> <title>Security features</title> - <para>These features are only available with SIP.</para> - <sect3 id="accounts_zrtp"> - <title>Secure RTP</title> + <para>These features are only available with SIP.</para> + <para>Follow the indications to <link linkend='account_edit'>edit an account</link> and choose the <guimenu>Security</guimenu> tab.</para> + <!-- ==== Figure ==== --> + <figure id="account-security-fig"> + <title>Security features configuration panel</title> + <screenshot> + <mediaobject> + <imageobject> + <imagedata fileref="figures/accounts_security.png" format="PNG"/> + </imageobject> + </mediaobject> + </screenshot> + </figure> + <!-- ==== End of Figure ==== --> + + <sect3 id="realms"> + <title>Credentials</title> + <para>SFLphone supports multiple realms.</para> </sect3> - <sect3 id="accounts_tls"> - <title>TLS</title> + + <sect3 id="security_frame"> + <title>Security </title> + <para>Please refer to the section <link linkend="detailed_security_features">Security features</link> for detailed information about security features.</para> </sect3> </sect2> - </sect1> <sect1 id="call_features"> <title>Call features</title> - <para>All the following features are available with both SIP and IAX2 accounts.</para> + <para>The following features are available with both SIP and IAX2 accounts.</para> <sect2 label="Dialing a number"> <!-- ==== Figure ==== --> @@ -554,8 +572,8 @@ SFLphone conference model let you leave a conference that you are currently hosting to answer any other incoming communication or even initiate new ones. The conference is - not interupted, double clicking the conference icon - let you reintroduce it at any momment. + not interrupted, double clicking the conference icon + let you reintroduce it at any moment. </para> <!-- ==== Figure ==== --> <figure id="conference_detached-fig"> @@ -607,10 +625,113 @@ </sect1> +<sect1 id="detailed_security_features"> + <title>Security features</title> + <sect2 id="zrtp_srtp"> + <title>SRTP/ZRTP</title> + <sect3 id="zrtp_srtp_definition"> + <title>SRTP and ZRTP, the big picture</title> + <para>RTP is the underlying protocol that is used in pair with the widely used SIP protocol to carry voice data. RTP alone does not provide any security features.</para> + <para>Details for implementing Secure RTP (SRTP) were described independently in a separate document (RFC). However, in this paper, one aspect was deliberately left unspecified: how should the encryption keys be exchanged between the two parties involved in a secure RTP session ?</para> + + <para>Multiple solutions were proposed to fill in that blank. Among them, are SDES (RFC4568) and ZRTP which are probably the most popular today. For the 0.9.7 release, SFLphone integrates support for Secure RTP through the ZRTP protocol, and SDES is expected to be implemented in the very few next releases.</para> + + <para>As of today, blueprints for ZRTP are still laid out and are recognized under the name "zrtp-draftzimmerman" in the RFC machine. The author of ZRTP is Phil Zimmermann, that same person who brought us PGP. Therefore, it is not surprising that he designed ZRTP as an anti-PKI solution for key exchange.</para> + + <para>ZRTP makes possible for two parties to automatically establish a shared secret in a very simple way from the user's point of view. Indeed under SFLphone no special configuration is needed, apart from enabling the option itself.</para> + + <para>If you want to use ZRTP, please take note that if you are connecting to a PBX, this one must have been configured to support ZRTP. Unfortunately, security for VoIP communications is still young and chances are that your PBX software won't support it.</para> + + <para>This does not mean that you want be able to benefit from ZRTP ! In fact, it turns out that you will be able to use it, as long as the server does not need to decode the RTP stream. This is often the case when the person you are calling to uses a codec that you don't support. In that case, the server will need to transcode the RTP packets and obviously need to be able to handle the ZRTP stream.</para> + + <para>Obviously, if you are calling another user (for example by prefixing the number with "sip:") directly, then this one will have to support ZRTP as well if you want to use it.</para> + </sect3> + + <sect3 id="enabling_srtp"> + <title>Enabling SRTP/ZRTP</title> + <para>To enable ZRTP per account basis, perform the following steps:</para> + <orderedlist> + <listitem><para>Choose <menuchoice><guimenu>Edit</guimenu><guimenuitem>Manage accounts</guimenuitem></menuchoice>.</para></listitem> + <listitem><para>Select in the list the account you would like to edit, then click on the <guilabel>Edit</guilabel> button.</para></listitem> + <listitem><para>Select the <guilabel>Security</guilabel> tab.</para></listitem> + <listitem><para>Select <guilabel>ZRTP</guilabel> from the select box named <guilabel>SRTP Key Exchange</guilabel>.</para></listitem> + </orderedlist> + <!-- ==== Figure ==== --> + <figure id="srtp-enabled-fig"> + <title>Enabling SRTP</title> + <screenshot> + <mediaobject> + <imageobject> + <imagedata fileref="figures/srtp_enabled.png" format="PNG"/> + </imageobject> + </mediaobject> + </screenshot> + </figure> + <!-- ==== End of Figure ==== --> + </sect3> + + <sect3 id="account_zrtp"> + <title>Configuration options</title> + + <para>After enabling SRTP, click the <guilabel>Preferences</guilabel> button.</para> + <para>For basic usage, one don't have to worry about that.</para> + + <!-- ==== Figure ==== --> + <figure id="zrtp-options-fig"> + <title>ZRTP configuration panel</title> + <screenshot> + <mediaobject> + <imageobject> + <imagedata fileref="figures/zrtp_options.png" format="PNG"/> + </imageobject> + </mediaobject> + </screenshot> + </figure> + <!-- ==== End of Figure ==== --> + + + <variablelist> + <varlistentry> + <term><guilabel>Send Hello Hash in SDP</guilabel></term> + <listitem><para>Selecting this option will cause the program to compute an hash function over the "Hello" packet and send it as an SDP field "zrtp-hash:". The remote end might be interested in getting this value to add an additional layer of protection based on another communication channel. Upon receiving this value, the remote point can compute the hash function on the received hello packet and compare it.</para> + <para>Take note that for 0.9.7, SFLphone does not perform the comparison on its side.</para></listitem> + </varlistentry> + + <varlistentry> + <term><guilabel>Ask user to confirm SAS</guilabel></term> + <listitem><para>The short authentication mechanism is at the heart of the ZRTP protocol. Not requiring the user to manually check the SAS value presents a security risk over Man in the Middle type of attacks.</para> + + <para>Disabling this option will stop the program from prompting the user with the SAS.</para> + + <para>Such an option was motivated to be developed at that time by the the state of the libzrtpcpp library that SFLphone was making use of. It is only from version x.x that this library can cache results of SAS computation between two peers.</para> + </listitem> + </varlistentry> + + <varlistentry> + <term><guilabel>Display SAS once for hold event</guilabel></term> + <listitem><para>When call is put on hold, the RTP stream is stopped and reinitiated later. From the ZRTP point of view, this appears as a "new call". Therefore, the SAS will be redisplayed unless this option is selected.</para></listitem> + </varlistentry> + <varlistentry> + <term><guilabel>ZRTP for direct peer-to-peer calls</guilabel></term> + <listitem><para>If you want to use ZRTP for calls that are placed directly to a user (without an intervening PBX), you must enable the option under the "Direct IP Calls" tab in the "configuration" window, available from the "edit" menu.</para> + + <para>Configuration instruction from that point are the same as for configured accounts.</para> + </listitem> + </varlistentry> + </variablelist> + </sect3> + </sect2> + <sect2 id="accounts_tls"> + <title>TLS</title> + </sect2> +</sect1> + + + <sect1 id="audio_interfaces"> <title>Audio configuration</title> <para> - ALSA and Pulseaudio native interfaces are available. + ALSA and PulseAudio native interfaces are available. </para> <sect2 label="Pulseaudio"> @@ -626,13 +747,13 @@ <sect1 id="codecs_overview"> <title>Codecs overview</title> - <para>SFLphone supports several widely used audio codec:</para> + <para>SFLphone supports several widely used audio codecs:</para> <para> <itemizedlist> <listitem> <guilabel>PCMU/PCMA</guilabel> <para> - ITU-T telefony standard PCM formats, 8kHz, 64 + ITU-T telephony standard PCM formats, 8kHz, 64 kbit/s, using logarithmic byte compression algorithm. </para> </listitem> @@ -653,7 +774,7 @@ <guilabel>SPEEX</guilabel> <para> High quality voice encoding/decoding available - in narrowband 8Khz, wideband 16khz (HD Voice), + in narrowband 8kHz, wideband 16kHz (HD Voice), and ultra-wideband 32 kHz. Integrate additional features such as Variable Bit Rate (VBR) and noise reduction. @@ -791,7 +912,7 @@ <varlistentry> <term><guilabel>Enable voicemail notifications</guilabel></term> <listitem><para> - The voicemail notifications are handled separatly. If checked, you will be notified with the number of unread voicemails for your accounts. + The voicemail notifications are handled separately. If checked, you will be notified with the number of unread voicemails for your accounts. </para> <figure id="voicemail-notif-fig"> <title>Example of a voicemail notification</title> diff --git a/sflphone-client-gnome/doc/Makefile.am b/sflphone-client-gnome/doc/Makefile.am index f258a20f31789d926de96481a9e3615042a553f6..6727048ed8b2627be0c82e25f8555fd0cb40c51f 100644 --- a/sflphone-client-gnome/doc/Makefile.am +++ b/sflphone-client-gnome/doc/Makefile.am @@ -24,8 +24,11 @@ DOC_FIGURES = figures/addressbook-button.png \ figures/systemtray-settings.png \ figures/voicemail-notif.png \ figures/account_advanced.png \ + figures/accounts_security.png \ figures/drag_n_drop.png \ figures/conference.png \ figures/conference_detached.png \ - figures/conference_attached.png + figures/conference_attached.png \ + figures/srtp_enabled.png \ + figures/zrtp_options.png DOC_LINGUAS = fr es diff --git a/sflphone-client-gnome/doc/es/es.po b/sflphone-client-gnome/doc/es/es.po new file mode 100644 index 0000000000000000000000000000000000000000..2d243741c05756549b4ea9bd29ad2b1849021b57 --- /dev/null +++ b/sflphone-client-gnome/doc/es/es.po @@ -0,0 +1,1356 @@ +# Spanish translation for sflphone +# Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 +# This file is distributed under the same license as the sflphone package. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: sflphone\n" +"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" +"POT-Creation-Date: 2009-10-26 15:41-0400\n" +"PO-Revision-Date: 2009-12-09 15:04+0000\n" +"Last-Translator: Maxime Chambreuil <maxime.chambreuil@gmail.com>\n" +"Language-Team: Spanish <es@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2009-12-09 20:52+0000\n" +"X-Generator: Launchpad (build Unknown)\n" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:230(None) +msgid "" +"@@image: 'figures/account_advanced.png'; md5=8cc040a5f56fe61566ad7b0fa83955d9" +msgstr "" +"@@image: 'figures/account_advanced.png'; md5=8cc040a5f56fe61566ad7b0fa83955d9" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:296(None) +msgid "@@image: 'figures/dial.png'; md5=81ff4280c293e62a49fad3a4b61b9bb5" +msgstr "@@image: 'figures/dial.png'; md5=81ff4280c293e62a49fad3a4b61b9bb5" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:311(None) +msgid "" +"@@image: 'figures/call-second.png'; md5=fa490e3b07eebaa9f4ff719f579d68ef" +msgstr "" +"@@image: 'figures/call-second.png'; md5=fa490e3b07eebaa9f4ff719f579d68ef" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:330(None) +msgid "@@image: 'figures/call.png'; md5=ecd96beec76f808b5c1469ecc1293237" +msgstr "@@image: 'figures/call.png'; md5=ecd96beec76f808b5c1469ecc1293237" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:348(None) +msgid "@@image: 'figures/answer.png'; md5=c168995c6b36b5d200c49d1c02c2ea52" +msgstr "@@image: 'figures/answer.png'; md5=c168995c6b36b5d200c49d1c02c2ea52" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:365(None) +msgid "@@image: 'figures/hangup.png'; md5=0cac4dfe3a9a4bdf4d12229f77e3723a" +msgstr "@@image: 'figures/hangup.png'; md5=0cac4dfe3a9a4bdf4d12229f77e3723a" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:385(None) +msgid "@@image: 'figures/refuse.png'; md5=34b6cbf068e56163058e79de3ca70c59" +msgstr "@@image: 'figures/refuse.png'; md5=34b6cbf068e56163058e79de3ca70c59" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:403(None) +msgid "@@image: 'figures/holdon.png'; md5=655078b8b495ada29f65b58501187d16" +msgstr "@@image: 'figures/holdon.png'; md5=655078b8b495ada29f65b58501187d16" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:415(None) +msgid "@@image: 'figures/holdoff.png'; md5=e06b8eba03f1545cd18891630b22f281" +msgstr "@@image: 'figures/holdoff.png'; md5=e06b8eba03f1545cd18891630b22f281" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:430(None) +msgid "@@image: 'figures/transfer.png'; md5=92f921c7c6ba4ee2487ccf6e02226d9a" +msgstr "" +"@@image: 'figures/transfer.png'; md5=92f921c7c6ba4ee2487ccf6e02226d9a" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:444(None) +msgid "" +"@@image: 'figures/transfer-go.png'; md5=553b57d5a9fc9f248ba15cecc32d343f" +msgstr "" +"@@image: 'figures/transfer-go.png'; md5=553b57d5a9fc9f248ba15cecc32d343f" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:465(None) +msgid "" +"@@image: 'figures/rec-settings.png'; md5=27d51e45ff23dde58b0512f90773f6ce" +msgstr "" +"@@image: 'figures/rec-settings.png'; md5=27d51e45ff23dde58b0512f90773f6ce" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:478(None) +msgid "@@image: 'figures/record.png'; md5=7a594660924940e8def9ecfcee0e8cb4" +msgstr "@@image: 'figures/record.png'; md5=7a594660924940e8def9ecfcee0e8cb4" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:496(None) +msgid "" +"@@image: 'figures/voicemail.png'; md5=36dbeb4bcc6a68519d474552a888ce1e" +msgstr "" +"@@image: 'figures/voicemail.png'; md5=36dbeb4bcc6a68519d474552a888ce1e" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:684(None) +msgid "" +"@@image: 'figures/addressbook-button.png'; " +"md5=b4a820013ef8b8f48e7de780a66c7800" +msgstr "" +"@@image: 'figures/addressbook-button.png'; " +"md5=b4a820013ef8b8f48e7de780a66c7800" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:719(None) +msgid "" +"@@image: 'figures/desktop-notif-settings.png'; " +"md5=2bca85d6d9871883399481b994bd3384" +msgstr "" +"@@image: 'figures/desktop-notif-settings.png'; " +"md5=2bca85d6d9871883399481b994bd3384" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:738(None) +msgid "" +"@@image: 'figures/notif-example.png'; md5=d09008bedcaee435b12cd165d42e39b7" +msgstr "" +"@@image: 'figures/notif-example.png'; md5=d09008bedcaee435b12cd165d42e39b7" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:755(None) +msgid "" +"@@image: 'figures/voicemail-notif.png'; md5=a33ed4ce4b693d67ee453b4ef1fa6c30" +msgstr "" +"@@image: 'figures/voicemail-notif.png'; md5=a33ed4ce4b693d67ee453b4ef1fa6c30" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:774(None) +msgid "" +"@@image: 'figures/systemtray-settings.png'; " +"md5=638612a08eb31eb768c4f08ace9c909a" +msgstr "" +"@@image: 'figures/systemtray-settings.png'; " +"md5=638612a08eb31eb768c4f08ace9c909a" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:814(None) +msgid "" +"@@image: 'figures/callshistory-settings.png'; " +"md5=287d8aed7d7c71752257c64e89a9127d" +msgstr "" +"@@image: 'figures/callshistory-settings.png'; " +"md5=287d8aed7d7c71752257c64e89a9127d" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:838(None) +msgid "" +"@@image: 'figures/configfile-settings.png'; " +"md5=eb4a5545f137b825dcdaf0396a9f1a7d" +msgstr "" +"@@image: 'figures/configfile-settings.png'; " +"md5=eb4a5545f137b825dcdaf0396a9f1a7d" + +#: sflphone.xml:12(title) +msgid "SFLphone Manual v1.0" +msgstr "Manual v1.0 de SFLphone" + +#: sflphone.xml:15(year) +msgid "2006" +msgstr "2006" + +#: sflphone.xml:16(year) +msgid "2007" +msgstr "2007" + +#: sflphone.xml:17(year) +msgid "2008" +msgstr "2008" + +#: sflphone.xml:18(year) +msgid "2009" +msgstr "2009" + +#: sflphone.xml:19(holder) sflphone.xml:32(publishername) sflphone.xml:80(para) +msgid "Savoir-faire Linux" +msgstr "Savoir-faire Linux" + +#: sflphone.xml:26(para) +msgid "" +"SFLphone is an enterprise-class SIP/IAX2 compatible softphone for GNU/Linux, " +"published under the GPLv3 license." +msgstr "" +"SFLphone es un softphone de clase empresarial compatible con SIP y IAX2 para " +"GNU/Linux, publicado bajo la licencia GPLv3." + +#: sflphone.xml:36(para) +msgid "" +"Permission is granted to copy, distribute and/or modify this document under " +"the terms of the GNU Free Documentation Licence (GFDL), Version 1.1 or any " +"later version published by the Free Software Foundation with no Invariant " +"Sections, no Front-Cover Texts, and no Back-Cover Texts. You can find a copy " +"of the GFDL at this <ulink type=\"help\" url=\"ghelp:fdl\">link</ulink> or " +"in the file COPYING-DOCS distributed with this manual." +msgstr "" +"Se concede permiso para copiar, distribuir y/o modificar este documento bajo " +"los términos de la Licencia de Documentación Libre de GNU, Versión 1.1 o " +"cualquier otra versión posterior publicada por la Free Software Foundation; " +"sin Secciones Invariantes ni Textos de Cubierta Delantera ni Textos de " +"Cubierta Trasera. Una copia de la licencia está incluida <ulink " +"type=\"help\" url=\"ghelp:fdl\">aqui</ulink> o en al archivo COPYING-DOCS " +"distribuido con ese manual." + +#: sflphone.xml:37(para) +msgid "" +"This manual is part of a collection of GNOME manuals distributed under the " +"GFDL. If you want to distribute this manual separately from the collection, " +"you can do so by adding a copy of the licence to the manual, as described in " +"section 6 of the licence." +msgstr "" +"Ese manual es parte de los manuales de GNOME, distribuidos bajo la GFDL. Si " +"quiere distribuir ese manual separadamente de la colecciòn, puede hacerlo " +"añando una copia de la licencia a ese manual, como describiendo a la secciòn " +"6 de la licencia." + +#: sflphone.xml:42(firstname) +msgid "Pierre-Luc" +msgstr "Pierre-Luc" + +#: sflphone.xml:43(surname) +msgid "Bacon" +msgstr "Bacon" + +#: sflphone.xml:45(email) +msgid "pierre-luc.bacon@savoirfairelinux.com" +msgstr "pierre-luc.bacon@savoirfairelinux.com" + +#: sflphone.xml:50(firstname) +msgid "Emmanuel" +msgstr "Emmanuel" + +#: sflphone.xml:51(surname) +msgid "Milou" +msgstr "Milou" + +#: sflphone.xml:53(email) +msgid "emmanuel.milou@savoirfairelinux.com" +msgstr "emmanuel.milou@savoirfairelinux.com" + +#: sflphone.xml:58(firstname) +msgid "Jérémy" +msgstr "Jérémy" + +#: sflphone.xml:59(surname) +msgid "Quentin" +msgstr "Quentin" + +#: sflphone.xml:61(email) +msgid "jeremy.quentin@savoirfairelinux.com" +msgstr "jeremy.quentin@savoirfairelinux.com" + +#: sflphone.xml:66(firstname) +msgid "Alexandre" +msgstr "Alexandre" + +#: sflphone.xml:67(surname) +msgid "Savard" +msgstr "Savard" + +#: sflphone.xml:69(email) +msgid "alexandre.savard@savoirfairelinux.com" +msgstr "alexandre.savard@savoirfairelinux.com" + +#: sflphone.xml:76(revnumber) +msgid "SFLphone Manual V1.0" +msgstr "Manual v. 1.0 de SFLphone" + +#: sflphone.xml:77(date) +msgid "September 2009" +msgstr "Septiembre del 2009" + +#: sflphone.xml:79(para) +msgid "SFLphone team" +msgstr "Equipo de SFLphone" + +#: sflphone.xml:85(releaseinfo) +msgid "This manual describes version 0.9.7 of SFLphone." +msgstr "Este manual describe la versión 0.9.7 de SFLphone." + +#: sflphone.xml:90(primary) +msgid "SFLphone" +msgstr "SFLphone" + +#: sflphone.xml:94(title) +msgid "Introduction" +msgstr "Introducción" + +#: sflphone.xml:95(para) +msgid "" +"<application>SFLphone</application> is a SIP/IAX2 softphone and VoIP client " +"for GNU/Linux. It aims at being a robust enterprise-class desktop phone and " +"has been designed with a hundred-calls-a-day receptionist in mind." +msgstr "" +"<application>SFLphone</application> es un softphone SIP y IAX2 y cliente " +"VoIP para GNU/Linux. Està dirigido a ser un telefono robusto de clase " +"empresarial y fue diseñado por una recepcionista de cien llamadas al dia." + +#: sflphone.xml:98(para) +msgid "" +"<application>SFLphone</application> is a free software and is distributed " +"under the GNU General Public License version 3. It is developed by Savoir-" +"Faire Linux, a Canadian Linux consulting company, in partnership with the " +"global community." +msgstr "" +"<application>SFLphone</application> es un software libre distribuido bajo la " +"Licencia Pública General de GNU versión 3. Esta desarrollando por Savoir-" +"Faire Linux, una empresa canadiense de consultorio Linux, en colaboración " +"con la comunidad global." + +#: sflphone.xml:101(para) +msgid "" +"Among the many features we developed for you, we could highlight the high " +"definition sound (wide-band audio codecs - speex, G722, Celt), multiple " +"conference call, audio recording, voicemail notification, and call history. " +"More than a simple softphone, <application>SFLphone</application> supports " +"advanced enterprise-class call features: unlimited number of calls, call " +"transfer, and on/off hold option." +msgstr "" +"Entre las muchas características que desarrollamos para usted, nosotros " +"podría destacar el alto sonido de la definición (codificadores-decodificador " +"audios de la banda ancha - speex, G722, Celt), la audioconferencia múltiple, " +"la grabación audio, la notificación del buzón de voz, y la historia de " +"llamada. Más que un softphone simple, <application>SFLphone</application> " +"soporta características de llamadas avanzadas de clase empresarial : número " +"ilimitado de llamadas, transferencia de llamadas, y opción de llamadas en " +"espera." + +#: sflphone.xml:108(para) +msgid "" +"This release also provides advanced security features (secure RTP and TLS)." +msgstr "" +"Esta versión también tiene características avanzadas de seguridad (RTP " +"seguro y TLS)." + +#: sflphone.xml:112(para) +msgid "" +"Besides the native ALSA interface, <application>SFLphone</application> now " +"fully supports PulseAudio sound server so you could experience the great " +"possibilities it offers (sound mixing, per application volume control, ...)." +msgstr "" +"Además del interfaz nativo ALSA, <application>SFLphone</application> ahora " +"soporta completamente el servidor de sonidos PulseAudio así que usted podría " +"experimentar las grandes posibilidades que ofrece (mezcla de sonidos, " +"control de volumen por aplicación,…)." + +#: sflphone.xml:118(title) +msgid "Getting started" +msgstr "Cómo empezar" + +#: sflphone.xml:123(guilabel) +msgid "Create a free SIP/IAX2 account on sflphone.org" +msgstr "Crear una cuenta SIP/IAS2 gratuita en sflphone.org" + +#: sflphone.xml:124(para) +msgid "" +"Savoir-faire Linux provides free SIP/IAX2 accounts on an Asterisk server. By " +"clicking this option, you will be created an account to make test calls. The " +"echo service is available, you may also call other accounts registered to " +"the same server." +msgstr "" +"Savoir-faire Linux proporciona cuentas libres SIP y IAX2 en un servidor " +"Asterisk. Chascando esta opción, le crearán una cuenta para hacer llamadas " +"de prueba. El servicio de echo está disponible, usted puede también llamar " +"otras cuentas registradas al mismo servidor." + +#: sflphone.xml:126(para) +msgid "" +"By filling out your email address information, you will receive voicemail " +"notifications by email. This information is not mandatory to get your free " +"account." +msgstr "" +"Completando su información de correo electronico, usted recibirá " +"notificaciones del buzón de voz por correo. Esta información no es " +"obligatoria para conseguir su cuenta libre." + +#: sflphone.xml:129(guilabel) +msgid "Register an existing SIP or IAX2 account" +msgstr "Registrar una cuenta SIP o IAX2 existente" + +#: sflphone.xml:130(para) +msgid "" +"Click there if you already have an account and you want to use it with " +"SFLphone. You will be prompted to select the account type (SIP or IAX2) and " +"to fill out your account information. <application>SFLphone</application> " +"will then try to register it so you could start using it." +msgstr "" +"Chasque allí si usted tiene ya una cuenta y quiere utilizarla con SFLphone. " +"Le preguntarán a seleccionar el tipo de la cuenta (SIP o IAX2) y completar " +"su información de cuenta. <application>SFLphone</application> intentará " +"registrarla así que usted podría comenzar a usarla." + +#: sflphone.xml:119(para) +msgid "" +"The first time you start up sflphone, you will be ask to complete a wizard " +"to set up your(s) account(s). This account configuration manager offers you " +"two possibilities: <placeholder-1/>" +msgstr "" +"La primera vez que usted inicià sflphone, usted será pidiendo terminar a un " +"mago para configurar su(s) cuenta(s). Este encargado de configuración de " +"cuenta ofrece dos posibilidades: <placeholder-1/>" + +#: sflphone.xml:135(para) +msgid "" +"You can always access the account creation manager: " +"<menuchoice><guimenu>Edit</guimenu><guimenuitem>Account creation " +"assistant</guimenuitem></menuchoice>." +msgstr "" +"Usted puede tener acceso siempre al encargado de creación de cuenta: " +"<menuchoice><guimenu>Editar</guimenu><guimenuitem>Asistante de creación de " +"cuenta</guimenuitem></menuchoice>" + +#: sflphone.xml:141(title) +msgid "Managing your accounts" +msgstr "Administrar sus cuentas" + +#: sflphone.xml:142(para) +msgid "" +"<application>SFLphone</application> supports both IAX2 and SIP accounts." +msgstr "<application>SFLphone</application> soporta cuentas IAX2 y SIP." + +#: sflphone.xml:148(title) +msgid "Basic features" +msgstr "Características básicas" + +#: sflphone.xml:150(title) +msgid "Creating a new account" +msgstr "Crear una cuenta nueva" + +#: sflphone.xml:151(para) +msgid "To create a new account, perform the following steps:" +msgstr "Para crear una cuenta nueva, sigue los siguientes pasos:" + +#: sflphone.xml:153(para) sflphone.xml:191(para) sflphone.xml:201(para) +msgid "" +"Choose <menuchoice><guimenu>Edit</guimenu><guimenuitem>Manage " +"accounts</guimenuitem></menuchoice>." +msgstr "" +"Escoje <menuchoice><guimenu>Editar</guimenu><guimenuitem>Administrar " +"cuentas</guimenuitem></menuchoice>." + +#: sflphone.xml:154(para) +msgid "" +"Click on the <guilabel>Add</guilabel> button. Fill out the following " +"information:" +msgstr "" +"Chasque <guilabel>Añadir</guilabel>botón. Complete la información siguiente:" + +#: sflphone.xml:157(guilabel) +msgid "Alias" +msgstr "Alias" + +#: sflphone.xml:158(para) +msgid "" +"The name to identify your account in the list. It is not used for the " +"communications" +msgstr "" +"El nombre para identificar tu cuenta en la lista. No se usará para las " +"comunicaciones." + +#: sflphone.xml:161(guilabel) +msgid "Protocol" +msgstr "Protocolo" + +#: sflphone.xml:162(para) +msgid "Select SIP or IAX2. The most commons are SIP accounts." +msgstr "Selecciona SIP o IAX2. Las más comunes son las cuentas SIP." + +#: sflphone.xml:165(guilabel) +msgid "Host name" +msgstr "Nombre del equipo" + +#: sflphone.xml:166(para) +msgid "The name or the IP address of the server you want to register on." +msgstr "Nombre o dirección IP del servidor en el que quieres registrarte." + +#: sflphone.xml:169(guilabel) +msgid "User name" +msgstr "Nombre de usuario" + +#: sflphone.xml:170(para) +msgid "The name or the extension for your account." +msgstr "El nombre o la extensiòn de su cuenta." + +#: sflphone.xml:173(guilabel) +msgid "Password" +msgstr "Contraseña" + +#: sflphone.xml:174(para) +msgid "The password for your account." +msgstr "La contraseña para tu cuenta." + +#: sflphone.xml:177(guilabel) +msgid "Voicemail number" +msgstr "Número de buzón de voz" + +#: sflphone.xml:178(para) +msgid "" +"The number to dial to reach your voicemail. Example: 888, or *97. It will be " +"used as a quick dial button on the main interface." +msgstr "" +"El número para alcanzar su buzón de voz. Ejemplo: 888, o *97. Será utilizado " +"como botón para marcar rápido en el interfaz principal." + +#: sflphone.xml:182(para) +msgid "Click the <menuchoice><guimenu>Apply</guimenu></menuchoice> button." +msgstr "" +"Da le clic al buttòn <menuchoice><guimenu>Aplicar</guimenu></menuchoice>." + +#: sflphone.xml:184(para) +msgid "" +"You may now check the state of your account(s). You may have as many setup " +"accounts as you wish. If it is registered, you may now use it to make calls." +msgstr "" +"Usted puede ahora comprobar el estado de sus cuentas. Usted puede tener " +"tantas cuentas como usted desea. Si se registra, usted puede ahora " +"utilizarla para hacer llamadas." + +#: sflphone.xml:188(title) +msgid "Editing a configured account" +msgstr "Editar una cuenta configurada" + +#: sflphone.xml:189(para) +msgid "To edit an existing account, perform the following steps:" +msgstr "Para editar una cuenta existente, sigue los pasos siguientes:" + +#: sflphone.xml:192(para) +msgid "" +"Select in the list the account you would like to edit, then click on the " +"<guilabel>Edit</guilabel> button." +msgstr "" +"Seleccione en la lista la cuenta que usted quisiera corregir, después " +"chasque encendido el botón de <guilabel>Editar</guilabel>." + +#: sflphone.xml:193(para) +msgid "" +"Make your modifications, then click on the <guilabel>Apply</guilabel> button." +msgstr "" +"Haga sus modificaciones, después chasque encendido el botón de " +"<guilabel>Aplicar</guilabel>." + +#: sflphone.xml:198(title) +msgid "Deleting an account" +msgstr "Borrar una cuenta" + +#: sflphone.xml:199(para) +msgid "To delete an existing account, perform the following steps:" +msgstr "Para borrar una cuenta existente, sigue los pasos siguientes:" + +#: sflphone.xml:202(para) +msgid "" +"Select in the list the account you would like to delete, then click on the " +"<guibutton>Delete</guibutton> button." +msgstr "" +"Seleccione en la lista la cuenta que usted quisiera suprimir, después " +"chasque encendido el botón de <guibutton>Suprimir</guibutton>." + +#: sflphone.xml:207(title) +msgid "Selecting a default account" +msgstr "Selección de una cuenta por defecto" + +#: sflphone.xml:208(para) +msgid "" +"As it is possible to have an unlimited number of registered accounts at the " +"same time, which account will be used when making a call ? You can not only " +"set up a default account to be used every time you are making a call, but an " +"entire priority list. To do that, perform the following steps:" +msgstr "" +"¿Pues es posible tener un número ilimitado de cuentas registradas al mismo " +"tiempo, cual cuenta será utilizada para hacer una llamada? No sólo usted " +"puede fijar una cuenta por defecto que se utilizarán cada vez que usted está " +"haciendo una llamada, pero tambien una lista de prioridad. Para hacer eso, " +"realice los pasos siguientes:" + +#: sflphone.xml:210(para) +msgid "" +"Choose <menuchoice><guimenu>Edit</guimenu><guimenuitem>Manage " +"accounts</guimenuitem></menuchoice> to access the accounts list." +msgstr "" +"Escoje <menuchoice><guimenu>Editar</guimenu><guimenuitem>Administrar " +"cuentas</guimenuitem></menuchoice> para ver la lista de cuentas." + +#: sflphone.xml:212(para) +msgid "" +"The first account in the account in list will be used as the default account " +"to make calls with. If it is not registered, SFLphone will try to use the " +"second in the list, if still not registered, the third, and so one ..." +msgstr "" +"La primera cuenta en la lista será utilizada como la cuenta por defecto para " +"hacer llamadas. Si no se registra, SFLphone intentará utilizar la segunda en " +"la lista, si tampoco se registra, la tercera, etc…" + +#: sflphone.xml:213(para) +msgid "" +"To reorder the accounts as you wish, select an account and click on the " +"<menuchoice><guimenu>Up</guimenu></menuchoice> or " +"<menuchoice><guimenu>Down</guimenu></menuchoice> button." +msgstr "" +"Para reordenar las cuentas como usted desea, seleccione una cuenta y chasque " +"encendido el botón de <menuchoice><guimenu>Arribá</guimenu></menuchoice> o " +"de <menuchoice><guimenu>Abajo</guimenu></menuchoice>." + +#: sflphone.xml:216(para) +msgid "" +"Note that you also can select an account to make a call with when dialing by " +"right-clicking on it." +msgstr "" +"Observe que usted también puede seleccionar una cuenta para hacer una " +"llamada, cuando usted esta marcando, haciendo clic con el botón derecho en " +"la llamada." + +#: sflphone.xml:221(title) +msgid "Advanced features" +msgstr "Características avanzadas" + +#: sflphone.xml:222(para) sflphone.xml:273(para) +msgid "These features are only available with SIP." +msgstr "Estas características sólo están disponibles con SIP." + +#: sflphone.xml:223(para) +msgid "" +"Follow the indications to <link linkend=\"account_edit\">edit an " +"account</link> and choose the <guimenu>Advanced</guimenu> tab." +msgstr "" +"Siga las indicaciones para <link linkend=\"account_edit\">editar una " +"cuenta</link> y elija la pestaña <guimenu>Avanzadas</guimenu>." + +#: sflphone.xml:226(title) +msgid "Advanced features configuration panel" +msgstr "Panel de configuración de características avanzadas" + +#: sflphone.xml:237(title) +msgid "Registration" +msgstr "Registro" + +#: sflphone.xml:238(para) +msgid "You may set the expires header for a contact." +msgstr "Usted puede fijar el encabezamiento expira para un contacto." + +#: sflphone.xml:239(para) +msgid "" +"It basically represents the duration your registration will remain active. " +"If you don't register again within that time, calls will no longer be routed " +"to you. it should be not used as a keepalive mechanism though. The default " +"value is 600 seconds (ten minutes)." +msgstr "" +"Representa básicamente la duración que su registro seguirá siendo activo. Si " +"usted no se registra otra vez dentro de ese tiempo, las llamadas no serán " +"encaminadas a usted. Sin embargo no debe ser utilizado como mecanismo de " +"keepalive. El valor prefijado es 600 segundos (diez minutos)." + +#: sflphone.xml:240(note) +msgid "" +"To register to some VoIP services, you will need to set this value at at " +"least 1600 seconds (Example: French VoIP server freephonie.net)." +msgstr "" +"Para registrarse a algunos servicios de VoIP, usted necesitará fijar este " +"valor a por lo menos 1600 segundos (ejemplo: Servidor de VoIP francés " +"freephonie.net)." + +#: sflphone.xml:244(title) sflphone.xml:873(title) +msgid "Network" +msgstr "Red" + +#: sflphone.xml:245(para) +msgid "This section enables you to set advanced network parameters." +msgstr "Esta sección le permite fijar parámetros de red avanzados." + +#: sflphone.xml:248(guilabel) +msgid "Local address" +msgstr "Dirección local" + +#: sflphone.xml:249(para) +msgid "" +"it is initialized to your private/local IP address. Calls will be routed to " +"this address by default." +msgstr "" +"se inicializa a su dirección IP privada/local. Las llamadas serán " +"encaminadas a esta dirección por defecto." + +#: sflphone.xml:252(guilabel) +msgid "Local port" +msgstr "Puerto local" + +#: sflphone.xml:253(para) +msgid "It is initialized to the default SIP port, 5060." +msgstr "Se inicia al puerto SIP por defecto, 5060." + +#: sflphone.xml:256(guilabel) +msgid "Set published address and port" +msgstr "Fije la dirección publicada y el puerto" + +#: sflphone.xml:260(para) +msgid "" +"If enabled, the core will try to initialize an UDP transport on the mapped " +"address/port number that the NAT (Network Address Translator) has allocated " +"to <application>SFLphone</application>." +msgstr "" +"Si está activada, la base intentará inicializar un transporte UDP con la " +"dirección y puerto que el NAT (traductor de dirección de red) ha asignado a " +"<application>SFLphone</application>." + +#: sflphone.xml:259(listitem) +msgid "Using STUN <placeholder-1/>" +msgstr "Usando STUN <placeholder-1/>" + +#: sflphone.xml:261(listitem) +msgid "Same as local parameters" +msgstr "Igual que parámetros locales" + +#: sflphone.xml:263(listitem) +msgid "Manually" +msgstr "Manualmente" + +#: sflphone.xml:272(title) +msgid "Security features" +msgstr "Características de seguridad" + +#: sflphone.xml:275(title) +msgid "Secure RTP" +msgstr "RTP seguro" + +#: sflphone.xml:278(title) +msgid "TLS" +msgstr "TLS" + +#: sflphone.xml:285(title) +msgid "Call features" +msgstr "Características de llamada" + +#: sflphone.xml:287(para) +msgid "" +"All the following features are available with both SIP and IAX2 accounts." +msgstr "" +"Todas las características siguientes están disponibles con las cuentas SIP e " +"IAX2." + +#: sflphone.xml:292(title) +msgid "Dial button" +msgstr "Botón de marcado" + +#. ==== End of Figure ==== +#: sflphone.xml:303(para) +msgid "" +"You may have an unlimited number of calls at the same time, even with " +"different accounts." +msgstr "" +"Usted puede tener un número ilimitado de llamadas al mismo tiempo, incluso " +"con diferentes cuentas." + +#: sflphone.xml:304(para) +msgid "" +"To create a new call when you already have a current call, just click on the " +"<guilabel>Dial</guilabel> button. The current call will automatically be put " +"on hold." +msgstr "" +"Para crear una nueva llamada cuando usted tiene ya una llamada actual, " +"apenas chasque encendido el botón de <guilabel>Marcar</guilabel>. La llamada " +"actual será automáticamente en espera." + +#: sflphone.xml:307(title) +msgid "Make an other call" +msgstr "Realizar otra llamada" + +#. ==== End of Figure ==== +#: sflphone.xml:318(para) +msgid "" +"Keyboard shortcut to perform this action: <accel>NUMPAD</accel> or almost " +"any keys." +msgstr "" +"Atajo de teclado para realizar esta acción: <accel>NUMPAD</accel> o casi " +"cualquier clave." + +#: sflphone.xml:326(title) +msgid "Call button" +msgstr "Botón de llamada" + +#. ==== End of Figure ==== +#: sflphone.xml:337(para) sflphone.xml:355(para) +msgid "Keyboard shortcut to perform this action: <accel>Enter</accel>." +msgstr "Atajo de teclado para realizar esta acción: <accel>Enter</accel>." + +#: sflphone.xml:344(title) +msgid "Answer button" +msgstr "Botón de respuesta" + +#: sflphone.xml:361(title) +msgid "Hangup button" +msgstr "Botón de colgado" + +#. ==== End of Figure ==== +#: sflphone.xml:372(para) sflphone.xml:392(para) +msgid "Keyboard shortcut to perform this action: <accel>ESC</accel>." +msgstr "Atajo de teclado para realizar esta acción: <accel>ESC</accel>." + +#: sflphone.xml:377(para) +msgid "" +"When you refuse a call, your caller is automatically redirected to your " +"voicemail box, if applicable." +msgstr "" +"Cuando usted rechaza una llamada, su llamador esta redirigido " +"automáticamente a su caja de buzón de voz, si fuera aplicable." + +#: sflphone.xml:381(title) +msgid "Refuse button" +msgstr "Botón de rechazar" + +#: sflphone.xml:399(title) +msgid "Hold on button" +msgstr "Botón es espera" + +#: sflphone.xml:411(title) +msgid "Hold off button" +msgstr "Botón seguir" + +#: sflphone.xml:426(title) +msgid "Transfer button" +msgstr "Botón transferir" + +#. ==== End of Figure ==== +#: sflphone.xml:437(para) +msgid "Then type the number you want to transfer the current call to." +msgstr "Despuès marca el número para transferir la llamada actual." + +#: sflphone.xml:440(title) +msgid "Validate the transfer" +msgstr "Valide la transferencia" + +#. ==== End of Figure ==== +#: sflphone.xml:451(para) +msgid "" +"And press <accel>Enter</accel>. Clicking again on the transfer button " +"cancels the transfer." +msgstr "" +"Y prensa <accel>Enter</accel>. Chascar otra vez en el botón de la " +"transferencia cancela la transferencia." + +#: sflphone.xml:457(para) +msgid "" +"Go to " +"<menuchoice><guimenu>Edit</guimenu><guimenuitem>Preferences</guimenuitem><gui" +"menuitem>Audio</guimenuitem></menuchoice> to configure the recordings " +"destination folder." +msgstr "" +"Vaya a " +"<menuchoice><guimenu>Editar</guimenu><guimenuitem>Preferencias</guimenuitem><" +"guimenuitem>Audio</guimenuitem></menuchoice> para configurar la carpeta de " +"la destinación de las grabaciones." + +#: sflphone.xml:461(title) +msgid "Record settings" +msgstr "Recordar parámetros" + +#: sflphone.xml:474(title) +msgid "Record button" +msgstr "Botón de grabación" + +#: sflphone.xml:488(caution) +msgid "" +"This feature is available only if you fill out the voicemail number " +"information for your default account." +msgstr "" +"Esta característica está disponible solamente si usted completa la " +"información del número del buzón de voz para su cuenta por defecto." + +#: sflphone.xml:492(title) +msgid "Voicemail button" +msgstr "Botón del buzón de voz" + +#: sflphone.xml:506(para) +msgid "" +"A direct IP call is a call established between two peers without any " +"accounts. When dialing, such a call must prefixed with " +"<guilabel>sip:</guilabel>." +msgstr "" +"Una llamada IP directa es una llamada establecida entre dos pares sin " +"ningunas cuentas. Al marcar, ese typo de lamada debe ser prefijada con " +"<guilabel>sip: </guilabel>." + +#: sflphone.xml:508(para) +msgid "" +"Direct IP calls use SIP protocol to establish communication and RTP to " +"transport data. It is right now not available with IAX2." +msgstr "" +"Llamadas IP directas usan el protocolo SIP para establecer la comunicación y " +"RTP para transportar datos. No está ahora disponible con IAX2." + +#: sflphone.xml:510(para) +msgid "" +"Go to " +"<menuchoice><guimenu>Edit</guimenu><guimenuitem>Preferences</guimenuitem><gui" +"menuitem>Direct IP calls</guimenuitem></menuchoice> to configure the " +"advanced security features for this kind of calls." +msgstr "" +"Vaya a " +"<menuchoice><guimenu>Editar</guimenu><guimenuitem>Preferencias</guimenuitem><" +"guimenuitem>Llamadas IP directas</guimenuitem></menuchoice> para configurar " +"los parámetros de seguridad avanzados para esta clase de llamadas." + +#: sflphone.xml:514(para) +msgid "" +"SFLphone now supports conference call hosting integrating server like " +"features in a simple GUI." +msgstr "" +"SFLphone ahora apoya el recibimiento de la audioconferencia, integrando " +"características de servidor en un GUI fácil." + +#: sflphone.xml:520(guilabel) +msgid "Create a conference" +msgstr "Crear conferencia" + +#: sflphone.xml:521(para) +msgid "" +"To host a conference, simply drag and drop one call on another. Additional " +"participants are added the same way, dragging a call on the conference icon." +msgstr "" +"Para recibir una conferencia, simplemente arrastre - y - caen una llamada " +"sobre la otra. Agrega los participantes adicionales de la misma manera, " +"arrastrando una llamada en el icono de la conferencia." + +#: sflphone.xml:528(guilabel) +msgid "Leave a conference" +msgstr "Salir de la conferencia" + +#: sflphone.xml:529(para) +msgid "" +"SFLphone conference model let you leave a conference that you are currently " +"hosting to answer any other incoming communication or even initiate new " +"ones. The conference is not interupted Double clicking the conference icon " +"let you reintroduce the conference." +msgstr "" +"El modelo de la conferencia de SFLphone le dejó dejar una conferencia que " +"usted está recibiendo actualmente para contestar a cualquier otras nuevas " +"llamadas o iniciar otras. La conferencia no es cortada, doble chasca el " +"icono de la conferencia le dejó regresar a la conferencia." + +#: sflphone.xml:538(guilabel) +msgid "Multiple conference" +msgstr "Conferencia múltiple" + +#: sflphone.xml:539(para) +msgid "" +"SFLphone supports multiple conferences running simultaneously. Two " +"conferences can be joined the same way they are created, dragging one on the " +"other." +msgstr "" +"SFLphone apoya múltiples conferencias que funcionan simultáneamente. Dos " +"conferencias se pueden ensamblar de la misma manera que se crean, " +"arrastrando una en la otra." + +#: sflphone.xml:547(guilabel) +msgid "Hangup/Hold a conference" +msgstr "Poner una conferencia en espera/Retrasar una conferencia" + +#: sflphone.xml:548(para) +msgid "" +"Right click the conference icon. Holding the conference put all participants " +"on hold. Hangup a conference hangup all participants." +msgstr "" +"Derecho chasque el icono de la conferencia. Poner la conferencia en espera " +"puso todos los participantes en espera. Retrasar una conferencia retrasa " +"todos los participantes." + +#: sflphone.xml:565(title) +msgid "Audio configuration" +msgstr "Configuración de sonido" + +#: sflphone.xml:566(para) +msgid "ALSA and Pulseaudio native interfaces are available." +msgstr "Los interfaces nativos ALSA y Pulseaudio están disponibles." + +#: sflphone.xml:582(title) +msgid "Codecs overview" +msgstr "Descripción de los codificadores-decodificador" + +#: sflphone.xml:583(para) +msgid "SFLphone supports several widely used audio codec:" +msgstr "" +"SFLphone apoya varios codificador-decodificador audio ampliamente utilizado:" + +#: sflphone.xml:587(guilabel) +msgid "PCMU/PCMA" +msgstr "PCMU/PCMA" + +#: sflphone.xml:588(para) +msgid "" +"ITU-T telefony standard PCM formats, 8kHz, 64 kbit/s, using logarithmic byte " +"compression algorithm." +msgstr "" +"Formatos PCM del estándar de telefonia de ITU-T, 8kHz, 64 kbit/s, usando " +"algoritmo logarítmico de compresión del octeto." + +#: sflphone.xml:594(guilabel) +msgid "GSM" +msgstr "GSM" + +#: sflphone.xml:595(para) +msgid "" +"Global System for Mobile communications (GSM) narrowband 8kHz standard based " +"on linear prediction encoding." +msgstr "" +"Estándar de banda estrecha 8kHz de la comunicaciones Sistema Global para " +"Movíl (GSM) basado en la codificación de predicción linear." + +#: sflphone.xml:601(guilabel) +msgid "G722" +msgstr "G722" + +#: sflphone.xml:602(para) +msgid "ITU-T standard wideband 16kHz standard based on linear prediction." +msgstr "" +"Estándar de la banda ancha 16kHz de ITU-T basado en la predicción linear." + +#: sflphone.xml:607(guilabel) +msgid "SPEEX" +msgstr "SPEEX" + +#: sflphone.xml:608(para) +msgid "" +"High quality voice encoding/decoding available in narrowband 8Khz, wideband " +"16khz (HD Voice), and ultra-wideband 32 kHz. Integrate additional features " +"such as Variable Bit Rate (VBR) and noise reduction." +msgstr "" +"Codificación/Decodificación de voz de alta calidad disponible en la banda " +"estrecha 8Khz, la banda ancha 16khz (voz HD), y la ultra-banda ancha 32 kHz. " +"Integre las características adicionales tal como índice binario variable " +"(VBR) y reducción del nivel de ruidos." + +#: sflphone.xml:617(guilabel) +msgid "CELT" +msgstr "CELT" + +#: sflphone.xml:628(title) +msgid "Address books" +msgstr "Agenda de direcciones" + +#: sflphone.xml:630(title) +msgid "Enable the address book support" +msgstr "Activar el soporte para agenda de direcciones" + +#: sflphone.xml:631(para) +msgid "To enable the address book, perform the following steps:" +msgstr "Para activar la agenda de direcciones, sigue los siguientes pasos:" + +#: sflphone.xml:634(para) +msgid "" +"Choose " +"<menuchoice><guimenu>Edit</guimenu><guimenuitem>Preferences</guimenuitem></me" +"nuchoice>." +msgstr "" +"Escoje " +"<menuchoice><guimenu>Editar</guimenu><guimenuitem>Preferencias</guimenuitem><" +"/menuchoice>." + +#: sflphone.xml:638(para) +msgid "" +"Select the <menuchoice><guimenu>Address book</guimenu></menuchoice> tab." +msgstr "" +"Seleccione la pestaña <menuchoice><guimenu>Libreta de " +"contactos</guimenu></menuchoice>." + +#: sflphone.xml:642(para) +msgid "Check the <guilabel>Use Evolution address books</guilabel> box." +msgstr "" +"Escoje la checkbox <guilabel>Usar libretas de contactos Evolution</guilabel>." + +#: sflphone.xml:645(para) +msgid "" +"Every address books you configured in Evolution will be now available in " +"<application>SFLphone</application>. Please be sure you selected at least " +"one address book." +msgstr "" +"Cada libreta de contactos configurada en Evolución estara disponible en " +"<application>SFLphone</application>. Por favor de asegurarse de seleccionar " +"por lo menos una libreta." + +#: sflphone.xml:649(title) +msgid "Available options" +msgstr "Opciones disponibles" + +#: sflphone.xml:650(para) +msgid "" +"In " +"<menuchoice><guimenu>Edit</guimenu><guimenuitem>Preferences</guimenuitem><gui" +"menuitem>Address book</guimenuitem></menuchoice>, you may select one or all " +"of the following options:" +msgstr "" +"En " +"<menuchoice><guimenu>Editar</guimenu><guimenuitem>Preferencias</guimenuitem><" +"guimenuitem>Libretas de contactos</guimenuitem></menuchoice>, usted puede " +"seleccionar una o todas las opciones siguientes:" + +#: sflphone.xml:653(guilabel) +msgid "Display contact photo if available" +msgstr "Mostrar la foto del contacto si está disponible" + +#: sflphone.xml:654(para) +msgid "" +"The contact photo will be displayed as a thumbnail beside the phone number." +msgstr "" +"La foto del contacto será exhibida como un thumbnail al lado del número de " +"teléfono." + +#: sflphone.xml:659(guilabel) +msgid "Fields from Evolution's address book" +msgstr "Campos de la agenda de direcciones de Evolution" + +#: sflphone.xml:660(para) +msgid "" +"You may use one or all of these following information from your contact." +msgstr "" +"Usted puede utilizar una o todas las informaciónes siguientes de su contacto." + +#: sflphone.xml:663(listitem) +msgid "Work phone number" +msgstr "Número de teléfono profesional" + +#: sflphone.xml:664(listitem) +msgid "Home phone number" +msgstr "Número de teléfono personal" + +#: sflphone.xml:665(listitem) +msgid "Mobile phone number" +msgstr "Número de teléfono móvil" + +#: sflphone.xml:673(title) +msgid "Using the address book" +msgstr "Usando la agenda de direcciones" + +#: sflphone.xml:676(para) +msgid "" +"On the toolbar, click on the following button to display the address book " +"window:" +msgstr "" +"En la barra de herramientas, chasque encendido el botón siguiente para " +"exhibir la ventana de libreta de contactos:" + +#: sflphone.xml:680(title) +msgid "Address book toolbar button" +msgstr "Botón de la barra de herramientas de libretas de contactos" + +#: sflphone.xml:693(para) +msgid "Search for a contact" +msgstr "Buscar un contacto" + +#: sflphone.xml:697(para) +msgid "" +"New entries should have appeared in the window. Double click on it to call " +"the contact. You may also <menuchoice><guimenu>Right " +"click</guimenu><guimenuitem>Edit before calling</guimenuitem></menuchoice> " +"to modify the entry before calling." +msgstr "" +"Las nuevas entradas deben haber aparecidas en la ventana. Doble chasqúela " +"encendido para llamar el contacto. Usted puede también " +"<menuchoice><guimenu>Derecho - chasque</guimenu><guimenuitem>Editar antes de " +"llamar</guimenuitem></menuchoice> para modificar la entrada antes de llamar." + +#: sflphone.xml:704(title) +msgid "Preferences" +msgstr "Configuración" + +#: sflphone.xml:706(para) +msgid "" +"Go to " +"<menuchoice><guimenu>Edit</guimenu><guimenuitem>Preferences</guimenuitem></me" +"nuchoice> to access the configuration panel." +msgstr "" +"Vaya a " +"<menuchoice><guimenu>Editar</guimenu><guimenuitem>Preferencias</guimenuitem><" +"/menuchoice> para acceder al panel de la configuración." + +#: sflphone.xml:707(para) +msgid "Each section is detailed below." +msgstr "Cada sección se detalla abajo" + +#: sflphone.xml:710(title) +msgid "General" +msgstr "Opciones Generales" + +#: sflphone.xml:711(para) +msgid "" +"This section provides the user general settings regarding the application." +msgstr "Esta sección provee al usuario las opciones general de la aplicación" + +#: sflphone.xml:715(title) +msgid "Desktop notifications options" +msgstr "Opciones de notificación de escritorio" + +#: sflphone.xml:729(guilabel) +msgid "Enable notifications" +msgstr "Activar notificaciones" + +#: sflphone.xml:730(para) +msgid "" +"Both clients use their desktop environment notification system. If checked, " +"you will receive desktop notifications for events such as incoming calls and " +"system messages." +msgstr "" +"Ambos clientes usan su sistema de notificación del entorno de escritorio. Si " +"está activado, recibirás notificaciones de escritorio para eventos como las " +"llamadas entrantes y mensajes del sistema." + +#: sflphone.xml:734(title) +msgid "Example of an incoming call notification" +msgstr "Ejemplo de notificación para una llamada entrante" + +#: sflphone.xml:746(guilabel) +msgid "Enable voicemail notifications" +msgstr "Activar notificaciones de correo de voz" + +#: sflphone.xml:747(para) +msgid "" +"The voicemail notifications are handled separatly. If checked, you will be " +"notified with the number of unread voicemails for your accounts." +msgstr "" +"Las notificaciones del buzón de voz se manejan separadamente. Si está " +"comprobado, le notificara el número de buzones de voz sin de sus cuentas." + +#: sflphone.xml:751(title) +msgid "Example of a voicemail notification" +msgstr "Ejemplo de notificacion de correo de voz" + +#: sflphone.xml:770(title) +msgid "System tray options" +msgstr "Opciones de la bandeja del sistema" + +#: sflphone.xml:784(guilabel) +msgid "Popup main window on incoming call" +msgstr "Mostrar ventana principal al recibir una llamada" + +#: sflphone.xml:785(para) +msgid "" +"If SFLphone is closed on the system tray, pops the main window up on " +"foreground when receiving an incoming call." +msgstr "" +"Si SFLphone esta cerrado en la bandeja del sistema, exhibe la ventana " +"principal emergente en primero plano para recibir una llamada entrante." + +#: sflphone.xml:790(guilabel) +msgid "Never popup main window" +msgstr "Nuncà exhibe la ventana principal emergente" + +#: sflphone.xml:791(para) +msgid "" +"If SFLphone is closed on the system tray, never pops the main window up on " +"foreground when receiving an incoming call." +msgstr "" +"Si SFLphone esta cerrado en la bandeja del sistema, nunca exhibe la ventana " +"principal emergente en primero plano para recibir una llamada entrante." + +#: sflphone.xml:796(guilabel) +msgid "Hide SFLphone window on startup" +msgstr "Esconder la pantalla de SFLphone al principio" + +#: sflphone.xml:797(para) +msgid "On startup, SFLphone will go directly on the system tray." +msgstr "Al principio, SFLphone ira directamente a la bandeja del sistema." + +#: sflphone.xml:810(title) +msgid "Calls history options" +msgstr "Opciones del historial de llamadas" + +#: sflphone.xml:823(guilabel) +msgid "Keep my history for at least n days" +msgstr "Mantener mi historial por al menos n días" + +#: sflphone.xml:824(para) +msgid "" +"If checked, calls will be kept up to N days in the history. You may select a " +"custom number of days. Do not check it if you don't want to use this feature." +msgstr "" +"Si está activado, las llamadas se mantendrán hasta N días en el historial. " +"Puedes seleccionar un número concreto de días. No lo actives si no quieres " +"usar esta opción." + +#: sflphone.xml:834(title) +msgid "Configuration file options" +msgstr "Opciones del archivo de configuración" + +#: sflphone.xml:847(guilabel) +msgid "Store SIP credentials as MD5 hash" +msgstr "Guarda información SIP como hash MD5" + +#: sflphone.xml:848(para) +msgid "" +"If checked, your password information will be encrypted in the configuration " +"file, instead of plain text." +msgstr "" +"Si está activo, tu información de contraseñas se almacenarán cifradas en el " +"archivo de configuración, en vez de en texto plano." + +#: sflphone.xml:859(title) +msgid "Audio" +msgstr "Sonido" + +#: sflphone.xml:863(title) +msgid "Address book" +msgstr "Libreta de direcciones" + +#: sflphone.xml:865(para) +msgid "" +"Refer to the <link linkend=\"addressbook\">Address books</link> section for " +"more information." +msgstr "" +"Refierese a la secciòn <link linkend=\"addressbook\">Libretas de " +"contactos</link> para màs informaciones." + +#: sflphone.xml:869(title) +msgid "Hooks" +msgstr "Disparadores" + +#: sflphone.xml:877(title) +msgid "Direct IP calls" +msgstr "Llamadas IP directas" + +#: sflphone.xml:878(para) +msgid "" +"Refer to the <link linkend=\"directip\">Direct IP calls</link> section for " +"more information." +msgstr "" +"Refierese a la secciòn <link linkend=\"directip\">Llamadas directas " +"IP</link> para màs informaciones." + +#. Put one translator per line, in the form of NAME <EMAIL>, YEAR1, YEAR2 +#: sflphone.xml:0(None) +msgid "translator-credits" +msgstr "" +"Launchpad Contributions:\n" +" Alfonso E. Romero https://launchpad.net/~alfonsoeromero\n" +" DiegoJ https://launchpad.net/~diegojromerolopez\n" +" Maxime Chambreuil https://launchpad.net/~max3903" diff --git a/sflphone-client-gnome/doc/fr/fr.po b/sflphone-client-gnome/doc/fr/fr.po new file mode 100644 index 0000000000000000000000000000000000000000..f9da713d2e1fe72e9b6a9ab7bec1443868098220 --- /dev/null +++ b/sflphone-client-gnome/doc/fr/fr.po @@ -0,0 +1,1284 @@ +# French translation for sflphone +# Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 +# This file is distributed under the same license as the sflphone package. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: sflphone\n" +"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" +"POT-Creation-Date: 2009-10-26 15:41-0400\n" +"PO-Revision-Date: 2009-12-09 15:38+0000\n" +"Last-Translator: Emmanuel Milou <emmanuel.milou@savoirfairelinux.com>\n" +"Language-Team: French <fr@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2009-12-09 20:52+0000\n" +"X-Generator: Launchpad (build Unknown)\n" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:230(None) +msgid "" +"@@image: 'figures/account_advanced.png'; md5=8cc040a5f56fe61566ad7b0fa83955d9" +msgstr "not used" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:296(None) +msgid "@@image: 'figures/dial.png'; md5=81ff4280c293e62a49fad3a4b61b9bb5" +msgstr "not used" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:311(None) +msgid "" +"@@image: 'figures/call-second.png'; md5=fa490e3b07eebaa9f4ff719f579d68ef" +msgstr "not used" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:330(None) +msgid "@@image: 'figures/call.png'; md5=ecd96beec76f808b5c1469ecc1293237" +msgstr "not used" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:348(None) +msgid "@@image: 'figures/answer.png'; md5=c168995c6b36b5d200c49d1c02c2ea52" +msgstr "not used" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:365(None) +msgid "@@image: 'figures/hangup.png'; md5=0cac4dfe3a9a4bdf4d12229f77e3723a" +msgstr "not used" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:385(None) +msgid "@@image: 'figures/refuse.png'; md5=34b6cbf068e56163058e79de3ca70c59" +msgstr "not used." + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:403(None) +msgid "@@image: 'figures/holdon.png'; md5=655078b8b495ada29f65b58501187d16" +msgstr "not used" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:415(None) +msgid "@@image: 'figures/holdoff.png'; md5=e06b8eba03f1545cd18891630b22f281" +msgstr "not used" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:430(None) +msgid "@@image: 'figures/transfer.png'; md5=92f921c7c6ba4ee2487ccf6e02226d9a" +msgstr "not used" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:444(None) +msgid "" +"@@image: 'figures/transfer-go.png'; md5=553b57d5a9fc9f248ba15cecc32d343f" +msgstr "not used" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:465(None) +msgid "" +"@@image: 'figures/rec-settings.png'; md5=27d51e45ff23dde58b0512f90773f6ce" +msgstr "not used" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:478(None) +msgid "@@image: 'figures/record.png'; md5=7a594660924940e8def9ecfcee0e8cb4" +msgstr "not used" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:496(None) +msgid "" +"@@image: 'figures/voicemail.png'; md5=36dbeb4bcc6a68519d474552a888ce1e" +msgstr "not used" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:684(None) +msgid "" +"@@image: 'figures/addressbook-button.png'; " +"md5=b4a820013ef8b8f48e7de780a66c7800" +msgstr "not used" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:719(None) +msgid "" +"@@image: 'figures/desktop-notif-settings.png'; " +"md5=2bca85d6d9871883399481b994bd3384" +msgstr "not used" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:738(None) +msgid "" +"@@image: 'figures/notif-example.png'; md5=d09008bedcaee435b12cd165d42e39b7" +msgstr "not used" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:755(None) +msgid "" +"@@image: 'figures/voicemail-notif.png'; md5=a33ed4ce4b693d67ee453b4ef1fa6c30" +msgstr "not used" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:774(None) +msgid "" +"@@image: 'figures/systemtray-settings.png'; " +"md5=638612a08eb31eb768c4f08ace9c909a" +msgstr "not used" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:814(None) +msgid "" +"@@image: 'figures/callshistory-settings.png'; " +"md5=287d8aed7d7c71752257c64e89a9127d" +msgstr "not used" + +#. When image changes, this message will be marked fuzzy or untranslated for you. +#. It doesn't matter what you translate it to: it's not used at all. +#: sflphone.xml:838(None) +msgid "" +"@@image: 'figures/configfile-settings.png'; " +"md5=eb4a5545f137b825dcdaf0396a9f1a7d" +msgstr "not used" + +#: sflphone.xml:12(title) +msgid "SFLphone Manual v1.0" +msgstr "Manuel d'utilisateur de SFLphone v1.0" + +#: sflphone.xml:15(year) +msgid "2006" +msgstr "2006" + +#: sflphone.xml:16(year) +msgid "2007" +msgstr "2007" + +#: sflphone.xml:17(year) +msgid "2008" +msgstr "2008" + +#: sflphone.xml:18(year) +msgid "2009" +msgstr "2009" + +#: sflphone.xml:19(holder) sflphone.xml:32(publishername) sflphone.xml:80(para) +msgid "Savoir-faire Linux" +msgstr "Savoir-faire Linux" + +#: sflphone.xml:26(para) +msgid "" +"SFLphone is an enterprise-class SIP/IAX2 compatible softphone for GNU/Linux, " +"published under the GPLv3 license." +msgstr "" +"SFLphone est téléphone logiciel de voix sur IP pour GNU/LINUX destiné aux " +"entreprises, compatible avec les protocoles SIP et IAX2. Il est distribué " +"sous licence GPLv3." + +#: sflphone.xml:36(para) +msgid "" +"Permission is granted to copy, distribute and/or modify this document under " +"the terms of the GNU Free Documentation Licence (GFDL), Version 1.1 or any " +"later version published by the Free Software Foundation with no Invariant " +"Sections, no Front-Cover Texts, and no Back-Cover Texts. You can find a copy " +"of the GFDL at this <ulink type=\"help\" url=\"ghelp:fdl\">link</ulink> or " +"in the file COPYING-DOCS distributed with this manual." +msgstr "" + +#: sflphone.xml:37(para) +msgid "" +"This manual is part of a collection of GNOME manuals distributed under the " +"GFDL. If you want to distribute this manual separately from the collection, " +"you can do so by adding a copy of the licence to the manual, as described in " +"section 6 of the licence." +msgstr "" + +#: sflphone.xml:42(firstname) +msgid "Pierre-Luc" +msgstr "Pierre-Luc" + +#: sflphone.xml:43(surname) +msgid "Bacon" +msgstr "Bacon" + +#: sflphone.xml:45(email) +msgid "pierre-luc.bacon@savoirfairelinux.com" +msgstr "pierre-luc.bacon@savoirfairelinux.com" + +#: sflphone.xml:50(firstname) +msgid "Emmanuel" +msgstr "Emmanuel" + +#: sflphone.xml:51(surname) +msgid "Milou" +msgstr "Milou" + +#: sflphone.xml:53(email) +msgid "emmanuel.milou@savoirfairelinux.com" +msgstr "emmanuel.milou@savoirfairelinux.com" + +#: sflphone.xml:58(firstname) +msgid "Jérémy" +msgstr "Jérémy" + +#: sflphone.xml:59(surname) +msgid "Quentin" +msgstr "Quentin" + +#: sflphone.xml:61(email) +msgid "jeremy.quentin@savoirfairelinux.com" +msgstr "jeremy.quentin@savoirfairelinux.com" + +#: sflphone.xml:66(firstname) +msgid "Alexandre" +msgstr "Alexandre" + +#: sflphone.xml:67(surname) +msgid "Savard" +msgstr "Savard" + +#: sflphone.xml:69(email) +msgid "alexandre.savard@savoirfairelinux.com" +msgstr "alexandre.savard@savoirfairelinux.com" + +#: sflphone.xml:76(revnumber) +msgid "SFLphone Manual V1.0" +msgstr "Manuel de l'utilisateur pour SFLphone V1.0" + +#: sflphone.xml:77(date) +msgid "September 2009" +msgstr "Septembre 2009" + +#: sflphone.xml:79(para) +msgid "SFLphone team" +msgstr "Équipe SFLphone" + +#: sflphone.xml:85(releaseinfo) +msgid "This manual describes version 0.9.7 of SFLphone." +msgstr "Ce manuel décrit la version 0.9.7 de SFLphone." + +#: sflphone.xml:90(primary) +msgid "SFLphone" +msgstr "SFLphone" + +#: sflphone.xml:94(title) +msgid "Introduction" +msgstr "Introduction" + +#: sflphone.xml:95(para) +msgid "" +"<application>SFLphone</application> is a SIP/IAX2 softphone and VoIP client " +"for GNU/Linux. It aims at being a robust enterprise-class desktop phone and " +"has been designed with a hundred-calls-a-day receptionist in mind." +msgstr "" +"<application>SFLphone</application> est un softphone compatible avec SIP et " +"IAX2 et un client de voix sur IP pour GNU/Linux. Notre but est d'offrir un " +"téléphone logiciel intégré au bureau, robuste, destiné à une utilisation " +"professionnelle." + +#: sflphone.xml:98(para) +msgid "" +"<application>SFLphone</application> is a free software and is distributed " +"under the GNU General Public License version 3. It is developed by Savoir-" +"Faire Linux, a Canadian Linux consulting company, in partnership with the " +"global community." +msgstr "" +"<application>SFLphone</application> est un logiciel open-source distribué " +"sous licence GNU GPL version 3. Il est développé par la compagnie de " +"consultation canadienne Savoir-faire Linux, en collaboration avec la " +"communauté." + +#: sflphone.xml:101(para) +msgid "" +"Among the many features we developed for you, we could highlight the high " +"definition sound (wide-band audio codecs - speex, G722, Celt), multiple " +"conference call, audio recording, voicemail notification, and call history. " +"More than a simple softphone, <application>SFLphone</application> supports " +"advanced enterprise-class call features: unlimited number of calls, call " +"transfer, and on/off hold option." +msgstr "" +"Parmi les nombreuses fonctionnalités de SFLphone, on peut noter notamment la " +"qualité de son haute-définition (codecs audio large bande - speex, G722, " +"Celt), conférences multiples, enregistrement d'appel, notification de " +"messages vocaux and historique d'appels. Plus qu'un simple téléphone " +"logiciel, <application>SFLphone</application> supporte des fonctionnalités " +"avancées destinées aux entreprises: nombre illimité d'appels, transfert, " +"mise en attente." + +#: sflphone.xml:108(para) +msgid "" +"This release also provides advanced security features (secure RTP and TLS)." +msgstr "" +"Cette nouvelle version implémente des fonctionnalités de sécurité avancées " +"(RTP sécurisé et TLS)." + +#: sflphone.xml:112(para) +msgid "" +"Besides the native ALSA interface, <application>SFLphone</application> now " +"fully supports PulseAudio sound server so you could experience the great " +"possibilities it offers (sound mixing, per application volume control, ...)." +msgstr "" +"En plus de l'interface native ALSA, <application>SFLphone</application> " +"supporte nativement le serveur de son PulseAudio. Profitez ainsi pleinement " +"des possibiltés qu'il apporte (mixage logiciel, gestion des volumes par " +"application, ...)." + +#: sflphone.xml:118(title) +msgid "Getting started" +msgstr "Premiers pas" + +#: sflphone.xml:123(guilabel) +msgid "Create a free SIP/IAX2 account on sflphone.org" +msgstr "Créer un compte SIP/IAX2 gratuit sur sflphone.org" + +#: sflphone.xml:124(para) +msgid "" +"Savoir-faire Linux provides free SIP/IAX2 accounts on an Asterisk server. By " +"clicking this option, you will be created an account to make test calls. The " +"echo service is available, you may also call other accounts registered to " +"the same server." +msgstr "" +"Savoir-faire Linux fournit des comptes SIP/IAX2 gratuits sur un serveur " +"Asterisk central. En choisissant cette option, nous vous créons un compte " +"de test. Le service echo vous est offert, ainsi que des appels vers d'autres " +"comptes enregistrés sur ce serveur." + +#: sflphone.xml:126(para) +msgid "" +"By filling out your email address information, you will receive voicemail " +"notifications by email. This information is not mandatory to get your free " +"account." +msgstr "" +"En remplissant votre adresse courriel, vous pourrez recevoir vos messages " +"vocaux par email. Cette information n'est cependant pas obligatoire." + +#: sflphone.xml:129(guilabel) +msgid "Register an existing SIP or IAX2 account" +msgstr "Enregistrer un compte SIP ou IAX2 existant" + +#: sflphone.xml:130(para) +msgid "" +"Click there if you already have an account and you want to use it with " +"SFLphone. You will be prompted to select the account type (SIP or IAX2) and " +"to fill out your account information. <application>SFLphone</application> " +"will then try to register it so you could start using it." +msgstr "" +"Choisissez cette option si vous avez déjà un compte et désirez l'utiliser " +"avec SFLphone. Il faut ensuite choisir le type de compte (SIP ou IAX2) et " +"remplir les informations nécessaires." + +#: sflphone.xml:119(para) +msgid "" +"The first time you start up sflphone, you will be ask to complete a wizard " +"to set up your(s) account(s). This account configuration manager offers you " +"two possibilities: <placeholder-1/>" +msgstr "" +"La première fois que vous lancez SFLphone, un assistant se lance pour vous " +"aider à configurer vos comptes. Vous avez alors deux " +"possibilités:<placeholder-1/>" + +#: sflphone.xml:135(para) +msgid "" +"You can always access the account creation manager: " +"<menuchoice><guimenu>Edit</guimenu><guimenuitem>Account creation " +"assistant</guimenuitem></menuchoice>." +msgstr "" +"Vous pouvez à tout moment accéder à l'assistant de création de compte: " +"<menuchoice><guimenu>Éditer</guimenu><guimenuitem>Assistant de création de " +"compte/guimenuitem></menuchoice>." + +#: sflphone.xml:141(title) +msgid "Managing your accounts" +msgstr "Gérer vos comptes" + +#: sflphone.xml:142(para) +msgid "" +"<application>SFLphone</application> supports both IAX2 and SIP accounts." +msgstr "" +"<application>SFLphone</application> supporte des comptes IAX2 et SIP." + +#: sflphone.xml:148(title) +msgid "Basic features" +msgstr "Fonctionnalités de base" + +#: sflphone.xml:150(title) +msgid "Creating a new account" +msgstr "Créer un nouveau compte" + +#: sflphone.xml:151(para) +msgid "To create a new account, perform the following steps:" +msgstr "Pour créer un nouveau compte, suivez les étapes suivantes:" + +#: sflphone.xml:153(para) sflphone.xml:191(para) sflphone.xml:201(para) +msgid "" +"Choose <menuchoice><guimenu>Edit</guimenu><guimenuitem>Manage " +"accounts</guimenuitem></menuchoice>." +msgstr "" +"Sélectionnez " +"<menuchoice><guimenu>Éditer</guimenu><guimenuitem>Comptes</guimenuitem></menu" +"choice>." + +#: sflphone.xml:154(para) +msgid "" +"Click on the <guilabel>Add</guilabel> button. Fill out the following " +"information:" +msgstr "" +"Cliquez sur le bouton <guilabel>Ajouter</guilabel>. Remplissez les " +"informations suivantes:" + +#: sflphone.xml:157(guilabel) +msgid "Alias" +msgstr "Alias" + +#: sflphone.xml:158(para) +msgid "" +"The name to identify your account in the list. It is not used for the " +"communications" +msgstr "" +"Le nom pour identifier ce compte dans la liste des comptes. il n'est pas " +"utilisé pour les communications" + +#: sflphone.xml:161(guilabel) +msgid "Protocol" +msgstr "Protocole" + +#: sflphone.xml:162(para) +msgid "Select SIP or IAX2. The most commons are SIP accounts." +msgstr "Choisissez SIP ou IAX2. Les plus courants sont les comptes SIP." + +#: sflphone.xml:165(guilabel) +msgid "Host name" +msgstr "Nom du hôte" + +#: sflphone.xml:166(para) +msgid "The name or the IP address of the server you want to register on." +msgstr "" +"Le nom ou l'adresse IP du serveur auprès duquel vous voulez enregistrer le " +"compte." + +#: sflphone.xml:169(guilabel) +msgid "User name" +msgstr "Nom d'utilisateur" + +#: sflphone.xml:170(para) +msgid "The name or the extension for your account." +msgstr "Le nom d'utilisateur ou l'extension de votre compte." + +#: sflphone.xml:173(guilabel) +msgid "Password" +msgstr "Mot de passe" + +#: sflphone.xml:174(para) +msgid "The password for your account." +msgstr "Le mot de passe associé à votre compte." + +#: sflphone.xml:177(guilabel) +msgid "Voicemail number" +msgstr "Numéro de boîte vocale" + +#: sflphone.xml:178(para) +msgid "" +"The number to dial to reach your voicemail. Example: 888, or *97. It will be " +"used as a quick dial button on the main interface." +msgstr "" +"Le numéro à composer pour joindre la boîte vocale associée à ce compte. " +"Exemple: 888, ou *97. Ce numéro sera utilisé comme raccourci pour appeler " +"votre bote vocale dans l'interface principale." + +#: sflphone.xml:182(para) +msgid "Click the <menuchoice><guimenu>Apply</guimenu></menuchoice> button." +msgstr "" +"Cliquez sur le bouton <menuchoice><guimenu>Appliquer</guimenu></menuchoice>." + +#: sflphone.xml:184(para) +msgid "" +"You may now check the state of your account(s). You may have as many setup " +"accounts as you wish. If it is registered, you may now use it to make calls." +msgstr "" +"Vous pouvez maintenant vérifier l'état de votre compte. S'il est enregistré, " +"vous pouvez maintenant passer un nouvel appel. Vous pouvez configurer autant " +"de comptes que vous le désirez." + +#: sflphone.xml:188(title) +msgid "Editing a configured account" +msgstr "Éditer un compte existant" + +#: sflphone.xml:189(para) +msgid "To edit an existing account, perform the following steps:" +msgstr "Pour éditer un compte, suivez les étapes suivantes:" + +#: sflphone.xml:192(para) +msgid "" +"Select in the list the account you would like to edit, then click on the " +"<guilabel>Edit</guilabel> button." +msgstr "" +"Sélectionnez le compte que vous voulez éditer dans la liste des comptes, " +"puis cliquez sur le bouton <guilabel>Éditer</guilabel>." + +#: sflphone.xml:193(para) +msgid "" +"Make your modifications, then click on the <guilabel>Apply</guilabel> button." +msgstr "" +"Faîtes vos modifications, puis cliquez sur le bouton " +"<guilabel>Appliquer</guilabel> pour sauvegarder vos changements." + +#: sflphone.xml:198(title) +msgid "Deleting an account" +msgstr "Supprimer un compte" + +#: sflphone.xml:199(para) +msgid "To delete an existing account, perform the following steps:" +msgstr "Pour supprimer un compte, suivez les étapes suivantes:" + +#: sflphone.xml:202(para) +msgid "" +"Select in the list the account you would like to delete, then click on the " +"<guibutton>Delete</guibutton> button." +msgstr "" +"Sélectionnez le compte que vous voulez supprimer dans la liste des comptes, " +"puis cliquez sur le bouton <guilabel>Supprimer</guilabel>." + +#: sflphone.xml:207(title) +msgid "Selecting a default account" +msgstr "Choisir un compte par défaut" + +#: sflphone.xml:208(para) +msgid "" +"As it is possible to have an unlimited number of registered accounts at the " +"same time, which account will be used when making a call ? You can not only " +"set up a default account to be used every time you are making a call, but an " +"entire priority list. To do that, perform the following steps:" +msgstr "" +"Comme il est possible d'avoir un nombre illimité de comptes enregistrés en " +"même temps, quel compte va être utilisé pour passer un appel? Il est " +"possible de configurer une liste de priorité des comptes pour passer des " +"appels. Pour cela, suivre les étapes suivantes:" + +#: sflphone.xml:210(para) +msgid "" +"Choose <menuchoice><guimenu>Edit</guimenu><guimenuitem>Manage " +"accounts</guimenuitem></menuchoice> to access the accounts list." +msgstr "" +"Sélectionner " +"<menuchoice><guimenu>Éditer</guimenu><guimenuitem>Comptes</guimenuitem></menu" +"choice> pour accéder à la liste des comptes." + +#: sflphone.xml:212(para) +msgid "" +"The first account in the account in list will be used as the default account " +"to make calls with. If it is not registered, SFLphone will try to use the " +"second in the list, if still not registered, the third, and so one ..." +msgstr "" +"Le premier compte dans la lsite sera utilisé comme le compte par défaut pour " +"passer des appels. Si ce compte n'est pas enregistré, SFLphone va essayer " +"d'utiliser le suivant dans la liste, etc ..." + +#: sflphone.xml:213(para) +msgid "" +"To reorder the accounts as you wish, select an account and click on the " +"<menuchoice><guimenu>Up</guimenu></menuchoice> or " +"<menuchoice><guimenu>Down</guimenu></menuchoice> button." +msgstr "" +"Pour ordonner les comptes comme vous le désirez, sélectionnez un compte et " +"cliquez sur le bouton <menuchoice><guimenu>Monter</guimenu></menuchoice> ou " +"<menuchoice><guimenu>Descendre</guimenu></menuchoice>." + +#: sflphone.xml:216(para) +msgid "" +"Note that you also can select an account to make a call with when dialing by " +"right-clicking on it." +msgstr "" +"Il est possible de sélectionner rapidement un compte pour un appel en " +"faisant un clic-droit sur l'appel en train d'être composé." + +#: sflphone.xml:221(title) +msgid "Advanced features" +msgstr "Fonctionnalités avancées" + +#: sflphone.xml:222(para) sflphone.xml:273(para) +msgid "These features are only available with SIP." +msgstr "Ces fonctionnalités sont seulement disponibles pour SIP." + +#: sflphone.xml:223(para) +msgid "" +"Follow the indications to <link linkend=\"account_edit\">edit an " +"account</link> and choose the <guimenu>Advanced</guimenu> tab." +msgstr "" +"Suivre les indications pour <link linkend=\"account_edit\">éditer un " +"compte</link> et choisir l'onglet <guimenu>Avancé</guimenu>." + +#: sflphone.xml:226(title) +msgid "Advanced features configuration panel" +msgstr "Panneau de configuration des options avancées" + +#: sflphone.xml:237(title) +msgid "Registration" +msgstr "Enregistrement" + +#: sflphone.xml:238(para) +msgid "You may set the expires header for a contact." +msgstr "Vous pouvez configurer l'en-tête expiration pour un contact." + +#: sflphone.xml:239(para) +msgid "" +"It basically represents the duration your registration will remain active. " +"If you don't register again within that time, calls will no longer be routed " +"to you. it should be not used as a keepalive mechanism though. The default " +"value is 600 seconds (ten minutes)." +msgstr "" + +#: sflphone.xml:240(note) +msgid "" +"To register to some VoIP services, you will need to set this value at at " +"least 1600 seconds (Example: French VoIP server freephonie.net)." +msgstr "" +"Pour vous enregistrer auprés de certains services de voix sur IP, vous avez " +"besoin de configurer cette valeur au minimum à 1 600 secondes (Exemple: " +"Serveur Free freephonie.net)." + +#: sflphone.xml:244(title) sflphone.xml:873(title) +msgid "Network" +msgstr "Réseau" + +#: sflphone.xml:245(para) +msgid "This section enables you to set advanced network parameters." +msgstr "" +"Cette section vous permet de configurer les paramètres réseau avancés." + +#: sflphone.xml:248(guilabel) +msgid "Local address" +msgstr "Adresse locale" + +#: sflphone.xml:249(para) +msgid "" +"it is initialized to your private/local IP address. Calls will be routed to " +"this address by default." +msgstr "" +"Elle est initialisée avec votre adresse IP locale/privée. Les appels seront " +"routés par défaut par cette adresse." + +#: sflphone.xml:252(guilabel) +msgid "Local port" +msgstr "Port local" + +#: sflphone.xml:253(para) +msgid "It is initialized to the default SIP port, 5060." +msgstr "Il est initialisé au port SIP par défaut, 5060" + +#: sflphone.xml:256(guilabel) +msgid "Set published address and port" +msgstr "Configurer l'adresse et le port de publication" + +#: sflphone.xml:260(para) +msgid "" +"If enabled, the core will try to initialize an UDP transport on the mapped " +"address/port number that the NAT (Network Address Translator) has allocated " +"to <application>SFLphone</application>." +msgstr "" + +#: sflphone.xml:259(listitem) +msgid "Using STUN <placeholder-1/>" +msgstr "Utiliser STUN <placeholder-1/>" + +#: sflphone.xml:261(listitem) +msgid "Same as local parameters" +msgstr "Identique aux paramètres locaux" + +#: sflphone.xml:263(listitem) +msgid "Manually" +msgstr "Manuelle" + +#: sflphone.xml:272(title) +msgid "Security features" +msgstr "Fonctionnalités de sécurité" + +#: sflphone.xml:275(title) +msgid "Secure RTP" +msgstr "RTP sécurisé" + +#: sflphone.xml:278(title) +msgid "TLS" +msgstr "TLS" + +#: sflphone.xml:285(title) +msgid "Call features" +msgstr "Fonctionnalités d'appel" + +#: sflphone.xml:287(para) +msgid "" +"All the following features are available with both SIP and IAX2 accounts." +msgstr "Les fonctionnalités suivantes sont disponibles pour SIP et IAX2" + +#: sflphone.xml:292(title) +msgid "Dial button" +msgstr "Bouton composer" + +#. ==== End of Figure ==== +#: sflphone.xml:303(para) +msgid "" +"You may have an unlimited number of calls at the same time, even with " +"different accounts." +msgstr "" +"Vous pouvez avoir un nombre illimité d'appels en même temps, même avec des " +"comptes différents." + +#: sflphone.xml:304(para) +msgid "" +"To create a new call when you already have a current call, just click on the " +"<guilabel>Dial</guilabel> button. The current call will automatically be put " +"on hold." +msgstr "" +"Pour créer un appel alors que vous avez déjà un appel courant, cliquez sur " +"le bouton <guilabel>Composer</guilabel>. L'appel courant sera alors " +"automatiquement mis en attente." + +#: sflphone.xml:307(title) +msgid "Make an other call" +msgstr "Faire un auitre appel" + +#. ==== End of Figure ==== +#: sflphone.xml:318(para) +msgid "" +"Keyboard shortcut to perform this action: <accel>NUMPAD</accel> or almost " +"any keys." +msgstr "" +"Raccourci clavier pour faire cette action: <accel>NUMPAD</accel> ou à peu " +"près n'importe quelle touche." + +#: sflphone.xml:326(title) +msgid "Call button" +msgstr "Bouton appeler" + +#. ==== End of Figure ==== +#: sflphone.xml:337(para) sflphone.xml:355(para) +msgid "Keyboard shortcut to perform this action: <accel>Enter</accel>." +msgstr "Raccourci clavier pour faire cette action: <accel>Entrée</accel>." + +#: sflphone.xml:344(title) +msgid "Answer button" +msgstr "Bouton décrocher" + +#: sflphone.xml:361(title) +msgid "Hangup button" +msgstr "Bouton raccrocher" + +#. ==== End of Figure ==== +#: sflphone.xml:372(para) sflphone.xml:392(para) +msgid "Keyboard shortcut to perform this action: <accel>ESC</accel>." +msgstr "Raccourci clavier pour faire cette action: <accel>Echap</accel>." + +#: sflphone.xml:377(para) +msgid "" +"When you refuse a call, your caller is automatically redirected to your " +"voicemail box, if applicable." +msgstr "" +"Quand un appel est refusé, votre correspondant est automatiquement redirigé " +"vers votre boîte vocale, s'il y en a une de configurée." + +#: sflphone.xml:381(title) +msgid "Refuse button" +msgstr "Bouton refuser" + +#: sflphone.xml:399(title) +msgid "Hold on button" +msgstr "Bouton mettre en attente" + +#: sflphone.xml:411(title) +msgid "Hold off button" +msgstr "Bouton reprendre" + +#: sflphone.xml:426(title) +msgid "Transfer button" +msgstr "Bouton transférer" + +#. ==== End of Figure ==== +#: sflphone.xml:437(para) +msgid "Then type the number you want to transfer the current call to." +msgstr "Puis entrez le numéro vers lequel vous voulez transférer l'appel." + +#: sflphone.xml:440(title) +msgid "Validate the transfer" +msgstr "Valider le transfert" + +#. ==== End of Figure ==== +#: sflphone.xml:451(para) +msgid "" +"And press <accel>Enter</accel>. Clicking again on the transfer button " +"cancels the transfer." +msgstr "" +"Et appuyez sur <accel>Entrée</accel>. Cliquer à nouveau sur le bouton " +"transfert annule le transfert en cours." + +#: sflphone.xml:457(para) +msgid "" +"Go to " +"<menuchoice><guimenu>Edit</guimenu><guimenuitem>Preferences</guimenuitem><gui" +"menuitem>Audio</guimenuitem></menuchoice> to configure the recordings " +"destination folder." +msgstr "" +"Aller à " +"<menuchoice><guimenu>Éditer</guimenu><guimenuitem>Préférences</guimenuitem><g" +"uimenuitem>Audio</guimenuitem></menuchoice> pour configurer le dossier de " +"destination des enregistrements." + +#: sflphone.xml:461(title) +msgid "Record settings" +msgstr "Paramètres d'enregistrement" + +#: sflphone.xml:474(title) +msgid "Record button" +msgstr "Bouton enregistrer" + +#: sflphone.xml:488(caution) +msgid "" +"This feature is available only if you fill out the voicemail number " +"information for your default account." +msgstr "" +"Cette fonctionnalité n'est disponible que si vous avez spécifié le numéro de " +"votre boîte vocale pour le compte courant." + +#: sflphone.xml:492(title) +msgid "Voicemail button" +msgstr "Bouton Boite vocale" + +#: sflphone.xml:506(para) +msgid "" +"A direct IP call is a call established between two peers without any " +"accounts. When dialing, such a call must prefixed with " +"<guilabel>sip:</guilabel>." +msgstr "" +"Un appel direct IP est un appel sans utiliser de registrar entre deux " +"personnes. Vous devez ajouter <guilabel>sip:</guilabel> devant le numéro à " +"composer pour faire un appel direct." + +#: sflphone.xml:508(para) +msgid "" +"Direct IP calls use SIP protocol to establish communication and RTP to " +"transport data. It is right now not available with IAX2." +msgstr "" +"Les appels directs SIP utilisent le protocole SIP pour établir la " +"communication et RTP pour envoyer les données de voix. Cette fonctionnalité " +"n'est pour l'instant pas disponible avec IAx2." + +#: sflphone.xml:510(para) +msgid "" +"Go to " +"<menuchoice><guimenu>Edit</guimenu><guimenuitem>Preferences</guimenuitem><gui" +"menuitem>Direct IP calls</guimenuitem></menuchoice> to configure the " +"advanced security features for this kind of calls." +msgstr "" +"Aller à " +"<menuchoice><guimenu>Éditer</guimenu><guimenuitem>Préférences</guimenuitem><g" +"uimenuitem>Appel direct SIP</guimenuitem></menuchoice> pour configurer le " +"comportement de ce type d'appel." + +#: sflphone.xml:514(para) +msgid "" +"SFLphone now supports conference call hosting integrating server like " +"features in a simple GUI." +msgstr "" + +#: sflphone.xml:520(guilabel) +msgid "Create a conference" +msgstr "Créer une conférence" + +#: sflphone.xml:521(para) +msgid "" +"To host a conference, simply drag and drop one call on another. Additional " +"participants are added the same way, dragging a call on the conference icon." +msgstr "" + +#: sflphone.xml:528(guilabel) +msgid "Leave a conference" +msgstr "Quitter une conférence" + +#: sflphone.xml:529(para) +msgid "" +"SFLphone conference model let you leave a conference that you are currently " +"hosting to answer any other incoming communication or even initiate new " +"ones. The conference is not interupted Double clicking the conference icon " +"let you reintroduce the conference." +msgstr "" + +#: sflphone.xml:538(guilabel) +msgid "Multiple conference" +msgstr "Conférence multiple" + +#: sflphone.xml:539(para) +msgid "" +"SFLphone supports multiple conferences running simultaneously. Two " +"conferences can be joined the same way they are created, dragging one on the " +"other." +msgstr "" + +#: sflphone.xml:547(guilabel) +msgid "Hangup/Hold a conference" +msgstr "Raccrocher/Mettre en attente une conférence" + +#: sflphone.xml:548(para) +msgid "" +"Right click the conference icon. Holding the conference put all participants " +"on hold. Hangup a conference hangup all participants." +msgstr "" + +#: sflphone.xml:565(title) +msgid "Audio configuration" +msgstr "Paramètres audio" + +#: sflphone.xml:566(para) +msgid "ALSA and Pulseaudio native interfaces are available." +msgstr "Les interfaces natives ALSA et Pulseaudio sont disponibles" + +#: sflphone.xml:582(title) +msgid "Codecs overview" +msgstr "Présentation des codecs" + +#: sflphone.xml:583(para) +msgid "SFLphone supports several widely used audio codec:" +msgstr "SFlphone supporte de nombreux codecs très populaires:" + +#: sflphone.xml:587(guilabel) +msgid "PCMU/PCMA" +msgstr "PCMU/PCMA" + +#: sflphone.xml:588(para) +msgid "" +"ITU-T telefony standard PCM formats, 8kHz, 64 kbit/s, using logarithmic byte " +"compression algorithm." +msgstr "" + +#: sflphone.xml:594(guilabel) +msgid "GSM" +msgstr "GSM" + +#: sflphone.xml:595(para) +msgid "" +"Global System for Mobile communications (GSM) narrowband 8kHz standard based " +"on linear prediction encoding." +msgstr "" + +#: sflphone.xml:601(guilabel) +msgid "G722" +msgstr "G722" + +#: sflphone.xml:602(para) +msgid "ITU-T standard wideband 16kHz standard based on linear prediction." +msgstr "" + +#: sflphone.xml:607(guilabel) +msgid "SPEEX" +msgstr "SPEEX" + +#: sflphone.xml:608(para) +msgid "" +"High quality voice encoding/decoding available in narrowband 8Khz, wideband " +"16khz (HD Voice), and ultra-wideband 32 kHz. Integrate additional features " +"such as Variable Bit Rate (VBR) and noise reduction." +msgstr "" + +#: sflphone.xml:617(guilabel) +msgid "CELT" +msgstr "CELT" + +#: sflphone.xml:628(title) +msgid "Address books" +msgstr "Carnets d'adresse" + +#: sflphone.xml:630(title) +msgid "Enable the address book support" +msgstr "Activer le support du carnet d'adresse" + +#: sflphone.xml:631(para) +msgid "To enable the address book, perform the following steps:" +msgstr "" +"pour activer le support du carnet d'adresse, voici les étapes à suivre:" + +#: sflphone.xml:634(para) +msgid "" +"Choose " +"<menuchoice><guimenu>Edit</guimenu><guimenuitem>Preferences</guimenuitem></me" +"nuchoice>." +msgstr "" +"Sélectionnez " +"<menuchoice><guimenu>Éditer</guimenu><guimenuitem>Préférences</guimenuitem></" +"menuchoice>." + +#: sflphone.xml:638(para) +msgid "" +"Select the <menuchoice><guimenu>Address book</guimenu></menuchoice> tab." +msgstr "" +"Selectionner l'onglet<menuchoice><guimenu>Carnet " +"d'adresse</guimenu></menuchoice>." + +#: sflphone.xml:642(para) +msgid "Check the <guilabel>Use Evolution address books</guilabel> box." +msgstr "" +"Cochez la case <guilabel>Utiliser le carnet d'adresse d'Evolution</guilabel>" + +#: sflphone.xml:645(para) +msgid "" +"Every address books you configured in Evolution will be now available in " +"<application>SFLphone</application>. Please be sure you selected at least " +"one address book." +msgstr "" +"Tous les carnets d'adresse configurés dans Evolution sont accessibles dans " +"<application>SFLphone</application>. Attention à bien vérifier que au moins " +"un carnet d'adresse est sélectionné." + +#: sflphone.xml:649(title) +msgid "Available options" +msgstr "Options disponibles" + +#: sflphone.xml:650(para) +msgid "" +"In " +"<menuchoice><guimenu>Edit</guimenu><guimenuitem>Preferences</guimenuitem><gui" +"menuitem>Address book</guimenuitem></menuchoice>, you may select one or all " +"of the following options:" +msgstr "" +"Dans " +"<menuchoice><guimenu>Éditer</guimenu><guimenuitem>Préférences</guimenuitem><g" +"uimenuitem>Carnet d'adresse</guimenuitem></menuchoice>, vous pouvez une ou " +"plusieurs des options suivantes:" + +#: sflphone.xml:653(guilabel) +msgid "Display contact photo if available" +msgstr "Afficher la photo du contact si elle est disponible" + +#: sflphone.xml:654(para) +msgid "" +"The contact photo will be displayed as a thumbnail beside the phone number." +msgstr "La photo sera affichée à côté du numéro de téléphone." + +#: sflphone.xml:659(guilabel) +msgid "Fields from Evolution's address book" +msgstr "Champs du carnet d'adresse Evolution" + +#: sflphone.xml:660(para) +msgid "" +"You may use one or all of these following information from your contact." +msgstr "" +"Vous pouvez recevoir une ou plusieurs des informations suivantes pour vos " +"contacts." + +#: sflphone.xml:663(listitem) +msgid "Work phone number" +msgstr "Tel Bureau" + +#: sflphone.xml:664(listitem) +msgid "Home phone number" +msgstr "Tel Domicile" + +#: sflphone.xml:665(listitem) +msgid "Mobile phone number" +msgstr "Tel Portable" + +#: sflphone.xml:673(title) +msgid "Using the address book" +msgstr "Utiliser le carnet d'adresse" + +#: sflphone.xml:676(para) +msgid "" +"On the toolbar, click on the following button to display the address book " +"window:" +msgstr "" +"Dans la barre d'outil, cliquez sur le bouton suivant pour afficher le carnet " +"d'adresse:" + +#: sflphone.xml:680(title) +msgid "Address book toolbar button" +msgstr "Carnet d'adresse dans la barre d'outil" + +#: sflphone.xml:693(para) +msgid "Search for a contact" +msgstr "Chercher un contact" + +#: sflphone.xml:697(para) +msgid "" +"New entries should have appeared in the window. Double click on it to call " +"the contact. You may also <menuchoice><guimenu>Right " +"click</guimenu><guimenuitem>Edit before calling</guimenuitem></menuchoice> " +"to modify the entry before calling." +msgstr "" + +#: sflphone.xml:704(title) +msgid "Preferences" +msgstr "Préférences" + +#: sflphone.xml:706(para) +msgid "" +"Go to " +"<menuchoice><guimenu>Edit</guimenu><guimenuitem>Preferences</guimenuitem></me" +"nuchoice> to access the configuration panel." +msgstr "" +"Aller dans " +"<menuchoice><guimenu>Éditer</guimenu><guimenuitem>Préférences</guimenuitem></" +"menuchoice> pour accéder au panneau de configuration." + +#: sflphone.xml:707(para) +msgid "Each section is detailed below." +msgstr "Chaque section est détaillée ci-dessous." + +#: sflphone.xml:710(title) +msgid "General" +msgstr "Général" + +#: sflphone.xml:711(para) +msgid "" +"This section provides the user general settings regarding the application." +msgstr "" +"Cette partie permet à l'utilisateur de configurer des paramètres globaux de " +"l'application." + +#: sflphone.xml:715(title) +msgid "Desktop notifications options" +msgstr "Notifications de bureau" + +#: sflphone.xml:729(guilabel) +msgid "Enable notifications" +msgstr "Activer les notifications" + +#: sflphone.xml:730(para) +msgid "" +"Both clients use their desktop environment notification system. If checked, " +"you will receive desktop notifications for events such as incoming calls and " +"system messages." +msgstr "" + +#: sflphone.xml:734(title) +msgid "Example of an incoming call notification" +msgstr "Exemple d'une notification d'appel entrant" + +#: sflphone.xml:746(guilabel) +msgid "Enable voicemail notifications" +msgstr "Activer les notifications de messages vocaux" + +#: sflphone.xml:747(para) +msgid "" +"The voicemail notifications are handled separatly. If checked, you will be " +"notified with the number of unread voicemails for your accounts." +msgstr "" + +#: sflphone.xml:751(title) +msgid "Example of a voicemail notification" +msgstr "Exempel d'une notification de message vocal" + +#: sflphone.xml:770(title) +msgid "System tray options" +msgstr "Options de la barre des tâches" + +#: sflphone.xml:784(guilabel) +msgid "Popup main window on incoming call" +msgstr "Popup la fenêtre principale lors de l'arrivée d'un appel" + +#: sflphone.xml:785(para) +msgid "" +"If SFLphone is closed on the system tray, pops the main window up on " +"foreground when receiving an incoming call." +msgstr "" +"Si SFLphone est réduit dans la barre des tâches, faire apparaître la fenêtre " +"principale sur les appels entrants." + +#: sflphone.xml:790(guilabel) +msgid "Never popup main window" +msgstr "Ne jamais faire apparaître la fenêtre principale" + +#: sflphone.xml:791(para) +msgid "" +"If SFLphone is closed on the system tray, never pops the main window up on " +"foreground when receiving an incoming call." +msgstr "" +"Si SFLphone est réduit dans la barre des tâches, ne jamais ouvrir la fenêtre " +"au premier plan sur les appels entrants." + +#: sflphone.xml:796(guilabel) +msgid "Hide SFLphone window on startup" +msgstr "Cacher SFLphone au démarrage" + +#: sflphone.xml:797(para) +msgid "On startup, SFLphone will go directly on the system tray." +msgstr "Au démarrage, SFLphone se met directement dans la barre des tâches." + +#: sflphone.xml:810(title) +msgid "Calls history options" +msgstr "Historique des appels" + +#: sflphone.xml:823(guilabel) +msgid "Keep my history for at least n days" +msgstr "Garder mon historique pour au moins n jours" + +#: sflphone.xml:824(para) +msgid "" +"If checked, calls will be kept up to N days in the history. You may select a " +"custom number of days. Do not check it if you don't want to use this feature." +msgstr "" + +#: sflphone.xml:834(title) +msgid "Configuration file options" +msgstr "Fichier de configuration" + +#: sflphone.xml:847(guilabel) +msgid "Store SIP credentials as MD5 hash" +msgstr "" +"Stocker les informations d'authentification sour forme encryptée (MD5)" + +#: sflphone.xml:848(para) +msgid "" +"If checked, your password information will be encrypted in the configuration " +"file, instead of plain text." +msgstr "" + +#: sflphone.xml:859(title) +msgid "Audio" +msgstr "Audio" + +#: sflphone.xml:863(title) +msgid "Address book" +msgstr "Carnet d'adresse" + +#: sflphone.xml:865(para) +msgid "" +"Refer to the <link linkend=\"addressbook\">Address books</link> section for " +"more information." +msgstr "" +"Se référer à la section <link linkend=\"addressbook\">Carnet " +"d'adresse</link> pour plus d'informations." + +#: sflphone.xml:869(title) +msgid "Hooks" +msgstr "Ancrage" + +#: sflphone.xml:877(title) +msgid "Direct IP calls" +msgstr "Appels IP" + +#: sflphone.xml:878(para) +msgid "" +"Refer to the <link linkend=\"directip\">Direct IP calls</link> section for " +"more information." +msgstr "" + +#. Put one translator per line, in the form of NAME <EMAIL>, YEAR1, YEAR2 +#: sflphone.xml:0(None) +msgid "translator-credits" +msgstr "" +"Launchpad Contributions:\n" +" Emmanuel Milou https://launchpad.net/~manumilou" diff --git a/sflphone-client-gnome/globals.mak b/sflphone-client-gnome/globals.mak index 027c152adb7defd6cd9acbf4a3f1d593e5fe2e78..8fe5ee180b5b23c08aaff4dda0927d41bdbdeb32 100644 --- a/sflphone-client-gnome/globals.mak +++ b/sflphone-client-gnome/globals.mak @@ -18,5 +18,6 @@ AM_CPPFLAGS = $(DEPS_CFLAGS) \ -DSYSCONFDIR=\""$(sysconfdir)"\" \ -DDATADIR=\""$(datadir)"\" \ -DLIBDIR=\""$(libdir)"\" \ + -DLOCALEDIR=\""$(localedir)"\" \ -DSFLPHONE_UIDIR=\""$(datadir)/sflphone/ui"\" diff --git a/sflphone-client-gnome/po/Makefile.am b/sflphone-client-gnome/po/Makefile.am index 6d2d320a9b79675cc62abab8c0a919be3dd0da04..2f8eebd1ccf3f00a642c4b16581e2af010f67dbb 100644 --- a/sflphone-client-gnome/po/Makefile.am +++ b/sflphone-client-gnome/po/Makefile.am @@ -38,7 +38,7 @@ SUFFIXES=.po .mo .po.mo: $(MSGFMT) -o $@ $< -install-data-local: +install-data-local: $(MOFILES) @catalogs='$(MOFILES)'; \ for i in $$catalogs; do \ destdir=$(locale_installdir); \ @@ -58,4 +58,4 @@ uninstall-local: done clean-local: - rm -rf *.mo + rm -f $(MOFILES) diff --git a/sflphone-client-gnome/po/ru/ru.po b/sflphone-client-gnome/po/ru/ru.po index 18045ccd617305d4f618c86d1bc5ae43e91c3548..14b3aa5dd8b52a0d5e0d4baafc1ee6278b5fe18f 100644 --- a/sflphone-client-gnome/po/ru/ru.po +++ b/sflphone-client-gnome/po/ru/ru.po @@ -8,16 +8,15 @@ msgstr "" "Project-Id-Version: SFLphone 0.9.6\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-12-03 10:22-0500\n" -"PO-Revision-Date: 2009-10-26 20:46+0000\n" -"Last-Translator: Emmanuel Milou <emmanuel.milou@savoirfairelinux.com>\n" +"PO-Revision-Date: 2009-12-08 20:46+0000\n" +"Last-Translator: Hussein Abdallah <hussein.abdallah@savoirfairelinux.com>\n" "Language-Team: Savoir-Faire Linux Inc <sflphoneteam@savoirfairelinux.com>\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-Launchpad-Export-Date: 2009-12-03 15:32+0000\n" -"X-Generator: Launchpad (build Unknown)\n" +"X-Generator: \n" #: ../sflphone-client-gnome/src/accountlist.c:175 msgid "Registered" @@ -29,7 +28,7 @@ msgstr "Не зарегистрирован" #: ../sflphone-client-gnome/src/accountlist.c:181 msgid "Trying..." -msgstr "Пытаюсь..." +msgstr "Подключение..." #: ../sflphone-client-gnome/src/accountlist.c:184 #: ../sflphone-client-gnome/src/sflnotify.c:131 @@ -59,15 +58,15 @@ msgstr "Неверный сервер Stun" #: ../sflphone-client-gnome/src/accountlist.c:202 msgid "Invalid" -msgstr "Неверный" +msgstr "Ошибка" #: ../sflphone-client-gnome/src/actions.c:98 msgid "Using account" -msgstr "Используя учетную запись" +msgstr "Используется учетная запись" #: ../sflphone-client-gnome/src/actions.c:104 msgid "No registered accounts" -msgstr "У вас нет зарегистрированных аккаунтов" +msgstr "Нет зарегистрированных учëтных записей" #: ../sflphone-client-gnome/src/actions.c:285 msgid "" @@ -127,11 +126,11 @@ msgstr "" #: ../sflphone-client-gnome/src/mainwindow.c:73 msgid "There is one call in progress." -msgstr "Звонок ещё не окончен." +msgstr "Один текущий разговор." #: ../sflphone-client-gnome/src/mainwindow.c:77 msgid "There are calls in progress." -msgstr "Несколько звонков ещё не окончены." +msgstr "Несколько текущих разговоров." #: ../sflphone-client-gnome/src/mainwindow.c:86 msgid "Do you still want to quit?" @@ -144,11 +143,11 @@ msgstr "Ошибка SFLphone." #: ../sflphone-client-gnome/src/mainwindow.c:392 #, c-format msgid "ZRTP is not supported by peer %s\n" -msgstr "не поддерживается устройством %s\n" +msgstr "ZRTP не поддерживается устройством %s\n" #: ../sflphone-client-gnome/src/mainwindow.c:393 msgid "Secure Communication Unavailable" -msgstr "Зашифрованная связь недоступна." +msgstr "Зашифрованная связь недоступна" #: ../sflphone-client-gnome/src/mainwindow.c:394 #: ../sflphone-client-gnome/src/mainwindow.c:416 @@ -213,19 +212,19 @@ msgstr[2] "%d голосовые письма" #: ../sflphone-client-gnome/src/sflnotify.c:111 #, c-format msgid "Calling with %s account <i>%s</i>" -msgstr "Звонок с аккаунтом %s <i>%s</i>" +msgstr "Звонок с учëтной записью %s <i>%s</i>" #: ../sflphone-client-gnome/src/sflnotify.c:115 msgid "Current account" -msgstr "Нынешний аккаунт" +msgstr "Нынешняя учëтная запись" #: ../sflphone-client-gnome/src/sflnotify.c:130 msgid "You have no accounts set up" -msgstr "Вы не настроили ни одного аккаунта" +msgstr "Вы не настроили ни одной учëтной записи" #: ../sflphone-client-gnome/src/sflnotify.c:147 msgid "You have no registered accounts" -msgstr "У вас нет зарегистрированных аккаунтов" +msgstr "У вас нет зарегистрированных учëтных записей" #: ../sflphone-client-gnome/src/sflnotify.c:190 #, c-format @@ -271,9 +270,9 @@ msgstr "SFLphone" #, c-format msgid "%i account configured" msgid_plural "%i accounts configured" -msgstr[0] "%i аккаунт настроен." -msgstr[1] "%i аккаунтов настроены" -msgstr[2] "%i аккаунтов настроены" +msgstr[0] "Настроена одна учëтная запись" +msgstr[1] "Настроены %i учëтные записи" +msgstr[2] "Настроены %i учëтные записи" #: ../sflphone-client-gnome/src/toolbar.c:38 #: ../sflphone-client-gnome/src/uimanager.c:693 @@ -283,7 +282,7 @@ msgstr "Автоответчик" #: ../sflphone-client-gnome/src/uimanager.c:117 msgid "No address book selected" -msgstr "Адресная книга" +msgstr "Нет выбранных адресных книг" #: ../sflphone-client-gnome/src/uimanager.c:137 #: ../sflphone-client-gnome/src/uimanager.c:756 @@ -292,7 +291,7 @@ msgstr "Адресная книга" #: ../sflphone-client-gnome/src/uimanager.c:279 msgid "Voicemail (%i)" -msgstr "Автоответчик" +msgstr "Автоответчик (%i)" #: ../sflphone-client-gnome/src/uimanager.c:342 msgid "SFLphone is a VoIP client compatible with SIP and IAX2 protocols." @@ -313,7 +312,7 @@ msgstr "_Новый звонок" #: ../sflphone-client-gnome/src/uimanager.c:720 msgid "Place a new call" -msgstr "" +msgstr "Позвонить" #: ../sflphone-client-gnome/src/uimanager.c:721 #: ../sflphone-client-gnome/src/uimanager.c:979 @@ -322,7 +321,7 @@ msgstr "_Взять трубку" #: ../sflphone-client-gnome/src/uimanager.c:721 msgid "Answer the call" -msgstr "" +msgstr "Ответить" #: ../sflphone-client-gnome/src/uimanager.c:722 #: ../sflphone-client-gnome/src/uimanager.c:991 @@ -332,7 +331,7 @@ msgstr "_Положить трубку" #: ../sflphone-client-gnome/src/uimanager.c:722 msgid "Finish the call" -msgstr "" +msgstr "Закончить звонок" #: ../sflphone-client-gnome/src/uimanager.c:723 msgid "O_n hold" @@ -340,15 +339,15 @@ msgstr "_Удержать звонок" #: ../sflphone-client-gnome/src/uimanager.c:723 msgid "Place the call on hold" -msgstr "" +msgstr "Удержать звонок" #: ../sflphone-client-gnome/src/uimanager.c:724 msgid "O_ff hold" -msgstr "" +msgstr "_Возобновить разговор" #: ../sflphone-client-gnome/src/uimanager.c:724 msgid "Place the call off hold" -msgstr "" +msgstr "Возобновить разговор" #: ../sflphone-client-gnome/src/uimanager.c:725 #: ../sflphone-client-gnome/src/uimanager.c:1015 @@ -357,15 +356,15 @@ msgstr "Записать" #: ../sflphone-client-gnome/src/uimanager.c:725 msgid "Record the current conversation" -msgstr "" +msgstr "Записать переговор" #: ../sflphone-client-gnome/src/uimanager.c:726 msgid "Configuration _Assistant" -msgstr "Файл конфигурации" +msgstr "Мастер настройки" #: ../sflphone-client-gnome/src/uimanager.c:726 msgid "Run the configuration assistant" -msgstr "Ошибка конфигурации Stun" +msgstr "Запустить мастер настройки" #: ../sflphone-client-gnome/src/uimanager.c:727 msgid "Call your voicemail" @@ -373,11 +372,11 @@ msgstr "%d голосовое письмо" #: ../sflphone-client-gnome/src/uimanager.c:728 msgid "_Close" -msgstr "" +msgstr "_Закрыть" #: ../sflphone-client-gnome/src/uimanager.c:728 msgid "Minimize to system tray" -msgstr "" +msgstr "Уменьшить в значок" #: ../sflphone-client-gnome/src/uimanager.c:729 msgid "_Quit" @@ -385,7 +384,7 @@ msgstr "_Правка" #: ../sflphone-client-gnome/src/uimanager.c:729 msgid "Quit the program" -msgstr "" +msgstr "Выйти из программы" #: ../sflphone-client-gnome/src/uimanager.c:732 msgid "_Edit" @@ -393,19 +392,19 @@ msgstr "_Правка" #: ../sflphone-client-gnome/src/uimanager.c:733 msgid "_Copy" -msgstr "" +msgstr "_Копировать" #: ../sflphone-client-gnome/src/uimanager.c:733 msgid "Copy the selection" -msgstr "Удалить выбранную учетную запись" +msgstr "Копировать видимое" #: ../sflphone-client-gnome/src/uimanager.c:734 msgid "_Paste" -msgstr "" +msgstr "_Вставить" #: ../sflphone-client-gnome/src/uimanager.c:734 msgid "Paste the clipboard" -msgstr "" +msgstr "Вставить из буфера обмена" #: ../sflphone-client-gnome/src/uimanager.c:735 msgid "Clear _history" @@ -417,19 +416,19 @@ msgstr "Очистить историю" #: ../sflphone-client-gnome/src/uimanager.c:736 msgid "_Accounts" -msgstr "_Аккаунты" +msgstr "_Учëтные записи" #: ../sflphone-client-gnome/src/uimanager.c:736 msgid "Edit your accounts" -msgstr "Нынешний аккаунт" +msgstr "Изменить ваши учëтные записи" #: ../sflphone-client-gnome/src/uimanager.c:737 msgid "_Preferences" -msgstr "Предпочтения" +msgstr "_Предпочтения" #: ../sflphone-client-gnome/src/uimanager.c:737 msgid "Change your preferences" -msgstr "" +msgstr "Изменить ваши предпочтении" #: ../sflphone-client-gnome/src/uimanager.c:740 msgid "_View" @@ -445,7 +444,7 @@ msgstr "Продолжить" #: ../sflphone-client-gnome/src/uimanager.c:744 msgid "Open the manual" -msgstr "" +msgstr "Открыть справочник " #: ../sflphone-client-gnome/src/uimanager.c:745 msgid "About this application" @@ -457,23 +456,23 @@ msgstr "Переслать звонок на другой номер" #: ../sflphone-client-gnome/src/uimanager.c:751 msgid "Transfer the call" -msgstr "Передать : " +msgstr "Переслать звонок на другой номер" #: ../sflphone-client-gnome/src/uimanager.c:752 msgid "_Show toolbar" -msgstr "" +msgstr "Показать панель инструментов" #: ../sflphone-client-gnome/src/uimanager.c:752 msgid "Show the toolbar" -msgstr "" +msgstr "Показать панель инструментов" #: ../sflphone-client-gnome/src/uimanager.c:753 msgid "_Dialpad" -msgstr "Отключен" +msgstr "Панель набора номера" #: ../sflphone-client-gnome/src/uimanager.c:753 msgid "Show the dialpad" -msgstr "" +msgstr "Показать панель набора номера" #: ../sflphone-client-gnome/src/uimanager.c:754 msgid "_Volume controls" @@ -489,7 +488,7 @@ msgstr "Журнал" #: ../sflphone-client-gnome/src/uimanager.c:755 msgid "Calls history" -msgstr "История звонков" +msgstr "Журнал звонков" #: ../sflphone-client-gnome/src/uimanager.c:756 msgid "_Address book" @@ -552,7 +551,7 @@ msgstr "Па_роль" #: ../sflphone-client-gnome/src/config/assistant.c:363 #: ../sflphone-client-gnome/src/config/assistant.c:473 msgid "Show password" -msgstr "Пароль" +msgstr "Показать пароль" #: ../sflphone-client-gnome/src/config/accountconfigdialog.c:274 #: ../sflphone-client-gnome/src/config/assistant.c:368 @@ -589,7 +588,7 @@ msgstr "Безопасность" #: ../sflphone-client-gnome/src/config/accountconfigdialog.c:687 #: ../sflphone-client-gnome/src/config/preferencesdialog.c:333 msgid "Use TLS transport (sips)" -msgstr "Имя для аутентификации" +msgstr "Использовать TLS-транспорт (sips)" #: ../sflphone-client-gnome/src/config/accountconfigdialog.c:693 #: ../sflphone-client-gnome/src/config/preferencesdialog.c:338 @@ -607,7 +606,7 @@ msgstr "Регистрация" #: ../sflphone-client-gnome/src/config/accountconfigdialog.c:800 msgid "Registration expire" -msgstr "Истек срок регистрации" +msgstr "Срок истечения регистрации" #: ../sflphone-client-gnome/src/config/accountconfigdialog.c:809 msgid "_Comply with RFC 3263" @@ -616,7 +615,7 @@ msgstr "_Соотвествует RFC 3263" #: ../sflphone-client-gnome/src/config/accountconfigdialog.c:816 #: ../sflphone-client-gnome/src/config/preferencesdialog.c:234 msgid "Network Interface" -msgstr "Сеть недоступна" +msgstr "Сетевые настройки" #: ../sflphone-client-gnome/src/config/accountconfigdialog.c:830 #: ../sflphone-client-gnome/src/config/preferencesdialog.c:249 @@ -631,7 +630,7 @@ msgstr "Локальный порт" #: ../sflphone-client-gnome/src/config/accountconfigdialog.c:893 #: ../sflphone-client-gnome/src/config/accountconfigdialog.c:928 msgid "Published address" -msgstr "издаваемый адрес" +msgstr "Сетевые настройки для Интернета" #: ../sflphone-client-gnome/src/config/accountconfigdialog.c:899 msgid "Using STUN" @@ -651,11 +650,11 @@ msgstr "Настроить видимый адрес и порт :" #: ../sflphone-client-gnome/src/config/accountconfigdialog.c:936 msgid "Published port" -msgstr "издаваемый порт" +msgstr "Публичный порт" #: ../sflphone-client-gnome/src/config/accountconfigdialog.c:1027 msgid "Account settings" -msgstr "Настройки аккаунта" +msgstr "Настройки учëтной записи" #: ../sflphone-client-gnome/src/config/accountconfigdialog.c:1046 msgid "Basic" @@ -683,18 +682,18 @@ msgstr "Учётные записи" #: ../sflphone-client-gnome/src/config/accountlistconfigdialog.c:484 msgid "Configured Accounts" -msgstr "Нынешний аккаунт" +msgstr "Настроенные учëтные записи" #: ../sflphone-client-gnome/src/config/accountlistconfigdialog.c:501 msgid "There is %d active account" msgid_plural "There are %d active accounts" -msgstr[0] " действующий аккаунт" -msgstr[1] " действующий аккаунт" -msgstr[2] " действующий аккаунт" +msgstr[0] "Одна действующая учëтная запись" +msgstr[1] "%d действующих учëтных записей" +msgstr[2] "%d действующих учëтных записей" #: ../sflphone-client-gnome/src/config/accountlistconfigdialog.c:507 msgid "You have no active account" -msgstr "У вас нет активного аккаунта" +msgstr "У вас нет активной учëтной записи" #: ../sflphone-client-gnome/src/config/addressbook-config.c:306 #: ../sflphone-client-gnome/src/config/preferencesdialog.c:556 @@ -707,7 +706,7 @@ msgstr "_Использовать адресную книгу Evolution" #: ../sflphone-client-gnome/src/config/addressbook-config.c:319 msgid "Download limit :" -msgstr "Ограничение скорости скачивания:" +msgstr "Показывать не более " #: ../sflphone-client-gnome/src/config/addressbook-config.c:327 msgid "cards" @@ -719,7 +718,7 @@ msgstr "_Показать фотографию контакта (если име #: ../sflphone-client-gnome/src/config/addressbook-config.c:341 msgid "Fields from Evolution's address books" -msgstr "Исполоьзовать следующие поля из адресной книги Evolution:" +msgstr "Исполоьзовать следующие номера из адресной книги Evolution" #: ../sflphone-client-gnome/src/config/addressbook-config.c:345 msgid "_Work" @@ -756,8 +755,8 @@ msgid "" "You can at any time check your registration state or modify your accounts " "parameters in the Options/Accounts window." msgstr "" -"Вы можете в любое время проверить статус регистрации или изменитьпараметры " -"ваших аккаунтов в меню Правка / Аккаунты." +"Вы можете в любое время проверить статус регистрации или изменить параметры " +"ваших учëтных записей в меню Правка / Учëтные записи" #: ../sflphone-client-gnome/src/config/assistant.c:80 msgid "Alias" @@ -773,7 +772,7 @@ msgstr "Пользователь" #: ../sflphone-client-gnome/src/config/assistant.c:92 msgid "Security: " -msgstr "Безопасность " +msgstr "Безопасность:" #: ../sflphone-client-gnome/src/config/assistant.c:94 msgid "SRTP/ZRTP draft-zimmermann" @@ -793,7 +792,7 @@ msgstr "Добро пожаловать в SFLphone!" #: ../sflphone-client-gnome/src/config/assistant.c:256 msgid "This installation wizard will help you configure an account." -msgstr "Этот мастер установки поможет вам настроить ваш аккаунт." +msgstr "Этот мастер установки поможет вам настроить вашу учëтную запись" #: ../sflphone-client-gnome/src/config/assistant.c:270 msgid "VoIP Protocols" @@ -801,7 +800,7 @@ msgstr "VoIP-протоколы" #: ../sflphone-client-gnome/src/config/assistant.c:270 msgid "Select an account type" -msgstr "Выберите тип аккаунта" +msgstr "Выберите тип учëтной записи" #: ../sflphone-client-gnome/src/config/assistant.c:272 msgid "SIP (Session Initiation Protocol)" @@ -813,7 +812,7 @@ msgstr "IAX2 (InterAsterix Exchange)" #: ../sflphone-client-gnome/src/config/assistant.c:288 msgid "Account" -msgstr "Аккаунты" +msgstr "Учëтная запись" #: ../sflphone-client-gnome/src/config/assistant.c:288 msgid "Please select one of the following options" @@ -821,15 +820,15 @@ msgstr "Введите пожалуйста следующие данные" #: ../sflphone-client-gnome/src/config/assistant.c:290 msgid "Create a free SIP/IAX2 account on sflphone.org" -msgstr "Создать бесплатный SIP/IAX2-аккаунт на sflphone.org" +msgstr "Создать бесплатную SIP/IAX2-учëтную запись на sflphone.org" #: ../sflphone-client-gnome/src/config/assistant.c:292 msgid "Register an existing SIP or IAX2 account" -msgstr "Зарегистрировать существующий SIP или IAX2 аккаунт" +msgstr "Зарегистрировать существующею SIP или IAX2 учëтную запись" #: ../sflphone-client-gnome/src/config/assistant.c:306 msgid "SIP account settings" -msgstr "Настройка SIP-аккаунта" +msgstr "Настройка учëтной записи SIP" #: ../sflphone-client-gnome/src/config/assistant.c:306 #: ../sflphone-client-gnome/src/config/assistant.c:419 @@ -855,7 +854,7 @@ msgstr "_Адрес эл. почты" #: ../sflphone-client-gnome/src/config/assistant.c:419 msgid "IAX2 account settings" -msgstr "Настройка IAX2-аккаунта" +msgstr "Настройка учëтной записи IAX2" #: ../sflphone-client-gnome/src/config/assistant.c:496 msgid "Network Address Translation (NAT)" @@ -875,7 +874,7 @@ msgstr "_STUN-сервер" #: ../sflphone-client-gnome/src/config/assistant.c:526 msgid "Account Registration" -msgstr "Регистрация аккаунта" +msgstr "Регистрация учëтной записи" #: ../sflphone-client-gnome/src/config/assistant.c:526 msgid "Congratulations!" @@ -1000,7 +999,7 @@ msgid "" "sip URI such as <b>sip:remotepeer</b>. The settings you define here will " "also be used if no account can be matched to an incoming or outgoing call." msgstr "" -"Этот профиль используется когда бы хотите достичь удалëнное устройство " +"Этот профиль используется когда вы хотите достичь удалëнное устройство " "просто набрав SIP URI (адрес) типа <b>sip:удалëнное устройство</b>. Эти " "настройки так-же будут использованы если не будет подходящего аккаунта для " "входящего или выходящего звонка." @@ -1015,7 +1014,7 @@ msgstr "Включить звонок" #: ../sflphone-client-gnome/src/config/preferencesdialog.c:450 msgid "System Tray Icon" -msgstr "System Tray Icon" +msgstr "Поведение окна SFLPhone" #: ../sflphone-client-gnome/src/config/preferencesdialog.c:453 msgid "_Popup main window on incoming call" diff --git a/sflphone-client-gnome/src/actions.c b/sflphone-client-gnome/src/actions.c index b3982aa8a72af3b751c6a66cb880933a8ea84d4c..ea216ca988ea9840bc075e6840e10e6378afa7ab 100644 --- a/sflphone-client-gnome/src/actions.c +++ b/sflphone-client-gnome/src/actions.c @@ -697,6 +697,8 @@ sflphone_new_call() peer_name = g_strdup (""); create_new_call (CALL, CALL_STATE_DIALING, "", "", peer_name, peer_number, &c); + c->_history_state = OUTGOING; + calllist_add (current_calls,c); calltree_add_call (current_calls, c, NULL); update_actions(); @@ -1208,23 +1210,59 @@ void sflphone_fill_history (void) { GHashTable *entries; GHashTableIter iter; - gpointer key, value; + gpointer key, key_to_min, value; callable_obj_t *history_entry; + int timestamp, min_timestamp; + + gboolean is_first; + DEBUG ("Loading history ..."); entries = dbus_get_history (); - if (entries) - { - // Init the iterator - g_hash_table_iter_init (&iter, entries); - while (g_hash_table_iter_next (&iter, &key, &value)) - { - /* do something with key and value */ - create_history_entry_from_serialized_form ((gchar*)key, (gchar*)value, &history_entry); - // Add it and update the GUI - calllist_add (history, history_entry); - } + if (entries) { + + while(g_hash_table_size (entries)) { + + is_first = TRUE; + + // find lowest timestamp in map + g_hash_table_iter_init (&iter, entries); + while (g_hash_table_iter_next (&iter, &key, &value)) { + + timestamp = atoi((gchar*)key); + + if(is_first) { + + // first iteration of the loop, init search + min_timestamp = timestamp; + key_to_min = key; + + is_first = FALSE; + } + else { + + // if lower, replace + if(timestamp < min_timestamp) { + + min_timestamp = timestamp; + key_to_min = key; + } + } + } + + if(g_hash_table_lookup_extended(entries, key_to_min, &key, &value)) { + + // do something with key and value + create_history_entry_from_serialized_form ((gchar*)key, (gchar*)value, &history_entry); + DEBUG("HISTORY ENTRY: %i\n", history_entry->_time_start); + // Add it and update the GUI + calllist_add (history, history_entry); + + // remove entry from map + g_hash_table_remove(entries, key_to_min); + } + } } } diff --git a/sflphone-client-gnome/src/config/accountconfigdialog.c b/sflphone-client-gnome/src/config/accountconfigdialog.c index 3876a60f91c18d4e99908e328871c8244c7f60e0..5fa496fe3d725e9ee018af1c04ee625a85bc821c 100644 --- a/sflphone-client-gnome/src/config/accountconfigdialog.c +++ b/sflphone-client-gnome/src/config/accountconfigdialog.c @@ -489,6 +489,25 @@ static void use_sip_tls_cb(GtkWidget *widget, gpointer data) } } +static local_interface_changed_cb(GtkWidget * widget, gpointer data UNUSED) +{ + + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sameAsLocalRadioButton))) { + + gchar * local_interface; + gchar * local_address; + + local_interface = (gchar *) gtk_combo_box_get_active_text(GTK_COMBO_BOX(localAddressCombo)); + local_address = dbus_get_address_from_interface_name(local_interface); + + gtk_entry_set_text(GTK_ENTRY(publishedAddressEntry), local_address); + + // gchar * local_port = (gchar *) gtk_entry_get_text(GTK_ENTRY(localPortSpinBox)); + // gtk_spin_button_set_value(GTK_SPIN_BUTTON(publishedPortSpinBox), g_ascii_strtod(local_port, NULL)); + } + +} + static set_published_addr_manually_cb(GtkWidget * widget, gpointer data UNUSED) { DEBUG("set_published_addr_manually_cb"); @@ -510,6 +529,9 @@ static set_published_addr_manually_cb(GtkWidget * widget, gpointer data UNUSED) static use_stun_cb(GtkWidget * widget, gpointer data UNUSED) { + gchar * local_interface; + gchar * local_address; + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) { DEBUG("Showing stun options, hiding Local/Published info"); gtk_widget_show(stunServerLabel); @@ -531,17 +553,31 @@ static use_stun_cb(GtkWidget * widget, gpointer data UNUSED) gtk_widget_show(publishedPortLabel); gtk_widget_show(publishedAddressEntry); gtk_widget_show(publishedPortSpinBox); + + // Since stun callback is called at initialization, we cannot reinit published address + // TODO: find a way so that if stun is unchecked, reinit published address entry + // in case local address changedd + + // local_interface = (gchar *) gtk_combo_box_get_active_text(GTK_COMBO_BOX(localAddressCombo)); + // local_address = dbus_get_address_from_interface_name(local_interface); + // gtk_entry_set_text(GTK_ENTRY(publishedAddressEntry), local_address); } } } + static same_as_local_cb(GtkWidget * widget, gpointer data UNUSED) { if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) { DEBUG("Same as local"); - gchar * ip_address = (gchar *) gtk_combo_box_get_active_text(GTK_COMBO_BOX(localAddressCombo)); - gtk_entry_set_text(GTK_ENTRY(publishedAddressEntry), ip_address); + gchar * local_interface; + gchar * local_address; + + local_interface = (gchar *) gtk_combo_box_get_active_text(GTK_COMBO_BOX(localAddressCombo)); + local_address = dbus_get_address_from_interface_name(local_interface); + + gtk_entry_set_text(GTK_ENTRY(publishedAddressEntry), local_address); gchar * local_port = (gchar *) gtk_entry_get_text(GTK_ENTRY(localPortSpinBox)); gtk_spin_button_set_value(GTK_SPIN_BUTTON(publishedPortSpinBox), g_ascii_strtod(local_port, NULL)); @@ -549,7 +585,6 @@ static same_as_local_cb(GtkWidget * widget, gpointer data UNUSED) } - GtkWidget * create_security_tab(account_t **a) { GtkWidget * frame; @@ -757,6 +792,7 @@ GtkWidget * create_advanced_tab(account_t **a) gchar * use_tls; gchar * published_address; gchar * published_port; + gchar * local_interface; gchar * local_address; gchar * local_port; gchar * stun_enable; @@ -772,13 +808,15 @@ GtkWidget * create_advanced_tab(account_t **a) published_sameas_local = g_hash_table_lookup(currentAccount->properties, PUBLISHED_SAMEAS_LOCAL); + local_interface = g_hash_table_lookup(currentAccount->properties, LOCAL_INTERFACE); + local_port = g_hash_table_lookup(currentAccount->properties, LOCAL_PORT); - local_address = g_hash_table_lookup(currentAccount->properties, LOCAL_ADDRESS); if (g_strcasecmp(published_sameas_local,"true") == 0) { - published_address = g_hash_table_lookup(currentAccount->properties, LOCAL_ADDRESS); + published_address = dbus_get_address_from_interface_name(local_interface); published_port = g_hash_table_lookup(currentAccount->properties, LOCAL_PORT); + } else { @@ -833,7 +871,8 @@ GtkWidget * create_advanced_tab(account_t **a) GtkTreeIter current_local_address_iter = iter; gchar ** iface_list = NULL; - iface_list = (gchar**) dbus_get_all_ip_interface(); + // iface_list = (gchar**) dbus_get_all_ip_interface(); + iface_list = (gchar**) dbus_get_all_ip_interface_by_name(); gchar ** iface = NULL; // flag to determine if local_address is found @@ -848,7 +887,7 @@ GtkWidget * create_advanced_tab(account_t **a) gtk_list_store_set(ipInterfaceListStore, &iter, 0, *iface, -1 ); // set the current local address - if (!iface_found && (g_strcmp0(*iface, local_address) == 0)) { + if (!iface_found && (g_strcmp0(*iface, local_interface) == 0)) { DEBUG("Setting active local address combo box"); current_local_address_iter = iter; iface_found = TRUE; @@ -930,6 +969,7 @@ GtkWidget * create_advanced_tab(account_t **a) gtk_misc_set_alignment(GTK_MISC (publishedAddressLabel), 0, 0.5); publishedAddressEntry = gtk_entry_new(); gtk_label_set_mnemonic_widget (GTK_LABEL (publishedAddressLabel), publishedAddressEntry); + gtk_entry_set_text(GTK_ENTRY(publishedAddressEntry), published_address); gtk_table_attach_defaults( GTK_TABLE(table), publishedAddressEntry, 1, 2, 5, 6); @@ -946,7 +986,10 @@ GtkWidget * create_advanced_tab(account_t **a) // This will trigger a signal, and the above two // widgets need to be instanciated before that. - g_signal_connect(useStunCheckBox, "toggled", G_CALLBACK(use_stun_cb), useStunCheckBox); + g_signal_connect(localAddressCombo, "changed", G_CALLBACK(local_interface_changed_cb), localAddressCombo); + + g_signal_connect(useStunCheckBox, "toggled", G_CALLBACK(use_stun_cb), useStunCheckBox); + g_signal_connect(sameAsLocalRadioButton, "toggled", G_CALLBACK(same_as_local_cb), sameAsLocalRadioButton); g_signal_connect(publishedAddrRadioButton, "toggled", G_CALLBACK(set_published_addr_manually_cb), publishedAddrRadioButton); @@ -1015,6 +1058,11 @@ show_account_window (account_t * a) gint response; account_t *currentAccount; + // In case the published address is same than local, + // we must resolve published address from interface name + gchar * local_interface; + gchar * published_address; + currentAccount = a; if (currentAccount == NULL) { @@ -1119,14 +1167,16 @@ show_account_window (account_t * a) g_hash_table_replace(currentAccount->properties, g_strdup(PUBLISHED_SAMEAS_LOCAL), g_strdup(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sameAsLocalRadioButton)) ? "true":"false")); g_hash_table_replace(currentAccount->properties, - g_strdup(LOCAL_PORT), - g_strdup((gchar *)gtk_entry_get_text(GTK_ENTRY(localPortSpinBox)))); + g_strdup(LOCAL_INTERFACE), + g_strdup((gchar *)gtk_combo_box_get_active_text(GTK_COMBO_BOX(localAddressCombo)))); g_hash_table_replace(currentAccount->properties, - g_strdup(LOCAL_ADDRESS), - g_strdup((gchar *)gtk_combo_box_get_active_text(GTK_COMBO_BOX(localAddressCombo)))); + g_strdup(LOCAL_PORT), + g_strdup((gchar *)gtk_entry_get_text(GTK_ENTRY(localPortSpinBox)))); + if(!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sameAsLocalRadioButton))) { + g_hash_table_replace(currentAccount->properties, g_strdup(PUBLISHED_PORT), g_strdup((gchar *)gtk_entry_get_text(GTK_ENTRY(publishedPortSpinBox)))); @@ -1140,10 +1190,13 @@ show_account_window (account_t * a) g_hash_table_replace(currentAccount->properties, g_strdup(PUBLISHED_PORT), g_strdup((gchar *)gtk_entry_get_text(GTK_ENTRY(localPortSpinBox)))); + local_interface = g_strdup((gchar *)gtk_combo_box_get_active_text(GTK_COMBO_BOX(localAddressCombo))); + + published_address = dbus_get_address_from_interface_name(local_interface); g_hash_table_replace(currentAccount->properties, g_strdup(PUBLISHED_ADDRESS), - g_strdup((gchar *)gtk_combo_box_get_active_text(GTK_COMBO_BOX(localAddressCombo)))); + published_address); } } diff --git a/sflphone-client-gnome/src/config/assistant.c b/sflphone-client-gnome/src/config/assistant.c index c3be338bced5e9a7771b67165d8c240b44089019..0319d1bd5e0e7e0bbec6120192546366aa45b4e8 100644 --- a/sflphone-client-gnome/src/config/assistant.c +++ b/sflphone-client-gnome/src/config/assistant.c @@ -164,7 +164,8 @@ static void sip_apply_callback( void ) { iface = iface_list; DEBUG("Selected interface %s", *iface); - g_hash_table_insert(current->properties, g_strdup(LOCAL_ADDRESS), g_strdup((gchar *)*iface)); + g_hash_table_insert(current->properties, g_strdup(LOCAL_INTERFACE), g_strdup((gchar *)*iface)); + g_hash_table_insert(current->properties, g_strdup(PUBLISHED_ADDRESS), g_strdup((gchar *)*iface)); dbus_add_account( current ); diff --git a/sflphone-client-gnome/src/config/preferencesdialog.c b/sflphone-client-gnome/src/config/preferencesdialog.c index 0be77de11e31854f4f66d616b38d6f1802553f60..791e4aaea6c2042c3f9bb4e6f7e27f558fe26e41 100644 --- a/sflphone-client-gnome/src/config/preferencesdialog.c +++ b/sflphone-client-gnome/src/config/preferencesdialog.c @@ -58,22 +58,6 @@ static gboolean history_enabled = TRUE; GHashTable * directIpCallsProperties = NULL; - - -static void update_ip_address_port_cb ( GtkSpinButton *button UNUSED, void *ptr ) -{ - // dbus_set_sip_port(gtk_spin_button_get_value_as_int((GtkSpinButton *)(ptr))); - gchar* local_address = g_strdup((gchar *)gtk_combo_box_get_active_text(GTK_COMBO_BOX(localAddressCombo))); - gchar* local_port = g_strdup((gchar *)gtk_entry_get_text(GTK_ENTRY(localPortSpinBox))); - - gchar* ip_interface = g_strconcat(local_address, ":", local_port, NULL); - - DEBUG("update_ip_address_port_cb %s\n", ip_interface); - - dbus_set_sip_address(ip_interface); -} - - static void set_md5_hash_cb(GtkWidget *widget UNUSED, gpointer data UNUSED) { @@ -165,7 +149,7 @@ static void use_sip_tls_cb(GtkWidget *widget, gpointer data) static void ip2ip_local_address_changed_cb(GtkWidget *widget, gpointer data) { DEBUG("ip2ip_local_address_changed_cb\n"); - g_hash_table_replace(directIpCallsProperties, g_strdup(LOCAL_ADDRESS), g_strdup((gchar *)gtk_combo_box_get_active_text(GTK_COMBO_BOX(widget)))); + g_hash_table_replace(directIpCallsProperties, g_strdup(LOCAL_INTERFACE), g_strdup((gchar *)gtk_combo_box_get_active_text(GTK_COMBO_BOX(widget)))); } static void ip2ip_local_port_changed_cb(GtkWidget *widget, gpointer data) @@ -199,6 +183,7 @@ GtkWidget* create_direct_ip_calls_tab() gchar * curKeyExchange = "0"; gchar * description; + gchar * local_interface; gchar * local_address; gchar * local_port; @@ -207,9 +192,9 @@ GtkWidget* create_direct_ip_calls_tab() if(directIpCallsProperties != NULL) { DEBUG("got a directIpCallsProperties"); - local_address = g_hash_table_lookup(directIpCallsProperties, LOCAL_ADDRESS); + local_interface = g_hash_table_lookup(directIpCallsProperties, LOCAL_INTERFACE); local_port = g_hash_table_lookup(directIpCallsProperties, LOCAL_PORT); - DEBUG(" local address = %s", local_address); + DEBUG(" local interface = %s", local_interface); DEBUG(" local port = %s", local_port); curSRTPEnabled = g_hash_table_lookup(directIpCallsProperties, ACCOUNT_SRTP_ENABLED); DEBUG(" curSRTPEnabled = %s", curSRTPEnabled); @@ -252,7 +237,8 @@ GtkWidget* create_direct_ip_calls_tab() GtkTreeIter current_local_address_iter = iter; gchar ** iface_list = NULL; - iface_list = (gchar**) dbus_get_all_ip_interface(); + // iface_list = (gchar**) dbus_get_all_ip_interface(); + iface_list = (gchar**) dbus_get_all_ip_interface_by_name(); gchar ** iface; gboolean iface_found = FALSE; @@ -263,7 +249,7 @@ GtkWidget* create_direct_ip_calls_tab() gtk_list_store_append(ipInterfaceListStore, &iter ); gtk_list_store_set(ipInterfaceListStore, &iter, 0, *iface, -1 ); - if (!iface_found && (g_strcmp0(*iface, local_address) == 0)) { + if (!iface_found && (g_strcmp0(*iface, local_interface) == 0)) { DEBUG("Setting active local address combo box"); current_local_address_iter = iter; iface_found = TRUE; @@ -291,7 +277,7 @@ GtkWidget* create_direct_ip_calls_tab() gtk_combo_box_set_active_iter(GTK_COMBO_BOX(localAddressCombo), ¤t_local_address_iter); g_signal_connect (G_OBJECT(GTK_COMBO_BOX(localAddressCombo)), "changed", G_CALLBACK (ip2ip_local_address_changed_cb), localAddressCombo); - g_hash_table_replace(directIpCallsProperties, g_strdup(LOCAL_ADDRESS), g_strdup((gchar *)gtk_combo_box_get_active_text(GTK_COMBO_BOX(localAddressCombo)))); + g_hash_table_replace(directIpCallsProperties, g_strdup(LOCAL_INTERFACE), g_strdup((gchar *)gtk_combo_box_get_active_text(GTK_COMBO_BOX(localAddressCombo)))); /** @@ -311,7 +297,7 @@ GtkWidget* create_direct_ip_calls_tab() GtkWidget *applyModificationButton = gtk_button_new_from_stock(GTK_STOCK_APPLY); - g_signal_connect( G_OBJECT(applyModificationButton) , "clicked" , G_CALLBACK( update_ip_address_port_cb ), localPortSpinBox); + // g_signal_connect( G_OBJECT(applyModificationButton) , "clicked" , G_CALLBACK( update_ip_address_port_cb ), localPortSpinBox); gtk_table_attach( GTK_TABLE(table), applyModificationButton, 2, 3, 1, 2, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 5); diff --git a/sflphone-client-gnome/src/config/tlsadvanceddialog.h b/sflphone-client-gnome/src/config/tlsadvanceddialog.h index 853d0ddd95416fe648bb5ed7b69c30e5e853644d..4b7702a2324ad086dd81444ea3e1f166c579cd07 100644 --- a/sflphone-client-gnome/src/config/tlsadvanceddialog.h +++ b/sflphone-client-gnome/src/config/tlsadvanceddialog.h @@ -24,6 +24,7 @@ */ #include <glib.h> +#include <mainwindow.h> /** * Display the advanced options window for zrtp diff --git a/sflphone-client-gnome/src/config/zrtpadvanceddialog.c b/sflphone-client-gnome/src/config/zrtpadvanceddialog.c index b055e0de41ad37998c1e43739950e6f166e2db73..02b634d55915e91c8752448bfdbee95013e3400a 100644 --- a/sflphone-client-gnome/src/config/zrtpadvanceddialog.c +++ b/sflphone-client-gnome/src/config/zrtpadvanceddialog.c @@ -47,7 +47,7 @@ void show_advanced_zrtp_options(GHashTable * properties) } securityDialog = GTK_DIALOG (gtk_dialog_new_with_buttons ( _("ZRTP Options"), - GTK_WINDOW (get_main_window()), + GTK_WINDOW (get_main_window()), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, diff --git a/sflphone-client-gnome/src/config/zrtpadvanceddialog.h b/sflphone-client-gnome/src/config/zrtpadvanceddialog.h index fb84c6e7b74a17218e640f18714b1fea23b32385..df92bfb09b5586627b02fb61600388bb0d6cbd1e 100644 --- a/sflphone-client-gnome/src/config/zrtpadvanceddialog.h +++ b/sflphone-client-gnome/src/config/zrtpadvanceddialog.h @@ -24,7 +24,7 @@ */ #include <glib.h> - +#include <mainwindow.h> /** * Display the advanced options window for zrtp */ diff --git a/sflphone-client-gnome/src/contacts/calltree.c b/sflphone-client-gnome/src/contacts/calltree.c index 9fc579db20d87af4e83128a9ba83290dfb8919e8..0838bacd8e50d2c25eb2b671ab9bb3ed4b857235 100644 --- a/sflphone-client-gnome/src/contacts/calltree.c +++ b/sflphone-client-gnome/src/contacts/calltree.c @@ -351,25 +351,32 @@ calltree_display_call_info(callable_obj_t * c, CallDisplayType display_type, gch DEBUG("Display call info"); - // Get the hostname for this call (NULL if not existent) - hostname = g_strrstr(peer_number, "@"); + // If call is outgoing, keep the hostname, strip it elsewhere + if(c->_type == CALL && c->_history_state == OUTGOING) { - // Test if we are dialing a new number - if(g_strcmp0("", c->_peer_number) != 0) { + display_number = peer_number; + } + else { + + // Get the hostname for this call (NULL if not existent) + hostname = g_strrstr(peer_number, "@"); - // Strip the hostname if existent - if(hostname) { - display_number = g_strndup(peer_number, hostname - peer_number); + // Test if we are dialing a new number + if(g_strcmp0("", c->_peer_number) != 0) { + + // Strip the hostname if existent + if(hostname) { + display_number = g_strndup(peer_number, hostname - peer_number); + } + else { + display_number = peer_number; + } } else { + display_number = peer_number; } } - else { - - display_number = peer_number; - } - // Different display depending on type switch(display_type) { @@ -714,7 +721,6 @@ calltree_update_call (calltab_t* tab, callable_obj_t * c, GtkTreeIter *parent) account_t* account_details=NULL; gchar *audio_codec = ""; - int nbChild = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(store), parent); int i; @@ -736,121 +742,146 @@ calltree_update_call (calltab_t* tab, callable_obj_t * c, GtkTreeIter *parent) for( i = 0; i < nbChild; i++) { - if(gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(store), &iter, parent, i)) { + if(gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(store), &iter, parent, i)) { - if(gtk_tree_model_iter_has_child(GTK_TREE_MODEL(store), &iter)) { - calltree_update_call (tab, c, &iter); - } + if(gtk_tree_model_iter_has_child(GTK_TREE_MODEL(store), &iter)) { + calltree_update_call (tab, c, &iter); + } - val.g_type = 0; - gtk_tree_model_get_value (GTK_TREE_MODEL(store), &iter, COLUMN_ACCOUNT_PTR, &val); + val.g_type = 0; + gtk_tree_model_get_value (GTK_TREE_MODEL(store), &iter, COLUMN_ACCOUNT_PTR, &val); - iterCall = (callable_obj_t*) g_value_get_pointer(&val); - g_value_unset(&val); + iterCall = (callable_obj_t*) g_value_get_pointer(&val); + g_value_unset(&val); - if(iterCall != c) { - continue; - } + if(iterCall != c) { + continue; + } - /* Update text */ - gchar * description; - gchar * date=""; - gchar * duration=""; - audio_codec = call_get_audio_codec (c); + /* Update text */ + gchar * description; + gchar * date=""; + gchar * duration=""; + audio_codec = call_get_audio_codec (c); - if(c->_state == CALL_STATE_TRANSFERT) { + if(c->_state == CALL_STATE_TRANSFERT) { - calltree_display_call_info(c, DISPLAY_TYPE_CALL_TRANSFER, NULL, &description); + calltree_display_call_info(c, DISPLAY_TYPE_CALL_TRANSFER, NULL, &description); - } - else { + } + else { - if((c->_sas != NULL) && (display_sas == TRUE) && (c->_srtp_state == SRTP_STATE_SAS_UNCONFIRMED) && (c->_zrtp_confirmed == FALSE)) { + if((c->_sas != NULL) && (display_sas == TRUE) && (c->_srtp_state == SRTP_STATE_SAS_UNCONFIRMED) && (c->_zrtp_confirmed == FALSE)) { - calltree_display_call_info(c, DISPLAY_TYPE_SAS, NULL, &description); + calltree_display_call_info(c, DISPLAY_TYPE_SAS, NULL, &description); - } else { + } else { - calltree_display_call_info(c, DISPLAY_TYPE_STATE_CODE, audio_codec, &description); - + calltree_display_call_info(c, DISPLAY_TYPE_STATE_CODE, audio_codec, &description); + } } - } - /* Update icons */ - if( tab == current_calls ) { - DEBUG("Receiving in state %d", c->_state); - switch(c->_state) { - case CALL_STATE_HOLD: - pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/hold.svg", NULL); - break; - case CALL_STATE_INCOMING: - case CALL_STATE_RINGING: - pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/ring.svg", NULL); - break; - case CALL_STATE_CURRENT: - pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/current.svg", NULL); - break; - case CALL_STATE_DIALING: - pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/dial.svg", NULL); - break; - case CALL_STATE_FAILURE: - pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/fail.svg", NULL); - break; - case CALL_STATE_BUSY: - pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/busy.svg", NULL); - break; - case CALL_STATE_TRANSFERT: - pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/transfert.svg", NULL); - break; - case CALL_STATE_RECORD: - pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/icon_rec.svg", NULL); - break; - default: - WARN("Update calltree - Should not happen!"); - } - - switch(c->_srtp_state) { - case SRTP_STATE_SAS_UNCONFIRMED: - DEBUG("Secure is ON"); - pixbuf_security = gdk_pixbuf_new_from_file(ICONS_DIR "/lock_unconfirmed.svg", NULL); - if(c->_sas != NULL) { DEBUG("SAS is ready with value %s", c->_sas); } - break; - case SRTP_STATE_SAS_CONFIRMED: - DEBUG("SAS is confirmed"); - pixbuf_security = gdk_pixbuf_new_from_file(ICONS_DIR "/lock_confirmed.svg", NULL); - break; - case SRTP_STATE_SAS_SIGNED: - DEBUG("Secure is ON with SAS signed and verified"); - pixbuf_security = gdk_pixbuf_new_from_file(ICONS_DIR "/lock_certified.svg", NULL); - break; - case SRTP_STATE_UNLOCKED: - DEBUG("Secure is off calltree %d", c->_state); - if(g_strcasecmp(srtp_enabled,"true") == 0) { - pixbuf_security = gdk_pixbuf_new_from_file(ICONS_DIR "/lock_off.svg", NULL); + /* Update icons */ + if( tab == current_calls ) { + DEBUG("Receiving in state %d", c->_state); + switch(c->_state) { + case CALL_STATE_HOLD: + pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/hold.svg", NULL); + break; + case CALL_STATE_INCOMING: + case CALL_STATE_RINGING: + pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/ring.svg", NULL); + break; + case CALL_STATE_CURRENT: + pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/current.svg", NULL); + break; + case CALL_STATE_DIALING: + pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/dial.svg", NULL); + break; + case CALL_STATE_FAILURE: + pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/fail.svg", NULL); + break; + case CALL_STATE_BUSY: + pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/busy.svg", NULL); + break; + case CALL_STATE_TRANSFERT: + pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/transfert.svg", NULL); + break; + case CALL_STATE_RECORD: + pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/icon_rec.svg", NULL); + break; + default: + WARN("Update calltree - Should not happen!"); + } + + switch(c->_srtp_state) { + case SRTP_STATE_SAS_UNCONFIRMED: + DEBUG("Secure is ON"); + pixbuf_security = gdk_pixbuf_new_from_file(ICONS_DIR "/lock_unconfirmed.svg", NULL); + if(c->_sas != NULL) { DEBUG("SAS is ready with value %s", c->_sas); } + break; + case SRTP_STATE_SAS_CONFIRMED: + DEBUG("SAS is confirmed"); + pixbuf_security = gdk_pixbuf_new_from_file(ICONS_DIR "/lock_confirmed.svg", NULL); + break; + case SRTP_STATE_SAS_SIGNED: + DEBUG("Secure is ON with SAS signed and verified"); + pixbuf_security = gdk_pixbuf_new_from_file(ICONS_DIR "/lock_certified.svg", NULL); + break; + case SRTP_STATE_UNLOCKED: + DEBUG("Secure is off calltree %d", c->_state); + if(g_strcasecmp(srtp_enabled,"true") == 0) { + pixbuf_security = gdk_pixbuf_new_from_file(ICONS_DIR "/lock_off.svg", NULL); + } + break; + default: + WARN("Update calltree srtp state #%d- Should not happen!", c->_srtp_state); + if(g_strcasecmp(srtp_enabled,"true") == 0) { + pixbuf_security = gdk_pixbuf_new_from_file(ICONS_DIR "/lock_off.svg", NULL); + } + } - break; - default: - WARN("Update calltree srtp state #%d- Should not happen!", c->_srtp_state); - if(g_strcasecmp(srtp_enabled,"true") == 0) { - pixbuf_security = gdk_pixbuf_new_from_file(ICONS_DIR "/lock_off.svg", NULL); + + } + + if(tab == history) { + + switch(c->_history_state) { + case INCOMING: + pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/incoming.svg", NULL); + break; + case OUTGOING: + pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/outgoing.svg", NULL); + break; + case MISSED: + pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/missed.svg", NULL); + break; + default: + WARN("History - Should not happen!"); } + calltree_display_call_info(c, DISPLAY_TYPE_HISTORY, NULL, &description); + + date = get_formatted_start_timestamp (c); + duration = get_call_duration (c); + duration = g_strconcat( date , duration , NULL); + description = g_strconcat( description , duration, NULL); } + gtk_tree_store_set(store, &iter, - 0, pixbuf, // Icon - 1, description, // Description - 2, pixbuf_security, - 3, c, - -1); + 0, pixbuf, // Icon + 1, description, // Description + 2, pixbuf_security, + 3, c, + -1); if (pixbuf != NULL) - g_object_unref(G_OBJECT(pixbuf)); - + g_object_unref(G_OBJECT(pixbuf)); } - } } + update_actions(); } @@ -1425,7 +1456,7 @@ static void drag_end_cb(GtkWidget * widget, GdkDragContext * context, gpointer d DEBUG(" selected_path %s, selected_call_id %s, selected_path_depth %i\n", selected_path, selected_call_id, selected_path_depth); DEBUG(" dragged path %s, dragged_call_id %s, dragged_path_depth %i\n", selected_path, selected_call_id, dragged_path_depth); - GtkTreeModel* model = (GtkTreeModel*)current_calls->store; + GtkTreeModel *model = (GtkTreeModel*)current_calls->store; GtkTreePath *path = gtk_tree_path_new_from_string(dragged_path); GtkTreePath *dpath = gtk_tree_path_new_from_string(dragged_path); GtkTreePath *spath = gtk_tree_path_new_from_string(selected_path); @@ -1433,13 +1464,66 @@ static void drag_end_cb(GtkWidget * widget, GdkDragContext * context, gpointer d GtkTreeIter iter; GtkTreeIter iter_parent; GtkTreeIter iter_children; - GtkTreeIter parent_conference; + GtkTreeIter parent_conference; // conference for which this call is attached GValue val; + callable_obj_t* call; conference_obj_t* conf; + // Make sure that drag n drop does not imply a dialing call + if(selected_type == A_CALL && selected_call->_state == CALL_STATE_DIALING) { + + DEBUG("Dragged a call on a dialing call"); + + calltree_remove_call(current_calls, selected_call, NULL); + calltree_add_call(current_calls, selected_call, NULL); + return; + } + + else if(selected_type == A_CALL) { + + // user may have dragged it outside the conference + if(dragged_call && dragged_call->_state == CALL_STATE_DIALING) { + + calltree_remove_call(current_calls, dragged_call, NULL); + + DEBUG("Dragged a call on a dialing call"); + + // test if call participate to a conference + if(selected_call->_confID) { + + gtk_tree_path_up(spath); + gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &parent_conference, path); + + calltree_add_call(current_calls, selected_call, &parent_conference); + } + else { + calltree_add_call(current_calls, selected_call, NULL); + } + + calltree_add_call(current_calls, dragged_call, NULL); + return; + + } + + } + else if(selected_type == A_CONFERENCE) { + + DEBUG("Dragged a conference on a dialing call"); + + if(dragged_call && dragged_call->_state == CALL_STATE_DIALING) { + + conf = selected_conf; + + calltree_remove_conference(current_calls, conf, NULL); + calltree_add_conference(current_calls, conf); + return; + } + } + + if(selected_path_depth == 1) { if(dragged_path_depth == 1) { @@ -1456,95 +1540,123 @@ static void drag_end_cb(GtkWidget * widget, GdkDragContext * context, gpointer d } } else if(selected_type == A_CALL && dragged_type == A_CONFERENCE) { + // dragged a single call on a conference + if(!selected_call) { + DEBUG("Error: call dragged on a conference is null"); + return; + } + selected_call->_confID = g_strdup(dragged_call_id); sflphone_add_participant(selected_call_id, dragged_call_id); } else if(selected_type == A_CONFERENCE && dragged_type == A_CALL) { + // dragged a conference on a single call conf = selected_conf; - - // dragged a conference on a single call (make no sence) + calltree_remove_conference(current_calls, conf, NULL); calltree_add_conference(current_calls, conf); + } - else if(selected_type == A_CONFERENCE && dragged_type == A_CONFERENCE) { + else if(selected_type == A_CONFERENCE && dragged_type == A_CONFERENCE){ + // dragged a conference on a conference if(gtk_tree_path_compare (dpath, spath) == 0) { + + if(!current_calls) { + DEBUG("Error while joining the same conference\n"); + return; + } + DEBUG("Joined the same conference!\n"); gtk_tree_view_expand_row(GTK_TREE_VIEW(current_calls->view), path, FALSE); } else { + + if(!selected_conf) { + DEBUG("Error: selected conference is null while joining 2 conference"); + } + + if(!dragged_conf) { + DEBUG("Error: dragged conference is null while joining 2 conference"); + } + DEBUG("Joined two conference %s, %s!\n", dragged_path, selected_path); sflphone_join_conference(selected_conf->_confID, dragged_conf->_confID); } } - // TODO: dragged a single call on a NULL element (should do nothing) - // TODO: dragged a conference on a NULL element (should do nothing) + // TODO: dragged a single call on a NULL element (should do nothing) + // TODO: dragged a conference on a NULL element (should do nothing) } else { + // dragged_path_depth == 2 - if (selected_type == A_CALL && dragged_type == A_CALL) { + // TODO: dragged a call on a conference call calltree_remove_call(current_calls, selected_call, NULL); calltree_add_call(current_calls, selected_call, NULL); } + else if(selected_type == A_CONFERENCE && dragged_type == A_CALL) { - // TODO: dragged a conference on a conference call - conf = selected_conf; - calltree_remove_conference(current_calls, conf, NULL); - calltree_add_conference(current_calls, conf); + // TODO: dragged a conference on a conference call + calltree_remove_conference(current_calls, selected_conf, NULL); + calltree_add_conference(current_calls, selected_conf); } - + // TODO: dragged a single call on a NULL element // TODO: dragged a conference on a NULL element } } else { - // selected_path_depth == 2 + // selected_path_depth == 2 if(dragged_path_depth == 1) { if(selected_type == A_CALL && dragged_type == A_CALL) { - + // dragged a conference call on a call sflphone_detach_participant(selected_call_id); - + if(selected_call != NULL && dragged_call != NULL) sflphone_join_participant(selected_call->_callID, dragged_call->_callID); - + } else if(selected_type == A_CALL && dragged_type == A_CONFERENCE) { + // dragged a conference call on a conference sflphone_detach_participant(selected_call_id); if(selected_call != NULL && dragged_conf != NULL) { - DEBUG("Adding a participant, since dragged call on a conference"); - sflphone_add_participant(selected_call_id, dragged_call_id); + DEBUG("Adding a participant, since dragged call on a conference"); + + sflphone_add_participant(selected_call_id, dragged_call_id); } } else { + // dragged a conference call on a NULL element sflphone_detach_participant(selected_call_id); } } else { + // dragged_path_depth == 2 // dragged a conference call on another conference call (same conference) // TODO: dragged a conference call on another conference call (different conference) - + gtk_tree_path_up(path); - + gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &parent_conference, path); - + gtk_tree_path_up(dpath); gtk_tree_path_up(spath); @@ -1555,15 +1667,18 @@ static void drag_end_cb(GtkWidget * widget, GdkDragContext * context, gpointer d calltree_add_call (current_calls, selected_call, &parent_conference); } else { + + DEBUG("Dragged a conference call onto another conference call %s, %s", gtk_tree_path_to_string(dpath), gtk_tree_path_to_string(spath)); conf = NULL; val.g_type = 0; if(gtk_tree_model_get_iter (model, &iter, dpath)) { + DEBUG("we got an iter!"); gtk_tree_model_get_value (model, &iter, COLUMN_ACCOUNT_PTR, &val); - + conf = (conference_obj_t*)g_value_get_pointer(&val); } g_value_unset(&val); @@ -1571,20 +1686,21 @@ static void drag_end_cb(GtkWidget * widget, GdkDragContext * context, gpointer d sflphone_detach_participant(selected_call_id); if(conf) { + DEBUG("we got a conf!"); - sflphone_add_participant(selected_call_id, conf->_confID); + sflphone_add_participant(selected_call_id, conf->_confID); } else { + DEBUG("didn't find a conf!"); } } - // TODO: dragged a conference call on another conference call (different conference) // TODO: dragged a conference call on a NULL element (same conference) // TODO: dragged a conference call on a NULL element (different conference) } - + } } @@ -1612,75 +1728,69 @@ void drag_data_received_cb(GtkWidget *widget, GdkDragContext *context, gint x, g if(drop_path) { - gtk_tree_model_get_iter(tree_model, &iter, drop_path); - gtk_tree_model_get_value(tree_model, &iter, COLUMN_ACCOUNT_PTR, &val); + gtk_tree_model_get_iter(tree_model, &iter, drop_path); + gtk_tree_model_get_value(tree_model, &iter, COLUMN_ACCOUNT_PTR, &val); + + if(gtk_tree_model_iter_has_child(tree_model, &iter)) { - if(gtk_tree_model_iter_has_child(tree_model, &iter)) - { - DEBUG("DRAGGING ON A CONFERENCE"); - dragged_type = A_CONFERENCE; - } - else - { - DEBUG("DRAGGING ON A CALL"); - dragged_type = A_CALL; - } + DEBUG("DRAGGING ON A CONFERENCE"); + dragged_type = A_CONFERENCE; + } + else { - switch (position) - { - case GTK_TREE_VIEW_DROP_AFTER: - dragged_path = gtk_tree_path_to_string(drop_path); - dragged_path_depth = gtk_tree_path_get_depth(drop_path); - dragged_call_id = "NULL"; - dragged_call = NULL; - dragged_conf = NULL; - // DEBUG(" AFTER dragged_path %s, dragged_call_id %s, dragged_path_depth %i\n", dragged_path, dragged_call_id, dragged_path_depth); - break; + DEBUG("DRAGGING ON A CALL"); + dragged_type = A_CALL; + } - case GTK_TREE_VIEW_DROP_INTO_OR_AFTER: - dragged_path = gtk_tree_path_to_string(drop_path); - dragged_path_depth = gtk_tree_path_get_depth(drop_path); - if (dragged_type == A_CALL) - { - dragged_call_id = ((callable_obj_t*)g_value_get_pointer(&val))->_callID; - dragged_call = (callable_obj_t*)g_value_get_pointer(&val); - } - else - { - dragged_call_id = ((conference_obj_t*)g_value_get_pointer(&val))->_confID; - dragged_conf = (conference_obj_t*)g_value_get_pointer(&val); - } - // DEBUG(" INTO_OR_AFTER dragged_path %s, dragged_call_id %s, dragged_path_depth %i\n", dragged_path, dragged_call_id, dragged_path_depth); - break; + switch (position) { - case GTK_TREE_VIEW_DROP_BEFORE: - dragged_path = gtk_tree_path_to_string(drop_path); - dragged_path_depth = gtk_tree_path_get_depth(drop_path); - dragged_call_id = "NULL"; - dragged_call = NULL; - dragged_conf = NULL; - // DEBUG(" BEFORE dragged_path %s, dragged_call_id %s, dragged_path_depth %i\n", dragged_path, dragged_call_id, dragged_path_depth); - break; + case GTK_TREE_VIEW_DROP_AFTER: + dragged_path = gtk_tree_path_to_string(drop_path); + dragged_path_depth = gtk_tree_path_get_depth(drop_path); + dragged_call_id = "NULL"; + dragged_call = NULL; + dragged_conf = NULL; + break; - case GTK_TREE_VIEW_DROP_INTO_OR_BEFORE: - dragged_path = gtk_tree_path_to_string(drop_path); - dragged_path_depth = gtk_tree_path_get_depth(drop_path); - if (dragged_type == A_CALL) - { - dragged_call_id = ((callable_obj_t*)g_value_get_pointer(&val))->_callID; - dragged_call = (callable_obj_t*)g_value_get_pointer(&val); - } - else - { - dragged_call_id = ((conference_obj_t*)g_value_get_pointer(&val))->_confID; - dragged_conf = (conference_obj_t*)g_value_get_pointer(&val); - } - // DEBUG(" INTO_OR_BEFORE dragged_path %s, dragged_call_id %s, dragged_path_depth %i\n", dragged_path, dragged_call_id, dragged_path_depth); - break; + case GTK_TREE_VIEW_DROP_INTO_OR_AFTER: + dragged_path = gtk_tree_path_to_string(drop_path); + dragged_path_depth = gtk_tree_path_get_depth(drop_path); + if (dragged_type == A_CALL) { + + dragged_call_id = ((callable_obj_t*)g_value_get_pointer(&val))->_callID; + dragged_call = (callable_obj_t*)g_value_get_pointer(&val); + } + else { - default: - return; + dragged_call_id = ((conference_obj_t*)g_value_get_pointer(&val))->_confID; + dragged_conf = (conference_obj_t*)g_value_get_pointer(&val); } + break; + + case GTK_TREE_VIEW_DROP_BEFORE: + dragged_path = gtk_tree_path_to_string(drop_path); + dragged_path_depth = gtk_tree_path_get_depth(drop_path); + dragged_call_id = "NULL"; + dragged_call = NULL; + dragged_conf = NULL; + break; + + case GTK_TREE_VIEW_DROP_INTO_OR_BEFORE: + dragged_path = gtk_tree_path_to_string(drop_path); + dragged_path_depth = gtk_tree_path_get_depth(drop_path); + if (dragged_type == A_CALL) { + dragged_call_id = ((callable_obj_t*)g_value_get_pointer(&val))->_callID; + dragged_call = (callable_obj_t*)g_value_get_pointer(&val); + } + else { + dragged_call_id = ((conference_obj_t*)g_value_get_pointer(&val))->_confID; + dragged_conf = (conference_obj_t*)g_value_get_pointer(&val); + } + break; + + default: + return; + } } } diff --git a/sflphone-client-gnome/src/dbus/configurationmanager-introspec.xml b/sflphone-client-gnome/src/dbus/configurationmanager-introspec.xml index 4099621f92b54894089f25f64684da5a587b6962..a32f4b94ec0947e2b259f371a73a175c3576592a 100644 --- a/sflphone-client-gnome/src/dbus/configurationmanager-introspec.xml +++ b/sflphone-client-gnome/src/dbus/configurationmanager-introspec.xml @@ -291,13 +291,6 @@ <method name="switchPopupMode"> </method> - <method name="setSipAddress"> - <arg type="s" name="address" direction="in"/> - </method> - - <method name="getSipAddress"> - <arg type="i" name="address" direction="out"/> - </method> <!-- Addressbook configuration --> <method name="getAddressbookSettings"> @@ -370,11 +363,21 @@ <arg type="s" name="accountID" direction="in"/> <arg type="a{ss}" name="details" direction="in"/> </method> - + + <method name="getAddrFromInterfaceName"> + <arg type="s" name="interface" direction="in"/> + <arg type="s" name="address" direction="out"/> + </method> + <method name="getAllIpInterface"> <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorString"/> <arg type="as" name="list" direction="out"/> </method> + + <method name="getAllIpInterfaceByName"> + <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorString"/> + <arg type="as" name="list" direction="out"/> + </method> </interface> </node> diff --git a/sflphone-client-gnome/src/dbus/dbus.c b/sflphone-client-gnome/src/dbus/dbus.c index c0f63a44dc515183b23d2cb7c95ee440c69f98d3..bec4e18f04ab89b89f074f8f8cb149d7c318c052 100644 --- a/sflphone-client-gnome/src/dbus/dbus.c +++ b/sflphone-client-gnome/src/dbus/dbus.c @@ -1195,7 +1195,7 @@ dbus_codec_list() { GError *error = NULL; - gchar** array; + gchar** array = NULL; org_sflphone_SFLphone_ConfigurationManager_get_codec_list ( configurationManagerProxy, &array, @@ -2053,6 +2053,7 @@ dbus_get_audio_manager( void ) return api; } +/* void dbus_set_sip_address( const gchar* address ) { @@ -2066,6 +2067,9 @@ dbus_set_sip_address( const gchar* address ) g_error_free(error); } } +*/ + + /* gint dbus_get_sip_address( void ) @@ -2082,6 +2086,7 @@ dbus_get_sip_address( void ) } return address; } + */ GHashTable* dbus_get_addressbook_settings (void) { @@ -2355,6 +2360,23 @@ GHashTable* dbus_get_tls_settings_default(void) return results; } + +gchar * dbus_get_address_from_interface_name(gchar* interface) +{ + GError *error = NULL; + gchar * address; + + org_sflphone_SFLphone_ConfigurationManager_get_addr_from_interface_name ( configurationManagerProxy, interface, &address, &error); + if (error != NULL){ + ERROR ("Error calling org_sflphone_SFLphone_ConfigurationManager_get_addr_from_interface_name\n"); + g_error_free (error); + } + + return address; + +} + + gchar ** dbus_get_all_ip_interface(void) { GError *error = NULL; @@ -2379,3 +2401,27 @@ gchar ** dbus_get_all_ip_interface(void) } } +gchar ** dbus_get_all_ip_interface_by_name(void) +{ + GError *error = NULL; + gchar ** array; + + if(!org_sflphone_SFLphone_ConfigurationManager_get_all_ip_interface_by_name ( configurationManagerProxy, &array, &error)) + { + if(error->domain == DBUS_GERROR && error->code == DBUS_GERROR_REMOTE_EXCEPTION) + { + ERROR ("Caught remote method (get_all_ip_interface) exception %s: %s", dbus_g_error_get_name(error), error->message); + } + else + { + ERROR("Error while calling get_all_ip_interface: %s", error->message); + } + g_error_free (error); + return NULL; + } + else{ + DEBUG ("DBus called get_all_ip_interface() on ConfigurationManager"); + return array; + } +} + diff --git a/sflphone-client-gnome/src/dbus/dbus.h b/sflphone-client-gnome/src/dbus/dbus.h index 0c297f3400fe607fc37493a5d827d63a152de090..9a0ee27a88b909a7c2a300202f218f7eceb95d8e 100644 --- a/sflphone-client-gnome/src/dbus/dbus.h +++ b/sflphone-client-gnome/src/dbus/dbus.h @@ -514,12 +514,21 @@ gchar** dbus_get_addressbook_list (void); void dbus_set_addressbook_list (const gchar** list); +/** + * Resolve the local address given an interface name + */ +gchar * dbus_get_address_from_interface_name(gchar* interface); /** * Query the daemon to return a list of network interface (described as there IP address) */ gchar** dbus_get_all_ip_interface(void); +/** + * Query the daemon to return a list of network interface (described as there name) + */ +gchar** dbus_get_all_ip_interface_by_name(void); + /** * Encapsulate all the url hook-related configuration * Get the configuration diff --git a/sflphone-client-gnome/src/main.c b/sflphone-client-gnome/src/main.c index 2a8b7ca5a9af5e5f43a1392be2a37def3dbfec23..fffd9a831b849f5b91b4c97625bd9ff1f2d7f156 100644 --- a/sflphone-client-gnome/src/main.c +++ b/sflphone-client-gnome/src/main.c @@ -84,7 +84,7 @@ There is NO WARRANTY, to the extent permitted by law.\n\n"); srand(time(NULL)); // Internationalization - bindtextdomain("sflphone-client-gnome", "/usr/share/locale"); + bindtextdomain("sflphone-client-gnome", LOCALEDIR); textdomain("sflphone-client-gnome"); // Initialises the GNOME libraries diff --git a/sflphone-client-gnome/src/mainwindow.c b/sflphone-client-gnome/src/mainwindow.c index 12b7ecedc0787bc6c76c6d7bab255ea8c973661f..8218938509eddeb310adac4d2670abdd0eaa3b67 100644 --- a/sflphone-client-gnome/src/mainwindow.c +++ b/sflphone-client-gnome/src/mainwindow.c @@ -291,11 +291,10 @@ main_window_message(GtkMessageType type, gchar * markup){ GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, type, GTK_BUTTONS_CLOSE, - "%s\n", - markup); - + NULL); gtk_window_set_title(GTK_WINDOW(dialog), _("SFLphone Error")); + gtk_message_dialog_set_markup(GTK_MESSAGE_DIALOG(dialog), markup); gtk_dialog_run (GTK_DIALOG(dialog)); gtk_widget_destroy (GTK_WIDGET(dialog)); diff --git a/sflphone-client-gnome/src/sflphone_const.h b/sflphone-client-gnome/src/sflphone_const.h index b63a3e17e17b6dd1d1515266277215bf7c09bac4..d8e7870b9efa49f0ee12d2a4b77e181a634851b9 100644 --- a/sflphone-client-gnome/src/sflphone_const.h +++ b/sflphone-client-gnome/src/sflphone_const.h @@ -88,9 +88,9 @@ #define TLS_NEGOTIATION_TIMEOUT_SEC "TLS.negotiationTimeoutSec" #define TLS_NEGOTIATION_TIMEOUT_MSEC "TLS.negotiationTimemoutMsec" +#define LOCAL_INTERFACE "Account.localInterface" #define PUBLISHED_SAMEAS_LOCAL "Account.publishedSameAsLocal" #define LOCAL_PORT "Account.localPort" -#define LOCAL_ADDRESS "Account.localAddress" #define PUBLISHED_PORT "Account.publishedPort" #define PUBLISHED_ADDRESS "Account.publishedAddress" diff --git a/sflphone-common/configure.ac b/sflphone-common/configure.ac index e3c869ac137efc92d95629e957910492f57c93b6..41bfe9221b850eb4ac988e88fd260feb978e5365 100644 --- a/sflphone-common/configure.ac +++ b/sflphone-common/configure.ac @@ -94,7 +94,6 @@ AC_SUBST(PKGADD_VENDOR) dnl Check for programs AC_PROG_CC - SFL_CXX_WITH_DEBUG AC_PROG_CXX AC_PROG_CPP AC_PROG_INSTALL diff --git a/sflphone-common/src/account.h b/sflphone-common/src/account.h index 00234ae909a58ee868ba041f5ab0a839e1c875d2..e8b0885b0df6ba4928773a4a8baa8e4e9f9a2538 100644 --- a/sflphone-common/src/account.h +++ b/sflphone-common/src/account.h @@ -70,9 +70,9 @@ typedef enum RegistrationState { #define REALM "realm" #define DEFAULT_REALM "*" +#define LOCAL_INTERFACE "Account.localInterface" #define PUBLISHED_SAMEAS_LOCAL "Account.publishedSameAsLocal" #define LOCAL_PORT "Account.localPort" -#define LOCAL_ADDRESS "Account.localAddress" #define PUBLISHED_PORT "Account.publishedPort" #define PUBLISHED_ADDRESS "Account.publishedAddress" @@ -139,7 +139,7 @@ class Account{ */ inline VoIPLink* getVoIPLink() { return _link; } - inline void setVoIPLink (VoIPLink *link) { _link = link; } + virtual void setVoIPLink () = 0; /** * Register the underlying VoIPLink. Launch the event listener. diff --git a/sflphone-common/src/audio/audiolayer.h b/sflphone-common/src/audio/audiolayer.h index ab70ddfd0701caadbb55cd6d15343403199cf0bf..580c064e510b337790ddf0c453e06b4b23c9d4ff 100644 --- a/sflphone-common/src/audio/audiolayer.h +++ b/sflphone-common/src/audio/audiolayer.h @@ -213,6 +213,11 @@ class AudioLayer { */ inline Recordable* getRecorderInstance (void) {return _recorder;} + /** + * Get the mutex lock for the entire audio layer + */ + inline ost::Mutex* getMutexLock(void) { return &_mutex; } + protected: @@ -285,6 +290,9 @@ class AudioLayer { /** Contains the current error code */ int _errorMessage; + /** + * Lock for the entire audio layer + */ ost::Mutex _mutex; }; diff --git a/sflphone-common/src/audio/audiortp/AudioRtpFactory.cpp b/sflphone-common/src/audio/audiortp/AudioRtpFactory.cpp index bf9a9bf6c8c1da002985e772557db9f8f5852cba..318bf8c727e9bda938b106b1cf82000eced3c4a6 100644 --- a/sflphone-common/src/audio/audiortp/AudioRtpFactory.cpp +++ b/sflphone-common/src/audio/audiortp/AudioRtpFactory.cpp @@ -125,6 +125,7 @@ void AudioRtpFactory::start (void) switch (_rtpSessionType) { case Sdes: + break; case Symmetric: _debug ("Starting symmetric rtp thread"); diff --git a/sflphone-common/src/audio/audiortp/AudioRtpSession.h b/sflphone-common/src/audio/audiortp/AudioRtpSession.h index afe37aa21d64f91ff3b71c0d2d4d888ac8338ee3..e1d8b536cb87083deb612096b4f2ab2e4d0c1442 100644 --- a/sflphone-common/src/audio/audiortp/AudioRtpSession.h +++ b/sflphone-common/src/audio/audiortp/AudioRtpSession.h @@ -202,7 +202,8 @@ namespace sfl { } _debug("Unbind audio RTP stream for call id %s\n", _ca->getCallId().c_str()); - _audiolayer->getMainBuffer()->unBindAll(_ca->getCallId()); + // _audiolayer->getMainBuffer()->unBindAll(_ca->getCallId()); + _manager->getAudioDriver()->getMainBuffer()->unBindAll(_ca->getCallId()); delete [] _micData; delete [] _micDataConverted; @@ -218,10 +219,12 @@ namespace sfl { void AudioRtpSession<D>::initBuffers() { // Set sampling rate, main buffer choose the highest one - _audiolayer->getMainBuffer()->setInternalSamplingRate(_codecSampleRate); + // _audiolayer->getMainBuffer()->setInternalSamplingRate(_codecSampleRate); + _manager->getAudioDriver()->getMainBuffer()->setInternalSamplingRate(_codecSampleRate); // may be different than one already setted - converterSamplingRate = _audiolayer->getMainBuffer()->getInternalSamplingRate(); + // converterSamplingRate = _audiolayer->getMainBuffer()->getInternalSamplingRate(); + converterSamplingRate = _manager->getAudioDriver()->getMainBuffer()->getInternalSamplingRate(); // initialize SampleRate converter using AudioLayer's sampling rate // (internal buffers initialized with maximal sampling rate and frame size) @@ -310,7 +313,8 @@ namespace sfl { assert(_audiocodec); assert(_audiolayer); - int _mainBufferSampleRate = _audiolayer->getMainBuffer()->getInternalSamplingRate(); + + int _mainBufferSampleRate = _manager->getAudioDriver()->getMainBuffer()->getInternalSamplingRate(); // compute codec framesize in ms float fixed_codec_framesize = computeCodecFrameSize (_audiocodec->getFrameSize(), _audiocodec->getClockRate()); @@ -319,7 +323,7 @@ namespace sfl { int maxBytesToGet = computeNbByteAudioLayer (fixed_codec_framesize); // available bytes inside ringbuffer - int availBytesFromMic = _audiolayer->getMainBuffer()->availForGet(_ca->getCallId()); + int availBytesFromMic = _manager->getAudioDriver()->getMainBuffer()->availForGet(_ca->getCallId()); // set available byte to maxByteToGet int bytesAvail = (availBytesFromMic < maxBytesToGet) ? availBytesFromMic : maxBytesToGet; @@ -328,7 +332,7 @@ namespace sfl { return 0; // Get bytes from micRingBuffer to data_from_mic - int nbSample = _audiolayer->getMainBuffer()->getData(_micData , bytesAvail, 100, _ca->getCallId()) / sizeof (SFLDataFormat); + int nbSample = _manager->getAudioDriver()->getMainBuffer()->getData(_micData , bytesAvail, 100, _ca->getCallId()) / sizeof (SFLDataFormat); // nb bytes to be sent over RTP int compSize = 0; @@ -361,7 +365,7 @@ namespace sfl { if (_audiocodec != NULL) { - int _mainBufferSampleRate = _audiolayer->getMainBuffer()->getInternalSamplingRate(); + int _mainBufferSampleRate = _manager->getAudioDriver()->getMainBuffer()->getInternalSamplingRate(); // Return the size of data in bytes int expandedSize = _audiocodec->codecDecode (_spkrDataDecoded , spkrData , size); @@ -381,7 +385,7 @@ namespace sfl { _nSamplesSpkr = nbSample; // put data in audio layer, size in byte - _audiolayer->getMainBuffer()->putData (_spkrDataConverted, nbSample * sizeof (SFLDataFormat), 100, _ca->getCallId()); + _manager->getAudioDriver()->getMainBuffer()->putData (_spkrDataConverted, nbSample * sizeof (SFLDataFormat), 100, _ca->getCallId()); } else { @@ -390,7 +394,7 @@ namespace sfl { // put data in audio layer, size in byte - _audiolayer->getMainBuffer()->putData (_spkrDataDecoded, expandedSize, 100, _ca->getCallId()); + _manager->getAudioDriver()->getMainBuffer()->putData (_spkrDataDecoded, expandedSize, 100, _ca->getCallId()); } // Notify (with a beep) an incoming call when there is already a call @@ -513,7 +517,7 @@ namespace sfl { _ca->setRecordingSmplRate(_audiocodec->getClockRate()); // Start audio stream (if not started) AND flush all buffers (main and urgent) - _audiolayer->startStream(); + _manager->getAudioDriver()->startStream(); static_cast<D*>(this)->startRunning(); // Already called in _audiolayer->startStream() @@ -524,7 +528,12 @@ namespace sfl { while (!testCancel()) { - converterSamplingRate = _audiolayer->getMainBuffer()->getInternalSamplingRate(); + // ost::MutexLock lock(*(_manager->getAudioLayerMutex())); + + _manager->getAudioLayerMutex()->enter(); + + // converterSamplingRate = _audiolayer->getMainBuffer()->getInternalSamplingRate(); + _manager->getAudioDriver()->getMainBuffer()->getInternalSamplingRate(); // Send session sessionWaiting = static_cast<D*>(this)->isWaiting(); @@ -544,6 +553,9 @@ namespace sfl { _ca->recAudio.recData (_micData,_nSamplesMic); } + // ost::MutexLock unlock(*(_manager->getAudioLayerMutex())); + _manager->getAudioLayerMutex()->leave(); + // Let's wait for the next transmit cycle Thread::sleep (TimerPort::getTimer()); diff --git a/sflphone-common/src/audio/pulseaudio/audiostream.cpp b/sflphone-common/src/audio/pulseaudio/audiostream.cpp index d98251075a8bcfc241979556d433f4fb664c61d8..dd11a28d57e2cb74c59284783eb15612b2cf9375 100644 --- a/sflphone-common/src/audio/pulseaudio/audiostream.cpp +++ b/sflphone-common/src/audio/pulseaudio/audiostream.cpp @@ -202,8 +202,8 @@ AudioStream::createStream (pa_context* c) // 20 ms framesize TODO: take framesize value from config attributes->maxlength = (uint32_t) -1; - attributes->tlength = pa_usec_to_bytes (50 * PA_USEC_PER_MSEC, &sample_spec); - attributes->prebuf = (uint32_t) -1; + attributes->tlength = pa_usec_to_bytes (100 * PA_USEC_PER_MSEC, &sample_spec); + attributes->prebuf = 0; attributes->minreq = (uint32_t) -1; attributes->fragsize = (uint32_t) -1; diff --git a/sflphone-common/src/audio/pulseaudio/pulselayer.cpp b/sflphone-common/src/audio/pulseaudio/pulselayer.cpp index 046d81cec1bc871f172e34182b2d7c9878cc8159..773956df5b35328bf5b2683b59507aa1d7af3faf 100644 --- a/sflphone-common/src/audio/pulseaudio/pulselayer.cpp +++ b/sflphone-common/src/audio/pulseaudio/pulselayer.cpp @@ -587,6 +587,7 @@ void PulseLayer::writeToSpeaker (void) normalAvailBytes = getMainBuffer()->availForGet(); byteToGet = (normalAvailBytes < (int) (maxNbBytesToGet)) ? normalAvailBytes : maxNbBytesToGet; + // _debug("byteToGet: %i", byteToGet); if (byteToGet) { diff --git a/sflphone-common/src/dbus/configurationmanager-introspec.xml b/sflphone-common/src/dbus/configurationmanager-introspec.xml index 4099621f92b54894089f25f64684da5a587b6962..a32f4b94ec0947e2b259f371a73a175c3576592a 100644 --- a/sflphone-common/src/dbus/configurationmanager-introspec.xml +++ b/sflphone-common/src/dbus/configurationmanager-introspec.xml @@ -291,13 +291,6 @@ <method name="switchPopupMode"> </method> - <method name="setSipAddress"> - <arg type="s" name="address" direction="in"/> - </method> - - <method name="getSipAddress"> - <arg type="i" name="address" direction="out"/> - </method> <!-- Addressbook configuration --> <method name="getAddressbookSettings"> @@ -370,11 +363,21 @@ <arg type="s" name="accountID" direction="in"/> <arg type="a{ss}" name="details" direction="in"/> </method> - + + <method name="getAddrFromInterfaceName"> + <arg type="s" name="interface" direction="in"/> + <arg type="s" name="address" direction="out"/> + </method> + <method name="getAllIpInterface"> <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorString"/> <arg type="as" name="list" direction="out"/> </method> + + <method name="getAllIpInterfaceByName"> + <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorString"/> + <arg type="as" name="list" direction="out"/> + </method> </interface> </node> diff --git a/sflphone-common/src/dbus/configurationmanager.cpp b/sflphone-common/src/dbus/configurationmanager.cpp index 1e04db251ebbbb856a237e7a1ece8ecb4121a757..64571106c482e53f1a3e1f8ef41c7bdde5fa1af9 100644 --- a/sflphone-common/src/dbus/configurationmanager.cpp +++ b/sflphone-common/src/dbus/configurationmanager.cpp @@ -77,7 +77,7 @@ ConfigurationManager::getIp2IpDetails (void) ip2ipAccountDetails.insert (std::pair<std::string, std::string> (ZRTP_NOT_SUPP_WARNING, Manager::instance().getConfigString (IP2IP_PROFILE, ZRTP_NOT_SUPP_WARNING))); ip2ipAccountDetails.insert (std::pair<std::string, std::string> (ZRTP_DISPLAY_SAS_ONCE, Manager::instance().getConfigString (IP2IP_PROFILE, ZRTP_DISPLAY_SAS_ONCE))); - ip2ipAccountDetails.insert (std::pair<std::string, std::string> (LOCAL_ADDRESS, Manager::instance().getConfigString (IP2IP_PROFILE, LOCAL_ADDRESS))); + ip2ipAccountDetails.insert (std::pair<std::string, std::string> (LOCAL_INTERFACE, Manager::instance().getConfigString(IP2IP_PROFILE, LOCAL_INTERFACE))); ip2ipAccountDetails.insert (std::pair<std::string, std::string> (LOCAL_PORT, Manager::instance().getConfigString (IP2IP_PROFILE, LOCAL_PORT))); std::map<std::string, std::string> tlsSettings; @@ -94,10 +94,10 @@ ConfigurationManager::setIp2IpDetails (const std::map< std::string, std::string std::map<std::string, std::string> map_cpy = details; std::map<std::string, std::string>::iterator it; - it = map_cpy.find (LOCAL_ADDRESS); + it = map_cpy.find (LOCAL_INTERFACE); if (it != details.end()) { - Manager::instance().setConfig (IP2IP_PROFILE, LOCAL_ADDRESS, it->second); + Manager::instance().setConfig (IP2IP_PROFILE, LOCAL_INTERFACE, it->second); } it = map_cpy.find (LOCAL_PORT); @@ -756,20 +756,6 @@ ConfigurationManager::getMailNotify (void) return Manager::instance().getMailNotify(); } -int -ConfigurationManager::getSipAddress (void) -{ - return Manager::instance().getLocalIp2IpPort(); - - // return "ok"; -} - -void -ConfigurationManager::setSipAddress (const std::string& address) -{ - _debug ("Manager received setSipAddress: %s", address.c_str()); - Manager::instance().setLocalIp2IpInfo (address); -} std::map<std::string, int32_t> ConfigurationManager::getAddressbookSettings (void) { @@ -817,6 +803,18 @@ void ConfigurationManager::setHistory (const std::map <std::string, std::string> Manager::instance().receive_history_from_client (entries); } +std::string +ConfigurationManager::getAddrFromInterfaceName(const std::string& interface) +{ + _debug ("ConfigurationManager::getAddrFromInterfaceName received"); + + std::string address = SIPVoIPLink::instance("")->getInterfaceAddrFromName(interface); + + _debug("address: %s", address.c_str()); + + return address; +} + std::vector<std::string> ConfigurationManager::getAllIpInterface (void) { _debug ("ConfigurationManager::getAllIpInterface received"); @@ -831,3 +829,18 @@ std::vector<std::string> ConfigurationManager::getAllIpInterface (void) return vector; } + +std::vector<std::string> ConfigurationManager::getAllIpInterfaceByName(void) +{ + _debug ("ConfigurationManager::getAllIpInterface received\n"); + + std::vector<std::string> vector; + SIPVoIPLink * sipLink = NULL; + sipLink = SIPVoIPLink::instance (""); + + if (sipLink != NULL) { + vector = sipLink->getAllIpInterfaceByName(); + } + + return vector; +} diff --git a/sflphone-common/src/dbus/configurationmanager.h b/sflphone-common/src/dbus/configurationmanager.h index 7d1f2764d6a52ef6023af7a3b44dca1541e8c147..864522d66b85c7fa077ad0111c060362c887b2ad 100644 --- a/sflphone-common/src/dbus/configurationmanager.h +++ b/sflphone-common/src/dbus/configurationmanager.h @@ -113,8 +113,6 @@ public: void setNotify( void ); int32_t getMailNotify( void ); void setMailNotify( void ); - int getSipAddress( void ); - void setSipAddress( const std::string& address ); std::map<std::string, int32_t> getAddressbookSettings (void); void setAddressbookSettings (const std::map<std::string, int32_t>& settings); @@ -131,8 +129,11 @@ public: std::map<std::string, std::string> getTlsSettings(const std::string& accountID); void setTlsSettings(const std::string& accountID, const std::map< std::string, std::string >& details); + + std::string getAddrFromInterfaceName(const std::string& interface); std::vector<std::string> getAllIpInterface(void); + std::vector<std::string> getAllIpInterfaceByName(void); }; diff --git a/sflphone-common/src/history/historymanager.cpp b/sflphone-common/src/history/historymanager.cpp index 9ea8f933d35495dedaaf444c24642ee18520ac18..1fb5b991547caf37acb6bafa18753e2789090cdb 100644 --- a/sflphone-common/src/history/historymanager.cpp +++ b/sflphone-common/src/history/historymanager.cpp @@ -107,6 +107,7 @@ int HistoryManager::load_history_items_map (Conf::ConfigTree *history_list, int return nb_items; } + bool HistoryManager::save_history_to_file (Conf::ConfigTree *history_list) { _debug ("Saving history in XDG directory: %s", _history_path.data()); diff --git a/sflphone-common/src/iax/iaxaccount.cpp b/sflphone-common/src/iax/iaxaccount.cpp index f68dfbef67be0865721cc22ebde992c9747663d9..de210fda00b12026e09d891035ff83e2ff8a9424 100644 --- a/sflphone-common/src/iax/iaxaccount.cpp +++ b/sflphone-common/src/iax/iaxaccount.cpp @@ -36,6 +36,11 @@ IAXAccount::~IAXAccount() _link = NULL; } +void IAXAccount::setVoIPLink() +{ + +} + int IAXAccount::registerVoIPLink() { _link->init(); diff --git a/sflphone-common/src/iax/iaxaccount.h b/sflphone-common/src/iax/iaxaccount.h index 9c40df1194a5625b3e4fc4e6495778ede20a2c4c..54e6094de703b9e50c693b11af77871877a9cd84 100644 --- a/sflphone-common/src/iax/iaxaccount.h +++ b/sflphone-common/src/iax/iaxaccount.h @@ -33,6 +33,8 @@ class IAXAccount : public Account ~IAXAccount(); + void setVoIPLink (); + /** * Actually unuseful, since config loading is done in init() */ diff --git a/sflphone-common/src/logger.cpp b/sflphone-common/src/logger.cpp index b7966beea56bad89712608d4f810714b3c3c3fc5..08ab98f208b30acbb131f751aa9b8e2080615d3c 100644 --- a/sflphone-common/src/logger.cpp +++ b/sflphone-common/src/logger.cpp @@ -37,7 +37,7 @@ void log(const int level, const char* format, ...) va_list ap; string prefix = "<> "; - char buffer[1024]; + char buffer[4096]; string message = ""; string color_prefix = ""; diff --git a/sflphone-common/src/managerimpl.cpp b/sflphone-common/src/managerimpl.cpp index 8038bb9553a664a398e59781222d12d0813a35fe..5fb236892e964303f8d13c537e3081d50662bd6d 100644 --- a/sflphone-common/src/managerimpl.cpp +++ b/sflphone-common/src/managerimpl.cpp @@ -120,6 +120,7 @@ ManagerImpl::~ManagerImpl (void) void ManagerImpl::init() { + // Load accounts, init map loadAccountMap(); @@ -412,8 +413,7 @@ ManagerImpl::hangupCall (const CallID& call_id) _debug ("ManagerImpl::hangupCall(%s)", call_id.c_str()); PulseLayer *pulselayer; AccountID account_id; - bool returnValue; - AudioLayer *audiolayer; + bool returnValue = true; // store the current call id CallID current_call_id = getCurrentCallId(); @@ -425,17 +425,6 @@ ManagerImpl::hangupCall (const CallID& call_id) if (_dbus) _dbus->getCallManager()->callStateChanged (call_id, "HUNGUP"); - int nbCalls = getCallList().size(); - - audiolayer = getAudioDriver(); - - // stop streams - if (audiolayer && (nbCalls <= 1)) { - _debug (" hangupCall: stop audio stream, ther is only %i call(s) remaining", nbCalls); - audiolayer->stopStream(); - } - - if (participToConference (call_id)) { Conference *conf = getConferenceFromCallID (call_id); @@ -457,19 +446,30 @@ ManagerImpl::hangupCall (const CallID& call_id) if (getConfigFromCall (call_id) == Call::IPtoIP) { returnValue = SIPVoIPLink::instance (AccountNULL)->hangup (call_id); } - /* Classic call, attached to an account */ else { account_id = getAccountFromCall (call_id); if (account_id == AccountNULL) { + _debug ("! Manager Hangup Call: Call doesn't exists"); - return false; + returnValue = false; } + else { - returnValue = getAccountLink (account_id)->hangup (call_id); + returnValue = getAccountLink (account_id)->hangup (call_id); + removeCallAccount (call_id); + } + } - removeCallAccount (call_id); + int nbCalls = getCallList().size(); + + AudioLayer *audiolayer = getAudioDriver(); + + // stop streams + if (audiolayer && (nbCalls <= 0)) { + _debug (" hangupCall: stop audio stream, ther is only %i call(s) remaining", nbCalls); + audiolayer->stopStream(); } if (_audiodriver->getLayerType() == PULSEAUDIO) { @@ -699,12 +699,31 @@ ManagerImpl::transferCall (const CallID& call_id, const std::string& to) CallID current_call_id = getCurrentCallId(); - /* Direct IP to IP call */ + if (participToConference (call_id)) { + + _debug("Particip to a conference\n"); + + Conference *conf = getConferenceFromCallID (call_id); + if (conf != NULL) { + // remove this participant + removeParticipant (call_id); + + processRemainingParticipant (current_call_id, conf); + } + } else { + + _debug("Do not Particip to a conference\n"); + + // we are not participating to a conference, current call switched to "" + if (!isConference (current_call_id)) + switchCall (""); + } + + /* Direct IP to IP call */ if (getConfigFromCall (call_id) == Call::IPtoIP) { returnValue = SIPVoIPLink::instance (AccountNULL)-> transfer (call_id, to); } - /* Classic call, attached to an account */ else { accountid = getAccountFromCall (call_id); @@ -721,22 +740,6 @@ ManagerImpl::transferCall (const CallID& call_id, const std::string& to) removeWaitingCall (call_id); - if (participToConference (call_id)) { - - Conference *conf = getConferenceFromCallID (call_id); - - if (conf != NULL) { - // remove this participant - removeParticipant (call_id); - - processRemainingParticipant (current_call_id, conf); - } - } else { - // we are not participating to a conference, current call switched to "" - if (!isConference (current_call_id)) - switchCall (""); - } - if (_dbus) _dbus->getCallManager()->callStateChanged (call_id, "HUNGUP"); return returnValue; @@ -1011,12 +1014,15 @@ ManagerImpl::participToConference (const CallID& call_id) accountId = getAccountFromCall (call_id); call = getAccountLink (accountId)->getCall (call_id); - if (call == NULL) + if (call == NULL) { return false; + } + if (call->getConfId() == "") { return false; } else { + return true; } } @@ -1857,18 +1863,7 @@ ManagerImpl::peerHungupCall (const CallID& call_id) } } - int nbCalls = getCallList().size(); - - // stop streams - - if (nbCalls <= 1) { - _debug (" hangupCall: stop audio stream, ther is only %i call(s) remaining", nbCalls); - - AudioLayer* audiolayer = getAudioDriver(); - audiolayer->stopStream(); - } - - /* Direct IP to IP call */ + /* Direct IP to IP call */ if (getConfigFromCall (call_id) == Call::IPtoIP) { SIPVoIPLink::instance (AccountNULL)->hangup (call_id); } @@ -1892,6 +1887,18 @@ ManagerImpl::peerHungupCall (const CallID& call_id) removeCallAccount (call_id); + int nbCalls = getCallList().size(); + + // stop streams + + if (nbCalls <= 0) { + _debug (" hangupCall: stop audio stream, ther is only %i call(s) remaining", nbCalls); + + AudioLayer* audiolayer = getAudioDriver(); + audiolayer->stopStream(); + } + + if (_audiodriver->getLayerType() == PULSEAUDIO) { pulselayer = dynamic_cast<PulseLayer *> (getAudioDriver()); } @@ -2259,10 +2266,10 @@ ManagerImpl::initConfigFile (bool load_user_value, std::string alternate) _config.addDefaultValue (std::pair<std::string, std::string> (TLS_REQUIRE_CLIENT_CERTIFICATE, TRUE_STR), IP2IP_PROFILE); _config.addDefaultValue (std::pair<std::string, std::string> (TLS_NEGOTIATION_TIMEOUT_SEC, "2"), IP2IP_PROFILE); _config.addDefaultValue (std::pair<std::string, std::string> (TLS_NEGOTIATION_TIMEOUT_MSEC, "0"), IP2IP_PROFILE); + _config.addDefaultValue (std::pair<std::string, std::string> (LOCAL_INTERFACE, "default"), IP2IP_PROFILE); _config.addDefaultValue (std::pair<std::string, std::string> (PUBLISHED_SAMEAS_LOCAL, TRUE_STR), IP2IP_PROFILE); _config.addDefaultValue (std::pair<std::string, std::string> (LOCAL_PORT, DEFAULT_SIP_PORT), IP2IP_PROFILE); _config.addDefaultValue (std::pair<std::string, std::string> (PUBLISHED_PORT, DEFAULT_SIP_PORT), IP2IP_PROFILE); - _config.addDefaultValue (std::pair<std::string, std::string> (LOCAL_ADDRESS, DEFAULT_ADDRESS), IP2IP_PROFILE); _config.addDefaultValue (std::pair<std::string, std::string> (PUBLISHED_ADDRESS, DEFAULT_ADDRESS), IP2IP_PROFILE); _config.addDefaultValue (std::pair<std::string, std::string> (STUN_ENABLE, DFT_STUN_ENABLE), IP2IP_PROFILE); _config.addDefaultValue (std::pair<std::string, std::string> (STUN_SERVER, DFT_STUN_SERVER), IP2IP_PROFILE); @@ -3045,6 +3052,9 @@ void ManagerImpl::switchAudioManager (void) _debug ("Deleting current layer... "); + // ost::MutexLock lock (*getAudioLayerMutex()); + getAudioLayerMutex()->enter(); + // _audiodriver->closeLayer(); delete _audiodriver; @@ -3083,6 +3093,8 @@ void ManagerImpl::switchAudioManager (void) if (hasCurrentCall()) _audiodriver->startStream(); + // ost::MutexLock unlock (*getAudioLayerMutex()); + getAudioLayerMutex()->leave(); // need to stop audio streams if there is currently no call // if ( (type != PULSEAUDIO) && (!hasCurrentCall())) { @@ -3130,49 +3142,10 @@ void ManagerImpl::setMicVolume (unsigned short mic_vol) - - -void ManagerImpl::setLocalIp2IpInfo (const std::string& address) -{ - std::string ip_address = std::string (address); - - int index = ip_address.find_first_of (":"); - - std::string local_address = ip_address.substr (0,index); - std::string local_port = ip_address.substr (index+1); - int newPort = atoi (local_port.c_str()); - - _debug ("Setting new address %s and port %s for default account (ip to ip calls)", local_address.c_str(), local_port.c_str()); - - int prevPort = getConfigInt (IP2IP_PROFILE, LOCAL_PORT); - std::string prevAddress = getConfigString (IP2IP_PROFILE, LOCAL_ADDRESS); - - if ( (prevPort != newPort) || (prevAddress.compare (local_address) != 0)) { - - - if (_directIpAccount) { - - SIPAccount* account = dynamic_cast<SIPAccount*> (_directIpAccount); - - account->setLocalPort (newPort); - account->setLocalAddress (local_address); - } - - setConfig (IP2IP_PROFILE, LOCAL_ADDRESS, local_address); - - setConfig (IP2IP_PROFILE, LOCAL_PORT, newPort); - - SIPVoIPLink* siplink = SIPVoIPLink::instance (""); - // if(siplink) - siplink->updateAccountInfo (_directIpAccount->getAccountID()); - // this->restartPJSIP (); - } -} - - + int ManagerImpl::getLocalIp2IpPort (void) { - /* The SIP port used for default account (IP to IP) calls */ + // The SIP port used for default account (IP to IP) calls _debug ("Default account port %i", getConfigInt (IP2IP_PROFILE, LOCAL_PORT)); return getConfigInt (IP2IP_PROFILE, LOCAL_PORT); @@ -3431,8 +3404,8 @@ std::map< std::string, std::string > ManagerImpl::getAccountDetails (const Accou a.insert (std::pair<std::string, std::string> (AUTHENTICATION_USERNAME, getConfigString (accountID, AUTHENTICATION_USERNAME))); a.insert (std::pair<std::string, std::string> (CONFIG_ACCOUNT_MAILBOX, getConfigString (accountID, CONFIG_ACCOUNT_MAILBOX))); a.insert (std::pair<std::string, std::string> (CONFIG_ACCOUNT_REGISTRATION_EXPIRE, getConfigString (accountID, CONFIG_ACCOUNT_REGISTRATION_EXPIRE))); + a.insert (std::pair<std::string, std::string> (LOCAL_INTERFACE, getConfigString (accountID, LOCAL_INTERFACE))); a.insert (std::pair<std::string, std::string> (PUBLISHED_SAMEAS_LOCAL, getConfigString (accountID, PUBLISHED_SAMEAS_LOCAL))); - a.insert (std::pair<std::string, std::string> (LOCAL_ADDRESS, getConfigString (accountID, LOCAL_ADDRESS))); a.insert (std::pair<std::string, std::string> (PUBLISHED_ADDRESS, getConfigString (accountID, PUBLISHED_ADDRESS))); a.insert (std::pair<std::string, std::string> (LOCAL_PORT, getConfigString (accountID, LOCAL_PORT))); a.insert (std::pair<std::string, std::string> (PUBLISHED_PORT, getConfigString (accountID, PUBLISHED_PORT))); @@ -3665,6 +3638,7 @@ void ManagerImpl::setAccountDetails (const std::string& accountID, const std::ma std::string hostname; std::string displayName; + std::string localInterface; std::string publishedSameasLocal; std::string localAddress; std::string publishedAddress; @@ -3701,12 +3675,12 @@ void ManagerImpl::setAccountDetails (const std::string& accountID, const std::ma displayName = iter->second; } - if ( (iter = map_cpy.find (PUBLISHED_SAMEAS_LOCAL)) != map_cpy.end()) { - publishedSameasLocal = iter->second; + if ( (iter = map_cpy.find (LOCAL_INTERFACE)) != map_cpy.end()) { + localInterface = iter->second; } - if ( (iter = map_cpy.find (LOCAL_ADDRESS)) != map_cpy.end()) { - localAddress = iter->second; + if ( (iter = map_cpy.find (PUBLISHED_SAMEAS_LOCAL)) != map_cpy.end()) { + publishedSameasLocal = iter->second; } if ( (iter = map_cpy.find (PUBLISHED_ADDRESS)) != map_cpy.end()) { @@ -3831,8 +3805,8 @@ void ManagerImpl::setAccountDetails (const std::string& accountID, const std::ma setConfig (accountID, HOSTNAME, hostname); + setConfig (accountID, LOCAL_INTERFACE, localInterface); setConfig (accountID, PUBLISHED_SAMEAS_LOCAL, publishedSameasLocal); - setConfig (accountID, LOCAL_ADDRESS, localAddress); setConfig (accountID, PUBLISHED_ADDRESS, publishedAddress); setConfig (accountID, LOCAL_PORT, localPort); setConfig (accountID, PUBLISHED_PORT, publishedPort); @@ -4063,7 +4037,7 @@ short ManagerImpl::loadAccountMap() { - _debug ("ManagerImpl::loadAccountMap\n"); + _debug ("Loading account map\n"); short nbAccount = 0; TokenList sections = _config.getSections(); @@ -4082,16 +4056,28 @@ ManagerImpl::loadAccountMap() _directIpAccount = AccountCreator::createAccount (AccountCreator::SIP_DIRECT_IP_ACCOUNT, ""); if (_directIpAccount == NULL) { + _debug ("Failed to create direct ip calls \"account\"\n"); } else { - // Force the options to be loaded - // No registration in the sense of - // the REGISTER method is performed. + _debug ("Succeed to create direct ip calls \"account\"\n"); _accountMap[IP2IP_PROFILE] = _directIpAccount; - _directIpAccount->registerVoIPLink(); + + // Force IP2IP settings to be loaded to be loaded + // No registration in the sense of the REGISTER method is performed. + _directIpAccount->registerVoIPLink(); + + // SIPVoIPlink is used as a singleton, it is the first call to instance here + // The SIP library initialization is done in the SIPVoIPLink constructor + // We need the IP2IP settings to be loaded at this time as they are used + // for default sip transport + + // _directIpAccount->setVoIPLink(SIPVoIPLink::instance ("")); + _directIpAccount->setVoIPLink(); + } + // initialize other accounts while (iter != sections.end()) { // Check if it starts with "Account:" (SIP and IAX pour le moment) if ( (int) (iter->find ("Account:")) != 0) { @@ -4116,13 +4102,15 @@ ManagerImpl::loadAccountMap() if (tmpAccount != NULL) { _debug ("Loading account %s ", iter->c_str()); _accountMap[iter->c_str() ] = tmpAccount; + // tmpAccount->setVoIPLink(SIPVoIPLink::instance ("")); + tmpAccount->setVoIPLink(); nbAccount++; } iter++; } - _debug ("nbAccount loaded %i", nbAccount); + _debug ("nb account loaded %i \n", nbAccount); return nbAccount; } @@ -4135,7 +4123,8 @@ ManagerImpl::unloadAccountMap() while (iter != _accountMap.end()) { - _debug ("-> Unloading account %s", iter->first.c_str()); + _debug ("Unloading account %s\n", iter->first.c_str()); + delete iter->second; iter->second = 0; diff --git a/sflphone-common/src/managerimpl.h b/sflphone-common/src/managerimpl.h index 9068c47478ee0b7c38825923818d88dde657481e..a4a871d1e4f1d8a8b1a3437c683db95f1089f8b2 100644 --- a/sflphone-common/src/managerimpl.h +++ b/sflphone-common/src/managerimpl.h @@ -1024,6 +1024,8 @@ class ManagerImpl { * Initialize audiodriver */ bool initAudioDriver(void); + + ost::Mutex* getAudioLayerMutex() { return &_audiolayer_mutex; } private: /* Transform digest to string. @@ -1129,6 +1131,8 @@ class ManagerImpl { /** Mutex to protect access to code section */ ost::Mutex _mutex; + ost::Mutex _audiolayer_mutex; + // Multithread variable (non protected) DBusManagerImpl * _dbus; @@ -1289,8 +1293,6 @@ class ManagerImpl { int getLocalIp2IpPort(); - void setLocalIp2IpInfo( const std::string& address ); - std::string getStunServer (void); void setStunServer (const std::string &server); diff --git a/sflphone-common/src/managerimpl_registration.cpp b/sflphone-common/src/managerimpl_registration.cpp index 004faf8f2eeb68f97a55f262f089fe36eb9bf298..241a8b4078db80e6450d79f8f6e68f43b4738ba6 100644 --- a/sflphone-common/src/managerimpl_registration.cpp +++ b/sflphone-common/src/managerimpl_registration.cpp @@ -95,11 +95,8 @@ ManagerImpl::initRegisterAccounts() while (iter != _accountMap.end()) { if (iter->second) { iter->second->loadConfig(); - /* If the account is set as enabled, try to register */ - - // TODO: take off this protection by storing localIPAddress using interface name - setConfig (iter->second->getAccountID(), LOCAL_ADDRESS, "0.0.0.0"); + /* If the account is set as enabled, try to register */ if (iter->second->isEnabled()) { status = iter->second->registerVoIPLink(); diff --git a/sflphone-common/src/sip/sdp.cpp b/sflphone-common/src/sip/sdp.cpp index 34d59744380a17b3fe2e530fad11a3acbba2823e..1d60ce41f79f1d80736263d4af75f3455c996419 100644 --- a/sflphone-common/src/sip/sdp.cpp +++ b/sflphone-common/src/sip/sdp.cpp @@ -33,6 +33,7 @@ static const pj_str_t STR_SDP_NAME = { (char*) "sflphone", 8 }; static const pj_str_t STR_SENDRECV = { (char*) "sendrecv", 8 }; static const pj_str_t STR_RTPMAP = { (char*) "rtpmap", 6 }; + Sdp::Sdp (pj_pool_t *pool) : _local_media_cap() , _session_media (0) @@ -114,6 +115,8 @@ void Sdp::set_media_descriptor_line (sdpMedia *media, pjmedia_sdp_media** p_med) _warn ("No hash specified"); } + sdp_add_sdes_attribute (med); + *p_med = med; } @@ -342,6 +345,38 @@ void Sdp::sdp_add_media_description() } } + +void Sdp::sdp_add_sdes_attribute (pjmedia_sdp_media* media) +{ + + char tempbuf[256]; + + std::string tag = "1"; + std::string crypto_suite = "AES_CM_128_HMAC_SHA1_32"; + std::string application = "srtp"; + std::string key = "inline:16/14/NzB4d1BINUAvLEw6UzF3WSJ+PSdFcGdUJShpX1Zj/2^20/1:32"; + + pjmedia_sdp_attr *attribute = (pjmedia_sdp_attr*) pj_pool_zalloc(_pool, sizeof(pjmedia_sdp_attr)); + + attribute->name = pj_strdup3(_pool, "crypto"); + + int len = pj_ansi_snprintf(tempbuf, sizeof(tempbuf), + "%.*s %.*s %.*s", + (int)tag.size(), tag.c_str(), + (int)crypto_suite.size(), crypto_suite.c_str(), + (int)key.size(), key.c_str()); + + attribute->value.slen = len; + attribute->value.ptr = (char*) pj_pool_alloc (_pool, attribute->value.slen+1); + pj_memcpy (attribute->value.ptr, tempbuf, attribute->value.slen+1); + + if(pjmedia_sdp_media_add_attr(media, attribute) != PJ_SUCCESS) { + throw sdpException(); + } + +} + + void Sdp::sdp_add_zrtp_attribute (pjmedia_sdp_media* media, std::string hash) { pjmedia_sdp_attr *attribute; @@ -587,8 +622,12 @@ void Sdp::set_media_transport_info_from_remote_sdp (const pjmedia_sdp_session *r pjmedia_sdp_media *r_media; + pjmedia_sdp_attr *attribute; + this->get_remote_sdp_media_from_offer (remote_sdp, &r_media); + // this->get_remote_sdp_crypto_from_offer() + if (r_media==NULL) { _debug ("SDP Failure: no remote sdp media found in the remote offer"); return; @@ -614,3 +653,18 @@ void Sdp::get_remote_sdp_media_from_offer (const pjmedia_sdp_session* remote_sdp } } +void Sdp::get_remote_sdp_crypto_from_offer (const pjmedia_sdp_session* remote_sdp, pjmedia_sdp_media** r_crypto) +{ + int count, i; + + count = remote_sdp->media_count; + *r_crypto = NULL; + + for (i = 0; i < count; ++i) { + if (pj_stricmp2 (&remote_sdp->media[i]->desc.media, "crypto") == 0) { + *r_crypto = remote_sdp->media[i]; + return; + } + } +} + diff --git a/sflphone-common/src/sip/sdp.h b/sflphone-common/src/sip/sdp.h index 46d7ee8c957074d5dc6c3fc9ee40e29b2cae6da6..7d10c4722bf5547fa0a42b184ca4b3e2d32da64a 100644 --- a/sflphone-common/src/sip/sdp.h +++ b/sflphone-common/src/sip/sdp.h @@ -336,6 +336,16 @@ class Sdp { void get_remote_sdp_media_from_offer (const pjmedia_sdp_session* r_sdp, pjmedia_sdp_media** r_media); + void get_remote_sdp_crypto_from_offer (const pjmedia_sdp_session* remote_sdp, pjmedia_sdp_media** r_crypto); + + + /* + * Adds a sdes attribute to the given media section. + * + * @param media The media to add the srtp attribute to + */ + void sdp_add_sdes_attribute(pjmedia_sdp_media* media); + /* * Adds a zrtp-hash attribute to * the given media section. The hello hash is diff --git a/sflphone-common/src/sip/sipaccount.cpp b/sflphone-common/src/sip/sipaccount.cpp index 01152cd309798187507defeb569fa8ea4ab268e7..29e1ace7999a4dd17639ae33118b30563c0ef960 100644 --- a/sflphone-common/src/sip/sipaccount.cpp +++ b/sflphone-common/src/sip/sipaccount.cpp @@ -30,7 +30,6 @@ SIPAccount::SIPAccount (const AccountID& accountID) , _bRegister (false) , _registrationExpire ("") , _publishedSameasLocal (true) - , _localIpAddress ("") , _publishedIpAddress ("") , _localPort (atoi (DEFAULT_SIP_PORT)) , _publishedPort (atoi (DEFAULT_SIP_PORT)) @@ -44,14 +43,13 @@ SIPAccount::SIPAccount (const AccountID& accountID) , _tlsSetting (NULL) , _displayName ("") { - /* SIPVoIPlink is used as a singleton, because we want to have only one link for all the SIP accounts created */ - /* So instead of creating a new instance, we just fetch the static instance, or create one if it is not yet */ - /* The SIP library initialization is done in the SIPVoIPLink constructor */ - /* The SIP voip link is now independant of the account ID as it can manage several SIP accounts */ - _link = SIPVoIPLink::instance (""); + + // IP2IP settings must be loaded before singleton instanciation, cannot call it here... + + // _link = SIPVoIPLink::instance (""); /* Represents the number of SIP accounts connected the same link */ - dynamic_cast<SIPVoIPLink*> (_link)->incrementClients(); + // dynamic_cast<SIPVoIPLink*> (_link)->incrementClients(); } @@ -59,12 +57,23 @@ SIPAccount::~SIPAccount() { /* One SIP account less connected to the sip voiplink */ dynamic_cast<SIPVoIPLink*> (_link)->decrementClients(); + /* Delete accounts-related information */ _regc = NULL; free (_cred); free (_tlsSetting); } + +// void SIPAccount::setVoIPLink(VoIPLink *link) { +void SIPAccount::setVoIPLink() { + + _link = SIPVoIPLink::instance (""); + dynamic_cast<SIPVoIPLink*> (_link)->incrementClients(); + +} + + int SIPAccount::initCredential (void) { int credentialCount = 0; @@ -76,7 +85,7 @@ int SIPAccount::initCredential (void) md5HashingEnabled = Manager::instance().getConfigBool (PREFERENCES, CONFIG_MD5HASH); std::string digest; -// Create the credential array + // Create the credential array pjsip_cred_info * cred_info = (pjsip_cred_info *) malloc (sizeof (pjsip_cred_info) * (credentialCount)); if (cred_info == NULL) { @@ -86,7 +95,7 @@ int SIPAccount::initCredential (void) pj_bzero (cred_info, sizeof (pjsip_cred_info) *credentialCount); -// Use authentication username if provided + // Use authentication username if provided if (!_authenticationUsername.empty()) { cred_info[0].username = pj_str (strdup (_authenticationUsername.c_str())); @@ -94,15 +103,15 @@ int SIPAccount::initCredential (void) cred_info[0].username = pj_str (strdup (_username.c_str())); } -// Set password + // Set password cred_info[0].data = pj_str (strdup (_password.c_str())); -// Set realm for that credential. * by default. + // Set realm for that credential. * by default. cred_info[0].realm = pj_str (strdup (_realm.c_str())); -// We want to make sure that the password is really -// 32 characters long. Otherwise, pjsip will fail -// on an assertion. + // We want to make sure that the password is really + // 32 characters long. Otherwise, pjsip will fail + // on an assertion. if (md5HashingEnabled && _password.length() == 32) { dataType = PJSIP_CRED_DATA_DIGEST; _debug ("Setting digest "); @@ -110,10 +119,10 @@ int SIPAccount::initCredential (void) dataType = PJSIP_CRED_DATA_PLAIN_PASSWD; } -// Set the datatype + // Set the datatype cred_info[0].data_type = dataType; - -// Set the secheme + + // Set the secheme cred_info[0].scheme = pj_str ( (char*) "digest"); int i; @@ -331,15 +340,12 @@ void SIPAccount::loadConfig() // Load network settings // Local parameters - std::string localPort = Manager::instance().getConfigString (_accountID, LOCAL_PORT); - setLocalPort (atoi (localPort.c_str())); + // Load local interface + setLocalInterface(Manager::instance().getConfigString (_accountID, LOCAL_INTERFACE)); - // Do not store or use IP address in config as this address may change - // Use loadSIPLocalIP for now instead in register/unregister (UDP,STUN,TLS), newOutGoingCall, mod_on_rx_request - // TODO: if we realy have to bind to a specific interface, store interfaces by name instead - // setLocalAddress (std::string("0.0.0.0")); - setLocalAddress (Manager::instance().getConfigString (_accountID, LOCAL_ADDRESS)); + std::string localPort = Manager::instance().getConfigString (_accountID, LOCAL_PORT); + setLocalPort (atoi (localPort.c_str())); // Published parameters @@ -407,6 +413,16 @@ std::string SIPAccount::getLoginName (void) return username; } +std::string SIPAccount::getTransportMapKey(void) +{ + + std::stringstream out; + out << getLocalPort(); + std::string localPort = out.str(); + + return localPort; +} + std::string SIPAccount::getFromUri (void) { diff --git a/sflphone-common/src/sip/sipaccount.h b/sflphone-common/src/sip/sipaccount.h index 7a3a17d887a4551938d2229a3b96e23b3eaf1757..ae454a533353680c23a169cc8d0945f523a7efc2 100644 --- a/sflphone-common/src/sip/sipaccount.h +++ b/sflphone-common/src/sip/sipaccount.h @@ -24,6 +24,8 @@ #ifndef SIPACCOUNT_H #define SIPACCOUNT_H +#include <sstream> + #include "account.h" #include "sipvoiplink.h" #include "pjsip/sip_transport_tls.h" @@ -56,6 +58,12 @@ class SIPAccount : public Account */ virtual ~SIPAccount(); + /** + * Special setVoIPLink which increment SipVoIPLink's number of client. + */ + // void setVoIPLink(VoIPLink *link); + void setVoIPLink(); + /** * Actually unuseful, since config loading is done in init() */ @@ -188,6 +196,17 @@ class SIPAccount : public Account */ std::string getContactHeader(const std::string& address, const std::string& port); + /** + * Set the interface name on which this account is bound, "default" means + * that the account is bound to the ANY interafec (0.0.0.0). This method should be + * when binding the account to a new sip transport only. + */ + inline void setLocalInterface(const std::string& interface) {_interface = interface;} + + /** + * Get the local interface name on which this account is bound. + */ + inline std::string getLocalInterface(void) { return _interface; } /** * Get a flag which determine the usage in sip headers of either the local @@ -229,19 +248,6 @@ class SIPAccount : public Account * @pram port The port used by this account. */ inline void setPublishedPort(pj_uint16_t port) { _publishedPort = port; } - - /** - * Get the bound address set by the user. - * @return std::string The public IPV4 address formatted in the standard dot notation. - */ - inline std::string getLocalAddress(void) { return _localIpAddress; } - - /** - * Set the bound address chosen by the user. - * @param The public IPV4 address in the standard dot notation. - * @return void - */ - inline void setLocalAddress(const std::string& address) { _localIpAddress = address; } /** * Get the public IP address set by the user for this account. @@ -268,7 +274,9 @@ class SIPAccount : public Account inline void setAccountTransport (pjsip_transport *transport) { _transport = transport; } - private: + std::string getTransportMapKey(void); + + private: /* Maps a string description of the SSL method * to the corresponding enum value in pjsip_ssl_method. @@ -283,10 +291,10 @@ class SIPAccount : public Account */ void initTlsConfiguration(void); - /* - * Initializes STUN config from the config file - */ - void initStunConfiguration (void); + /* + * Initializes STUN config from the config file + */ + void initStunConfiguration (void); /* * Initializes set of additional credentials, if supplied by the user. @@ -308,8 +316,7 @@ class SIPAccount : public Account * @return std::string The login name under which SFLPhone is running. */ std::string getLoginName(void); - - private: + // The pjsip client registration information pjsip_regc *_regc; @@ -319,11 +326,13 @@ class SIPAccount : public Account // Network settings std::string _registrationExpire; - // Flag which determine if _localIpAddress or _publishedIpAddress is used in + // interface name on which this account is bound + std::string _interface; + + // Flag which determine if _localIpAddress or _publishedIpAddress is used in // sip headers - bool _publishedSameasLocal; + bool _publishedSameasLocal; - std::string _localIpAddress; std::string _publishedIpAddress; pj_uint16_t _localPort; @@ -350,8 +359,8 @@ class SIPAccount : public Account // The STUN server name, if applicable pj_str_t _stunServerName; - // The STUN server port, if applicable - pj_uint16_t _stunPort; + // The STUN server port, if applicable + pj_uint16_t _stunPort; // Display Name that can be used in SIP URI. std::string _displayName; diff --git a/sflphone-common/src/sip/sipvoiplink.cpp b/sflphone-common/src/sip/sipvoiplink.cpp index 0bfe9b5b8d9a4e8a5edc013b834ec2b8f9df5934..5d78a1f2ee5be34bb6812238c7b5d38ea9dc561f 100644 --- a/sflphone-common/src/sip/sipvoiplink.cpp +++ b/sflphone-common/src/sip/sipvoiplink.cpp @@ -42,7 +42,13 @@ #include <arpa/nameser.h> #include <resolv.h> #include <istream> -//#define CAN_REINVITE 1 + +#include <sys/types.h> +#include <sys/socket.h> +#include <sys/ioctl.h> +#include <linux/if.h> + +#define CAN_REINVITE 1 static char * invitationStateMap[] = { (char*) "PJSIP_INV_STATE_NULL", @@ -238,6 +244,8 @@ SIPVoIPLink::SIPVoIPLink (const AccountID& accountID) SIPVoIPLink::~SIPVoIPLink() { + _debug("SIPVoIPLink destructor called"); + terminate(); } @@ -257,6 +265,8 @@ void SIPVoIPLink::decrementClients (void) _clients--; if (_clients == 0) { + + _debug("No SIP account anymore, terminate SIPVoIPLink"); terminate(); SIPVoIPLink::_instance=NULL; } @@ -285,21 +295,18 @@ bool SIPVoIPLink::init() void SIPVoIPLink::terminate() { - _debug ("SIPVoIPLink::terminate"); - - + _debug ("Terminating SIPVoIPLink"); if (_evThread) { - _debug ("SIPVoIPLink:: delete eventThread"); + _debug ("Deleting sip eventThread"); delete _evThread; _evThread = NULL; } - /* Clean shutdown of pjsip library */ if (initDone()) { - _debug ("pjsip_shutdown\n"); + _debug ("Shuting down PJSIP"); pjsip_shutdown(); } @@ -365,6 +372,38 @@ void get_remote_sdp_from_offer (pjsip_rx_data *rdata, pjmedia_sdp_session** r_sd } +std::string SIPVoIPLink::getInterfaceAddrFromName(std::string ifaceName) { + + struct ifreq ifr; + int fd; + int rval = 0; + int err; + + struct sockaddr_in *saddr_in; + struct in_addr *addr_in; + + if((fd = socket (AF_INET, SOCK_DGRAM,0)) < 0) + _debug("getInterfaceAddrFromName error could not open socket\n"); + + memset (&ifr, 0, sizeof (struct ifreq)); + + strcpy (ifr.ifr_name, ifaceName.c_str()); + ifr.ifr_addr.sa_family = AF_INET; + + if((err = ioctl(fd, SIOCGIFADDR, &ifr)) < 0) + _debug("getInterfaceAddrFromName use default interface (0.0.0.0)\n"); + + // printf("Local address: %s\n", inet_ntos( ((struct sockaddr_in *) &ifr.ifr_ifru.ifru_addr)->sin_addr )); + + saddr_in = (struct sockaddr_in *)&ifr.ifr_addr; + addr_in = &(saddr_in->sin_addr); + + std::string addr(pj_inet_ntoa(*((pj_in_addr*)addr_in))); + + return addr; +} + + std::string SIPVoIPLink::get_useragent_name (void) { std::ostringstream useragent; @@ -388,6 +427,7 @@ SIPVoIPLink::getEvent() int SIPVoIPLink::sendRegister (AccountID id) { + int expire_value; pj_status_t status; @@ -449,39 +489,17 @@ int SIPVoIPLink::sendRegister (AccountID id) } } - // Launch a new TLS listener/transport - // if the user did choose it. - if (account->isTlsEnabled()) { - pj_status_t status; - - _debug (" sendRegister: createTlsTransport"); - status = createTlsTransportRetryOnFailure (id); - - if (status != PJ_SUCCESS) { - _debug ("Failed to initialize TLS transport for account %s", id.c_str()); - } - } - - else { - // Launch a new UDP listener/transport, using the published address - if (account->isStunEnabled ()) { - pj_status_t status; - - _debug (" sendRegister: createAlternateUdpTransport"); - status = createAlternateUdpTransport (id); - - if (status != PJ_SUCCESS) { - _debug ("Failed to initialize UDP transport with an extern published address for account %s", id.c_str()); - } - } else { - - status = createUDPServer (id); + // Create SIP transport or get existent SIP transport from internal map + // according to account settings, if the transport could not be created but + // one is already set in account, use this one (most likely this is the + // transport we tried to create) + acquireTransport(account->getAccountID()); - if (status != PJ_SUCCESS) { - _debug ("Use the local UDP transport\n"); - account->setAccountTransport (_localUDPTransport); - } - } + if (account->getAccountTransport()) { + _debug("Acquire transport in account registration: %s %s (refcnt=%d)", + account->getAccountTransport()->obj_name, + account->getAccountTransport()->info, + (int)pj_atomic_get(account->getAccountTransport()->ref_cnt)); } _mutexSIP.enterMutex(); @@ -590,9 +608,22 @@ int SIPVoIPLink::sendRegister (AccountID id) pjsip_tpselector *tp; - init_transport_selector (account->getAccountTransport (), &tp); + init_transport_selector (account->getAccountTransport (), &tp); + + // pjsip_regc_set_transport increments transport ref count by one status = pjsip_regc_set_transport (regc, tp); + if(account->getAccountTransport()) { + // decrease transport's ref count, counter icrementation is + // managed when acquiring transport + pjsip_transport_dec_ref(account->getAccountTransport ()); + + _debug("After setting the transport in account registration using transport: %s %s (refcnt=%d)", + account->getAccountTransport()->obj_name, + account->getAccountTransport()->info, + (int)pj_atomic_get(account->getAccountTransport()->ref_cnt)); + } + if (status != PJ_SUCCESS) { _debug ("UserAgent: Unable to set transport."); _mutexSIP.leaveMutex (); @@ -600,8 +631,16 @@ int SIPVoIPLink::sendRegister (AccountID id) } // Send registration request + // pjsip_regc_send increment the transport ref count by one, status = pjsip_regc_send (regc, tdata); + if(account->getAccountTransport()) { + // Decrease transport's ref count, since coresponding reference counter decrementation + // is performed in pjsip_regc_destroy. This function is never called in SFLphone as the + // regc data structure is permanently associated to the account at first registration. + pjsip_transport_dec_ref(account->getAccountTransport ()); + } + if (status != PJ_SUCCESS) { _debug ("UserAgent: Unable to send regc request."); _mutexSIP.leaveMutex(); @@ -611,12 +650,22 @@ int SIPVoIPLink::sendRegister (AccountID id) _mutexSIP.leaveMutex(); account->setRegistrationInfo (regc); + + if(account->getAccountTransport()) { + + _debug("Sent account registration using transport: %s %s (refcnt=%d)", + account->getAccountTransport()->obj_name, + account->getAccountTransport()->info, + (int)pj_atomic_get(account->getAccountTransport()->ref_cnt)); + } + return true; } int SIPVoIPLink::sendUnregister (AccountID id) { + pj_status_t status = 0; pjsip_tx_data *tdata = NULL; SIPAccount *account; @@ -625,6 +674,18 @@ SIPVoIPLink::sendUnregister (AccountID id) account = dynamic_cast<SIPAccount *> (Manager::instance().getAccount (id)); regc = account->getRegistrationInfo(); + // If an transport is attached to this account, detach it and decrease reference counter + if(account->getAccountTransport()) { + + _debug("Sent account unregistration using transport: %s %s (refcnt=%d)", + account->getAccountTransport()->obj_name, + account->getAccountTransport()->info, + (int)pj_atomic_get(account->getAccountTransport()->ref_cnt)); + + // shutdownSipTransport(account->getAccountID()); + } + + // This may occurs if account failed to register and is in state INVALID if (!account->isRegister()) { account->setRegistrationState (Unregistered); return true; @@ -637,7 +698,7 @@ SIPVoIPLink::sendUnregister (AccountID id) _debug ("UserAgent: Unable to unregister regc."); return false; } - + status = pjsip_regc_send (regc, tdata); if (status != PJ_SUCCESS) { @@ -680,7 +741,7 @@ SIPVoIPLink::newOutgoingCall (const CallID& id, const std::string& toUrl) call->setPeerNumber (toUri); - localAddr = account->getLocalAddress (); + localAddr = getInterfaceAddrFromName(account->getLocalInterface ()); if (localAddr == "0.0.0.0") loadSIPLocalIP (&localAddr); @@ -688,7 +749,7 @@ SIPVoIPLink::newOutgoingCall (const CallID& id, const std::string& toUrl) setCallAudioLocal (call, localAddr); // May use the published address as well - account->isStunEnabled () ? addrSdp = account->getPublishedAddress () : addrSdp = account->getLocalAddress (); + account->isStunEnabled () ? addrSdp = account->getPublishedAddress () : addrSdp = getInterfaceAddrFromName(account->getLocalInterface ()); if (addrSdp == "0.0.0.0") loadSIPLocalIP (&addrSdp); @@ -870,12 +931,14 @@ SIPVoIPLink::peerHungup (const CallID& id) call->getInvSession()->mod_data[getModId() ] = NULL; + // Release RTP thread if (Manager::instance().isCurrentCall (id)) { _debug ("* SIP Info: Stopping AudioRTP for hangup"); call->getAudioRtp()->stop(); } + terminateOneCall (id); removeCall (id); @@ -1333,8 +1396,13 @@ SIPVoIPLink::SIPStartCall (SIPCall* call, const std::string& subject UNUSED) init_transport_selector (account->getAccountTransport (), &tp); + // increment transport's ref count by one status = pjsip_dlg_set_transport (dialog, tp); + // decrement transport's ref count + // pjsip_transport_dec_ref(account->getAccountTransport()); + + status = pjsip_inv_send_msg (inv, tdata); if (status != PJ_SUCCESS) { @@ -1342,6 +1410,14 @@ SIPVoIPLink::SIPStartCall (SIPCall* call, const std::string& subject UNUSED) return false; } + if(account->getAccountTransport()) { + + _debug("Sent invite request using transport: %s %s (refcnt=%d)", + account->getAccountTransport()->obj_name, + account->getAccountTransport()->info, + (int)pj_atomic_get(account->getAccountTransport()->ref_cnt)); + } + return true; } @@ -1459,26 +1535,26 @@ bool SIPVoIPLink::new_ip_to_ip_call (const CallID& id, const std::string& to) account = dynamic_cast<SIPAccount *> (Manager::instance().getAccount (IP2IP_PROFILE)); if (account == NULL) { - _debug ("Account is null. Returning"); + + _debug ("Account %s is null. Returning", IP2IP_PROFILE); return !PJ_SUCCESS; } - // Set the local address - localAddress = account->getLocalAddress (); - - // Set SDP parameters - Set to local or published address - account->isStunEnabled () ? addrSdp = account->getPublishedAddress () : addrSdp = account->getLocalAddress (); + // Set the local address + localAddress = getInterfaceAddrFromName(account->getLocalInterface ()); + // Set SDP parameters - Set to local + addrSdp = localAddress; _debug ("new_ip_to_ip_call localAddress: %s", localAddress.c_str()); if (localAddress == "0.0.0.0") { - _debug ("Here is the local address: %s", localAddress.c_str ()); + _debug ("Local address: %s", localAddress.c_str ()); loadSIPLocalIP (&localAddress); } - if (addrSdp == "0.0.0.0") { - addrSdp = localAddress; - } + if (addrSdp == "0.0.0.0") { + addrSdp = localAddress; + } setCallAudioLocal (call, localAddress); @@ -1499,13 +1575,13 @@ bool SIPVoIPLink::new_ip_to_ip_call (const CallID& id, const std::string& to) // If no account already set, use the default one created at pjsip initialization if (account->getAccountTransport() == NULL) { - _debug ("No transport for this account, using the default one\n"); + _debug ("No transport for this account, using the default one"); account->setAccountTransport (_localUDPTransport); } - _debug ("IptoIP local port %i\n", account->getLocalPort()); + _debug ("IptoIP local port %i", account->getLocalPort()); - _debug ("IptoIP local address in sdp %s\n", account->getLocalAddress().c_str()); + _debug ("IptoIP local address in sdp %s", localAddress.c_str()); // Create URI std::string fromUri; @@ -1561,8 +1637,12 @@ bool SIPVoIPLink::new_ip_to_ip_call (const CallID& id, const std::string& to) init_transport_selector (account->getAccountTransport(), &tp); + // set_transport methods increment transport's ref_count status = pjsip_dlg_set_transport (dialog, tp); + // decrement transport's ref count + // pjsip_transport_dec_ref(account->getAccountTransport()); + if (status != PJ_SUCCESS) { _debug ("Failed to set the transport for an IP call"); return status; @@ -1654,7 +1734,7 @@ pj_status_t SIPVoIPLink::enable_dns_srv_resolver (pjsip_endpoint *endpt, pj_dns_ // Build the nameservers list needed by pjsip if ( (scount = dns_servers.size ()) <= 0) { - _debug ("No server detected while fetching DNS information, stop dns resolution\n"); + _debug ("No server detected while fetching DNS information, stop dns resolution"); return 0; } @@ -1699,7 +1779,7 @@ bool SIPVoIPLink::pjsip_init() name_mod = "sflphone"; - _debug ("pjsip_init\n"); + _debug ("pjsip_init"); // Init PJLIB: must be called before any call to the pjsip library status = pj_init(); @@ -1745,48 +1825,59 @@ bool SIPVoIPLink::pjsip_init() bool directIpCallsTlsEnabled = false; - account = dynamic_cast<SIPAccount *> (Manager::instance().getAccount (AccountNULL)); + // Use IP2IP_PROFILE to init default udp transport settings + account = dynamic_cast<SIPAccount *> (Manager::instance().getAccount (IP2IP_PROFILE)); - if (account == NULL) { - _debug ("Account is null in pjsip init"); - port = _regPort; - } else { - directIpCallsTlsEnabled = account->isTlsEnabled(); - port = account->getLocalPort (); - } + // Create a UDP listener meant for all accounts for which TLS was not enabled + // Cannot acquireTransport since default UDP transport must be created regardless of TLS + errPjsip = createUDPServer(IP2IP_PROFILE); - // Create a UDP listener meant for all accounts - // for which TLS was not enabled - errPjsip = createUDPServer(); + if(account && (errPjsip == PJ_SUCCESS)) { + _debug("UserAgent: Initialized sip listener on port %d", account->getLocalPort ()); + addTransportToMap(account->getTransportMapKey(), account->getAccountTransport()); + + // if account is not NULL, use IP2IP trasport as default one + _localUDPTransport = account->getAccountTransport(); + + } // If the above UDP server // could not be created, then give it another try // on a random sip port - if (errPjsip != PJ_SUCCESS) { - _debug ("UserAgent: Could not initialize SIP listener on port %d", port); - port = RANDOM_SIP_PORT; + else if (errPjsip != PJ_SUCCESS) { + _debug ("UserAgent: Could not initialize SIP listener on port %d", _regPort); + _regPort = RANDOM_SIP_PORT; - _debug ("UserAgent: Trying to initialize SIP listener on port %d", port); + _debug ("UserAgent: Trying to initialize SIP listener on port %d", _regPort); + // If no AccountID specified, pointer to transport is stored in _localUDPTransport errPjsip = createUDPServer(); if (errPjsip != PJ_SUCCESS) { - _debug ("UserAgent: Fail to initialize SIP listener on port %d", port); + _debug ("UserAgent: Fail to initialize SIP listener on port %d", _regPort); return errPjsip; } } - _debug ("pjsip_init -- listening on port %d", port); + acquireTransport(IP2IP_PROFILE); + /* // Create a TLS listener meant for Direct IP calls // if the user did enabled it. + if (account != NULL) { + + directIpCallsTlsEnabled = account->isTlsEnabled(); + port = account->getLocalPort (); + + } if (directIpCallsTlsEnabled) { - errPjsip = createTlsTransportRetryOnFailure (AccountNULL); + errPjsip = createTlsTransportRetryOnFailure (IP2IP_PROFILE); } if (errPjsip != PJ_SUCCESS) { _debug ("pj_init(): could not start TLS transport for Direct Calls"); } + */ // TODO: For TLS, retry on random port, just we already do above // for UDP transport. @@ -1938,6 +2029,167 @@ pj_status_t SIPVoIPLink::stunServerResolve (AccountID id) return status; } + + +bool SIPVoIPLink::acquireTransport(const AccountID& accountID) { + + SIPAccount* account = dynamic_cast<SIPAccount *> (Manager::instance().getAccount (accountID)); + + if(!account) + return false; + + // If an account is already bound to this account, decrease its reference + // as it is going to change. If the same transport is selected, reference + // counter will be increased + if(account->getAccountTransport()) { + + _debug("pjsip_transport_dec_ref in acquireTransport"); + pjsip_transport_dec_ref(account->getAccountTransport()); + } + + // Try to create a new transport + if(createSipTransport(accountID)) { + + return true; + } + /* + else if(account->getAccountTransport()) { + + // Transport could not be created, account account already have one set. + // Most likely this is the transport we tried to create. + _debug("Transport (%s) already set for this account, use it\n", account->getTransportMapKey().c_str()); + + return true; + } + */ + else { + + _debug("Searching transport (%s) in transport map", account->getTransportMapKey().c_str()); + + // Could not create new transport, this transport may already exists + SipTransportMap::iterator transport; + transport = _transportMap.find(account->getTransportMapKey()); + + if(transport != _transportMap.end()) { + + // Transport already exist, use it for this account + _debug("Found transport (%s) in transport map", account->getTransportMapKey().c_str()); + + pjsip_transport* tr = transport->second; + + // Set transport to be used for transaction involving this account + account->setAccountTransport(tr); + + // Increment newly associated transport reference counter + // If the account is shutdowning, time is automatically canceled + pjsip_transport_add_ref(tr); + + return true; + } + else { + + // Transport could not either be created, socket not available + _debug("Did not find transport (%s) in transport map", account->getTransportMapKey().c_str()); + + account->setAccountTransport(_localUDPTransport); + + std::string localHostName(_localUDPTransport->local_name.host.ptr, _localUDPTransport->local_name.host.slen); + + _debug("Use default one instead (%s:%i)", localHostName.c_str(), _localUDPTransport->local_name.port); + + // account->setLocalAddress(localHostName); + account->setLocalPort(_localUDPTransport->local_name.port); + + // Transport could not either be created or found in the map, socket not available + return false; + } + } +} + + +bool SIPVoIPLink::createSipTransport(AccountID id) { + + + SIPAccount* account = dynamic_cast<SIPAccount *> (Manager::instance().getAccount (id)); + + if (!account) + return false; + + pj_status_t status; + + // Launch a new TLS listener/transport + // if the user did choose it. + if (account->isTlsEnabled()) { + + _debug ("Create TLS transport"); + status = createTlsTransportRetryOnFailure (id); + + if (status != PJ_SUCCESS) { + _debug ("Failed to initialize TLS transport for account %s", id.c_str()); + return false; + } + } + else { + + // Launch a new UDP listener/transport, using the published address + if (account->isStunEnabled ()) { + + _debug ("Create Alternate UDP transport"); + status = createAlternateUdpTransport (id); + + if (status != PJ_SUCCESS) { + _debug ("Failed to initialize UDP transport with an extern published address for account %s", id.c_str()); + return false; + } + + } else { + + _debug ("Create UDP transport"); + status = createUDPServer (id); + + if (status != PJ_SUCCESS) { + _debug ("Failed to initialize UDP transport for account %s", id.c_str()); + return false; + } + else { + + // If transport succesfully created, store it in the internal map. + // STUN aware transport are account specific and should not be stored in map. + // TLS transport is ephemeral and is managed by PJSIP, should not be stored either. + addTransportToMap(account->getTransportMapKey(), account->getAccountTransport()); + } + + + } + + } + + return true; + + +} + + + +bool SIPVoIPLink::addTransportToMap(std::string key, pjsip_transport* transport) +{ + + SipTransportMap::iterator iter_transport; + iter_transport = _transportMap.find(key); + + // old transport in transport map, erase it + if(iter_transport != _transportMap.end()){ + _transportMap.erase(iter_transport); + } + + _debug("Storing the newly created transport in transport map using key %s", key.c_str()); + _transportMap.insert(pair<std::string, pjsip_transport*>(key, transport)); + + return true; + +} + + int SIPVoIPLink::createUDPServer (AccountID id) { @@ -1950,94 +2202,112 @@ int SIPVoIPLink::createUDPServer (AccountID id) int listeningPort = _regPort; /* Use my local address as default value */ - if (!loadSIPLocalIP (&listeningAddress)) return !PJ_SUCCESS; - _debug ("SIPVoIPLink::createUDPServer\n"); + _debug ("Create UDP transport for account \"%s\"", id.c_str()); /* * Retrieve the account information */ SIPAccount * account = NULL; - account = dynamic_cast<SIPAccount *> (Manager::instance().getAccount (id)); + // if account id is not specified, init _localUDPTransport + if (id != "") { - // Set information to the local address and port + account = dynamic_cast<SIPAccount *> (Manager::instance().getAccount (id)); + } + // Set information to the local address and port if (account == NULL) { + _debug ("Account with id \"%s\" is null in createUDPServer.", id.c_str()); + } else { + // We are trying to initialize a UDP transport available for all local accounts and direct IP calls - if (account->getLocalAddress () != "0.0.0.0") { - listeningAddress = account->getLocalAddress (); + _debug("Found account %s in map", account->getAccountID().c_str()); + + if (account->getLocalInterface () != "default") { + listeningAddress = getInterfaceAddrFromName(account->getLocalInterface()); } listeningPort = account->getLocalPort (); } - // Init bound address to ANY pj_memset (&bound_addr, 0, sizeof (bound_addr)); - bound_addr.sin_addr.s_addr = pj_htonl (PJ_INADDR_ANY); + pj_str_t temporary_address; - bound_addr.sin_port = pj_htons ( (pj_uint16_t) listeningPort); + if (account && account->getLocalInterface () == "default") { - bound_addr.sin_family = PJ_AF_INET; + // Init bound address to ANY + bound_addr.sin_addr.s_addr = pj_htonl (PJ_INADDR_ANY); + } + else { + + // bind this account to a specific interface + pj_strdup2(_pool, &temporary_address, listeningAddress.c_str()); + bound_addr.sin_addr = pj_inet_addr(&temporary_address); + } + bound_addr.sin_port = pj_htons ( (pj_uint16_t) listeningPort); + bound_addr.sin_family = PJ_AF_INET; pj_bzero (bound_addr.sin_zero, sizeof (bound_addr.sin_zero)); // Create UDP-Server (default port: 5060) // Use here either the local information or the published address if (account != NULL && !account->getPublishedSameasLocal ()) { + // Set the listening address to the published address listeningAddress = account->getPublishedAddress (); // Set the listening port to the published port listeningPort = account->getPublishedPort (); - _debug (" ******************************** Use the published address %s:%i\n", listeningAddress.c_str (), listeningPort); + _debug ("Creating UDP transport published %s:%i", listeningAddress.c_str (), listeningPort); + } + //strcpy (tmpIP, listeningAddress.data()); /* Init published name */ pj_bzero (&a_name, sizeof (pjsip_host_port)); - pj_cstr (&a_name.host, listeningAddress.c_str()); - a_name.port = listeningPort; - //pj_strdup2 (_pool, &a_name.host, tmpIP); - //a_name.port = (pj_uint16_t) listeningPort; status = pjsip_udp_transport_start (_endpt, &bound_addr, &a_name, 1, &transport); - // Get the transport manager associated with - // this endpoint - pjsip_tpmgr * tpmgr = NULL; - - tpmgr = pjsip_endpt_get_tpmgr (_endpt); - - _debug ("number of transport: %i", pjsip_tpmgr_get_transport_count (tpmgr)); - + // Print info from transport manager associated to endpoint + pjsip_tpmgr * tpmgr = pjsip_endpt_get_tpmgr (_endpt); pjsip_tpmgr_dump_transports (tpmgr); if (status != PJ_SUCCESS) { + _debug ("UserAgent: (%d) Unable to start UDP transport on %s:%d", status, listeningAddress.data(), listeningPort); - // Try to acquire an existing one - // pjsip_tpmgr_acquire_transport () return status; + } else { + _debug ("UserAgent: UDP server listening on port %d", listeningPort); - if (account == NULL) + if (account == NULL) { + + _debug("Use transport as local UDP server"); _localUDPTransport = transport; + } else { - account->setAccountTransport (transport); - } + + _debug("Bind transport to account %s", account->getAccountID().c_str()); + account->setAccountTransport (transport); + } } - _debug ("Transport initialized successfully on %s:%i", listeningAddress.c_str (), listeningPort); + if (status == PJ_SUCCESS) { + _debug ("Transport initialized successfully on %s:%i", listeningAddress.c_str (), listeningPort); + + } return PJ_SUCCESS; } @@ -2076,6 +2346,7 @@ std::string SIPVoIPLink::findLocalAddressFromUri (const std::string& uri, pjsip_ if (PJSIP_URI_SCHEME_IS_SIPS (sip_uri)) { transportType = PJSIP_TRANSPORT_TLS; + } else { if (transport == NULL) { _debug ("transport is NULL in findLocalAddressFromUri. Try the local UDP transport"); @@ -2111,8 +2382,10 @@ std::string SIPVoIPLink::findLocalAddressFromUri (const std::string& uri, pjsip_ status = pjsip_tpmgr_find_local_addr (tpmgr, _pool, transportType, tp_sel, &localAddress, &port); else status = pjsip_tpmgr_find_local_addr (tpmgr, _pool, transportType, NULL, &localAddress, &port); - } else + } else { + status = pjsip_tpmgr_find_local_addr (tpmgr, _pool, transportType, NULL, &localAddress, &port); + } if (status != PJ_SUCCESS) { _debug ("Failed to find local address from transport"); @@ -2124,6 +2397,8 @@ std::string SIPVoIPLink::findLocalAddressFromUri (const std::string& uri, pjsip_ return std::string (localAddress.ptr, localAddress.slen); } + + pj_status_t SIPVoIPLink::init_transport_selector (pjsip_transport *transport, pjsip_tpselector **tp_sel) { pjsip_tpselector *tp; @@ -2351,6 +2626,32 @@ pj_status_t SIPVoIPLink::createAlternateUdpTransport (AccountID id) account->setAccountTransport (transport); + if(transport) { + + _debug("INITIAL REF COUNT: %s %s (refcnt=%i)", + transport->obj_name, + transport->info, + (int)pj_atomic_get(transport->ref_cnt)); + + + pj_sockaddr *addr = (pj_sockaddr*)&(transport->key.rem_addr); + + static char str[PJ_INET6_ADDRSTRLEN]; + pj_inet_ntop(((const pj_sockaddr*)addr)->addr.sa_family, + pj_sockaddr_get_addr(addr), + str, sizeof(str)); + + + _debug("KEY: %s:%d", + // addr_string(account->getAccountTransport()->key.rem_addr), + str, + pj_sockaddr_get_port((const pj_sockaddr*)&(transport->key.rem_addr))); + + } + pjsip_tpmgr * tpmgr = pjsip_endpt_get_tpmgr (_endpt); + + pjsip_tpmgr_dump_transports (tpmgr); + return PJ_SUCCESS; } @@ -2390,11 +2691,25 @@ pj_status_t SIPVoIPLink::createTlsTransport (AccountID id) local_addr.sin_port = pj_htons (localTlsPort); } - std::string localAddress = account->getLocalAddress(); + /* + std::string localAddress; + if (account->getLocalInterface() == "default"){ + + // Current selected interface address is 0.0.0.0, resolve local address using + loadSIPLocalIP (&localAddress); + } + else { + + // Specific interface selected, reslove it + localAddress = getInterfaceAddrFromName(account->getLocalInterface()); + } + */ + + std::string localAddress = getInterfaceAddrFromName(account->getLocalInterface()); if (!localAddress.empty()) { pj_str_t pjAddress; - pj_cstr (&pjAddress, (account->getLocalAddress()).c_str()); + pj_cstr (&pjAddress, localAddress.c_str()); pj_status_t success; success = pj_sockaddr_in_set_str_addr (&local_addr, &pjAddress); @@ -2404,10 +2719,30 @@ pj_status_t SIPVoIPLink::createTlsTransport (AccountID id) } } + std::string publishedAddress; + if (account->getPublishedSameasLocal()) { + + // if "default" interface is selected, loadSIPLocalIP() is used to get local address + if (account->getLocalInterface() == "default"){ + + loadSIPLocalIP (&publishedAddress); + } + else { + + // Specific interface selected + publishedAddress = localAddress; + } + } + else { + + publishedAddress = account->getPublishedAddress(); + } + + /* Init published name */ pj_bzero (&a_name, sizeof (pjsip_host_port)); - pj_cstr (&a_name.host, (account->getPublishedAddress()).c_str()); + pj_cstr (&a_name.host, publishedAddress.c_str()); a_name.port = account->getPublishedPort(); @@ -2431,10 +2766,45 @@ pj_status_t SIPVoIPLink::createTlsTransport (AccountID id) } +void SIPVoIPLink::shutdownSipTransport(const AccountID& accountID) +{ + _debug("Shutdown Sip Transport"); + + pj_status_t status = 0; + + SIPAccount* account = dynamic_cast<SIPAccount *> (Manager::instance().getAccount (accountID)); + + if(!account) + return; + + if(account->getAccountTransport()) { + + _debug("Transport bound to account, decrease ref count"); + + // decrease reference count added by pjsip_regc_send + // PJSIP's IDLE timer is set if counter reach 0 + status = pjsip_transport_dec_ref(account->getAccountTransport()); + + // detach transport from this account + account->setAccountTransport(NULL); + + } + +} + + void SIPVoIPLink::updateAccountInfo (const AccountID& accountID) { - createUDPServer (accountID); + // createSipTransport (accountID); + acquireTransport(accountID); + + if(accountID == IP2IP_PROFILE) { + + SIPAccount* account = dynamic_cast<SIPAccount *> (Manager::instance().getAccount (accountID)); + // Store new IP2IP UDP transport as default + _localUDPTransport = account->getAccountTransport(); + } } @@ -2517,7 +2887,7 @@ bool SIPVoIPLink::pjsip_shutdown (void) /* Shutdown PJLIB */ pj_shutdown(); - _debug ("UserAgent: Shutted down succesfully\n"); + _debug ("UserAgent: Shutted down succesfully"); /* Done. */ return true; @@ -2857,6 +3227,8 @@ void call_on_tsx_changed (pjsip_inv_session *inv, pjsip_transaction *tsx, pjsip_ { _debug("call_on_tsx_changed to state %s", transactionStateMap[tsx->state]); + + if (tsx->role==PJSIP_ROLE_UAS && tsx->state==PJSIP_TSX_STATE_TRYING && pjsip_method_cmp (&tsx->method, &pjsip_refer_method) ==0) { /** Handle the refer method **/ @@ -2875,7 +3247,7 @@ void call_on_tsx_changed (pjsip_inv_session *inv, pjsip_transaction *tsx, pjsip_ if (request.find (method_name) != (size_t)-1) { - _debug ("%s\n", pjsip_rx_data_get_info (r_data)); + _debug ("%s", pjsip_rx_data_get_info (r_data)); pjsip_dlg_create_response (inv->dlg, r_data, PJSIP_SC_OK, NULL, &t_data); @@ -2942,6 +3314,13 @@ void regc_cb (struct pjsip_regc_cbparam *param) } account->setRegister (false); + + // shutdown this transport since useless + // if(account->getAccountTransport() != _localUDPTransport) { + + SIPVoIPLink::instance("")->shutdownSipTransport(account->getAccountID()); + //} + } else { // Registration/Unregistration is success if (account->isRegister()) @@ -2949,11 +3328,18 @@ void regc_cb (struct pjsip_regc_cbparam *param) else { account->setRegistrationState (Unregistered); account->setRegister (false); + + SIPVoIPLink::instance("")->shutdownSipTransport(account->getAccountID()); + + // pjsip_regc_destroy(param->regc); + // account->setRegistrationInfo(NULL); } } } else { account->setRegistrationState (ErrorAuth); account->setRegister (false); + + SIPVoIPLink::instance("")->shutdownSipTransport(account->getAccountID()); } } @@ -2987,6 +3373,11 @@ mod_on_rx_request (pjsip_rx_data *rdata) // Handle the incoming call invite in this function _debug ("UserAgent: Callback on_rx_request is involved! "); + _debug("Receiving REQUEST using transport: %s %s (refcnt=%d)", + rdata->tp_info.transport->obj_name, + rdata->tp_info.transport->info, + (int)pj_atomic_get(rdata->tp_info.transport->ref_cnt)); + /* First, let's got the username and server name from the invite. * We will use them to detect which account is the callee. */ @@ -3028,6 +3419,9 @@ mod_on_rx_request (pjsip_rx_data *rdata) int end_displayName = temp.rfind ("\""); // _debug("The display name start at %i, end at %i", begin_displayName, end_displayName); displayName = temp.substr (begin_displayName, end_displayName - begin_displayName);//display_name); + if(displayName.size() > 25) { + displayName = std::string (""); + } } else { displayName = std::string (""); } @@ -3119,7 +3513,7 @@ mod_on_rx_request (pjsip_rx_data *rdata) /************************************************************************************************/ - _debug ("create a new call\n"); + _debug ("create a new call"); // Generate a new call ID for the incoming call! id = Manager::instance().getNewCallID(); @@ -3143,10 +3537,20 @@ mod_on_rx_request (pjsip_rx_data *rdata) if (account != NULL) { // May use the published address as well - addrToUse = account->getLocalAddress (); - account->isStunEnabled () ? addrSdp = account->getPublishedAddress () : addrSdp = account->getLocalAddress (); - // Set the appropriate transport to have the right VIA header - link->init_transport_selector (account->getAccountTransport (), &tp); + + addrToUse = SIPVoIPLink::instance("")->getInterfaceAddrFromName(account->getLocalInterface ()); + account->isStunEnabled () ? addrSdp = account->getPublishedAddress () : addrSdp = addrToUse; + // Set the appropriate transport to have the right VIA header + link->init_transport_selector (account->getAccountTransport (), &tp); + + if(account->getAccountTransport()) { + + _debug("Process INVITE request using transport: %s %s (refcnt=%i)", + account->getAccountTransport()->obj_name, + account->getAccountTransport()->info, + (int)pj_atomic_get(account->getAccountTransport()->ref_cnt)); + } + } if (addrToUse == "0.0.0.0") { @@ -3168,7 +3572,7 @@ mod_on_rx_request (pjsip_rx_data *rdata) // Notify UI there is an incoming call - _debug ("Add call to account link\n"); + _debug ("Add call to account link"); if (Manager::instance().incomingCall (call, account_id)) { // Add this call to the callAccountMap in ManagerImpl @@ -3211,9 +3615,11 @@ mod_on_rx_request (pjsip_rx_data *rdata) // Specify media capability during invite session creation status = pjsip_inv_create_uas (dialog, rdata, call->getLocalSDP()->get_local_sdp_session(), 0, &inv); - // Explicitly set the transport + // Explicitly set the transport, set_transport methods increment transport's reference counter status = pjsip_dlg_set_transport (dialog, tp); + // decrement transport's reference counter + // pjsip_transport_dec_ref(rdata->tp_info.transport); PJ_ASSERT_RETURN (status == PJ_SUCCESS, 1); @@ -3748,6 +4154,7 @@ void handle_incoming_options (pjsip_rx_data *rdata) status = pjsip_endpt_send_response (_endpt, &res_addr, tdata, NULL, NULL); + if (status != PJ_SUCCESS) pjsip_tx_data_dec_ref (tdata); } @@ -3850,6 +4257,54 @@ std::vector<std::string> SIPVoIPLink::getAllIpInterface (void) } +int get_iface_list(struct ifconf *ifconf) +{ + int sock, rval; + + if((sock = socket(AF_INET,SOCK_STREAM,0)) < 0) + _debug("get_iface_list error could not open socket\n"); + + + if((rval = ioctl(sock, SIOCGIFCONF , (char*) ifconf )) < 0 ) + _debug("get_iface_list error ioctl(SIOGIFCONF)\n"); + + close(sock); + + return rval; +} + + +std::vector<std::string> SIPVoIPLink::getAllIpInterfaceByName(void) +{ + std::vector<std::string> ifaceList; + + static struct ifreq ifreqs[20]; + struct ifconf ifconf; + int nifaces; + + // add the default + ifaceList.push_back(std::string("default")); + + memset(&ifconf,0,sizeof(ifconf)); + ifconf.ifc_buf = (char*) (ifreqs); + ifconf.ifc_len = sizeof(ifreqs); + + if(get_iface_list(&ifconf) < 0) + _debug("getAllIpInterfaceByName error could not get interface list\n"); + + nifaces = ifconf.ifc_len/sizeof(struct ifreq); + + _debug("Interfaces (count = %d):\n", nifaces); + for(int i = 0; i < nifaces; i++) { + _debug(" %s ", ifreqs[i].ifr_name); + ifaceList.push_back(std::string (ifreqs[i].ifr_name)); + printf(" %s\n", getInterfaceAddrFromName(std::string (ifreqs[i].ifr_name)).c_str()); + } + + return ifaceList; +} + + pj_bool_t stun_sock_on_status (pj_stun_sock *stun_sock, pj_stun_sock_op op, pj_status_t status) { if (status == PJ_SUCCESS) @@ -3876,7 +4331,7 @@ std::string getLocalAddressAssociatedToAccount (AccountID id) // Set the local address - if (account != NULL) { + if (account != NULL && account->getAccountTransport ()) { tspt = account->getAccountTransport (); if (tspt != NULL) { diff --git a/sflphone-common/src/sip/sipvoiplink.h b/sflphone-common/src/sip/sipvoiplink.h index 56e4ef7d9db0ca82305b8e6f9fb0231b269d74ee..2178188424269a2beb56d851772eb86f3bd8b1a0 100644 --- a/sflphone-common/src/sip/sipvoiplink.h +++ b/sflphone-common/src/sip/sipvoiplink.h @@ -36,6 +36,9 @@ #include <pjnath/stun_config.h> /////////////////////////////// +#include <map> +#include <sstream> + class EventThread; class SIPCall; @@ -45,6 +48,8 @@ class SIPCall; // To set the verbosity. From 0 (min) to 6 (max) #define PJ_LOG_LEVEL 0 +#define SipTransportMap std::map<std::string, pjsip_transport*> + /** * @file sipvoiplink.h * @brief Specific VoIPLink for SIP (SIP core for incoming and outgoing events). @@ -286,15 +291,44 @@ class SIPVoIPLink : public VoIPLink */ std::vector<std::string> getAllIpInterface(void); - /** - * Initialize the transport selector - * @param transport A transport associated with an account - * @param tp_sel A pointer to receive the transport selector structure - * - * @return pj_status_t PJ_SUCCESS if the structure was successfully initialized - */ - pj_status_t init_transport_selector (pjsip_transport *transport, pjsip_tpselector **tp_sel); + /** + * List all the interfaces on the system and return + * a vector list containing their name (eth0, eth0:1 ...). + * @param void + * @return std::vector<std::string> A std::string vector + * of interface name available on all of the interfaces on + * the system. + */ + std::vector<std::string> getAllIpInterfaceByName(void); + + + /** + * List all the interfaces on the system and return + * a vector list containing their name (eth0, eth0:1 ...). + * @param void + * @return std::vector<std::string> A std::string vector + * of interface name available on all of the interfaces on + * the system. + */ + std::string getInterfaceAddrFromName(std::string ifaceName); + + + /** + * Initialize the transport selector + * @param transport A transport associated with an account + * @param tp_sel A pointer to receive the transport selector structure + * + * @return pj_status_t PJ_SUCCESS if the structure was successfully initialized + */ + pj_status_t init_transport_selector (pjsip_transport *transport, pjsip_tpselector **tp_sel); + + /** + * Requests PJSIP library for local IP address, using pj_gethostbyname() + * @param addr* A string to be initialized + * + * @return bool True if addr successfully initialized + */ bool loadSIPLocalIP (std::string *addr); /** @@ -302,6 +336,14 @@ class SIPVoIPLink : public VoIPLink */ void updateAccountInfo(const AccountID& accountID); + /** + * This function unset the transport for a given account. It tests wether the + * associated transport is used by other accounts. If not, it shutdown the transport + * putting its reference counter to zero. PJSIP assumes transport destruction since + * this action can be delayed by ongoing SIP transactions. + */ + void shutdownSipTransport(const AccountID& accountID); + private: /** * Constructor @@ -338,6 +380,27 @@ class SIPVoIPLink : public VoIPLink pj_status_t stunServerResolve (AccountID id); + + /** + * Function used to create a new sip transport or get an existing one from the map. + * The SIP transport is "acquired" according to account's current settings. + * This function should be called before registering an account + * @param accountID An account id for which transport is to be set + * + * @return bool True if the account is succesfully created or + * successfully obtained from the transport map + */ + bool acquireTransport(const AccountID& accountID); + + + /** + * Create a new sip transport according to the trasport type specified in account settings + */ + bool createSipTransport(AccountID id); + + + bool addTransportToMap(std::string key, pjsip_transport* transport); + /** Create SIP UDP Listener */ int createUDPServer (AccountID = ""); @@ -369,8 +432,10 @@ class SIPVoIPLink : public VoIPLink */ pj_status_t createTlsTransport(AccountID id); - pj_status_t createAlternateUdpTransport (AccountID id); - + pj_status_t createAlternateUdpTransport (AccountID id); + + SipTransportMap _transportMap; + /** For registration use only */ int _regPort; diff --git a/tools/build-system/build-osc.sh b/tools/build-system/build-osc.sh index 30fb9ab3c0e319730d6104fbf53f42d62c684fdc..8735ba83dfde2e019d8033e173f3676ac67cc4af 100755 --- a/tools/build-system/build-osc.sh +++ b/tools/build-system/build-osc.sh @@ -23,7 +23,7 @@ LAUNCHPAD_PACKAGES=( "sflphone-client-gnome" "sflphone-common" ) REFERENCE_REPOSITORY="${ROOT_DIR}/sflphone-source-repository" -SOFTWARE_VERSION="0.9.7.beta" +SOFTWARE_VERSION="0.9.7.rc2" VERSION_INDEX=1 diff --git a/tools/build-system/launch-build-machine-2.sh b/tools/build-system/launch-build-machine-2.sh index 46246540a089f1de84f40e24e810d3622bb70566..b6b7638195aa7152ec9585dc24cfd9caed0d023d 100755 --- a/tools/build-system/launch-build-machine-2.sh +++ b/tools/build-system/launch-build-machine-2.sh @@ -217,6 +217,7 @@ END fi done + cp ${DEBIAN_DIR}/changelog.generic ${DEBIAN_DIR}/changelog done # if push is activated diff --git a/tools/build-system/launchpad/sflphone-client-gnome/debian/changelog b/tools/build-system/launchpad/sflphone-client-gnome/debian/changelog index 0fc72e29660477e57c279ed29a034962687e2f10..8021fb0d7d0b35eb2d8330c906baee884e297e43 100644 --- a/tools/build-system/launchpad/sflphone-client-gnome/debian/changelog +++ b/tools/build-system/launchpad/sflphone-client-gnome/debian/changelog @@ -1,3 +1,162 @@ +sflphone-client-gnome (0.9.7~rc1~ppa1~SYSTEM) SYSTEM; urgency=low + + ** 0.9.7~rc1~ppa1~SYSTEM ** + + * [#2462] Set explicitly the transport on incoming call too + * [#2462] fix typo + * [#2462] Use different address for SDP and call IP + * [#2462] Use published address in SIP-SDP + * [#2181] Fixed changelog files + * [#2181] Updated spec file + * [#2402] Fix pointer to int conversion warning (atoi) + * [#2402] Remove daemon warnings, make indent + * [#2459] Make sure the stream is opened when the call is answered + * [#2402] Add conference related picture in documentation + * [#2443] Not much ... + * [#2399] Fix dialing display problem + * [#2450] Fix incoming call already in conference crash + * [#2399] Display peer name on the first line and peer number on the + second + * [#2450] Handle 403 FORBIDDEN when refused + * [#2447] Bind offHold/onHold actions to button in gtk client + * [#2447] Bind hangup action to button for conference + * [#2447] Add conference action in gtk client's ToolBar + * [#2381] Disable the password hashing in config file + * [#2402] Cleanup + * [#2366] Set callback to null when deleting Pulseaudio streams + * [#1313] Fix main buffer unit test + * [#1313] Fix audio layer unit test + * [#2315] Hide pw in security tab, display when editing, sync with + basic tab + * [#1313] UnitTest change AudioRtpSession for AudioSymetricRtpSession + instance + * [#2402] Code cleanup + * [#2444] Add debug to catch occasional crash when loading client's + config + * [#2444] Add debug info to catch occasional crash when loading config + dialog + * [#2402] Restore Call menu translations + * [#2403] Use the published address if checked in GUI + * [#2442] Add protection test in sdp + * [#1841] Reapply pjsip patch concerning DNS SRV resolution + * [#2384] Tags incoming call as direct SIP call, if applicable + * [#2402] Change the monkey face + * [#2315] Enable user to display password in clear text + * [#2434] Force optimization level at 2 + * [#2284] Fix dbus_get_all_ip_interface compilation warnings + * [#2431] Popup main window on incoming if applicable + * [$2402] Fix simple warnings + * [#2402] Fix implicit variable init order in LibraryManagerException + * [#2402] Fixing implicit variable initialization warnings in + AudioRtpSession + * [#2402] Revert atoi change, fixing codec list doubled entries + * [#2402] Fix gpointer to gint conversion + * [#2402] Fix pointer casting to integer different size warning in + codec list + * [#2402] Fix warning discarting qualifiers from pointer target + * [#2402] Fix gtk tree view assignement from incompatible type warning + * [#1669] Fix audio recording folder utf-8 non compatibility issue + * [#2414] Clean up debugs + * [#2414] Use transport set in iptoip Account and update it frm + preference + * [#2348] Use macro N_() to mark ui.xml strings as translatable + * [#2414] Rename getSipAddress/setSipAddress functions + * [#2407] Fix volume controls display + * [#2407] Fixes dialpad + * [#2383] Set ip to ip config when clicking apply button + * [#2404] Update call-to script - Maxime Chambreuil + * [#2405] Client handles unknown call in current state as well + * [#2383] Add DBUS signal to send IPtoIP local address and port as + string + * [#2383] Add Ip to IP config change apply call back + * Clonflict + * [#2402] Code cleanup + * [#2383] Do the same for IPtoIP (init localn ip with first in the + list) + * [#2383] Use first interface in the list if local addresss is not + defined + * [#2403] Clean up unuseful addresses/ports + * [#2403] Use the IP profile SIP port as global SIP port + * [#2383] Fix dbus_get_all_ip_interface warnings + * [#2383] Take into account sameAsLocal when loading published address + * [#2383] Tsake into account sameAsLocal option when saving published + address + * [#2383] Update local ip address in ip to ip config + * [#2383] Save ip 2 ip local port in config + * [#2406] Update toolbar at startup + * [#2284] Remove redefinition warnings + speex warnings + * [#2383] Fix security table in account config + * [#2383] Save ip 2 ip network interface parameters in config + * [#2403] Restore sip transport selector + * [#2383] Fix filling the Localt IP Address on account creation + * [#2383] Fix Gtk-Critical when checking STUN + * [#2383] Fix reopening account configuration display issue + * [#2383] Load IPtoIP local address and port in preference iptoiptab + * [#2383] Add LocalAddress and Localport in Preference IpToIp tab + * [#2403] Use the address and port associated to the account as often + as possible + * [#1753] Removed pjsip generated files + * [#1753] Removed remaining milenage lib references + * [#2383] Add _publishedSameasLocal variable in sipaccount + * [#2383] Add PUBLISHED_SAMEAS_LOCAL variable in config + * [#2383] Fix stun set active or not when opening config + * [#2181] Added RPM 64bits dbus patch + * [#2402] Code indentation + * [#2313] Force $(HOME).cache directory creation at startup + * [#2383] Separate network interface and published address in account + config + * [#2400] Change dbus service installation path to libdir + * [#2382] Move TLS related published address options in security tab + * [#2382] Indent accountconfigdialog.c + * [#2181] Install libdbus-c++ in $pkglib instead of $lib + * [#1753] Remove ILBC code and disable it by default in the configure + * [#1753] Remove milenage directory + * [#2382] Fix switching interaface instabilities + * [#2396] Save local ip in account creation wizard + * [#2284] Remove warning on hold + * [#2387] Fixes history searching and filtering + * [#1215] Add samplerate display in the GUI + * [#1663] Voicemail icon reflects voice messages + * [#2395] Fix account registration ( specifically with callcentric) + * [#2386] Strip "sip:" on incoming call, fixing history call back + * [#2181] Updated spec files + * [#1215] Display codec name in calltree instead of status bar + * [#2390] Move back nbCalls and stopStream higher in refuseCall + * [#2392] Fix ringtone during call in IAX + * [#2391] Stop audio streams when there is 0 calls only + * [#2391] Add debug when call state is not valid + * [#2390] Clear returns in IAXvoipLink::sendAudioFromMic() method + * [#2380] Fixing IncomingCallNotification not regular + * [#2339] Query conference at client startup + * [#2339] Working conference querying at startup + * [#2339] Add conference in call tree + * [#2339] Primitives to query conferences at client startup + * [#2320] Add account selection in history + * [#2355] Temporary solution: do not delete pointer when removing + account + * [#2380] Change algorithm in AudioRtp to trigger an + IncomingCallNotification + * [#2274] Comment sdebug in MainBuffer flush method + * [#2274] Add flushMain() in ManagerImpl::addStream + * [#2274] Add getBufferID() method in ring buffer + * [#2274] Fix warning, comment debug in ringbuffer's flush method + * [#2274] Use AudioLayer flushMain() and flushUrgent() in ALSA + * [#2274] Clean up unused variable warning + * [#2274] Protect minbudffer pointer on flushing + * [#2274] Fix playATone method which writing empty buffer in urgent + ringbuffer + * [#2274] Use audio layer flushUrgent and flushMain in createStreams + * [#2274] Use flush audio calls from audiolayer + * [#2274] Flush when peer answered call + * [#2375] Flush main buffer in iax when answering a call + * [#2274] Parse displayname using c++ string method + * [#2375] Flush main buffer when off holding calls + * [#2375] Flush main buffer mon RTP startup + * [#2376] Use now Pulseaudio module-cork-music-on-phone + * Updated OSC packaging + + -- Julien Bonjean <julien.bonjean@savoirfairelinux.com> Fri, 20 Nov 2009 13:59:02 -0500 + sflphone-client-gnome (0.9.7~beta~ppa1~SYSTEM) SYSTEM; urgency=low ** 0.9.7~beta~ppa1~SYSTEM ** diff --git a/tools/build-system/launchpad/sflphone-common/debian/changelog b/tools/build-system/launchpad/sflphone-common/debian/changelog index 1263d2f8a2315a14efd06b7e9281b93986e4d552..7d5b2fb58422eb4d0d07c06f97e5c612bb380a7e 100644 --- a/tools/build-system/launchpad/sflphone-common/debian/changelog +++ b/tools/build-system/launchpad/sflphone-common/debian/changelog @@ -1,3 +1,162 @@ +sflphone-common (0.9.7~rc1~ppa1~SYSTEM) SYSTEM; urgency=low + + ** 0.9.7~rc1~ppa1~SYSTEM ** + + * [#2462] Set explicitly the transport on incoming call too + * [#2462] fix typo + * [#2462] Use different address for SDP and call IP + * [#2462] Use published address in SIP-SDP + * [#2181] Fixed changelog files + * [#2181] Updated spec file + * [#2402] Fix pointer to int conversion warning (atoi) + * [#2402] Remove daemon warnings, make indent + * [#2459] Make sure the stream is opened when the call is answered + * [#2402] Add conference related picture in documentation + * [#2443] Not much ... + * [#2399] Fix dialing display problem + * [#2450] Fix incoming call already in conference crash + * [#2399] Display peer name on the first line and peer number on the + second + * [#2450] Handle 403 FORBIDDEN when refused + * [#2447] Bind offHold/onHold actions to button in gtk client + * [#2447] Bind hangup action to button for conference + * [#2447] Add conference action in gtk client's ToolBar + * [#2381] Disable the password hashing in config file + * [#2402] Cleanup + * [#2366] Set callback to null when deleting Pulseaudio streams + * [#1313] Fix main buffer unit test + * [#1313] Fix audio layer unit test + * [#2315] Hide pw in security tab, display when editing, sync with + basic tab + * [#1313] UnitTest change AudioRtpSession for AudioSymetricRtpSession + instance + * [#2402] Code cleanup + * [#2444] Add debug to catch occasional crash when loading client's + config + * [#2444] Add debug info to catch occasional crash when loading config + dialog + * [#2402] Restore Call menu translations + * [#2403] Use the published address if checked in GUI + * [#2442] Add protection test in sdp + * [#1841] Reapply pjsip patch concerning DNS SRV resolution + * [#2384] Tags incoming call as direct SIP call, if applicable + * [#2402] Change the monkey face + * [#2315] Enable user to display password in clear text + * [#2434] Force optimization level at 2 + * [#2284] Fix dbus_get_all_ip_interface compilation warnings + * [#2431] Popup main window on incoming if applicable + * [$2402] Fix simple warnings + * [#2402] Fix implicit variable init order in LibraryManagerException + * [#2402] Fixing implicit variable initialization warnings in + AudioRtpSession + * [#2402] Revert atoi change, fixing codec list doubled entries + * [#2402] Fix gpointer to gint conversion + * [#2402] Fix pointer casting to integer different size warning in + codec list + * [#2402] Fix warning discarting qualifiers from pointer target + * [#2402] Fix gtk tree view assignement from incompatible type warning + * [#1669] Fix audio recording folder utf-8 non compatibility issue + * [#2414] Clean up debugs + * [#2414] Use transport set in iptoip Account and update it frm + preference + * [#2348] Use macro N_() to mark ui.xml strings as translatable + * [#2414] Rename getSipAddress/setSipAddress functions + * [#2407] Fix volume controls display + * [#2407] Fixes dialpad + * [#2383] Set ip to ip config when clicking apply button + * [#2404] Update call-to script - Maxime Chambreuil + * [#2405] Client handles unknown call in current state as well + * [#2383] Add DBUS signal to send IPtoIP local address and port as + string + * [#2383] Add Ip to IP config change apply call back + * Clonflict + * [#2402] Code cleanup + * [#2383] Do the same for IPtoIP (init localn ip with first in the + list) + * [#2383] Use first interface in the list if local addresss is not + defined + * [#2403] Clean up unuseful addresses/ports + * [#2403] Use the IP profile SIP port as global SIP port + * [#2383] Fix dbus_get_all_ip_interface warnings + * [#2383] Take into account sameAsLocal when loading published address + * [#2383] Tsake into account sameAsLocal option when saving published + address + * [#2383] Update local ip address in ip to ip config + * [#2383] Save ip 2 ip local port in config + * [#2406] Update toolbar at startup + * [#2284] Remove redefinition warnings + speex warnings + * [#2383] Fix security table in account config + * [#2383] Save ip 2 ip network interface parameters in config + * [#2403] Restore sip transport selector + * [#2383] Fix filling the Localt IP Address on account creation + * [#2383] Fix Gtk-Critical when checking STUN + * [#2383] Fix reopening account configuration display issue + * [#2383] Load IPtoIP local address and port in preference iptoiptab + * [#2383] Add LocalAddress and Localport in Preference IpToIp tab + * [#2403] Use the address and port associated to the account as often + as possible + * [#1753] Removed pjsip generated files + * [#1753] Removed remaining milenage lib references + * [#2383] Add _publishedSameasLocal variable in sipaccount + * [#2383] Add PUBLISHED_SAMEAS_LOCAL variable in config + * [#2383] Fix stun set active or not when opening config + * [#2181] Added RPM 64bits dbus patch + * [#2402] Code indentation + * [#2313] Force $(HOME).cache directory creation at startup + * [#2383] Separate network interface and published address in account + config + * [#2400] Change dbus service installation path to libdir + * [#2382] Move TLS related published address options in security tab + * [#2382] Indent accountconfigdialog.c + * [#2181] Install libdbus-c++ in $pkglib instead of $lib + * [#1753] Remove ILBC code and disable it by default in the configure + * [#1753] Remove milenage directory + * [#2382] Fix switching interaface instabilities + * [#2396] Save local ip in account creation wizard + * [#2284] Remove warning on hold + * [#2387] Fixes history searching and filtering + * [#1215] Add samplerate display in the GUI + * [#1663] Voicemail icon reflects voice messages + * [#2395] Fix account registration ( specifically with callcentric) + * [#2386] Strip "sip:" on incoming call, fixing history call back + * [#2181] Updated spec files + * [#1215] Display codec name in calltree instead of status bar + * [#2390] Move back nbCalls and stopStream higher in refuseCall + * [#2392] Fix ringtone during call in IAX + * [#2391] Stop audio streams when there is 0 calls only + * [#2391] Add debug when call state is not valid + * [#2390] Clear returns in IAXvoipLink::sendAudioFromMic() method + * [#2380] Fixing IncomingCallNotification not regular + * [#2339] Query conference at client startup + * [#2339] Working conference querying at startup + * [#2339] Add conference in call tree + * [#2339] Primitives to query conferences at client startup + * [#2320] Add account selection in history + * [#2355] Temporary solution: do not delete pointer when removing + account + * [#2380] Change algorithm in AudioRtp to trigger an + IncomingCallNotification + * [#2274] Comment sdebug in MainBuffer flush method + * [#2274] Add flushMain() in ManagerImpl::addStream + * [#2274] Add getBufferID() method in ring buffer + * [#2274] Fix warning, comment debug in ringbuffer's flush method + * [#2274] Use AudioLayer flushMain() and flushUrgent() in ALSA + * [#2274] Clean up unused variable warning + * [#2274] Protect minbudffer pointer on flushing + * [#2274] Fix playATone method which writing empty buffer in urgent + ringbuffer + * [#2274] Use audio layer flushUrgent and flushMain in createStreams + * [#2274] Use flush audio calls from audiolayer + * [#2274] Flush when peer answered call + * [#2375] Flush main buffer in iax when answering a call + * [#2274] Parse displayname using c++ string method + * [#2375] Flush main buffer when off holding calls + * [#2375] Flush main buffer mon RTP startup + * [#2376] Use now Pulseaudio module-cork-music-on-phone + * Updated OSC packaging + + -- Julien Bonjean <julien.bonjean@savoirfairelinux.com> Fri, 20 Nov 2009 14:00:02 -0500 + sflphone-common (0.9.7~beta~ppa1~SYSTEM) SYSTEM; urgency=low ** 0.9.7~beta~ppa1~SYSTEM ** diff --git a/tools/build-system/osc/sflphone-client-gnome.spec b/tools/build-system/osc/sflphone-client-gnome.spec index 794dc7784e837ebecbf98a18f77336f8a4850701..dba4cd8ebbdf090931c142a83b961ed2299b0805 100644 --- a/tools/build-system/osc/sflphone-client-gnome.spec +++ b/tools/build-system/osc/sflphone-client-gnome.spec @@ -125,6 +125,7 @@ make clean %lang(zh_HK) %{_prefix}/share/locale/zh_HK/LC_MESSAGES/*.mo %lang(it) %{_prefix}/share/locale/it/LC_MESSAGES/*.mo %lang(pt_BR) %{_prefix}/share/locale/pt_BR/LC_MESSAGES/*.mo +%lang(da) %{_prefix}/share/locale/da/LC_MESSAGES/*.mo %doc AUTHORS COPYING README %doc %{_prefix}/share/man/man1/sflphone-client-gnome.1.gz %doc %{_prefix}/share/man/man1/sflphone.1.gz diff --git a/tools/build-system/osc/sflphone-common-dbus-service-in-libdir.patch b/tools/build-system/osc/sflphone-common-dbus-service-in-libdir.patch deleted file mode 100644 index 72d23454fb73ad3a87f1b83cdf9cc809a844d50a..0000000000000000000000000000000000000000 --- a/tools/build-system/osc/sflphone-common-dbus-service-in-libdir.patch +++ /dev/null @@ -1,14 +0,0 @@ -diff --git sflphone-common/src/dbus/Makefile.am sflphone-common/src/dbus/Makefile.am -index 5a2745e..5ca2e42 100644 ---- sflphone-common/src/dbus/Makefile.am -+++ sflphone-common/src/dbus/Makefile.am -@@ -38,7 +38,7 @@ service_DATA = $(service_in_files:.service.in=.service) - - # Rule to make the service file with bindir expanded - $(service_DATA): $(service_in_files) Makefile -- sed -e "s|libexec|$(prefix)/lib/sflphone|" $<> $@ -+ sed -e "s|libexec|$(libdir)/sflphone|" $<> $@ - - EXTRA_DIST = *.xml README - - diff --git a/tools/build-system/osc/sflphone-common.spec b/tools/build-system/osc/sflphone-common.spec index 0bc1a2b5735f438c0efef7d25ae32d5d64feee21..d44f94103e8e4e61fefc2be0a03d0e2b4a9f58c4 100644 --- a/tools/build-system/osc/sflphone-common.spec +++ b/tools/build-system/osc/sflphone-common.spec @@ -21,7 +21,6 @@ Packager: Julien Bonjean <julien.bonjean@savoirfairelinux.com> BuildRoot: %{_tmppath}/%{name} Source0: sflphone-common-%{version}.tar.gz -Patch0: sflphone-common-dbus-service-in-libdir.patch BuildRequires: speex-devel BuildRequires: gcc-c++ BuildRequires: expat @@ -95,7 +94,6 @@ Authors: %prep %setup -q -%patch0 -p1 %build cd libs/pjproject @@ -127,7 +125,7 @@ make clean %dir %{_libdir}/sflphone/plugins %dir %{_prefix}/share/sflphone %dir %{_prefix}/share/sflphone/ringtones -%{_libdir}/libdbus-* +%{_libdir}/sflphone/libdbus-* %{_libdir}/sflphone/codecs/* %{_libdir}/sflphone/plugins/* %{_prefix}/share/dbus-1/services/org.sflphone.*