Showing preview only (5,874K chars total). Download the full file or copy to clipboard to get everything.
Repository: LubosD/twinkle
Branch: master
Commit: a1c4ba719651
Files: 538
Total size: 5.5 MB
Directory structure:
gitextract_nh3snu39/
├── .github/
│ └── workflows/
│ └── main.yml
├── .gitignore
├── AUTHORS
├── CMakeLists.txt
├── COPYING
├── Doxyfile
├── NEWS
├── README.md
├── THANKS
├── TODO
├── cmake/
│ ├── CheckCXX11Regex.cmake
│ ├── FindCcrtp.cmake
│ ├── FindCommoncpp.cmake
│ ├── FindG729.cmake
│ ├── FindGsm.cmake
│ ├── FindIlbc.cmake
│ ├── FindLibMagic.cmake
│ ├── FindLibSndfile.cmake
│ ├── FindReadline.cmake
│ ├── FindSpeex.cmake
│ ├── FindUcommon.cmake
│ └── FindZrtpcpp.cmake
├── data/
│ ├── providers.csv
│ └── twinkle.1
├── sip.protocol
├── src/
│ ├── CMakeLists.txt
│ ├── abstract_dialog.cpp
│ ├── abstract_dialog.h
│ ├── address_book.cpp
│ ├── address_book.h
│ ├── audio/
│ │ ├── CMakeLists.txt
│ │ ├── README_G711
│ │ ├── audio_codecs.cpp
│ │ ├── audio_codecs.h
│ │ ├── audio_decoder.cpp
│ │ ├── audio_decoder.h
│ │ ├── audio_device.cpp
│ │ ├── audio_device.h
│ │ ├── audio_encoder.cpp
│ │ ├── audio_encoder.h
│ │ ├── audio_rx.cpp
│ │ ├── audio_rx.h
│ │ ├── audio_session.cpp
│ │ ├── audio_session.h
│ │ ├── audio_tx.cpp
│ │ ├── audio_tx.h
│ │ ├── dtmf_player.cpp
│ │ ├── dtmf_player.h
│ │ ├── freq_gen.cpp
│ │ ├── freq_gen.h
│ │ ├── g711.cpp
│ │ ├── g711.h
│ │ ├── g721.cpp
│ │ ├── g722.h
│ │ ├── g722_decode.c
│ │ ├── g722_encode.c
│ │ ├── g722_local.h
│ │ ├── g723_16.cpp
│ │ ├── g723_24.cpp
│ │ ├── g723_40.cpp
│ │ ├── g72x.cpp
│ │ ├── g72x.h
│ │ ├── gsm/
│ │ │ ├── COPYRIGHT
│ │ │ ├── ChangeLog
│ │ │ ├── INSTALL
│ │ │ ├── MACHINES
│ │ │ ├── README
│ │ │ ├── inc/
│ │ │ │ ├── config.h
│ │ │ │ ├── gsm.h
│ │ │ │ ├── private.h
│ │ │ │ ├── proto.h
│ │ │ │ └── unproto.h
│ │ │ └── src/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── add.cpp
│ │ │ ├── code.cpp
│ │ │ ├── debug.cpp
│ │ │ ├── decode.cpp
│ │ │ ├── gsm_create.cpp
│ │ │ ├── gsm_decode.cpp
│ │ │ ├── gsm_destroy.cpp
│ │ │ ├── gsm_encode.cpp
│ │ │ ├── gsm_explode.cpp
│ │ │ ├── gsm_implode.cpp
│ │ │ ├── gsm_option.cpp
│ │ │ ├── gsm_print.cpp
│ │ │ ├── long_term.cpp
│ │ │ ├── lpc.cpp
│ │ │ ├── preprocess.cpp
│ │ │ ├── rpe.cpp
│ │ │ ├── short_term.cpp
│ │ │ └── table.cpp
│ │ ├── media_buffer.cpp
│ │ ├── media_buffer.h
│ │ ├── rtp_telephone_event.cpp
│ │ ├── rtp_telephone_event.h
│ │ ├── tone_gen.cpp
│ │ ├── tone_gen.h
│ │ ├── twinkle_rtp_session.cpp
│ │ ├── twinkle_rtp_session.h
│ │ ├── twinkle_zrtp_ui.cpp
│ │ └── twinkle_zrtp_ui.h
│ ├── audits/
│ │ ├── CMakeLists.txt
│ │ ├── memman.cpp
│ │ └── memman.h
│ ├── auth.cpp
│ ├── auth.h
│ ├── call_history.cpp
│ ├── call_history.h
│ ├── call_script.cpp
│ ├── call_script.h
│ ├── client_request.cpp
│ ├── client_request.h
│ ├── cmd_socket.cpp
│ ├── cmd_socket.h
│ ├── dialog.cpp
│ ├── dialog.h
│ ├── diamondcard.cpp
│ ├── diamondcard.h
│ ├── epa.cpp
│ ├── epa.h
│ ├── events.cpp
│ ├── events.h
│ ├── exceptions.h
│ ├── gui/
│ │ ├── CMakeLists.txt
│ │ ├── address_finder.cpp
│ │ ├── address_finder.h
│ │ ├── addresscardform.cpp
│ │ ├── addresscardform.h
│ │ ├── addresscardform.ui
│ │ ├── addresstablemodel.cpp
│ │ ├── addresstablemodel.h
│ │ ├── akonadiaddressbook.cpp
│ │ ├── akonadiaddressbook.h
│ │ ├── authenticationform.cpp
│ │ ├── authenticationform.h
│ │ ├── authenticationform.ui
│ │ ├── buddyform.cpp
│ │ ├── buddyform.h
│ │ ├── buddyform.ui
│ │ ├── buddylistview.cpp
│ │ ├── buddylistview.h
│ │ ├── command_args.h
│ │ ├── core_strings.h
│ │ ├── deregisterform.cpp
│ │ ├── deregisterform.h
│ │ ├── deregisterform.ui
│ │ ├── diamondcardprofileform.cpp
│ │ ├── diamondcardprofileform.h
│ │ ├── diamondcardprofileform.ui
│ │ ├── dtmfform.cpp
│ │ ├── dtmfform.h
│ │ ├── dtmfform.ui
│ │ ├── getaddressform.cpp
│ │ ├── getaddressform.h
│ │ ├── getaddressform.ui
│ │ ├── getprofilenameform.cpp
│ │ ├── getprofilenameform.h
│ │ ├── getprofilenameform.ui
│ │ ├── gui.cpp
│ │ ├── gui.h
│ │ ├── historyform.cpp
│ │ ├── historyform.h
│ │ ├── historyform.ui
│ │ ├── icons.qrc
│ │ ├── idlesession_inhibitor.cpp
│ │ ├── idlesession_inhibitor.h
│ │ ├── idlesession_manager.cpp
│ │ ├── idlesession_manager.h
│ │ ├── images/
│ │ │ ├── editcopy
│ │ │ ├── editcut
│ │ │ ├── editpaste
│ │ │ ├── filenew
│ │ │ ├── filesave
│ │ │ ├── print
│ │ │ ├── redo
│ │ │ ├── searchfind
│ │ │ └── undo
│ │ ├── incoming_call_popup.cpp
│ │ ├── incoming_call_popup.h
│ │ ├── inviteform.cpp
│ │ ├── inviteform.h
│ │ ├── inviteform.ui
│ │ ├── kcontactstablemodel.cpp
│ │ ├── kcontactstablemodel.h
│ │ ├── lang/
│ │ │ ├── twinkle_cs.ts
│ │ │ ├── twinkle_de.ts
│ │ │ ├── twinkle_fr.ts
│ │ │ ├── twinkle_nl.ts
│ │ │ ├── twinkle_ru.ts
│ │ │ ├── twinkle_sk.ts
│ │ │ ├── twinkle_sv.ts
│ │ │ └── twinkle_xx.ts
│ │ ├── logviewform.cpp
│ │ ├── logviewform.h
│ │ ├── logviewform.ui
│ │ ├── main.cpp
│ │ ├── messageform.cpp
│ │ ├── messageform.h
│ │ ├── messageform.ui
│ │ ├── messageformview.cpp
│ │ ├── messageformview.h
│ │ ├── mphoneform.cpp
│ │ ├── mphoneform.h
│ │ ├── mphoneform.ui
│ │ ├── numberconversionform.cpp
│ │ ├── numberconversionform.h
│ │ ├── numberconversionform.ui
│ │ ├── osd.cpp
│ │ ├── osd.h
│ │ ├── qml/
│ │ │ ├── ImageButton.qml
│ │ │ ├── TextImageButton.qml
│ │ │ ├── incoming_call.qml
│ │ │ ├── osd.qml
│ │ │ └── qml.qrc
│ │ ├── qt_translator.h
│ │ ├── redirectform.cpp
│ │ ├── redirectform.h
│ │ ├── redirectform.ui
│ │ ├── selectnicform.cpp
│ │ ├── selectnicform.h
│ │ ├── selectnicform.ui
│ │ ├── selectprofileform.cpp
│ │ ├── selectprofileform.h
│ │ ├── selectprofileform.ui
│ │ ├── selectuserform.cpp
│ │ ├── selectuserform.h
│ │ ├── selectuserform.ui
│ │ ├── sendfileform.cpp
│ │ ├── sendfileform.h
│ │ ├── sendfileform.ui
│ │ ├── srvredirectform.cpp
│ │ ├── srvredirectform.h
│ │ ├── srvredirectform.ui
│ │ ├── syssettingsform.cpp
│ │ ├── syssettingsform.h
│ │ ├── syssettingsform.ui
│ │ ├── termcapform.cpp
│ │ ├── termcapform.h
│ │ ├── termcapform.ui
│ │ ├── transferform.cpp
│ │ ├── transferform.h
│ │ ├── transferform.ui
│ │ ├── twinkle-uri-handler
│ │ ├── twinkleapplication.cpp
│ │ ├── twinkleapplication.h
│ │ ├── userprofileform.cpp
│ │ ├── userprofileform.h
│ │ ├── userprofileform.ui
│ │ ├── wizardform.cpp
│ │ ├── wizardform.h
│ │ ├── wizardform.ui
│ │ ├── yesnodialog.cpp
│ │ └── yesnodialog.h
│ ├── id_object.cpp
│ ├── id_object.h
│ ├── im/
│ │ ├── CMakeLists.txt
│ │ ├── im_iscomposing_body.cpp
│ │ ├── im_iscomposing_body.h
│ │ ├── msg_session.cpp
│ │ └── msg_session.h
│ ├── line.cpp
│ ├── line.h
│ ├── listener.cpp
│ ├── listener.h
│ ├── log.cpp
│ ├── log.h
│ ├── main.cpp
│ ├── mwi/
│ │ ├── CMakeLists.txt
│ │ ├── mwi.cpp
│ │ ├── mwi.h
│ │ ├── mwi_dialog.cpp
│ │ ├── mwi_dialog.h
│ │ ├── mwi_subscription.cpp
│ │ ├── mwi_subscription.h
│ │ ├── simple_msg_sum_body.cpp
│ │ └── simple_msg_sum_body.h
│ ├── parser/
│ │ ├── CMakeLists.txt
│ │ ├── challenge.cpp
│ │ ├── challenge.h
│ │ ├── coding.cpp
│ │ ├── coding.h
│ │ ├── credentials.cpp
│ │ ├── credentials.h
│ │ ├── definitions.cpp
│ │ ├── definitions.h
│ │ ├── hdr_accept.cpp
│ │ ├── hdr_accept.h
│ │ ├── hdr_accept_encoding.cpp
│ │ ├── hdr_accept_encoding.h
│ │ ├── hdr_accept_language.cpp
│ │ ├── hdr_accept_language.h
│ │ ├── hdr_alert_info.cpp
│ │ ├── hdr_alert_info.h
│ │ ├── hdr_allow.cpp
│ │ ├── hdr_allow.h
│ │ ├── hdr_allow_events.cpp
│ │ ├── hdr_allow_events.h
│ │ ├── hdr_auth_info.cpp
│ │ ├── hdr_auth_info.h
│ │ ├── hdr_authorization.cpp
│ │ ├── hdr_authorization.h
│ │ ├── hdr_call_id.cpp
│ │ ├── hdr_call_id.h
│ │ ├── hdr_call_info.cpp
│ │ ├── hdr_call_info.h
│ │ ├── hdr_contact.cpp
│ │ ├── hdr_contact.h
│ │ ├── hdr_content_disp.cpp
│ │ ├── hdr_content_disp.h
│ │ ├── hdr_content_encoding.cpp
│ │ ├── hdr_content_encoding.h
│ │ ├── hdr_content_language.cpp
│ │ ├── hdr_content_language.h
│ │ ├── hdr_content_length.cpp
│ │ ├── hdr_content_length.h
│ │ ├── hdr_content_type.cpp
│ │ ├── hdr_content_type.h
│ │ ├── hdr_cseq.cpp
│ │ ├── hdr_cseq.h
│ │ ├── hdr_date.cpp
│ │ ├── hdr_date.h
│ │ ├── hdr_error_info.cpp
│ │ ├── hdr_error_info.h
│ │ ├── hdr_event.cpp
│ │ ├── hdr_event.h
│ │ ├── hdr_expires.cpp
│ │ ├── hdr_expires.h
│ │ ├── hdr_from.cpp
│ │ ├── hdr_from.h
│ │ ├── hdr_in_reply_to.cpp
│ │ ├── hdr_in_reply_to.h
│ │ ├── hdr_max_forwards.cpp
│ │ ├── hdr_max_forwards.h
│ │ ├── hdr_mime_version.cpp
│ │ ├── hdr_mime_version.h
│ │ ├── hdr_min_expires.cpp
│ │ ├── hdr_min_expires.h
│ │ ├── hdr_min_se.cpp
│ │ ├── hdr_min_se.h
│ │ ├── hdr_organization.cpp
│ │ ├── hdr_organization.h
│ │ ├── hdr_p_asserted_identity.cpp
│ │ ├── hdr_p_asserted_identity.h
│ │ ├── hdr_p_preferred_identity.cpp
│ │ ├── hdr_p_preferred_identity.h
│ │ ├── hdr_priority.cpp
│ │ ├── hdr_priority.h
│ │ ├── hdr_privacy.cpp
│ │ ├── hdr_privacy.h
│ │ ├── hdr_proxy_authenticate.cpp
│ │ ├── hdr_proxy_authenticate.h
│ │ ├── hdr_proxy_authorization.cpp
│ │ ├── hdr_proxy_authorization.h
│ │ ├── hdr_proxy_require.cpp
│ │ ├── hdr_proxy_require.h
│ │ ├── hdr_rack.cpp
│ │ ├── hdr_rack.h
│ │ ├── hdr_reason.cpp
│ │ ├── hdr_reason.h
│ │ ├── hdr_record_route.cpp
│ │ ├── hdr_record_route.h
│ │ ├── hdr_refer_sub.cpp
│ │ ├── hdr_refer_sub.h
│ │ ├── hdr_refer_to.cpp
│ │ ├── hdr_refer_to.h
│ │ ├── hdr_referred_by.cpp
│ │ ├── hdr_referred_by.h
│ │ ├── hdr_replaces.cpp
│ │ ├── hdr_replaces.h
│ │ ├── hdr_reply_to.cpp
│ │ ├── hdr_reply_to.h
│ │ ├── hdr_request_disposition.cpp
│ │ ├── hdr_request_disposition.h
│ │ ├── hdr_require.cpp
│ │ ├── hdr_require.h
│ │ ├── hdr_retry_after.cpp
│ │ ├── hdr_retry_after.h
│ │ ├── hdr_route.cpp
│ │ ├── hdr_route.h
│ │ ├── hdr_rseq.cpp
│ │ ├── hdr_rseq.h
│ │ ├── hdr_server.cpp
│ │ ├── hdr_server.h
│ │ ├── hdr_service_route.cpp
│ │ ├── hdr_service_route.h
│ │ ├── hdr_session_expires.cpp
│ │ ├── hdr_session_expires.h
│ │ ├── hdr_sip_etag.cpp
│ │ ├── hdr_sip_etag.h
│ │ ├── hdr_sip_if_match.cpp
│ │ ├── hdr_sip_if_match.h
│ │ ├── hdr_subject.cpp
│ │ ├── hdr_subject.h
│ │ ├── hdr_subscription_state.cpp
│ │ ├── hdr_subscription_state.h
│ │ ├── hdr_supported.cpp
│ │ ├── hdr_supported.h
│ │ ├── hdr_timestamp.cpp
│ │ ├── hdr_timestamp.h
│ │ ├── hdr_to.cpp
│ │ ├── hdr_to.h
│ │ ├── hdr_unsupported.cpp
│ │ ├── hdr_unsupported.h
│ │ ├── hdr_user_agent.cpp
│ │ ├── hdr_user_agent.h
│ │ ├── hdr_via.cpp
│ │ ├── hdr_via.h
│ │ ├── hdr_warning.cpp
│ │ ├── hdr_warning.h
│ │ ├── hdr_www_authenticate.cpp
│ │ ├── hdr_www_authenticate.h
│ │ ├── header.cpp
│ │ ├── header.h
│ │ ├── identity.cpp
│ │ ├── identity.h
│ │ ├── media_type.cpp
│ │ ├── media_type.h
│ │ ├── milenage.cpp
│ │ ├── milenage.h
│ │ ├── parameter.cpp
│ │ ├── parameter.h
│ │ ├── parse_ctrl.cpp
│ │ ├── parse_ctrl.h
│ │ ├── parser.yxx
│ │ ├── request.cpp
│ │ ├── request.h
│ │ ├── response.cpp
│ │ ├── response.h
│ │ ├── rijndael.cpp
│ │ ├── rijndael.h
│ │ ├── route.cpp
│ │ ├── route.h
│ │ ├── scanner.lxx
│ │ ├── sip_body.cpp
│ │ ├── sip_body.h
│ │ ├── sip_message.cpp
│ │ └── sip_message.h
│ ├── patterns/
│ │ ├── CMakeLists.txt
│ │ ├── observer.cpp
│ │ └── observer.h
│ ├── phone.cpp
│ ├── phone.h
│ ├── phone_user.cpp
│ ├── phone_user.h
│ ├── presence/
│ │ ├── CMakeLists.txt
│ │ ├── buddy.cpp
│ │ ├── buddy.h
│ │ ├── pidf_body.cpp
│ │ ├── pidf_body.h
│ │ ├── presence_dialog.cpp
│ │ ├── presence_dialog.h
│ │ ├── presence_epa.cpp
│ │ ├── presence_epa.h
│ │ ├── presence_state.cpp
│ │ ├── presence_state.h
│ │ ├── presence_subscription.cpp
│ │ └── presence_subscription.h
│ ├── prohibit_thread.cpp
│ ├── prohibit_thread.h
│ ├── protocol.h
│ ├── redirect.cpp
│ ├── redirect.h
│ ├── sdp/
│ │ ├── CMakeLists.txt
│ │ ├── sdp.cpp
│ │ ├── sdp.h
│ │ ├── sdp_parse_ctrl.cpp
│ │ ├── sdp_parse_ctrl.h
│ │ ├── sdp_parser.h
│ │ ├── sdp_parser.yxx
│ │ └── sdp_scanner.lxx
│ ├── sender.cpp
│ ├── sender.h
│ ├── sequence_number.h
│ ├── service.cpp
│ ├── service.h
│ ├── session.cpp
│ ├── session.h
│ ├── sockets/
│ │ ├── CMakeLists.txt
│ │ ├── connection.cpp
│ │ ├── connection.h
│ │ ├── connection_table.cpp
│ │ ├── connection_table.h
│ │ ├── dnssrv.cpp
│ │ ├── dnssrv.h
│ │ ├── interfaces.cpp
│ │ ├── interfaces.h
│ │ ├── ipaddr.h
│ │ ├── socket.cpp
│ │ ├── socket.h
│ │ ├── url.cpp
│ │ └── url.h
│ ├── stun/
│ │ ├── CMakeLists.txt
│ │ ├── stun.cxx
│ │ ├── stun.h
│ │ ├── stun_transaction.cpp
│ │ ├── stun_transaction.h
│ │ ├── udp.cxx
│ │ └── udp.h
│ ├── sub_refer.cpp
│ ├── sub_refer.h
│ ├── subscription.cpp
│ ├── subscription.h
│ ├── subscription_dialog.cpp
│ ├── subscription_dialog.h
│ ├── sys_settings.cpp
│ ├── sys_settings.h
│ ├── threads/
│ │ ├── CMakeLists.txt
│ │ ├── mutex.cpp
│ │ ├── mutex.h
│ │ ├── sema.cpp
│ │ ├── sema.h
│ │ ├── thread.cpp
│ │ └── thread.h
│ ├── timekeeper.cpp
│ ├── timekeeper.h
│ ├── transaction.cpp
│ ├── transaction.h
│ ├── transaction_layer.cpp
│ ├── transaction_layer.h
│ ├── transaction_mgr.cpp
│ ├── transaction_mgr.h
│ ├── translator.h
│ ├── user.cpp
│ ├── user.h
│ ├── userintf.cpp
│ ├── userintf.h
│ ├── util.cpp
│ ├── util.h
│ └── utils/
│ ├── CMakeLists.txt
│ ├── file_utils.cpp
│ ├── file_utils.h
│ ├── mime_database.cpp
│ ├── mime_database.h
│ ├── record_file.h
│ └── record_file.hpp
├── twinkle.desktop.in
├── twinkle.spec.in
└── twinkle_config.h.in
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/workflows/main.yml
================================================
name: Build
on: [push, pull_request]
env:
# CMake flags used for default builds -- can be overridden by matrix.flags
FLAGS: >
-DWITH_QT5=ON
-DWITH_AKONADI=ON
-DWITH_ALSA=ON
-DWITH_DIAMONDCARD=ON
-DWITH_GSM=ON
-DWITH_SPEEX=ON
-DWITH_ZRTP=OFF
# Essential packages required by all builds
PACKAGES_REQUIRED: >
bison
cmake
flex
libccrtp-dev
libmagic-dev
libreadline-dev
libsndfile1-dev
libucommon-dev
libxml2-dev
linux-libc-dev
# Additional packages required by default builds -- can be overridden by
# matrix.packages
# (gettext is explitly added due to LP #1932371)
PACKAGES: >
gettext
libasound2-dev
libgsm1-dev
libkf5akonadi-dev
libkf5contacts-dev
libspeex-dev
libspeexdsp-dev
qtdeclarative5-dev
qttools5-dev
jobs:
build:
# Job name, including description and compiler if applicable
name: >
${{ format('Build {0} {1}',
((matrix.descr && format('({0})', matrix.descr)) || ''),
((matrix.gcc && format('[GCC {0}]', matrix.gcc)) ||
(matrix.clang && format('[Clang {0}]', matrix.clang)) || '')
) }}
# ' # Patch around Vim syntax bug
runs-on: ${{ matrix.os || 'ubuntu-latest' }}
strategy:
matrix:
include:
# Test building with GCC and Clang (current default version)
- gcc: default
- clang: default
# Test some other GCC/Clang versions, namely the lowest and highest
# available at the moment, making sure to include at least one for
# each Ubuntu release provided by GitHub Actions.
- gcc: 7
os: ubuntu-20.04
- gcc: 12
os: ubuntu-22.04
- clang: 6.0
os: ubuntu-20.04
- clang: 15
os: ubuntu-22.04
# Test with all options disabled
- descr: 'All options disabled'
flags: >
-DWITH_QT5=OFF
-DWITH_ALSA=OFF
-DWITH_GSM=OFF
-DWITH_SPEEX=OFF
-DWITH_ZRTP=OFF
# The empty string would evaluate to false and fail to override
# $PACKAGES, so we use this true-but-still-empty hack instead.
packages: ' '
# Test with Qt enabled and Akonadi disabled
- descr: 'w/o Akonadi'
flags: >
-DWITH_QT5=ON
-DWITH_AKONADI=OFF
-DWITH_ALSA=OFF
-DWITH_GSM=OFF
-DWITH_SPEEX=OFF
-DWITH_ZRTP=OFF
packages: >
qtdeclarative5-dev
qttools5-dev
# Test building with bcg729
- descr: 'w/ bcg729'
bcg729-branch: 'master'
flags: >
-DWITH_QT5=OFF
-DWITH_ALSA=OFF
-DWITH_G729=ON
packages: ' ' # true-but-empty value
# Also test the old pre-1.0.2 API (see issue #104)
- descr: 'w/ bcg729 (old API)'
bcg729-branch: '1.0.1'
# (bcg729 1.0.1 used Autotools instead of CMake)
bcg729-autotools: true
flags: >
-DWITH_QT5=OFF
-DWITH_ALSA=OFF
-DWITH_G729=ON
packages: >
autoconf
automake
libtool
pkg-config
steps:
# Install all packages necessary for this build
- name: Install packages
run: |
sudo apt-get update
sudo apt-get -y install $PACKAGES $PACKAGES_REQUIRED
env:
PACKAGES: ${{ matrix.packages || env.PACKAGES }}
PACKAGES_REQUIRED: ${{ env.PACKAGES_REQUIRED }}
# Set up a specific version of GCC or Clang if matrix.gcc/clang is set
#
# Note: This must come *after* `apt-get update` above, see:
# https://github.com/egor-tensin/setup-clang/issues/5
- name: Set up GCC (${{ matrix.gcc || 'n/a' }})
if: ${{ matrix.gcc }}
uses: egor-tensin/setup-gcc@v1
with:
# Note that these actions use 'latest' to designate the (usually not
# latest) default version. This would result in somewhat confusing
# output, so we use 'default' instead and perform our own renaming.
version: ${{ ((matrix.gcc == 'default') && 'latest') || matrix.gcc }}
- name: Set up Clang (${{ matrix.clang || 'n/a' }})
if: ${{ matrix.clang }}
uses: egor-tensin/setup-clang@v1
with:
version: ${{ ((matrix.clang == 'default') && 'latest') || matrix.clang }}
# Download and build bcg729 if necessary for this build
- name: Download and build bcg729 (${{ matrix.bcg729-branch || 'n/a' }})
if: ${{ matrix.bcg729-branch }}
run: |
git clone https://github.com/BelledonneCommunications/bcg729.git \
--branch "$BCG729_BRANCH"
cd bcg729
if $BCG729_AUTOTOOLS; then
./autogen.sh
./configure
else
cmake .
fi
make
sudo make install
env:
BCG729_BRANCH: ${{ matrix.bcg729-branch }}
BCG729_AUTOTOOLS: ${{ (matrix.bcg729-autotools && 'true') || 'false' }}
# Everything is now set up, ready to checkout/configure/build/install
- name: Checkout
uses: actions/checkout@v3
- name: Configure
run: cmake -B ${{github.workspace}}/build ${{env.FLAGS}}
env:
FLAGS: ${{ matrix.flags || env.FLAGS }}
- name: Build
run: cmake --build ${{github.workspace}}/build
- name: Install
run: cmake --install ${{github.workspace}}/build
--prefix ${{github.workspace}}/_install
================================================
FILE: .gitignore
================================================
# generated by cmake
*.cmake
!cmake/*.cmake
*.depends
CMakeFiles
Makefile
/CMakeCache.txt
/twinkle_config.h
/twinkle.desktop
# generated by build
*.o
*.qm
ui_*.h
moc_*.cpp
src/twinkle-console
src/gui/twinkle
src/gui/twinkle_automoc.cpp
src/gui/qrc_icons.cpp
src/gui/qrc_icons.cxx
src/gui/qrc_qml.cpp
src/gui/qrc_qml.cxx
src/parser/parser.cxx
src/parser/parser.hxx
src/parser/scanner.cxx
src/sdp/sdp_parser.cxx
src/sdp/sdp_parser.hxx
src/sdp/sdp_scanner.cxx
# Qt Creator files
CMakeLists.txt.user*
# generic
*~
================================================
FILE: AUTHORS
================================================
Author of Twinkle:
Michel de Boer <michel@twinklephone.com> designed and implemented Twinkle.
Lubos Dolezel <lubos@dolezel.info> ported Twinkle to Qt4/5 and took over further development.
Contributions:
* Werner Dittmann (ZRTP/SRTP)
* Bogdan Harjoc (AKAv1-MD5, Service-Route)
* Roman Imankulov (command line editing)
* Ondrej Moris (codec preprocessing)
* Rickard Petzall (ALSA)
Twinkle contains the following 3rd party software packages:
- GSM codec from Jutta Degener and Carsten Bormann
see directory src/audio/gsm for more info
- G.711/G.726 codec from Sun Microsystems
see src/audio/README_G711 for more info
- G.722 codec from Steve Underwood
see src/audio/g722.h for more info
- iLBC implementation from RFC 3951 (www.ilbcfreeware.org)
- Parts of the STUN project from sourceforge
http://sourceforge.net/projects/stun
- Parts of libsrv at http://libsrv.sourceforge.net/
Dynamic linked libraries:
- RTP, ZRTP and SRTP functionality is provided by the
GNU ccRTP stack: http://www.gnu.org/software/ccrtp
Translators:
Czech Marek Straka
Dutch Michel de Boer
German Joerg Reisenweber
French Olivier Aufrere
Russian Michail Chodorenko
Swedish Daniel Nylander
Michel de Boer
https://mfnboer.home.xs4all.nl/twinkle/
================================================
FILE: CMakeLists.txt
================================================
cmake_minimum_required(VERSION 2.8.10...3.22 FATAL_ERROR)
project(twinkle)
set(PRODUCT_VERSION "1.10.3")
set(PRODUCT_DATE "February 18, 2022")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
# Add -DDEBUG for non-release builds, or uCommon will unilaterally define NDEBUG
# (https://lists.gnu.org/archive/html/bug-commoncpp/2019-12/msg00000.html)
set_directory_properties(PROPERTIES
COMPILE_DEFINITIONS $<$<OR:$<CONFIG:>,$<CONFIG:Debug>>:DEBUG>)
include(CMakeDependentOption)
OPTION(WITH_ZRTP "Enable ZRTP encrypted calls" OFF)
OPTION(WITH_SPEEX "Enable the Speex codec" OFF)
OPTION(WITH_ILBC "Enable the iLBC codec" OFF)
OPTION(WITH_ALSA "Enable ALSA support" ON)
CMAKE_DEPENDENT_OPTION(WITH_DIAMONDCARD "Enable Diamondcard integration" ON "WITH_QT5" OFF)
OPTION(WITH_QT5 "Enable Qt 5 GUI" ON)
CMAKE_DEPENDENT_OPTION(WITH_DBUS "Enable use of QtDBus (GUI only)" ON "WITH_QT5" OFF)
CMAKE_DEPENDENT_OPTION(WITH_AKONADI "Enable Akonadi support" OFF WITH_QT5 OFF)
OPTION(WITH_G729 "Enable G.729A support" OFF)
OPTION(WITH_GSM "Use external GSM library" OFF)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
include (CheckCXX11Regex)
check_cxx11_regex(HAVE_CXX11_REGEX)
if (HAVE_CXX11_REGEX)
message(STATUS "C++11 regular expressions OK")
else (HAVE_CXX11_REGEX)
message(FATAL_ERROR "C++11 regular expressions not supported!")
endif (HAVE_CXX11_REGEX)
# Link against libatomic and libresolv on systems where they are present (e.g.
# Linux), but not on systems that do not make use of them (e.g. FreeBSD).
# Debian annoyingly does not ship a libatomic.so symlink, so we need to add
# libatomic.so.1 to the list. (https://bugs.debian.org/1010728)
find_library(HAVE_LIBATOMIC NAMES atomic libatomic.so.1)
if (HAVE_LIBATOMIC)
set(ATOMIC_LIBRARY ${HAVE_LIBATOMIC})
message(STATUS "libatomic: ${ATOMIC_LIBRARY}")
endif (HAVE_LIBATOMIC)
find_library(HAVE_LIBRESOLV resolv)
if (HAVE_LIBRESOLV)
set(RESOLV_LIBRARY ${HAVE_LIBRESOLV})
message(STATUS "libresolv: ${RESOLV_LIBRARY}")
endif (HAVE_LIBRESOLV)
include (CheckIncludeFile)
include (CheckIncludeFiles)
include (CheckSymbolExists)
include (CMakePushCheckState)
include (CheckCXXSourceCompiles)
include (TestBigEndian)
find_package(LibXml2 REQUIRED)
find_package(LibMagic REQUIRED)
find_package(LibSndfile REQUIRED)
find_package(Readline REQUIRED)
find_package(BISON REQUIRED)
find_package(FLEX REQUIRED)
find_package(Ucommon REQUIRED)
find_package(Commoncpp REQUIRED)
find_package(Ccrtp REQUIRED)
include_directories(
${LIBXML2_INCLUDE_DIR}
${LibMagic_INCLUDE_DIR}
${LIBSNDFILE_INCLUDE_DIR}
${Readline_INCLUDE_DIR}
${UCOMMON_INCLUDE_DIR}
${COMMONCPP_INCLUDE_DIR}
${CCRTP_INCLUDE_DIR}
)
if (WITH_QT5)
find_package(Qt5Widgets REQUIRED)
find_package(Qt5LinguistTools REQUIRED)
find_package(Qt5Quick REQUIRED)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS} ${Qt5Quick_EXECUTABLE_COMPILE_FLAGS}")
include_directories(${Qt5Widgets_INCLUDES} ${Qt5Quick_INCLUDES})
add_definitions(${Qt5Widgets_DEFINITIONS} ${Qt5Quick_DEFINITIONS})
if (WITH_DBUS)
find_package(Qt5DBus REQUIRED)
set(HAVE_DBUS TRUE)
include_directories(${Qt5DBus_INCLUDES})
endif (WITH_DBUS)
if (WITH_AKONADI)
find_package(KF5Akonadi REQUIRED)
find_package(KF5Contacts REQUIRED)
message(STATUS "Akonadi OK")
set(HAVE_AKONADI TRUE)
include_directories(${KF5Akonadi_INCLUDES} ${KF5Contacts_INCLUDES})
endif (WITH_AKONADI)
endif (WITH_QT5)
if (WITH_ALSA)
find_package(ALSA)
if (ALSA_FOUND)
message(STATUS "libasound OK")
set(HAVE_LIBASOUND TRUE)
include_directories(${ALSA_INCLUDE_DIR})
else (ALSA_FOUND)
message(FATAL_ERROR "libasound not found!")
endif (ALSA_FOUND)
endif (WITH_ALSA)
if (WITH_ZRTP)
find_package(Zrtpcpp)
if (ZRTPCPP_FOUND)
message(STATUS "libzrtpcpp OK")
set(HAVE_ZRTP TRUE)
include_directories(${ZRTPCPP_INCLUDE_DIR})
else (ZRTPCPP_FOUND)
message(FATAL_ERROR "libzrtpcpp not found!")
endif (ZRTPCPP_FOUND)
endif (WITH_ZRTP)
if (WITH_SPEEX)
find_package(Speex)
if (SPEEX_FOUND)
message(STATUS "Speex OK")
set(HAVE_SPEEX TRUE)
include_directories(${SPEEX_INCLUDE_DIR})
else (SPEEX_FOUND)
message(FATAL_ERROR "Speex not found!")
endif (SPEEX_FOUND)
endif (WITH_SPEEX)
if (WITH_ILBC)
find_package(Ilbc)
if (ILBC_FOUND)
message(STATUS "iLBC OK")
set(HAVE_ILBC TRUE)
if (ILBC_CPP)
set(HAVE_ILBC_CPP TRUE)
endif (ILBC_CPP)
include_directories(${ILBC_INCLUDE_DIR})
else (ILBC_FOUND)
message(FATAL_ERROR "iLBC not found!")
endif (ILBC_FOUND)
endif (WITH_ILBC)
if (WITH_G729)
find_package(G729)
if (G729_FOUND)
message(STATUS "bcg729 OK")
set(HAVE_BCG729 TRUE)
if (G729_ANNEX_B)
set(HAVE_BCG729_ANNEX_B TRUE)
endif (G729_ANNEX_B)
include_directories(${G729_INCLUDE_DIR})
else (G729_FOUND)
message(FATAL_ERROR "bcg729 not found!")
endif (G729_FOUND)
endif (WITH_G729)
if (WITH_GSM)
find_package(Gsm)
if (GSM_FOUND)
message(STATUS "gsm OK")
set(HAVE_GSM TRUE)
include_directories(${GSM_INCLUDE_DIR})
else (GSM_FOUND)
message(FATAL_ERROR "gsm not found!")
endif (GSM_FOUND)
endif (WITH_GSM)
check_include_file(unistd.h HAVE_UNISTD_H)
check_include_file(linux/types.h HAVE_LINUX_TYPES_H)
check_include_files("sys/socket.h;linux/errqueue.h" HAVE_LINUX_ERRQUEUE_H)
check_symbol_exists(strerror_r "string.h" HAVE_STRERROR_R)
if (HAVE_STRERROR_R)
# Check whether the return type is (int) or (char *)
# Code taken from Apache Thrift's ConfigureChecks.cmake
check_cxx_source_compiles("
#include <string.h>
int main() {
char b;
char *a = strerror_r(0, &b, 0);
return 0;
}
" STRERROR_R_CHAR_P)
endif (HAVE_STRERROR_R)
cmake_push_check_state()
list(APPEND CMAKE_REQUIRED_LIBRARIES ${RESOLV_LIBRARY})
check_cxx_source_compiles("
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/nameser.h>
#include <resolv.h>
int main() { res_init(); return 0; }
" HAVE_RES_INIT)
cmake_pop_check_state()
test_big_endian(WORDS_BIGENDIAN)
set(datadir "${CMAKE_INSTALL_PREFIX}/share/twinkle")
configure_file(twinkle_config.h.in twinkle_config.h)
configure_file(twinkle.desktop.in twinkle.desktop)
include_directories("${CMAKE_BINARY_DIR}")
install(FILES
${CMAKE_CURRENT_SOURCE_DIR}/data/providers.csv
${CMAKE_CURRENT_SOURCE_DIR}/data/ringtone.wav
${CMAKE_CURRENT_SOURCE_DIR}/data/ringback.wav
${CMAKE_CURRENT_SOURCE_DIR}/src/gui/images/twinkle16.png
${CMAKE_CURRENT_SOURCE_DIR}/src/gui/images/twinkle32.png
${CMAKE_CURRENT_SOURCE_DIR}/src/gui/images/twinkle48.png
DESTINATION share/twinkle)
install(FILES
${CMAKE_CURRENT_SOURCE_DIR}/src/gui/images/twinkle48.png
DESTINATION share/pixmaps
RENAME twinkle.png)
install(FILES
${CMAKE_CURRENT_BINARY_DIR}/twinkle.desktop
DESTINATION share/applications)
install(FILES src/gui/images/twinkle16.png
RENAME twinkle.png
DESTINATION share/icons/hicolor/16x16/apps)
install(FILES src/gui/images/twinkle24.png
RENAME twinkle.png
DESTINATION share/icons/hicolor/24x24/apps)
install(FILES src/gui/images/twinkle32.png
RENAME twinkle.png
DESTINATION share/icons/hicolor/32x32/apps)
install(FILES src/gui/images/twinkle48.png
RENAME twinkle.png
DESTINATION share/icons/hicolor/48x48/apps)
install(FILES data/twinkle.svg
DESTINATION share/icons/hicolor/scalable/apps)
install(FILES data/twinkle.1
DESTINATION share/man/man1)
add_subdirectory(src)
================================================
FILE: COPYING
================================================
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.
================================================
FILE: Doxyfile
================================================
# Doxyfile 1.5.0
# This file describes the settings to be used by the documentation system
# doxygen (www.doxygen.org) for a project
#
# All text after a hash (#) is considered a comment and will be ignored
# The format is:
# TAG = value [value, ...]
# For lists items can also be appended using:
# TAG += value [value, ...]
# Values that contain spaces should be placed between quotes (" ")
#---------------------------------------------------------------------------
# Project related configuration options
#---------------------------------------------------------------------------
# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
# by quotes) that should identify the project.
PROJECT_NAME = Twinkle
# The PROJECT_NUMBER tag can be used to enter a project or revision number.
# This could be handy for archiving the generated documentation or
# if some version control system is used.
PROJECT_NUMBER =
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
# base path where the generated documentation will be put.
# If a relative path is entered, it will be relative to the location
# where doxygen was started. If left blank the current directory will be used.
OUTPUT_DIRECTORY = doc
# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
# 4096 sub-directories (in 2 levels) under the output directory of each output
# format and will distribute the generated files over these directories.
# Enabling this option can be useful when feeding doxygen a huge amount of
# source files, where putting all generated files in the same directory would
# otherwise cause performance problems for the file system.
CREATE_SUBDIRS = NO
# The OUTPUT_LANGUAGE tag is used to specify the language in which all
# documentation generated by doxygen is written. Doxygen will use this
# information to generate all constant output in the proper language.
# The default language is English, other supported languages are:
# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,
# Croatian, Czech, Danish, Dutch, Finnish, French, German, Greek, Hungarian,
# Italian, Japanese, Japanese-en (Japanese with English messages), Korean,
# Korean-en, Lithuanian, Norwegian, Polish, Portuguese, Romanian, Russian,
# Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian.
OUTPUT_LANGUAGE = English
# This tag can be used to specify the encoding used in the generated output.
# The encoding is not always determined by the language that is chosen,
# but also whether or not the output is meant for Windows or non-Windows users.
# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES
# forces the Windows encoding (this is the default for the Windows binary),
# whereas setting the tag to NO uses a Unix-style encoding (the default for
# all platforms other than Windows).
USE_WINDOWS_ENCODING = NO
# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
# include brief member descriptions after the members that are listed in
# the file and class documentation (similar to JavaDoc).
# Set to NO to disable this.
BRIEF_MEMBER_DESC = YES
# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
# the brief description of a member or function before the detailed description.
# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
# brief descriptions will be completely suppressed.
REPEAT_BRIEF = YES
# This tag implements a quasi-intelligent brief description abbreviator
# that is used to form the text in various listings. Each string
# in this list, if found as the leading text of the brief description, will be
# stripped from the text and the result after processing the whole list, is
# used as the annotated text. Otherwise, the brief description is used as-is.
# If left blank, the following values are used ("$name" is automatically
# replaced with the name of the entity): "The $name class" "The $name widget"
# "The $name file" "is" "provides" "specifies" "contains"
# "represents" "a" "an" "the"
ABBREVIATE_BRIEF =
# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
# Doxygen will generate a detailed section even if there is only a brief
# description.
ALWAYS_DETAILED_SEC = NO
# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
# inherited members of a class in the documentation of that class as if those
# members were ordinary class members. Constructors, destructors and assignment
# operators of the base classes will not be shown.
INLINE_INHERITED_MEMB = NO
# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
# path before files name in the file list and in the header files. If set
# to NO the shortest path that makes the file name unique will be used.
FULL_PATH_NAMES = YES
# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
# can be used to strip a user-defined part of the path. Stripping is
# only done if one of the specified strings matches the left-hand part of
# the path. The tag can be used to show relative paths in the file list.
# If left blank the directory from which doxygen is run is used as the
# path to strip.
STRIP_FROM_PATH =
# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
# the path mentioned in the documentation of a class, which tells
# the reader which header file to include in order to use a class.
# If left blank only the name of the header file containing the class
# definition is used. Otherwise one should specify the include paths that
# are normally passed to the compiler using the -I flag.
STRIP_FROM_INC_PATH =
# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
# (but less readable) file names. This can be useful is your file systems
# doesn't support long names like on DOS, Mac, or CD-ROM.
SHORT_NAMES = NO
# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
# will interpret the first line (until the first dot) of a JavaDoc-style
# comment as the brief description. If set to NO, the JavaDoc
# comments will behave just like the Qt-style comments (thus requiring an
# explicit @brief command for a brief description.
JAVADOC_AUTOBRIEF = YES
# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
# treat a multi-line C++ special comment block (i.e. a block of //! or ///
# comments) as a brief description. This used to be the default behaviour.
# The new default is to treat a multi-line C++ comment block as a detailed
# description. Set this tag to YES if you prefer the old behaviour instead.
MULTILINE_CPP_IS_BRIEF = NO
# If the DETAILS_AT_TOP tag is set to YES then Doxygen
# will output the detailed description near the top, like JavaDoc.
# If set to NO, the detailed description appears after the member
# documentation.
DETAILS_AT_TOP = NO
# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
# member inherits the documentation from any documented member that it
# re-implements.
INHERIT_DOCS = YES
# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
# a new page for each member. If set to NO, the documentation of a member will
# be part of the file/class/namespace that contains it.
SEPARATE_MEMBER_PAGES = NO
# The TAB_SIZE tag can be used to set the number of spaces in a tab.
# Doxygen uses this value to replace tabs by spaces in code fragments.
TAB_SIZE = 8
# This tag can be used to specify a number of aliases that acts
# as commands in the documentation. An alias has the form "name=value".
# For example adding "sideeffect=\par Side Effects:\n" will allow you to
# put the command \sideeffect (or @sideeffect) in the documentation, which
# will result in a user-defined paragraph with heading "Side Effects:".
# You can put \n's in the value part of an alias to insert newlines.
ALIASES =
# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
# sources only. Doxygen will then generate output that is more tailored for C.
# For instance, some of the names that are used will be different. The list
# of all members will be omitted, etc.
OPTIMIZE_OUTPUT_FOR_C = NO
# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
# sources only. Doxygen will then generate output that is more tailored for Java.
# For instance, namespaces will be presented as packages, qualified scopes
# will look different, etc.
OPTIMIZE_OUTPUT_JAVA = NO
# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to
# include (a tag file for) the STL sources as input, then you should
# set this tag to YES in order to let doxygen match functions declarations and
# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
# func(std::string) {}). This also make the inheritance and collaboration
# diagrams that involve STL classes more complete and accurate.
BUILTIN_STL_SUPPORT = NO
# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
# tag is set to YES, then doxygen will reuse the documentation of the first
# member in the group (if any) for the other members of the group. By default
# all members of a group must be documented explicitly.
DISTRIBUTE_GROUP_DOC = NO
# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
# the same type (for instance a group of public functions) to be put as a
# subgroup of that type (e.g. under the Public Functions section). Set it to
# NO to prevent subgrouping. Alternatively, this can be done per class using
# the \nosubgrouping command.
SUBGROUPING = YES
#---------------------------------------------------------------------------
# Build related configuration options
#---------------------------------------------------------------------------
# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
# documentation are documented, even if no documentation was available.
# Private class members and static file members will be hidden unless
# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
EXTRACT_ALL = NO
# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
# will be included in the documentation.
EXTRACT_PRIVATE = YES
# If the EXTRACT_STATIC tag is set to YES all static members of a file
# will be included in the documentation.
EXTRACT_STATIC = YES
# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
# defined locally in source files will be included in the documentation.
# If set to NO only classes defined in header files are included.
EXTRACT_LOCAL_CLASSES = YES
# This flag is only useful for Objective-C code. When set to YES local
# methods, which are defined in the implementation section but not in
# the interface are included in the documentation.
# If set to NO (the default) only methods in the interface are included.
EXTRACT_LOCAL_METHODS = NO
# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
# undocumented members of documented classes, files or namespaces.
# If set to NO (the default) these members will be included in the
# various overviews, but no documentation section is generated.
# This option has no effect if EXTRACT_ALL is enabled.
HIDE_UNDOC_MEMBERS = NO
# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
# undocumented classes that are normally visible in the class hierarchy.
# If set to NO (the default) these classes will be included in the various
# overviews. This option has no effect if EXTRACT_ALL is enabled.
HIDE_UNDOC_CLASSES = NO
# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
# friend (class|struct|union) declarations.
# If set to NO (the default) these declarations will be included in the
# documentation.
HIDE_FRIEND_COMPOUNDS = NO
# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
# documentation blocks found inside the body of a function.
# If set to NO (the default) these blocks will be appended to the
# function's detailed documentation block.
HIDE_IN_BODY_DOCS = NO
# The INTERNAL_DOCS tag determines if documentation
# that is typed after a \internal command is included. If the tag is set
# to NO (the default) then the documentation will be excluded.
# Set it to YES to include the internal documentation.
INTERNAL_DOCS = NO
# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
# file names in lower-case letters. If set to YES upper-case letters are also
# allowed. This is useful if you have classes or files whose names only differ
# in case and if your file system supports case sensitive file names. Windows
# and Mac users are advised to set this option to NO.
CASE_SENSE_NAMES = YES
# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
# will show members with their full class and namespace scopes in the
# documentation. If set to YES the scope will be hidden.
HIDE_SCOPE_NAMES = NO
# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
# will put a list of the files that are included by a file in the documentation
# of that file.
SHOW_INCLUDE_FILES = YES
# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
# is inserted in the documentation for inline members.
INLINE_INFO = YES
# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
# will sort the (detailed) documentation of file and class members
# alphabetically by member name. If set to NO the members will appear in
# declaration order.
SORT_MEMBER_DOCS = YES
# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
# brief documentation of file, namespace and class members alphabetically
# by member name. If set to NO (the default) the members will appear in
# declaration order.
SORT_BRIEF_DOCS = NO
# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
# sorted by fully-qualified names, including namespaces. If set to
# NO (the default), the class list will be sorted only by class name,
# not including the namespace part.
# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
# Note: This option applies only to the class list, not to the
# alphabetical list.
SORT_BY_SCOPE_NAME = NO
# The GENERATE_TODOLIST tag can be used to enable (YES) or
# disable (NO) the todo list. This list is created by putting \todo
# commands in the documentation.
GENERATE_TODOLIST = YES
# The GENERATE_TESTLIST tag can be used to enable (YES) or
# disable (NO) the test list. This list is created by putting \test
# commands in the documentation.
GENERATE_TESTLIST = YES
# The GENERATE_BUGLIST tag can be used to enable (YES) or
# disable (NO) the bug list. This list is created by putting \bug
# commands in the documentation.
GENERATE_BUGLIST = YES
# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
# disable (NO) the deprecated list. This list is created by putting
# \deprecated commands in the documentation.
GENERATE_DEPRECATEDLIST= YES
# The ENABLED_SECTIONS tag can be used to enable conditional
# documentation sections, marked by \if sectionname ... \endif.
ENABLED_SECTIONS =
# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
# the initial value of a variable or define consists of for it to appear in
# the documentation. If the initializer consists of more lines than specified
# here it will be hidden. Use a value of 0 to hide initializers completely.
# The appearance of the initializer of individual variables and defines in the
# documentation can be controlled using \showinitializer or \hideinitializer
# command in the documentation regardless of this setting.
MAX_INITIALIZER_LINES = 30
# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
# at the bottom of the documentation of classes and structs. If set to YES the
# list will mention the files that were used to generate the documentation.
SHOW_USED_FILES = YES
# If the sources in your project are distributed over multiple directories
# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
# in the documentation. The default is NO.
SHOW_DIRECTORIES = YES
# The FILE_VERSION_FILTER tag can be used to specify a program or script that
# doxygen should invoke to get the current version for each file (typically from the
# version control system). Doxygen will invoke the program by executing (via
# popen()) the command <command> <input-file>, where <command> is the value of
# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
# provided by doxygen. Whatever the program writes to standard output
# is used as the file version. See the manual for examples.
FILE_VERSION_FILTER =
#---------------------------------------------------------------------------
# configuration options related to warning and progress messages
#---------------------------------------------------------------------------
# The QUIET tag can be used to turn on/off the messages that are generated
# by doxygen. Possible values are YES and NO. If left blank NO is used.
QUIET = NO
# The WARNINGS tag can be used to turn on/off the warning messages that are
# generated by doxygen. Possible values are YES and NO. If left blank
# NO is used.
WARNINGS = YES
# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
# automatically be disabled.
WARN_IF_UNDOCUMENTED = YES
# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
# potential errors in the documentation, such as not documenting some
# parameters in a documented function, or documenting parameters that
# don't exist or using markup commands wrongly.
WARN_IF_DOC_ERROR = YES
# This WARN_NO_PARAMDOC option can be abled to get warnings for
# functions that are documented, but have no documentation for their parameters
# or return value. If set to NO (the default) doxygen will only warn about
# wrong or incomplete parameter documentation, but not about the absence of
# documentation.
WARN_NO_PARAMDOC = NO
# The WARN_FORMAT tag determines the format of the warning messages that
# doxygen can produce. The string should contain the $file, $line, and $text
# tags, which will be replaced by the file and line number from which the
# warning originated and the warning text. Optionally the format may contain
# $version, which will be replaced by the version of the file (if it could
# be obtained via FILE_VERSION_FILTER)
WARN_FORMAT = "$file:$line: $text"
# The WARN_LOGFILE tag can be used to specify a file to which warning
# and error messages should be written. If left blank the output is written
# to stderr.
WARN_LOGFILE =
#---------------------------------------------------------------------------
# configuration options related to the input files
#---------------------------------------------------------------------------
# The INPUT tag can be used to specify the files and/or directories that contain
# documented source files. You may enter file names like "myfile.cpp" or
# directories like "/usr/src/myproject". Separate the files or directories
# with spaces.
INPUT = src src/utils src/im src/presence src/patterns
# If the value of the INPUT tag contains directories, you can use the
# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
# and *.h) to filter out the source-files in the directories. If left
# blank the following patterns are tested:
# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py
FILE_PATTERNS = *.cpp *.h
# The RECURSIVE tag can be used to turn specify whether or not subdirectories
# should be searched for input files as well. Possible values are YES and NO.
# If left blank NO is used.
RECURSIVE = NO
# The EXCLUDE tag can be used to specify files and/or directories that should
# excluded from the INPUT source files. This way you can easily exclude a
# subdirectory from a directory tree whose root is specified with the INPUT tag.
EXCLUDE = src/twinkle_config.h
# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
# directories that are symbolic links (a Unix filesystem feature) are excluded
# from the input.
EXCLUDE_SYMLINKS = NO
# If the value of the INPUT tag contains directories, you can use the
# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
# certain files from those directories. Note that the wildcards are matched
# against the file with absolute path, so to exclude all test directories
# for example use the pattern */test/*
EXCLUDE_PATTERNS =
# The EXAMPLE_PATH tag can be used to specify one or more files or
# directories that contain example code fragments that are included (see
# the \include command).
EXAMPLE_PATH =
# If the value of the EXAMPLE_PATH tag contains directories, you can use the
# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
# and *.h) to filter out the source-files in the directories. If left
# blank all files are included.
EXAMPLE_PATTERNS =
# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
# searched for input files to be used with the \include or \dontinclude
# commands irrespective of the value of the RECURSIVE tag.
# Possible values are YES and NO. If left blank NO is used.
EXAMPLE_RECURSIVE = NO
# The IMAGE_PATH tag can be used to specify one or more files or
# directories that contain image that are included in the documentation (see
# the \image command).
IMAGE_PATH =
# The INPUT_FILTER tag can be used to specify a program that doxygen should
# invoke to filter for each input file. Doxygen will invoke the filter program
# by executing (via popen()) the command <filter> <input-file>, where <filter>
# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
# input file. Doxygen will then use the output that the filter program writes
# to standard output. If FILTER_PATTERNS is specified, this tag will be
# ignored.
INPUT_FILTER =
# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
# basis. Doxygen will compare the file name with each pattern and apply the
# filter if there is a match. The filters are a list of the form:
# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER
# is applied to all files.
FILTER_PATTERNS =
# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
# INPUT_FILTER) will be used to filter the input files when producing source
# files to browse (i.e. when SOURCE_BROWSER is set to YES).
FILTER_SOURCE_FILES = NO
#---------------------------------------------------------------------------
# configuration options related to source browsing
#---------------------------------------------------------------------------
# If the SOURCE_BROWSER tag is set to YES then a list of source files will
# be generated. Documented entities will be cross-referenced with these sources.
# Note: To get rid of all source code in the generated output, make sure also
# VERBATIM_HEADERS is set to NO.
SOURCE_BROWSER = NO
# Setting the INLINE_SOURCES tag to YES will include the body
# of functions and classes directly in the documentation.
INLINE_SOURCES = NO
# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
# doxygen to hide any special comment blocks from generated source code
# fragments. Normal C and C++ comments will always remain visible.
STRIP_CODE_COMMENTS = YES
# If the REFERENCED_BY_RELATION tag is set to YES (the default)
# then for each documented function all documented
# functions referencing it will be listed.
REFERENCED_BY_RELATION = YES
# If the REFERENCES_RELATION tag is set to YES (the default)
# then for each documented function all documented entities
# called/used by that function will be listed.
REFERENCES_RELATION = YES
# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
# link to the source code. Otherwise they will link to the documentstion.
REFERENCES_LINK_SOURCE = YES
# If the USE_HTAGS tag is set to YES then the references to source code
# will point to the HTML generated by the htags(1) tool instead of doxygen
# built-in source browser. The htags tool is part of GNU's global source
# tagging system (see http://www.gnu.org/software/global/global.html). You
# will need version 4.8.6 or higher.
USE_HTAGS = NO
# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
# will generate a verbatim copy of the header file for each class for
# which an include is specified. Set to NO to disable this.
VERBATIM_HEADERS = YES
#---------------------------------------------------------------------------
# configuration options related to the alphabetical class index
#---------------------------------------------------------------------------
# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
# of all compounds will be generated. Enable this if the project
# contains a lot of classes, structs, unions or interfaces.
ALPHABETICAL_INDEX = YES
# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
# in which this list will be split (can be a number in the range [1..20])
COLS_IN_ALPHA_INDEX = 5
# In case all classes in a project start with a common prefix, all
# classes will be put under the same header in the alphabetical index.
# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
# should be ignored while generating the index headers.
IGNORE_PREFIX = t_
#---------------------------------------------------------------------------
# configuration options related to the HTML output
#---------------------------------------------------------------------------
# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
# generate HTML output.
GENERATE_HTML = YES
# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
# If a relative path is entered the value of OUTPUT_DIRECTORY will be
# put in front of it. If left blank `html' will be used as the default path.
HTML_OUTPUT = html
# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
# doxygen will generate files with .html extension.
HTML_FILE_EXTENSION = .html
# The HTML_HEADER tag can be used to specify a personal HTML header for
# each generated HTML page. If it is left blank doxygen will generate a
# standard header.
HTML_HEADER =
# The HTML_FOOTER tag can be used to specify a personal HTML footer for
# each generated HTML page. If it is left blank doxygen will generate a
# standard footer.
HTML_FOOTER =
# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
# style sheet that is used by each HTML page. It can be used to
# fine-tune the look of the HTML output. If the tag is left blank doxygen
# will generate a default style sheet. Note that doxygen will try to copy
# the style sheet file to the HTML output directory, so don't put your own
# stylesheet in the HTML output directory as well, or it will be erased!
HTML_STYLESHEET =
# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
# files or namespaces will be aligned in HTML using tables. If set to
# NO a bullet list will be used.
HTML_ALIGN_MEMBERS = YES
# If the GENERATE_HTMLHELP tag is set to YES, additional index files
# will be generated that can be used as input for tools like the
# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
# of the generated HTML documentation.
GENERATE_HTMLHELP = NO
# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
# be used to specify the file name of the resulting .chm file. You
# can add a path in front of the file if the result should not be
# written to the html output directory.
CHM_FILE =
# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
# be used to specify the location (absolute path including file name) of
# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
# the HTML help compiler on the generated index.hhp.
HHC_LOCATION =
# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
# controls if a separate .chi index file is generated (YES) or that
# it should be included in the master .chm file (NO).
GENERATE_CHI = NO
# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
# controls whether a binary table of contents is generated (YES) or a
# normal table of contents (NO) in the .chm file.
BINARY_TOC = NO
# The TOC_EXPAND flag can be set to YES to add extra items for group members
# to the contents of the HTML help documentation and to the tree view.
TOC_EXPAND = NO
# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
# top of each HTML page. The value NO (the default) enables the index and
# the value YES disables it.
DISABLE_INDEX = NO
# This tag can be used to set the number of enum values (range [1..20])
# that doxygen will group on one line in the generated HTML documentation.
ENUM_VALUES_PER_LINE = 4
# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
# generated containing a tree-like index structure (just like the one that
# is generated for HTML Help). For this to work a browser that supports
# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+,
# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are
# probably better off using the HTML help feature.
GENERATE_TREEVIEW = NO
# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
# used to set the initial width (in pixels) of the frame in which the tree
# is shown.
TREEVIEW_WIDTH = 250
#---------------------------------------------------------------------------
# configuration options related to the LaTeX output
#---------------------------------------------------------------------------
# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
# generate Latex output.
GENERATE_LATEX = NO
# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
# If a relative path is entered the value of OUTPUT_DIRECTORY will be
# put in front of it. If left blank `latex' will be used as the default path.
LATEX_OUTPUT = latex
# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
# invoked. If left blank `latex' will be used as the default command name.
LATEX_CMD_NAME = latex
# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
# generate index for LaTeX. If left blank `makeindex' will be used as the
# default command name.
MAKEINDEX_CMD_NAME = makeindex
# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
# LaTeX documents. This may be useful for small projects and may help to
# save some trees in general.
COMPACT_LATEX = NO
# The PAPER_TYPE tag can be used to set the paper type that is used
# by the printer. Possible values are: a4, a4wide, letter, legal and
# executive. If left blank a4wide will be used.
PAPER_TYPE = a4wide
# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
# packages that should be included in the LaTeX output.
EXTRA_PACKAGES =
# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
# the generated latex document. The header should contain everything until
# the first chapter. If it is left blank doxygen will generate a
# standard header. Notice: only use this tag if you know what you are doing!
LATEX_HEADER =
# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
# is prepared for conversion to pdf (using ps2pdf). The pdf file will
# contain links (just like the HTML output) instead of page references
# This makes the output suitable for online browsing using a pdf viewer.
PDF_HYPERLINKS = NO
# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
# plain latex in the generated Makefile. Set this option to YES to get a
# higher quality PDF documentation.
USE_PDFLATEX = NO
# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
# command to the generated LaTeX files. This will instruct LaTeX to keep
# running if errors occur, instead of asking the user for help.
# This option is also used when generating formulas in HTML.
LATEX_BATCHMODE = NO
# If LATEX_HIDE_INDICES is set to YES then doxygen will not
# include the index chapters (such as File Index, Compound Index, etc.)
# in the output.
LATEX_HIDE_INDICES = NO
#---------------------------------------------------------------------------
# configuration options related to the RTF output
#---------------------------------------------------------------------------
# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
# The RTF output is optimized for Word 97 and may not look very pretty with
# other RTF readers or editors.
GENERATE_RTF = NO
# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
# If a relative path is entered the value of OUTPUT_DIRECTORY will be
# put in front of it. If left blank `rtf' will be used as the default path.
RTF_OUTPUT = rtf
# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
# RTF documents. This may be useful for small projects and may help to
# save some trees in general.
COMPACT_RTF = NO
# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
# will contain hyperlink fields. The RTF file will
# contain links (just like the HTML output) instead of page references.
# This makes the output suitable for online browsing using WORD or other
# programs which support those fields.
# Note: wordpad (write) and others do not support links.
RTF_HYPERLINKS = NO
# Load stylesheet definitions from file. Syntax is similar to doxygen's
# config file, i.e. a series of assignments. You only have to provide
# replacements, missing definitions are set to their default value.
RTF_STYLESHEET_FILE =
# Set optional variables used in the generation of an rtf document.
# Syntax is similar to doxygen's config file.
RTF_EXTENSIONS_FILE =
#---------------------------------------------------------------------------
# configuration options related to the man page output
#---------------------------------------------------------------------------
# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
# generate man pages
GENERATE_MAN = NO
# The MAN_OUTPUT tag is used to specify where the man pages will be put.
# If a relative path is entered the value of OUTPUT_DIRECTORY will be
# put in front of it. If left blank `man' will be used as the default path.
MAN_OUTPUT = man
# The MAN_EXTENSION tag determines the extension that is added to
# the generated man pages (default is the subroutine's section .3)
MAN_EXTENSION = .3
# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
# then it will generate one additional man file for each entity
# documented in the real man page(s). These additional files
# only source the real man page, but without them the man command
# would be unable to find the correct page. The default is NO.
MAN_LINKS = NO
#---------------------------------------------------------------------------
# configuration options related to the XML output
#---------------------------------------------------------------------------
# If the GENERATE_XML tag is set to YES Doxygen will
# generate an XML file that captures the structure of
# the code including all documentation.
GENERATE_XML = NO
# The XML_OUTPUT tag is used to specify where the XML pages will be put.
# If a relative path is entered the value of OUTPUT_DIRECTORY will be
# put in front of it. If left blank `xml' will be used as the default path.
XML_OUTPUT = xml
# The XML_SCHEMA tag can be used to specify an XML schema,
# which can be used by a validating XML parser to check the
# syntax of the XML files.
XML_SCHEMA =
# The XML_DTD tag can be used to specify an XML DTD,
# which can be used by a validating XML parser to check the
# syntax of the XML files.
XML_DTD =
# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
# dump the program listings (including syntax highlighting
# and cross-referencing information) to the XML output. Note that
# enabling this will significantly increase the size of the XML output.
XML_PROGRAMLISTING = YES
#---------------------------------------------------------------------------
# configuration options for the AutoGen Definitions output
#---------------------------------------------------------------------------
# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
# generate an AutoGen Definitions (see autogen.sf.net) file
# that captures the structure of the code including all
# documentation. Note that this feature is still experimental
# and incomplete at the moment.
GENERATE_AUTOGEN_DEF = NO
#---------------------------------------------------------------------------
# configuration options related to the Perl module output
#---------------------------------------------------------------------------
# If the GENERATE_PERLMOD tag is set to YES Doxygen will
# generate a Perl module file that captures the structure of
# the code including all documentation. Note that this
# feature is still experimental and incomplete at the
# moment.
GENERATE_PERLMOD = NO
# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
# the necessary Makefile rules, Perl scripts and LaTeX code to be able
# to generate PDF and DVI output from the Perl module output.
PERLMOD_LATEX = NO
# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
# nicely formatted so it can be parsed by a human reader. This is useful
# if you want to understand what is going on. On the other hand, if this
# tag is set to NO the size of the Perl module output will be much smaller
# and Perl will parse it just the same.
PERLMOD_PRETTY = YES
# The names of the make variables in the generated doxyrules.make file
# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
# This is useful so different doxyrules.make files included by the same
# Makefile don't overwrite each other's variables.
PERLMOD_MAKEVAR_PREFIX =
#---------------------------------------------------------------------------
# Configuration options related to the preprocessor
#---------------------------------------------------------------------------
# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
# evaluate all C-preprocessor directives found in the sources and include
# files.
ENABLE_PREPROCESSING = YES
# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
# names in the source code. If set to NO (the default) only conditional
# compilation will be performed. Macro expansion can be done in a controlled
# way by setting EXPAND_ONLY_PREDEF to YES.
MACRO_EXPANSION = NO
# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
# then the macro expansion is limited to the macros specified with the
# PREDEFINED and EXPAND_AS_DEFINED tags.
EXPAND_ONLY_PREDEF = NO
# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
# in the INCLUDE_PATH (see below) will be search if a #include is found.
SEARCH_INCLUDES = YES
# The INCLUDE_PATH tag can be used to specify one or more directories that
# contain include files that are not input files but should be processed by
# the preprocessor.
INCLUDE_PATH =
# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
# patterns (like *.h and *.hpp) to filter out the header-files in the
# directories. If left blank, the patterns specified with FILE_PATTERNS will
# be used.
INCLUDE_FILE_PATTERNS =
# The PREDEFINED tag can be used to specify one or more macro names that
# are defined before the preprocessor is started (similar to the -D option of
# gcc). The argument of the tag is a list of macros of the form: name
# or name=definition (no spaces). If the definition and the = are
# omitted =1 is assumed. To prevent a macro definition from being
# undefined via #undef or recursively expanded use the := operator
# instead of the = operator.
PREDEFINED =
# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
# this tag can be used to specify a list of macro names that should be expanded.
# The macro definition that is found in the sources will be used.
# Use the PREDEFINED tag if you want to use a different macro definition.
EXPAND_AS_DEFINED =
# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
# doxygen's preprocessor will remove all function-like macros that are alone
# on a line, have an all uppercase name, and do not end with a semicolon. Such
# function macros are typically used for boiler-plate code, and will confuse
# the parser if not removed.
SKIP_FUNCTION_MACROS = YES
#---------------------------------------------------------------------------
# Configuration::additions related to external references
#---------------------------------------------------------------------------
# The TAGFILES option can be used to specify one or more tagfiles.
# Optionally an initial location of the external documentation
# can be added for each tagfile. The format of a tag file without
# this location is as follows:
# TAGFILES = file1 file2 ...
# Adding location for the tag files is done as follows:
# TAGFILES = file1=loc1 "file2 = loc2" ...
# where "loc1" and "loc2" can be relative or absolute paths or
# URLs. If a location is present for each tag, the installdox tool
# does not have to be run to correct the links.
# Note that each tag file must have a unique name
# (where the name does NOT include the path)
# If a tag file is not located in the directory in which doxygen
# is run, you must also specify the path to the tagfile here.
TAGFILES =
# When a file name is specified after GENERATE_TAGFILE, doxygen will create
# a tag file that is based on the input files it reads.
GENERATE_TAGFILE =
# If the ALLEXTERNALS tag is set to YES all external classes will be listed
# in the class index. If set to NO only the inherited external classes
# will be listed.
ALLEXTERNALS = NO
# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
# in the modules index. If set to NO, only the current project's groups will
# be listed.
EXTERNAL_GROUPS = YES
# The PERL_PATH should be the absolute path and name of the perl script
# interpreter (i.e. the result of `which perl').
PERL_PATH = /usr/bin/perl
#---------------------------------------------------------------------------
# Configuration options related to the dot tool
#---------------------------------------------------------------------------
# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
# or super classes. Setting the tag to NO turns the diagrams off. Note that
# this option is superseded by the HAVE_DOT option below. This is only a
# fallback. It is recommended to install and use dot, since it yields more
# powerful graphs.
CLASS_DIAGRAMS = YES
# If set to YES, the inheritance and collaboration graphs will hide
# inheritance and usage relations if the target is undocumented
# or is not a class.
HIDE_UNDOC_RELATIONS = YES
# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
# available from the path. This tool is part of Graphviz, a graph visualization
# toolkit from AT&T and Lucent Bell Labs. The other options in this section
# have no effect if this option is set to NO (the default)
HAVE_DOT = NO
# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
# will generate a graph for each documented class showing the direct and
# indirect inheritance relations. Setting this tag to YES will force the
# the CLASS_DIAGRAMS tag to NO.
CLASS_GRAPH = YES
# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
# will generate a graph for each documented class showing the direct and
# indirect implementation dependencies (inheritance, containment, and
# class references variables) of the class with other documented classes.
COLLABORATION_GRAPH = YES
# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
# will generate a graph for groups, showing the direct groups dependencies
GROUP_GRAPHS = YES
# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
# collaboration diagrams in a style similar to the OMG's Unified Modeling
# Language.
UML_LOOK = NO
# If set to YES, the inheritance and collaboration graphs will show the
# relations between templates and their instances.
TEMPLATE_RELATIONS = NO
# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
# tags are set to YES then doxygen will generate a graph for each documented
# file showing the direct and indirect include dependencies of the file with
# other documented files.
INCLUDE_GRAPH = YES
# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
# documented header file showing the documented files that directly or
# indirectly include this file.
INCLUDED_BY_GRAPH = YES
# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will
# generate a call dependency graph for every global function or class method.
# Note that enabling this option will significantly increase the time of a run.
# So in most cases it will be better to enable call graphs for selected
# functions only using the \callgraph command.
CALL_GRAPH = NO
# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then doxygen will
# generate a caller dependency graph for every global function or class method.
# Note that enabling this option will significantly increase the time of a run.
# So in most cases it will be better to enable caller graphs for selected
# functions only using the \callergraph command.
CALLER_GRAPH = NO
# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
# will graphical hierarchy of all classes instead of a textual one.
GRAPHICAL_HIERARCHY = YES
# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
# then doxygen will show the dependencies a directory has on other directories
# in a graphical way. The dependency relations are determined by the #include
# relations between the files in the directories.
DIRECTORY_GRAPH = YES
# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
# generated by dot. Possible values are png, jpg, or gif
# If left blank png will be used.
DOT_IMAGE_FORMAT = png
# The tag DOT_PATH can be used to specify the path where the dot tool can be
# found. If left blank, it is assumed the dot tool can be found in the path.
DOT_PATH =
# The DOTFILE_DIRS tag can be used to specify one or more directories that
# contain dot files that are included in the documentation (see the
# \dotfile command).
DOTFILE_DIRS =
# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width
# (in pixels) of the graphs generated by dot. If a graph becomes larger than
# this value, doxygen will try to truncate the graph, so that it fits within
# the specified constraint. Beware that most browsers cannot cope with very
# large images.
MAX_DOT_GRAPH_WIDTH = 1024
# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height
# (in pixels) of the graphs generated by dot. If a graph becomes larger than
# this value, doxygen will try to truncate the graph, so that it fits within
# the specified constraint. Beware that most browsers cannot cope with very
# large images.
MAX_DOT_GRAPH_HEIGHT = 1024
# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
# graphs generated by dot. A depth value of 3 means that only nodes reachable
# from the root by following a path via at most 3 edges will be shown. Nodes
# that lay further from the root node will be omitted. Note that setting this
# option to 1 or 2 may greatly reduce the computation time needed for large
# code bases. Also note that a graph may be further truncated if the graph's
# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH
# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default),
# the graph is not depth-constrained.
MAX_DOT_GRAPH_DEPTH = 0
# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
# background. This is disabled by default, which results in a white background.
# Warning: Depending on the platform used, enabling this option may lead to
# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
# read).
DOT_TRANSPARENT = NO
# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
# files in one run (i.e. multiple -o and -T options on the command line). This
# makes dot run faster, but since only newer versions of dot (>1.8.10)
# support this, this feature is disabled by default.
DOT_MULTI_TARGETS = NO
# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
# generate a legend page explaining the meaning of the various boxes and
# arrows in the dot generated graphs.
GENERATE_LEGEND = YES
# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
# remove the intermediate dot files that are used to generate
# the various graphs.
DOT_CLEANUP = YES
#---------------------------------------------------------------------------
# Configuration::additions related to the search engine
#---------------------------------------------------------------------------
# The SEARCHENGINE tag specifies whether or not a search engine should be
# used. If set to NO the values of all tags below this one will be ignored.
SEARCHENGINE = NO
================================================
FILE: NEWS
================================================
18 February 2022 - 1.10.3
=========================
- Replace manual URL.
14 February 2019 - 1.10.2
=======================
- Fix sound not working with ALSA 1.1.7.
- Translation updates.
- Various bug fixes.
7 October 2016 - 1.10.1
=======================
- Stability fixes.
- French translation updates.
- Remove obsolete commoncpp2 dependency.
- Set PA role to phone to pause music playback automatically.
15 July 2016 - 1.10.0
=======================
- Supports newest Qt5, drops support for Qt4.
- Source code cleanups, spelling error fixes.
- Handle digest authentication scheme case insensitively.
- Address book UI fixes.
- Fix build with ucommon 7.0.
- Call history UI fixes.
- Support using an external GSM library.
- Various other bug fixes.
10 July 2015 - 1.9.0
=======================
- Ported to Qt4 and Qt5.
- Added in-call OSD.
- Added a new incoming call notification screen/dialog.
- Support the G.729A codec.
- Made Diamondcard support optional.
- Save window geometry and state.
- Visual feedback (button presses) in DTMF window when pushing keyboard buttons.
- Support clipboard paste in DTMF window.
- Removed Boost Regex dependency.
- Eliminated some GUI freezes/stalls.
25 february 2009 - 1.4.2
========================
- Integration with Diamondcard Worldwide Communication Service
(worldwide calls to regular and cell phones and SMS).
- Show number of calls and total call duration in call history.
- Show message size while typing an instant message.
- Show "referred by" party for an incoming transferred call in systray popup.
- Option to allow call transfer while consultation call is still in progress.
- Improved lock file checking. No more stale lock files.
Bug fixes:
----------
- Opening an IM attachment did not work anymore.
Build fixes:
------------
- Link with ncurses library
31 january 2009 - 1.4.1
=======================
Bug fixes:
----------
- No sound when Twinkle is compiled without speex support.
Build fixes:
------------
- Compiling without KDE sometimes failed (cannot find -lqt-mt).
- Configure script did not correctly check for the readline-devel package.
25 january 2009 - 1.4
=====================
- Service route discovery during registration.
- Codec preprocessing: automatic gain control, voice activation detection,
noise reduction, acoustic echo cancellation (experimental).
- Support tel-URI as destination address for a call or instant message.
- User profile option to expand a telephone number to a tel-URI instead
of a sip-URI.
- Add descending q-value to contacts in 3XX responses for the redirection
services.
- AKAv1-MD5 authentication.
- Command line editing, history, auto-completion.
- Ignore wrong formatted domain-parameter in digest challenge.
- Match tel-URI in incoming call to address book.
- Determine RTP IP address for SDP answer from RTP IP address in SDP offer.
- Show context menu's when pressing the right mouse button instead of
after clicking.
- Swedish translation
- Resampled ringback tone from 8287 Hz to 8000 Hz
Bug fixes
---------
- Text line edit in the message form looses focus after sending an IM.
- Twinkle does not escape reserved symbols when dialing.
- Deregister all function causes a crash.
- Twinkle crashes at startup in CLI mode.
- Twinkle may freeze when an ALSA error is detected when starting
the ringback tone and the outgoing call gets answered very fast.
- User profile editor did not allow spaces in a user name.
New RFC's
---------
RFC 3608 - Session Initiation Protocol (SIP) Extension Header Field
for Service Route Discovery During Registration
24 august 2008 - 1.3.2
======================
- Fix in non-KDE version for gcc 4.3
23 august 2008 - 1.3.1
======================
- Disable file attachment button in message window when destination
address is not filled in
- Updated russian translation
Build fixes
-----------
- Fixes for gcc 4.3 (missing includes)
- non-KDE version failed to build
18 august 2008 - 1.3
====================
- Send file attachment with instant message.
- Show timestamp with instant messages.
- Instant message composition indication (RFC 3994).
- Persistent TCP connections with keep alive.
- Do not try to send SIP messages larger than 64K via UDP.
- Integration with libzrtcpp-1.3.0
- Xsession support to restore Twinkle after system shutdown/startup.
- Call snd_pcm_state to determine jitter buffer exhaustion (some ALSA
implementations gave problems with the old method).
- SDP parser allows SDP body without terminating CRLF.
- Russian translation.
Bug fixes
---------
- SIP parser did not allow white space between header name and colon.
- With "send in-dialog requests to proxy" enabled and transport
mode set to "auto", in-dialog requests are wrongly sent via TCP.
- Crash when a too large message is received.
- Comparison of authentication parameters (e.g. algorithm) were case-sensitive.
These comparisons must be case-insensitive.
- SDP parser could not parse other media transports than RTP/AVP.
- Twinkle sent 415 response instead of 200 OK on in-dialog INFO without body.
- Twinkle responds with 513 Message too large on an incoming call.
- ICMP error on STUN request causes Twinkle to crash.
- Add received-parameter to Via header of an incoming request if it contains
an empty rport parameter (RFC 3581)
- Twinkle did not add Contact header and copy Record-Route header
to 180 response.
New RFC's
---------
RFC 3994 - Indication of Message Composition for Instant Messaging
8 march 2008 - 1.2
==================
- SIP over TCP
- Automatic selection of IP address.
* On a multi-homed machine you do not have to select an IP address/NIC
anymore.
- Support for sending a q-value in a registration contact.
- Send DTMF on an early media stream.
- Choose auth over auth-int qop when server supports both for authentication.
This avoids problems with SIP ALGs.
- Support tel-URI in From and To headers in incoming SIP messages.
- Print a log rotation message at end of log when a log file is full.
- Remove 20 character limit on profile names.
- Reject an incoming MESSAGE with 603 if max. sessions == 0
- Delivery notification when a 202 response is received on a MESSAGE.
Bug fixes
---------
- When you deactivate a profile that has MWI active, but MWI subscription failed,
and subsequently activate this profile again, then Twinkle does not subscribe to
MWI.
- The max redirection value was always set to 1.
- Leading space in the body of a SIP message causes a parse failure
- Twinkle crashes with SIGABRT when it receives an INVITE with
a CSeq header that contains an invalid method.
- Latest release of lrelease corrupted translation files.
- Twinkle crashes on 'twinkle --cmd line'
- If an MWI NOTIFY does not contain a voice msg summary, twinkle
shows a random number for the amount of messages waiting.
- Depending on the locale Twinkle encoded a q-value with a comma
instead of a dot as decimal point.
Build changes
-------------
- Modifications for gcc 4.3.
- Remove fast sequence of open/close calls for ALSA to avoid
problems with bluez.
21 july 2007 - 1.1
==================
- French translation
- Presence
- Instant messaging
- New CLI commands: presence, message
Bug fixes
---------
- If a session was on-hold and Twinkle received a re-INVITE without
SDP, it would offer SDP on-hold in the 200 OK, instead of a brand
new SDP offer.
- Twinkle refused to change to another profile with the same user name
as the current active profile.
- ICMP processing did not work most times (uninitialized data).
- Replace strerror by strerror_r (caused rare SIGSEGV crashes)
- Fix deadlock in timekeeper (caused rare freezes)
New RFC's
---------
RFC 3428 - Session Initiation Protocol (SIP) Extension for Instant Messaging
RFC 3856 - A Presence Event Package for the Session Initiation Protocol (SIP)
RFC 3863 - Presence Information Data Format (PIDF)
RFC 3903 - Session Initiation Protocol (SIP) Extension
for Event State Publication
19 may 2007 - 1.0.1
===================
- Czech translation
- Check on user profiles having the same contact name at startup.
- When comparing an incoming INVITE request-URI with the contact-name,
ignore the host part to avoid NAT problems.
- A call to voice mail will not be attached to the "redial" button.
- Added voice mail entry to services and systray menu.
- New command line options: --show, --hide
- TWINKLE_LINE environment variable in scripts. This variable contains
the line number (starting at 1) associated with a trigger.
- Preload KAddressbook at startup.
- Allow multiple occurrences of the display_msg parameter in the incoming call
script to create multi-line messages.
- Handle SIP forking and early media interaction
Bug fixes
---------
- Fix conference call
- If lock file still exists when you start Twinkle, Twinkle asks
if it should start anyway. When you click 'yes', Twinkle does not start.
- Audio validation opened soundcard in stereo instead of mono
- When quitting Twinkle while the call history window is open, a segfault occurs
- When an incoming call is rejected when only unsupported codecs are offered,
it does not show as a missed call in the call history.
- Segfault when the remote party establishes an early media session without
sending a to-tag in the 1XX response (some Cisco devices).
- in_call_failed trigger was not called when the call failed before ringing.
- Escape double quote with backslash in display name.
- On some system Twinkle occasionally crashed at startup with the following
error: Xlib: unexpected async reply
Build Changes
-------------
- Remove AC_CHECK_HEADERS([]) from configure.in
- Configure checks for lrelease.
Other
-----
- Very small part of the comments has been formatted now for automatic
documentation generation with doxygen.
22 jan 2007 - 1.0
=================
- Local address book
- Message waiting indication (MWI)
* Solicited MWI as specified by RFC 3842
* Unsolicited MWI as implemented by Asterisk
- Voice mail speed dial
- Call transfer with consultation
* This is a combination of a consultation call on the other line
followed by a blind transfer.
- Attended call transfer
* This is a combination of a consultation call on the other line
followed by a replacement from B to C of the call on the first line.
This is only possible if the C-party supports "replaces".
If "replaces" is not supported, then twinkle automatically falls
back to "transfer with consultation".
- User identity hiding
- Multi language support
This version contains Dutch and German translations
- Send BYE when a CANCEL/2XX INVITE glare occurs.
- When call release was not immediate due to network problems or protocol errors,
the line would be locked for some time. Now Twinkle releases a call in the
background immediately freeing the line for new calls.
- Escape reserved symbols in a URI by their hex-notation (%hex).
- Changed key binding for Bye from F7 to ESC
- When a lock file exists at startup, Twinkle asks if you want to override it
- New command line options: --force, --sip-port, --rtp-port
- Ring tone and speaker device list now also shows playback only devices
- Microphone device list now also shows capture only devices
- Validate audio device settings on startup, before making a call, before
answering a call.
- SIP_FROM_USER, SIP_FROM_HOST, SIP_TO_USER, SIP_TO_HOST variables for call scripts.
- display_msg parameter added to incoming call script
- User profile options to indicate which codec preference to follow
- Twinkle now asks permission for an incoming REFER asynchronously. This
prevents blocking of the transaction layer.
- Highlight missed calls in call history
- Support for G.726 ATM AAL2 codeword packing
- replaces SIP extension (RFC 3891)
- norefesub SIP extension (RFC 4488)
- SIP parser supports IPv6 addresses in SIP URI's and Via headers
(Note: Twinkle does not support transport over IPv6)
- Support mid-call change of SSRC
- Handling of SIGCHLD, SIGTERM and SIGINT on platforms implementing
LinuxThreads instead of NPTL threading (e.g. sparc)
Bug fixes
---------
- Invalid speex payload when setting ptime=30 for G.711
- When editing the active user profile via File -> Change User -> Edit
QObject::connect: No such slot MphoneForm::displayUser(t_user*)
- 32 s after call setup the DTMF button gets disabled.
- 4XX response on INVITE does not get properly handled.
From/To/Subject labels are not cleared. No call history record is made.
- The dial combobox accepted a newline through copy/past. This corrupted
the system settings.
- When a far-end responds with no supported codecs, Twinkle automatically
releases the call. If the far-end sends an invalid response on this
release and the user pressed the BYE button, Twinkle crashed.
- When using STUN the private port was put in the Via header instead of
the public port.
- Twinkle crashes once in a while, while it is just sitting idle.
Build changes
-------------
- If libbind exists then link with libbind, otherwise link with libresolv
This solves GLIBC_PRIVATE errors on Fedora
- Link with libboost_regex or libboost_regex-gcc
New RFC's
---------
RFC 3323 - A Privacy Mechanism for the Session Initiation Protocol (SIP)
RFC 3325 - Private Extensions to the Session Initiation Protocol (SIP) for
Asserted Identity within Trusted Networks
RFC 3842 - A Message Summary and Message Waiting Indication Event Package
for the Session Initiation Protocol (SIP)
RFC 3891 - The Session Initiation Protocol (SIP) "Replaces" Header
RFC 4488 - Suppression of Session Initiation Protocol (SIP)
REFER Method Implicit Subscription
01 oct 2006 - Release 0.9
=========================
- Supports Phil Zimmermann's ZRTP and SRTP for
secure voice communication.
ZRTP/SRTP is provided by the latest version (1.5.0) of the
GNU ccRTP library.
The implementation is interoperable with Zfone beta2
- SIP INFO method (RFC 2976)
- DTMF via SIP INFO
- G.726 codec (16, 24, 32 and 48 kbps modes)
- Option to hide display
- CLI command "answerbye" to answer an incoming or hangup an established call
- Switch lines from system tray menu
- Answer or reject a call from the KDE systray popup on incoming call
- Icons to indicate line status
- Default NIC option in system settings
- Accept SDP offer without m= lines (RFC 3264 section 5, RFC 3725 flow IV)
Bug fixes
---------
- t_audio::open did not return a value
- segmentation fault when quitting Twinkle in transient call state
- Twinkle did not accept message/sipfrag body with a single CRLF at the end
- user profile could not be changed on service redirect dialog
- Twinkle did not react to 401/407 authentication challenges for
PRACK, REFER, SUBSCRIBE and NOTIFY
Build changes
-------------
- For ZRTP support you need to install libzrtpcpp first. This library
comes as an extension library with ccRTP.
09 jul 2006 - Release 0.8.1
===========================
- Removed iLBC source code from Twinkle. To use iLBC you can
link Twinkle with the ilbc library (ilbc package). When you
have the ilbc library installed on your system, then Twinkle's
configure script will automatically setup the Makefiles to
link with the library.
Bug fixes
---------
- Name and photo lookups in KAddressbook on incoming calls may
freeze Twinkle.
Build improvements
------------------
- Added missing includes to userprofile.ui and addressfinder.h
- Configure has new --without-speex option
01 jul 2006 - Release 0.8
=========================
- iLBC
- Make supplementary service settings persistent
- Lookup name in address book for incoming call
- Display photo from address book of caller on incoming call
- Number conversion rules
- Always popup systray notification (KDE only) on incoming call
- Add organization and subject to incoming call popup
- New call script trigger points: incoming call answered, incoming call failed,
outgoing call, outgoing call answered, outgoing call failed, local release,
remote release.
- Added 'end' parameter for the incoming call script
- Option to provision ALSA and OSS devices that are not in the standard list
of devices.
- Option to auto show main window on incoming call
- Resized the user profile window such that it fits on an 800x600 display
- Popup the user profile selection window, when the SIP UDP port is occupied
during startup of Twinkle, so the user can change to another port.
- Skip unsupported codecs in user profile during startup
Bug fixes
---------
- Sometimes the NAT discovery window never closed
- When RTP timestamps wrap around some RTP packets may be discarded
- When the dial history contains an entry of insane length, the
main window becomes insanely large on next startup
- On rare occasions, Twinkle could respond to an incoming call for
a deactivated user profile.
- Credentials cache did not get erased when a failure response other
than 401/407 was received on a REGISTER with credentials.
- G.711 enocders amplified soft noise from the microphone.
Newly supported RFC's
---------------------
RFC 3951 - Internet Low Bit Rate Codec (iLBC)
RFC 3952 - Real-time Transport Protocol (RTP) Payload Format
for internet Low Bit Rate Codec (iLBC) Speech
Build notes
-----------
- New dependency on libboost-regex (boost package)
07 may 2006 - Release 0.7.1
===========================
- Check that --call and --cmd arguments are not empty
- When DTMF transport is "inband", then do not signal RFC2833 support in SDP
Bug fixes
---------
- CLI and non-KDE version hang when stopping ring tone
- The GUI allowed payload type 96-255 for DTMF and Speex, while
maximum value is only 127
- When a dynamic codec change takes place at the same time as a re-INVITE
Twinkle sometimes freezes.
- Sending RFC 2833 DTMF events fails when codec is speex-wb or speex-uwb
29 apr 2006 - Release 0.7
=========================
- Speex support (narrow, wide and ultra wide band)
- Support for dynamic payload numbers for audio codecs in SDP
- Inband DTMF (option for DTMF transport in user profile)
- UTF-8 support to properly display non-ASCII characters
- --cmd command line option to remotely execute CLI commands
- --immediate command line option to perform --call and --cmd without user
confirmation.
- --set-profile command line option to set the active profile.
- Support "?subject=<subject>" as part of address for --call
- The status icon are always displayed: gray -> inactive, full color -> active
- Clicking the registration status icon fetches current registration status
- Clicking the service icons enables/disables the service
- Fancier popup from KDE system tray on incoming call.
- Popup from system tray shows as long as the phone is ringing.
- Reload button on address form
- Remove special phone number symbols from dialed strings.
This option can be enabled/disabled via the user profile.
- Remove duplicate entries from the dial history drop down box
- Specify in the user profile what symbols are special symbols to remove.
- Changed default for "use domain to create unique contact header value" to
"no"
- New SIP protocol option: allow SDP change in INVITE responses
- Do not ask username and password when authentication for an
automatic re-regsitration fails. The user may not be at his desk, and
the authentication dialog stalls Twinkle.
- Ask authentication password when user profile contains authentication
name, but no password.
- Improved handling of socket errors when interface goes down temporarily.
Bug fixes
---------
- If the far end holds a call and then resumes a call while Twinkle has
been put locally on-hold, then Twinkle will start recording sound from
the mic and send it to the far-end while indicating that the call is
still on-hold.
- Crash on no-op SDP in re-INVITE
- Twinkle exits when it receives SIGSTOP followed by SIGCONT
- call release cause in history is incorrect for incoming calls.
Build improvements
------------------
- Break dependency on X11/xpm.h
26 feb 2006 - Release 0.6.2
===========================
- Graceful termination on reception of SIGINT and SIGTERM
Bug fixes
---------
- If the URI in a received To-header is not enclosed by '<' and '>', then
the tag parameter is erronesouly parsed as a URI parameter instead of a
header parameter. This causes failing call setup, tear down, when
communicating with a far-end that does not enclose the URI in angle
brackets in the To-header.
- Function to flush OSS buffers flushed a random amount of samples that
could cause sound clipping (at start of call and after call hold) when
using OSS.
- In some cases Twinkle added "user=phone" to a URI when the URI already
had a user parameter.
11 feb 2006 - Release 0.6.1
===========================
- action=autoanswer added to call script actions
- Performance improvement of --call parameter
- Synchronized dial history drop downs on main window and call dialog
- Dial history drop down lists are stored persistently
- Redial information is stored persistently
Bug fixes
---------
- When using STUN Twinkle freezes when making a call and the STUN
server does not respond within 200 ms (since version 0.2)
- Some malformed SIP messages triggered a memory leak in the
parser code generated by bison (since version 0.1)
- The lexical scanner jammed on rubbish input (since version 0.1)
05 feb 2006 - Release 0.6
=========================
- Custom ring tones (package libsndfile is needed)
- Twinkle can call a user defineable script for each incoming call.
With this script the user can:
* reject, redirect or accept a call
* define a specific ring tone (distinctive ringing)
- Missed call indication
- Call directly from the main window
- DTMF keys can by typed directly from the keyboard at the main window.
Letters are converted to the corresponding digits.
- Letters can be typed in the DTMF window. They are converted to digits.
- Call duration in call history
- Call duration timer while call is established
- Added --call parameter to command line to instruct Twinkle to make
a call
- Increased expiry timer for outgoing RTP packets to 160 ms
With this setting slow sound cards should give better sound quality
for the mic.
- System setting to disable call waiting.
- System setting to modify hangup behaviour of 3-way call. Hang up both
lines or only the active line.
- Replace dots with underscores in contact value
- Silently discard packets on the SIP port smaller than 10 bytes
- User profile option to disable the usage of the domain name in the
contact header.
- Graceful release of calls when quitting Twinkle
- Changed call hold default from RFC2543 to RFC3264
Bug fixes
---------
- An '=' in a value of a user profile or system settings parameter
caused a syntax error
- If a default startup profile was renamed, the default startup list
was not updated
- When call was put on-hold using RFC2543 method, the host in the
SDP o= line was erroneously set to 0.0.0.0
- When a response with wrong tags but correct branch was received, a
line would hang forever (RFC 3261 did not specify this scenario).
- If far end responds with 200 OK to CANCEL, but never sends 487 on
INVITE as mandated by RFC 3261, then a line would hang forever
- CPU load was sometimes excessive when using ALSA
01 jan 2006 - Release 0.5
=========================
- Run multiple user profiles in parallel
- Add/remove users while Twinkle is running
- The SIP UDP port and RTP port settings have been moved from the user
profile to system settings. Changes of the default values in the user
profile will be lost.
- DNS SRV support for SIP and STUN
- ICMP processing
- SIP failover on 503 response
- SIP and STUN failover on ICMP error
- When a call is originated from the call history, copy the subject to the
call window (prefixed with "Re:" when replying to a call).
- Remove '/' from a phone number taken from KAddressbook. / is used in
Germany to separate the area code from the local number.
- Queue incoming in-dialog request if ACK has not been received yet.
- Clear credentials cache when user changes realm, username or password
- Added micro seconds to timestamps in log
- Detecting a soundcard playing out at slightly less than 8000 samples per
second is now done on the RTP queue status. This seems to be more reliable
than checking the ALSA sound buffer filling.
- OSS fragment size and ALSA period size are now changeable via the system
settings. Some soundcard problems may be solved by changing these values.
- Default ALSA period size for capturing lowered from 128 to 32. This seems
to give better performance on some sound cards.
Bug fixes
---------
- With certain ALSA settings (eg. mic=default, speaker=plughw), the ALSA
device got locked up after 1 call.
- The ports used for NAT discovery via STUN stayed open.
- When a STUN transaction for a media port failed, the GUI did not clear
the line information fields.
- Sending DTMF events took many unnecessary CPU cycles
- Parse failure when Server or User-Agent header contained comment only
Newly supported RFC's
---------------------
RFC 2782 - A DNS RR for specifying the location of services (DNS SRV)
RFC 3263 - Session Initiation Protocol (SIP): Locating SIP Servers
28 nov 2005 - Release 0.4.2
===========================
- Microphone noise reduction (can be disabled in system settings)
- System tray icon shows status of active line and enabled services
- Call history option added to system tray menu
Bug fixes
---------
- Twinkle crashes at startup when the systray icon is disabled in the system settings.
- Line stays forever in dialing state when pressing ESC in the call window
19 nov 2005 - Release 0.4.1
===========================
- Fixed build problems with gcc-4.0.2 and qt3-3.4.4
18 nov 2005 - Release 0.4
=========================
- Interface to KAddressbook
- History of incoming and outgoing calls (successful and missed calls)
- History of 10 last calls on call dialog window for redialling
- Call and service menu options added to KDE sys tray icon
- Allow a missing mandatory Expires header in a 2XX response on SUBSCRIBE
- Big Endian support for sound playing (eg. PPC platforms)
- System setting to start Twinkle hidden in system tray
- System setting to start with a default profile
- System setting to start on a default IP address
- Command line option (-i) for IP address
Bug fixes
---------
- send a 500 failure response on a request that is received out of order
instead of discarding the request.
- 64bit fix in events.cpp
- race condition on starting/stopping audio threads could cause a crash
- segmentation fault when RTP port could not be opened.
- CLI looped forever on reaching EOF
- 64bit fix in events.cpp
- ALSA lib pcm_hw.c:590:(snd_pcm_hw_pause) SNDRV_PCM_IOCTL_PAUSE failed
- sometimes when quitting Twinkle a segmentation fault occurred
Build improvements
------------------
- Removed platform dependent code from stunRand() in stun.cxx
- It should be possible to build Twinkle without the KDE addons on a
non-KDE system
- new option --without-kde added to configure to build a non-KDE version
of Twinkle
22 oct 2005 - Release 0.3.2
===========================
- Fixed several build problams with KDE include files and
libraries.
If you already successfully installed release 0.3.1 then there is
no need to upgrade to 0.3.2 as there is no new functionality.
16 oct 2005 - Release 0.3.1
===========================
This is a minor bug fix release.
Bug fixes:
----------
- Command line options -f and -share were broken in release 0.3
This release fixes the command line options.
09 oct 2005 - Release 0.3
=========================
New functionality:
------------------
- ALSA support
- System tray icon
- Send NAT keep alive packets when Twinkle sits behind a symmetric firewall
(discovered via STUN)
- Allow missing or wrong Contact header in a 200 OK response on a REGISTER
Bug fixes:
----------
- Hostnames in Via and Warning headers were erroneously converted to lower case.
- t_ts_non_invite::timeout assert( t==TIMER_J ) when ACK is received
for a non-INVITE request that had INVITE as method in the CSeq header.
- The SIP/SDP parser accepted a port number > 65535. This caused an assert
- Segmentation fault on some syntax errors in SIP headers
- Line got stuck when CSeq sequence nr 0 was received. RFC 3261 allows 0.
- With 100rel required, every 1XX after the first 1XX response were discarded.
- Fixed build problems on 64-bit architectures.
- Dead lock due to logging in UDP sender.
- Segmentation fault when packet loss occurred while the sequence
number in the RTP packets wrapped around.
- Route set was not recomputed on reception of a 2XX response, when a 1XX
repsonse before already contained a Record-Route header.
30 jul 2005 - Release 0.2.1
===========================
New functionality:
------------------
- Clear button on log view window.
Bug fixes:
----------
- The system settings window confused the speaker and mic settings.
- Log view window sometimes opened behind other windows.
- Segmentation fault when SUBSCRIBE with expires=0 was received to end
a refer subscription.
- When a call transfer fails, the original call is received. If the line
for this call is not the active call however, the call should stay
on-hold.
- On rare occasions a segmentation fault occurred when the ring tone
was stopped.
- Log view window sometimes caused deadlock.
24 jul 2005 - Release 0.2
=========================
New functionality:
------------------
- STUN support for NAT traversal
- Blind call transfer service
- Reject call transfer request
- Auto answer service
- REFER, NOTIFY and SUBSCRIBE support for call transfer scenario's
* REFER is sent for blind call transfer. Twinkle accpets incoming
NOTIFY messages about the transfer progress.
Twinkle can send SUBSCRIBE to extend refer event subscription
* Incoming REFER within dialog is handled by Twinkle
Twinkle sends NOTIFY messages during transfer.
Incoming SUBSCRIBE to extend refer event subscription is granted.
- Retry re-INVITE after a glare (491 response, RFC 3261 14.1)
- Respond with 416 if a request with a non-sip URI is received
- Multiple sound card support for playing ring tone to a different
device than speech
- The To-tag in a 200 OK on a CANCEL was different than the To-tag in a provisional
response on the INVITE. RFC 3261 recommends that these To-tags are the same.
Twinkle now uses the same To-tag.
- Show error messages to user when trying to submit invalid values on the
user profile
- DTMF volume configurable via user profile
- Log viewer
- User profile wizard
- Help texts for many input fields (e.g. in user profile). Help can be accessed
by pressing Ctrl+F1 or using the question mark from the title bar.
Bug fixes:
----------
- A retransmission of an incoming INVITE after a 2XX has been sent
was seen as a new INVITE.
- If an OPTIONS request timed out then the GUI did not release its
lock causing a deadlock.
- If the URI in a To, From, Contact or Reply-To header is not
enclosed by < and >, then the parameters (separated by a semi-colon)
belong to the header, NOT to the URI.
They were parsed as parameters of the URI. This could cause the
loss of a tag-parameter causing call setup failures.
- Do not resize window when setting a long string in to, from or subject
Newly supported RFC's
---------------------
RFC 3265 - Session Initiation Protocol (SIP)-Specific Event Notification
RFC 3420 - Internet Media Type message/sipfrag
RFC 3489 - Simple Traversal of User Datagram Protocol (UDP)
Through Network Address Translators (NATs)
RFC 3515 - The Session Initiation Protocol (SIP) Refer Method
RFC 3892 - The Session Initiation Protocol (SIP) Referred-By Mechanism
27 apr 2005 - Release 0.1
=========================
First release of Twinkle, a SIP VoIP client.
- Basic calls
- 2 call appearances (lines)
- Call Waiting
- Call Hold
- 3-way conference calling
- Mute
- Call redirection on demand
- Call redirection unconditional
- Call redirection when busy
- Call redirection no answer
- Reject call redirection request
- Call reject
- Do not disturb
- Send DTMF digits to navigate IVR systems
- NAT traversal through static provisioning
- Audio codecs: G.711 A-law, G.711 u-law, GSM
Supported RFC's
---------------
- RFC 2327 - SDP: Session Description Protocol
- RFC 2833 - RTP Payload for DTMF Digits
- RFC 3261 - SIP: Session Initiation Protocol
- RFC 3262 - Reliability of Provisional Responses in SIP
- RFC 3264 - An Offer/Answer Model with the Session Description Protocol (SDP)
- RFC 3581 - An extension to SIP for Symmetric Response Routing
- RFC 3550 - RTP: A Transport Protocol for Real-Time Applications
RFC 3261 is not fully implemented yet.
- No TCP transport support, only UDP
- No DNS SRV support, only DNS A-record lookup
- Only plain SDP bodies are supported, no multi-part MIME or S/MIME
- Only sip: URI support, no sips: URI support
================================================
FILE: README.md
================================================
[](https://github.com/LubosD/twinkle/actions/workflows/main.yml)
# Twinkle
Twinkle is a SIP-based VoIP client.
## Dependencies
To compile Twinkle you need the following libraries:
* A standard library with C++11 support (at least version 4.9 for libstdc++)
* ucommon [GNU uCommon C++](http://www.gnu.org/software/commoncpp/)
* ccRTP (version >= 1.5.0) [GNU RTP Stack](http://www.gnu.org/software/ccrtp/)
* libxml2
* libsndfile
* libmagic
* libreadline
* Qt 5 – more specifically, the following submodules:
* base
* declarative
* tools
The following tools are also required:
* cmake
* bison
* flex
### Optional dependencies
* alsa-lib (also known as libasound)
* libzrtpcpp (version >= 0.9.0) [ZRTP library, ccRTP support must be enabled](https://www.gnu.org/software/ccrtp/zrtp.html)
* bcg729 [G.729A codec library](http://www.linphone.org/technical-corner/bcg729)
* Speex and SpeexDSP [Speex codec library](http://www.speex.org/)
* iLBC [iLBC codec library](http://www.ilbcfreeware.org/)
* [Akonadi](https://community.kde.org/KDE_PIM/Akonadi) (specifically, the `core` library) and [KContacts](https://cgit.kde.org/kcontacts.git)
## Build
First of all, choose which options you want to have enabled.
All possible options are:
* Qt 5 GUI: `-DWITH_QT5=On` (on by default)
* D-Bus use: `-DWITH_DBUS=On` (on by default, requires `WITH_QT5`)
* ALSA support: `-DWITH_ALSA=On` (on by default)
* ZRTP support: `-DWITH_ZRTP=On`
* G.729A codec support: `-DWITH_G729=On`
* Speex codec support: `-DWITH_SPEEX=On`
* iLBC codec support: `-DWITH_ILBC=On`
* Diamondcard support: `-DWITH_DIAMONDCARD=On`
* Akonadi support: `-DWITH_AKONADI=On` (requires `WITH_QT5`)
### Build instructions
# Create a subdirectory for the build an enter it
mkdir build && cd build
# Run cmake with a list of build options
cmake .. -Dexample_option=On
# Build Twinkle
make
# Install Twinkle
make install
## Shared user data
Installation will create the following directory for shared user data
on your system:
${CMAKE_INSTALL_PREFIX}/share/twinkle
The typical default value for `CMAKE_INSTALL_PREFIX` is `/usr/local`.
## Application icon
If you want to create an application link on your desktop you
can find an application icon in the shared user data directory:
* `twinkle16.png` (16x16 icon)
* `twinkle32.png` (32x32 icon)
* `twinkle48.png` (48x48 icon)
## User data
On first run Twinkle will create the `.twinkle` directory in your home
directory. In this directory all user data will be put:
* user profiles (`.cfg`)
* log files (`.log`)
* system settings (`twinkle.sys`)
* call history (`twinkle.ch`)
* lock file (`twinkle.lck`)
## Starting Twinkle
Give the command: `twinkle`
`twinkle -h` will show you some command line options you may use.
NOTE: the CLI option is not fool proof. A command given at a wrong
time may crash the program. It is recommended to use the GUI.
If you do not specify a configuration file (`-f <profile>`) on the command
line, then Twinkle will look for configuration files in your
`.twinkle` directory.
If you do not have any configuration file, the configuration file
editor will startup so you can create one. If you have
configuration files, then Twinkle lets you select an
existing configuration file. See below for some hints on
settings to be made with the profile configuration editor.
If you specify a configuration file name, then Twinkle will
such for this configuration file in your `.twinkle` directory.
If you have put your configuration file in another location
you have to specify the full path name for the file, i.e.
starting with a slash.
NOTE: the configuration file editor only exists in the GUI.
If you run the CLI mode, you must have a configuration file.
So first create a configuration file in GUI mode or hand edit
a configuration file, before running the CLI mode.
If you run the CLI mode and you do not specify a file name
on the command line, then Twinkle will use twinkle.cfg
## NAT
If there is a NAT between you and your SIP server then you have
3 options to make things work:
1. Your SIP provider uses a Session Border Controller
2. Your SIP provider offers a STUN server
3. Make static address mappings in your NAT for SIP and RTP
STUN can be enabled in the NAT section of the user profile.
For the static address mappings enable the following in
the NAT section of the user profile:
Use statically configured public IP address inside SIP messages
And fill in the public IP address of your NAT.
Twinkle will then use this IP address inside SIP headers and
SDP bodies instead of the private IP address of your machine.
In addition you have to add the following port forwardings for UDP
on your NAT
public:5060 --> private:5060 (for SIP signaling)
public:8000 --> private:8000 (for RTP on line 1)
public:8001 --> private:8001 (for RTCP on line 1)
public:8002 --> private:8002 (for RTP on line 2)
public:8003 --> private:8003 (for RTCP on line 2)
public:8004 --> private:8004 (for RTP for call transfer)
public:8005 --> private:8005 (for RTCP for call transfer)
If you have changed the SIP/RTP ports in your profile you have
to change the port forwarding rules likewise.
## Log files
During execution Twinkle will create the following log files in
your .twinkle directory:
* `twinkle.log` (latest log file)
* `twinkle.log.old` (previous log file)
When `twinkle.log` is full (default is 5 MB) then it is moved to
`twinkle.log.old` and a new `twinkle.log` is created.
On startup an existing `twinkle.log` is moved to `twinkle.log.old` and a
new `twinkle.log` is created.
## User profile configuration
A user profile contains information about your user account,
SIP proxy, and several SIP protocol options. If you use Twinkle
with different user accounts you may create multiple user
profiles.
When you create a new profile you first give it a name and
then you can make the appropriate settings. The name of the
profile is what later on appears in the selection box
when you start Twinkle again. Or you can give the name.cfg
at the command line (`-f` option) to immediately start that
profile.
The user profile is stored as `<name>.cfg` in the `.twinkle`
directory where `<name>` is the name you gave to the profile.
At a minimum you have to specify the following:
* User name: this is your SIP user name (eg. phone number)
* Domain: the domain of your provider (eg. fwd.pulver.com)
this could also be the IP address of your SIP proxy
if you want to do IP-to-IP dialing (without proxy) then
fill in the IP address or FQDN of your computer.
If your SIP proxy does not request authentication and the value you
filled in for 'Domain' can be resolved to an IP address by Twinkle,
eg. it is an IP address or an FQDN that is in an A-record of the
DNS, then you are ready now.
## Authentication
If your proxy needs authentication, then specify the following fields
in the SIP authentication box:
* Realm: the realm for authentication
you might leave the realm empty. If you do so, then
Twinkle will use the name and password regardless of
the realm put in the challenge by the proxy. For most
network setups this is fine. You only need to explicitly
specify a realm when you have call scenario's where
you have to access multiple realms. Then for the realms
not known to Twinkle you will be requested for a login
when needed.
* Name: your authentication name
* Password: your authentication password
If authentication fails during registration or any other SIP request
because you filled in wrong values, then Twinkle will at that time
interactively request your login and cache it.
## Outbound proxy
An outbound proxy is only needed if the domain value cannot be resolved
to an IP address by Twinkle or because your provider demands you to
use an outbound proxy that is at a different IP address.
Check the 'use outbound proxy' check box in the SIP server section.
For outbound proxy fill in an IP address or an FQDN that can be
resolved to an IP address via DNS.
By default only out-of-dialog requests (eg. REGISTER, OPTIONS, initial
INVITE) are sent to the outbound proxy. In-dialog requests (eg. re-INVITE,
BYE) are sent to the target indicated by the far end during call setup.
By checking 'send in-dialog requests to proxy' Twinkle will ignore this
target and send these requests also to the proxy. Normally you would
not need this. It could be useful in a scenario where the far-end
indicates a target that cannot be resolved to an IP address.
By checking "Do not send a request to proxy if its destination can be
resolved locally" will make Twinkle always first try to figure out
the destination IP address itself, i.e. based on the request-URI and
Route-headers. Only when that fails the outbound-proxy will be tried,
but only for the options checked above. I.e. if you did not check
the 'in-dialog' option, then an in-dialog request will
never go to the proxy. If its destination cannot be resolved, then
the request will simply fail.
## Registrar
By default a REGISTER will be send to the IP address resolved from
the domain value or to the outbound proxy if specified.
If your service provider has a dedicated registrar which is
different from these IP addresses, then you can specify the
IP or FQDN of the registrar in the registrar-field.
The 'expiry' value is the expiry of your registration. Just before
the registration expires Twinkle will automatically refresh the
registration. The expiry time may be overruled by the registrar.
The 'registrar at startup option' will make Twinkle automatically
send a REGISTER on startup of the profile.
## Addressing
When you invite someone to a call you have to enter an address.
A SIP address has the following form:
sip:<user>@<host-part>
Where 'user' is a user name or a phone number
and 'host-part' is a domain name, FQDN or IP address
The only mandatory part for you to enter is the `<user>`. Twinkle
will fill in the other parts if you do not provide them.
For the host-part, Twinkle will fill in the value you configured
as your `domain`.
Currently `sip:` is the only addressing scheme supported by Twinkle.
Michel de Boer [michel@twinklephone.com]
Lubos Dolezel [lubos@dolezel.info]
================================================
FILE: THANKS
================================================
Thanks to the following people for testing and finding all
those lovely bugs:
Richard Bos
Schelte Bron
Ruud Linders
John van der Ploeg
Marco van Zijl
Thanks to Richard Bos for RPM building and advertising.
Thanks to Joerg Reisenweber for his excellent testing and debugging.
Thanks to Treeve Jelbert for helping me catching build errors in release 0.4
Thanks to James Le Cuirot for helping me debug several ALSA and RTP problems.
Qt 4 & 5 porting done by Lubos Dolezel and Michal Kubecek.
================================================
FILE: TODO
================================================
* make KDE support work again
After cleaning up the autotools config, twinkle only builds with
--without-kde. This is only temporary, the goal is to allow building
against KDE4 libraries (and, preferrably, also KDE5).
* IPv6 support
Still missing, AFAIK.
* t_gui locking
Dirty workaround for (mostly) calling GUI related methods from non-GUI
threads. Doesn't actually work with Qt4, causing segfaults. Analyze
the remaining uses and get rid of it.
* MEMMAN_* tracking macros
Ugly and unreliable (too easy to forget adding them). Either replace
them with overloaded new and delete operators or kill them completely
and rely on valgrind.
================================================
FILE: cmake/CheckCXX11Regex.cmake
================================================
# Check if C++11 regular expressions are available and actually work.
#
# libstdc++ 4.8 shipped with a buggy prototype for C++11 regular expressions,
# which barely supports the simplest cases, and will throw an exception at
# pretty much anything else. Unfortunately, this does not cause the build to
# fail (since all the symbols are properly exported), and results instead in
# mysterious runtime errors. (See issue #31 for such an example.)
include(CMakePushCheckState)
include(CheckCXXSourceRuns)
function(check_cxx11_regex result_var)
# When cross-compiling, check_cxx_source_runs() below will cause the
# build to fail. Since libstdc++ 4.8 is pretty much obsolete by now,
# we may as well assume that everything is working fine.
if(CMAKE_CROSSCOMPILING)
message(STATUS "Skipping C++11 regular expressions check due to cross-compilation")
# Returning a true value that we could recognize if needed
set(${result_var} 42 PARENT_SCOPE)
return()
endif()
cmake_push_check_state()
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -std=c++11")
# With libstdc++ 4.8, this will compile but crash at runtime
check_cxx_source_runs("
#include <regex>
// Regex copied from Apple's SwiftCheckCXXNativeRegex.cmake
const std::regex re(\"([a]+)\");
int main() {
return 0;
}
" ${result_var})
set(${result_var} ${${result_var}} PARENT_SCOPE)
cmake_pop_check_state()
endfunction()
================================================
FILE: cmake/FindCcrtp.cmake
================================================
FIND_PATH(CCRTP_INCLUDE_DIR ccrtp/rtp.h)
FIND_LIBRARY(CCRTP_LIBRARIES NAMES ccrtp)
IF(CCRTP_INCLUDE_DIR AND CCRTP_LIBRARIES)
SET(CCRTP_FOUND TRUE)
ENDIF(CCRTP_INCLUDE_DIR AND CCRTP_LIBRARIES)
IF(CCRTP_FOUND)
IF (NOT Ccrtp_FIND_QUIETLY)
MESSAGE(STATUS "Found ccrtp includes: ${CCRTP_INCLUDE_DIR}/ccrtp/rtp.h")
MESSAGE(STATUS "Found ccrtp library: ${CCRTP_LIBRARIES}")
ENDIF (NOT Ccrtp_FIND_QUIETLY)
ELSE(CCRTP_FOUND)
IF (Ccrtp_FIND_REQUIRED)
MESSAGE(FATAL_ERROR "Could NOT find ccrtp development files")
ENDIF (Ccrtp_FIND_REQUIRED)
ENDIF(CCRTP_FOUND)
================================================
FILE: cmake/FindCommoncpp.cmake
================================================
FIND_PATH(COMMONCPP_INCLUDE_DIR commoncpp/config.h)
FIND_LIBRARY(COMMONCPP_LIBRARIES NAMES commoncpp)
IF(COMMONCPP_INCLUDE_DIR AND COMMONCPP_LIBRARIES)
SET(COMMONCPP_FOUND TRUE)
ENDIF(COMMONCPP_INCLUDE_DIR AND COMMONCPP_LIBRARIES)
IF(COMMONCPP_FOUND)
IF (NOT Commoncpp_FIND_QUIETLY)
MESSAGE(STATUS "Found commoncpp includes: ${COMMONCPP_INCLUDE_DIR}/commoncpp/config.h")
MESSAGE(STATUS "Found commoncpp library: ${COMMONCPP_LIBRARIES}")
ENDIF (NOT Commoncpp_FIND_QUIETLY)
ELSE(COMMONCPP_FOUND)
IF (Commoncpp_FIND_REQUIRED)
MESSAGE(FATAL_ERROR "Could NOT find commoncpp development files")
ENDIF (Commoncpp_FIND_REQUIRED)
ENDIF(COMMONCPP_FOUND)
================================================
FILE: cmake/FindG729.cmake
================================================
INCLUDE(CMakePushCheckState)
INCLUDE(CheckCSourceCompiles)
FIND_PATH(G729_INCLUDE_DIR bcg729/decoder.h)
FIND_LIBRARY(G729_LIBRARY NAMES bcg729)
IF(G729_INCLUDE_DIR AND G729_LIBRARY)
SET(G729_FOUND TRUE)
# The bcg729 API was changed in 1.0.2 to add support for G.729 Annex B.
# This checks whether we are dealing with the old or new API.
CMAKE_PUSH_CHECK_STATE()
SET(CMAKE_REQUIRED_INCLUDES "${INCLUDE_DIRECTORIES}" "${G729_INCLUDE_DIR}")
SET(CMAKE_REQUIRED_LIBRARIES "${G729_LIBRARY}")
SET(CMAKE_REQUIRED_QUIET TRUE)
# Try to compile something using the old (pre-1.0.2) API.
#
# We cannot do it the other way around, as initBcg729EncoderChannel()
# did not have a prototype before 1.0.2, thus compilation would not fail
# when passing it an extra argument.
CHECK_C_SOURCE_COMPILES("
#include <bcg729/encoder.h>
int main() {
/* This function requires an argument since 1.0.2 */
initBcg729EncoderChannel();
return 0;
}
" G729_OLD_API)
CMAKE_POP_CHECK_STATE()
IF (G729_OLD_API)
SET(G729_ANNEX_B FALSE)
ELSE (G729_OLD_API)
SET(G729_ANNEX_B TRUE)
ENDIF (G729_OLD_API)
ENDIF(G729_INCLUDE_DIR AND G729_LIBRARY)
IF(G729_FOUND)
IF (NOT G729_FIND_QUIETLY)
MESSAGE(STATUS "Found bcg729 includes: ${G729_INCLUDE_DIR}/bcg729/decoder.h")
MESSAGE(STATUS "Found bcg729 library: ${G729_LIBRARY}")
IF (G729_ANNEX_B)
MESSAGE(STATUS "bcg729 supports Annex B; using the new (1.0.2) API")
ELSE (G729_ANNEX_B)
MESSAGE(STATUS "bcg729 does not support Annex B; using the old (pre-1.0.2) API")
ENDIF (G729_ANNEX_B)
ENDIF (NOT G729_FIND_QUIETLY)
ELSE(G729_FOUND)
IF (G729_FIND_REQUIRED)
MESSAGE(FATAL_ERROR "Could NOT find bcg729 development files")
ENDIF (G729_FIND_REQUIRED)
ENDIF(G729_FOUND)
================================================
FILE: cmake/FindGsm.cmake
================================================
FIND_PATH(GSM_INCLUDE_DIR gsm/gsm.h)
FIND_LIBRARY(GSM_LIBRARY NAMES gsm)
IF(GSM_INCLUDE_DIR AND GSM_LIBRARY)
SET(GSM_FOUND TRUE)
ENDIF(GSM_INCLUDE_DIR AND GSM_LIBRARY)
IF(GSM_FOUND)
IF (NOT Gsm_FIND_QUIETLY)
MESSAGE(STATUS "Found gsm includes: ${GSM_INCLUDE_DIR}/gsm/config.h")
MESSAGE(STATUS "Found gsm library: ${GSM_LIBRARY}")
ENDIF (NOT Gsm_FIND_QUIETLY)
ELSE(GSM_FOUND)
IF (Gsm_FIND_REQUIRED)
MESSAGE(FATAL_ERROR "Could NOT find gsm development files")
ENDIF (Gsm_FIND_REQUIRED)
ENDIF(GSM_FOUND)
================================================
FILE: cmake/FindIlbc.cmake
================================================
include (CMakePushCheckState)
include (CheckCXXSourceCompiles)
FIND_PATH(ILBC_INCLUDE_DIR ilbc/iLBC_decode.h)
FIND_LIBRARY(ILBC_LIBRARIES NAMES ilbc)
IF(ILBC_INCLUDE_DIR AND ILBC_LIBRARIES)
SET(ILBC_FOUND TRUE)
# Check if libilbc can be used without 'extern "C"'
CMAKE_PUSH_CHECK_STATE()
LIST(APPEND CMAKE_REQUIRED_INCLUDES "${ILBC_INCLUDE_DIR}")
LIST(APPEND CMAKE_REQUIRED_LIBRARIES "-lilbc")
SET(CMAKE_REQUIRED_QUIET TRUE)
CHECK_CXX_SOURCE_COMPILES("
#include <ilbc/iLBC_decode.h>
int main() {
iLBC_Dec_Inst_t *iLBCdec_inst;
initDecode(iLBCdec_inst, 0, 0);
return 0;
}
" ILBC_CPP)
CMAKE_POP_CHECK_STATE()
ENDIF(ILBC_INCLUDE_DIR AND ILBC_LIBRARIES)
IF(ILBC_FOUND)
IF (NOT Ilbc_FIND_QUIETLY)
MESSAGE(STATUS "Found ilbc includes: ${ILBC_INCLUDE_DIR}/ilbc/iLBC_decode.h")
MESSAGE(STATUS "Found ilbc library: ${ILBC_LIBRARIES}")
ENDIF (NOT Ilbc_FIND_QUIETLY)
ELSE(ILBC_FOUND)
IF (Ilbc_FIND_REQUIRED)
MESSAGE(FATAL_ERROR "Could NOT find ilbc development files")
ENDIF (Ilbc_FIND_REQUIRED)
ENDIF(ILBC_FOUND)
================================================
FILE: cmake/FindLibMagic.cmake
================================================
# - Try to find libmagic header and library
#
# Usage of this module as follows:
#
# find_package(LibMagic)
#
# Variables used by this module, they can change the default behaviour and need
# to be set before calling find_package:
#
# LibMagic_ROOT_DIR Set this variable to the root installation of
# libmagic if the module has problems finding the
# proper installation path.
#
# Variables defined by this module:
#
# LIBMAGIC_FOUND System has libmagic and magic.h
# LibMagic_FILE_EXE Path to the 'file' command (if available)
# LibMagic_VERSION Version of libmagic (if available)
# LibMagic_LIBRARY The libmagic library
# LibMagic_INCLUDE_DIR The location of magic.h
find_path(LibMagic_ROOT_DIR
NAMES include/magic.h
)
if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
# the static version of the library is preferred on OS X for the
# purposes of making packages (libmagic doesn't ship w/ OS X)
set(libmagic_names libmagic.a magic)
else ()
set(libmagic_names magic)
endif ()
find_program(LibMagic_FILE_EXE
NAMES file
HINTS ${LibMagic_ROOT_DIR}/bin
)
find_library(LibMagic_LIBRARY
NAMES ${libmagic_names}
HINTS ${LibMagic_ROOT_DIR}/lib
)
find_path(LibMagic_INCLUDE_DIR
NAMES magic.h
HINTS ${LibMagic_ROOT_DIR}/include
)
if (LibMagic_FILE_EXE)
execute_process(COMMAND "${LibMagic_FILE_EXE}" --version
ERROR_VARIABLE LibMagic_VERSION
OUTPUT_VARIABLE LibMagic_VERSION)
string(REGEX REPLACE "^file-([0-9.]+).*$" "\\1"
LibMagic_VERSION "${LibMagic_VERSION}")
message(STATUS "libmagic version: ${LibMagic_VERSION}")
else ()
set(LibMagic_VERSION NOTFOUND)
endif ()
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(LibMagic DEFAULT_MSG
LibMagic_LIBRARY
LibMagic_INCLUDE_DIR
)
mark_as_advanced(
LibMagic_ROOT_DIR
LibMagic_FILE_EXE
LibMagic_VERSION
LibMagic_LIBRARY
LibMagic_INCLUDE_DIR
)
================================================
FILE: cmake/FindLibSndfile.cmake
================================================
FIND_PATH(LIBSNDFILE_INCLUDE_DIR sndfile.h)
SET(LIBSNDFILE_NAMES ${LIBSNDFILE_NAMES} sndfile)
FIND_LIBRARY(LIBSNDFILE_LIBRARY NAMES ${LIBSNDFILE_NAMES} PATH)
IF(LIBSNDFILE_INCLUDE_DIR AND LIBSNDFILE_LIBRARY)
SET(LIBSNDFILE_FOUND TRUE)
ENDIF(LIBSNDFILE_INCLUDE_DIR AND LIBSNDFILE_LIBRARY)
IF(LIBSNDFILE_FOUND)
IF(NOT LibSndfile_FIND_QUIETLY)
MESSAGE(STATUS "Found LibSndfile: ${LIBSNDFILE_LIBRARY}")
ENDIF (NOT LibSndfile_FIND_QUIETLY)
ELSE(LIBSNDFILE_FOUND)
IF(LibSndfile_FIND_REQUIRED)
MESSAGE(FATAL_ERROR "Could not find sndfile")
ENDIF(LibSndfile_FIND_REQUIRED)
ENDIF (LIBSNDFILE_FOUND)
================================================
FILE: cmake/FindReadline.cmake
================================================
# - Try to find readline include dirs and libraries
#
# Usage of this module as follows:
#
# find_package(Readline)
#
# Variables used by this module, they can change the default behaviour and need
# to be set before calling find_package:
#
# Readline_ROOT_DIR Set this variable to the root installation of
# readline if the module has problems finding the
# proper installation path.
#
# Variables defined by this module:
#
# READLINE_FOUND System has readline, include and lib dirs found
# Readline_INCLUDE_DIR The readline include directories.
# Readline_LIBRARY The readline library.
find_path(Readline_ROOT_DIR
NAMES include/readline/readline.h
)
find_path(Readline_INCLUDE_DIR
NAMES readline/readline.h
HINTS ${Readline_ROOT_DIR}/include
)
find_library(Readline_LIBRARY
NAMES readline
HINTS ${Readline_ROOT_DIR}/lib
)
if(Readline_INCLUDE_DIR AND Readline_LIBRARY AND Ncurses_LIBRARY)
set(READLINE_FOUND TRUE)
else(Readline_INCLUDE_DIR AND Readline_LIBRARY AND Ncurses_LIBRARY)
FIND_LIBRARY(Readline_LIBRARY NAMES readline)
include(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(Readline DEFAULT_MSG Readline_INCLUDE_DIR Readline_LIBRARY )
MARK_AS_ADVANCED(Readline_INCLUDE_DIR Readline_LIBRARY)
endif(Readline_INCLUDE_DIR AND Readline_LIBRARY AND Ncurses_LIBRARY)
mark_as_advanced(
Readline_ROOT_DIR
Readline_INCLUDE_DIR
Readline_LIBRARY
)
================================================
FILE: cmake/FindSpeex.cmake
================================================
FIND_PATH(SPEEX_INCLUDE_DIR speex/speex.h)
FIND_LIBRARY(SPEEX_LIBRARY NAMES speex)
FIND_LIBRARY(SPEEXDSP_LIBRARY NAMES speexdsp)
IF(SPEEX_INCLUDE_DIR AND SPEEX_LIBRARY AND SPEEXDSP_LIBRARY)
SET(SPEEX_FOUND TRUE)
SET(SPEEX_LIBRARIES ${SPEEX_LIBRARY} ${SPEEXDSP_LIBRARY})
ENDIF(SPEEX_INCLUDE_DIR AND SPEEX_LIBRARY AND SPEEXDSP_LIBRARY)
IF(SPEEX_FOUND)
IF (NOT Speex_FIND_QUIETLY)
MESSAGE(STATUS "Found speex includes: ${SPEEX_INCLUDE_DIR}/speex/speex.h")
MESSAGE(STATUS "Found speex library: ${SPEEX_LIBRARIES}")
ENDIF (NOT Speex_FIND_QUIETLY)
ELSE(SPEEX_FOUND)
IF (Speex_FIND_REQUIRED)
MESSAGE(FATAL_ERROR "Could NOT find speex development files")
ENDIF (Speex_FIND_REQUIRED)
ENDIF(SPEEX_FOUND)
================================================
FILE: cmake/FindUcommon.cmake
================================================
FIND_PATH(UCOMMON_INCLUDE_DIR ucommon/ucommon.h)
FIND_LIBRARY(UCOMMON_LIBRARIES NAMES ucommon)
FIND_LIBRARY(USECURE_LIBRARIES NAMES usecure)
IF(UCOMMON_INCLUDE_DIR AND UCOMMON_LIBRARIES AND USECURE_LIBRARIES)
SET(UCOMMON_FOUND TRUE)
SET(UCOMMON_LIBRARIES ${UCOMMON_LIBRARIES} ${USECURE_LIBRARIES})
ENDIF(UCOMMON_INCLUDE_DIR AND UCOMMON_LIBRARIES AND USECURE_LIBRARIES)
IF(UCOMMON_FOUND)
IF (NOT Ucommon_FIND_QUIETLY)
MESSAGE(STATUS "Found ucommon includes: ${UCOMMON_INCLUDE_DIR}/ucommon/ucommon.h")
MESSAGE(STATUS "Found ucommon library: ${UCOMMON_LIBRARIES}")
ENDIF (NOT Ucommon_FIND_QUIETLY)
ELSE(UCOMMON_FOUND)
IF (Ucommon_FIND_REQUIRED)
MESSAGE(FATAL_ERROR "Could NOT find ucommon development files")
ENDIF (Ucommon_FIND_REQUIRED)
ENDIF(UCOMMON_FOUND)
================================================
FILE: cmake/FindZrtpcpp.cmake
================================================
FIND_PATH(ZRTPCPP_INCLUDE_DIR libzrtpcpp/zrtpccrtp.h)
FIND_LIBRARY(ZRTPCPP_LIBRARIES NAMES zrtpcpp)
IF(ZRTPCPP_INCLUDE_DIR AND ZRTPCPP_LIBRARIES)
SET(ZRTPCPP_FOUND TRUE)
ENDIF(ZRTPCPP_INCLUDE_DIR AND ZRTPCPP_LIBRARIES)
IF(ZRTPCPP_FOUND)
IF (NOT Zrtpcpp_FIND_QUIETLY)
MESSAGE(STATUS "Found libzrtpcpp includes: ${ZRTPCPP_INCLUDE_DIR}/libzrtpcpp/zrtpccrtp.h")
MESSAGE(STATUS "Found libzrtpcpp library: ${ZRTPCPP_LIBRARIES}")
SET(ZRTPCPP_INCLUDE_DIR ${ZRTPCPP_INCLUDE_DIR} "${ZRTPCPP_INCLUDE_DIR}/libzrtpcpp")
ENDIF (NOT Zrtpcpp_FIND_QUIETLY)
ELSE(ZRTPCPP_FOUND)
IF (Zrtpcpp_FIND_REQUIRED)
MESSAGE(FATAL_ERROR "Could NOT find libzrtpcpp development files")
ENDIF (Zrtpcpp_FIND_REQUIRED)
ENDIF(ZRTPCPP_FOUND)
================================================
FILE: data/providers.csv
================================================
# provider;domain;sip proxy;stun server
sipgate.at;sipgate.at;;sipgate.at
sipgate.co.uk;sipgate.co.uk;;sipgate.co.uk
sipgate.de;sipgate.de;;sipgate.de
SIPphone!;proxy01.sipphone.com;;stun01.sipphone.com
================================================
FILE: data/twinkle.1
================================================
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.2.
.TH TWINKLE "1" "January 2016" "Twinkle 1.10.0 - 15 July 2016" "User Commands"
.SH NAME
Twinkle \- Twinkle 1.10.0
.SH SYNOPSIS
.B twinkle
[\fI\,options\/\fR]
.SH OPTIONS
.TP
\fB\-c\fR
Run in command line interface (CLI) mode
.TP
\fB\-\-share\fR <dir>
Set the share directory.
.TP
\fB\-f\fR <profile>
Startup with a specific profile. You will not be requested
to choose a profile at startup. The profiles that you created
are the .cfg files in your .twinkle directory.
You may specify multiple profiles separated by spaces.
.TP
\fB\-\-force\fR
If a lock file is detected at startup, then override it
and startup.
.HP
\fB\-\-sip\-port\fR <port>
.IP
Port for SIP signalling.
This port overrides the port from the system settings.
.HP
\fB\-\-rtp\-port\fR <port>
.IP
Port for RTP.
This port overrides the port from the system settings.
.HP
\fB\-\-call\fR <address>
.IP
Instruct Twinkle to call the address.
When Twinkle is already running, this will instruct the running
process to call the address.
The address may be a full or partial SIP URI. A partial SIP URI
will be completed with the information from the user profile.
.IP
A subject may be passed by appending '?subject=<subject>'
to the address.
.IP
Examples:
twinkle \fB\-\-call\fR 123456
twinkle \fB\-\-call\fR sip:example@example.com?subject=hello
.HP
\fB\-\-cmd\fR <cli command>
.IP
Instruct Twinkle to execute the CLI command. You can run
all commands from the command line interface mode.
When Twinkle is already running, this will instruct the running
process to execute the CLI command.
.IP
Examples:
twinkle \fB\-\-cmd\fR answer
twinkle \fB\-\-cmd\fR mute
twinkle \fB\-\-cmd\fR 'transfer 12345'
.TP
\fB\-\-immediate\fR
This option can be used in conjunction with \fB\-\-call\fR or \fB\-\-cmd\fR
It indicates the the command or call is to be performed
immediately without asking the user for any confirmation.
.HP
\fB\-\-set\-profile\fR <profile>
.IP
Make <profile> the active profile.
When using this option in conjunction with \fB\-\-call\fR and \fB\-\-cmd\fR,
then the profile is activated before executing \fB\-\-call\fR or
\fB\-\-cmd\fR.
.TP
\fB\-\-show\fR
Instruct a running instance of Twinkle to show the main window
and take focus.
.TP
\fB\-\-hide\fR
Instruct a running instance of Twinkle to hide in the system tray.
If no system tray is used, then Twinkle will minimize.
.HP
\fB\-\-help\-cli\fR [cli command]
.IP
Without a cli command this option lists all available CLI
commands. With a CLI command this option prints help on
the CLI command.
.TP
\fB\-\-version\fR
Get version information.
.SH COPYRIGHT
Copyright \(co 2005\-2015 Michel de Boer and contributors
http://twinkle.dolezel.info
.PP
Built with support for: ALSA, Speex, iLBC, ZRTP
.PP
Contributions:
* Werner Dittmann (ZRTP/SRTP)
* Bogdan Harjoc (AKAv1\-MD5, Service\-Route)
* Roman Imankulov (command line editing)
* Ondrej Moris (codec preprocessing)
* Rickard Petzall (ALSA)
.PP
This software contains the following software from 3rd parties:
* GSM codec from Jutta Degener and Carsten Bormann, University of Berlin
* G.711/G.726 codecs from Sun Microsystems (public domain)
* iLBC implementation from RFC 3951 (www.ilbcfreeware.org)
* Parts of the STUN project at http://sourceforge.net/projects/stun
* Parts of libsrv at http://libsrv.sourceforge.net/
.PP
For RTP the following dynamic libraries are linked:
* GNU ccRTP \- http://www.gnu.org/software/ccrtp
* GNU uCommon C++ \- https://www.gnu.org/software/commoncpp/
.PP
Twinkle comes with ABSOLUTELY NO WARRANTY.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
.SH "SEE ALSO"
The full documentation for
.B Twinkle
is maintained as a Texinfo manual. If the
.B info
and
.B Twinkle
programs are properly installed at your site, the command
.IP
.B info Twinkle
.PP
should give you access to the complete manual.
================================================
FILE: sip.protocol
================================================
[Protocol]
exec=twinkle --call %u
protocol=sip
input=none
output=none
helper=true
listing=
reading=false
writing=false
makedir=false
deleting=false
Icon=multimedia
================================================
FILE: src/CMakeLists.txt
================================================
project(libtwinkle)
include_directories("${CMAKE_CURRENT_SOURCE_DIR}")
add_subdirectory(audio)
if (NOT WITH_GSM)
add_subdirectory(audio/gsm/src)
endif (NOT WITH_GSM)
add_subdirectory(audits)
add_subdirectory(im)
add_subdirectory(mwi)
add_subdirectory(parser)
add_subdirectory(patterns)
add_subdirectory(presence)
add_subdirectory(sdp)
add_subdirectory(sockets)
add_subdirectory(stun)
add_subdirectory(threads)
add_subdirectory(utils)
set(LIBTWINKLE_SRCS
abstract_dialog.cpp
address_book.cpp
auth.cpp
call_history.cpp
call_script.cpp
client_request.cpp
cmd_socket.cpp
dialog.cpp
diamondcard.cpp
epa.cpp
events.cpp
id_object.cpp
line.cpp
listener.cpp
log.cpp
phone.cpp
phone_user.cpp
prohibit_thread.cpp
redirect.cpp
sender.cpp
service.cpp
session.cpp
sub_refer.cpp
subscription.cpp
subscription_dialog.cpp
sys_settings.cpp
timekeeper.cpp
transaction.cpp
transaction_layer.cpp
transaction_mgr.cpp
user.cpp
userintf.cpp
util.cpp
)
add_library(libtwinkle OBJECT ${LIBTWINKLE_SRCS})
set(twinkle_OBJS
$<TARGET_OBJECTS:libtwinkle>
$<TARGET_OBJECTS:libtwinkle-audio>
$<TARGET_OBJECTS:libtwinkle-audits>
$<TARGET_OBJECTS:libtwinkle-im>
$<TARGET_OBJECTS:libtwinkle-mwi>
$<TARGET_OBJECTS:libtwinkle-parser>
$<TARGET_OBJECTS:libtwinkle-patterns>
$<TARGET_OBJECTS:libtwinkle-presence>
$<TARGET_OBJECTS:libtwinkle-sdp>
$<TARGET_OBJECTS:libtwinkle-sockets>
$<TARGET_OBJECTS:libtwinkle-stun>
$<TARGET_OBJECTS:libtwinkle-threads>
$<TARGET_OBJECTS:libtwinkle-utils>
)
if (NOT WITH_GSM)
list(APPEND twinkle_OBJS $<TARGET_OBJECTS:libtwinkle-gsm>)
endif (NOT WITH_GSM)
add_executable(twinkle-console
main.cpp
${twinkle_OBJS}
)
set(twinkle_LIBS
${ATOMIC_LIBRARY}
-lpthread
${RESOLV_LIBRARY}
${LibMagic_LIBRARY}
${LIBXML2_LIBRARIES}
${Readline_LIBRARY}
${ILBC_LIBRARIES}
${SPEEX_LIBRARIES}
${ZRTPCPP_LIBRARIES}
${CCRTP_LIBRARIES}
${COMMONCPP_LIBRARIES}
${UCOMMON_LIBRARIES}
${LIBSNDFILE_LIBRARY}
${ALSA_LIBRARY}
${G729_LIBRARY}
)
if (WITH_GSM)
list(APPEND twinkle_LIBS ${GSM_LIBRARY})
endif (WITH_GSM)
if (WITH_QT5)
add_subdirectory(gui)
endif (WITH_QT5)
target_link_libraries(twinkle-console ${twinkle_LIBS})
install(TARGETS twinkle-console DESTINATION bin)
================================================
FILE: src/abstract_dialog.cpp
================================================
/*
Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include <cstdlib>
#include <assert.h>
#include <iostream>
#include "abstract_dialog.h"
#include "log.h"
#include "phone.h"
#include "phone_user.h"
#include "sockets/ipaddr.h"
#include "util.h"
#include "userintf.h"
#include "audits/memman.h"
extern string user_host;
extern t_phone *phone;
// Private
void t_abstract_dialog::remove_client_request(t_client_request **cr) {
if ((*cr)->dec_ref_count() == 0) {
MEMMAN_DELETE(*cr);
delete *cr;
}
*cr = NULL;
}
// Create a request within a dialog
// RFC 3261 12.2.1.1
t_request *t_abstract_dialog::create_request(t_method m) {
t_user *user_config = phone_user->get_user_profile();
t_request *r = new t_request(m);
MEMMAN_NEW(r);
// To header
r->hdr_to.set_uri(remote_uri);
r->hdr_to.set_display(remote_display);
r->hdr_to.set_tag(remote_tag);
// From header
r->hdr_from.set_uri(local_uri);
r->hdr_from.set_display(local_display);
r->hdr_from.set_tag(local_tag);
// Call-ID header
r->hdr_call_id.set_call_id(call_id);
// CSeq header
r->hdr_cseq.set_method(m);
r->hdr_cseq.set_seqnr(++local_seqnr);
// Set Max-Forwards header
r->hdr_max_forwards.set_max_forwards(MAX_FORWARDS);
// User-Agent
SET_HDR_USER_AGENT(r->hdr_user_agent);
// RFC 3261 12.2.1.1
// Request URI and Route header
r->set_route(remote_target_uri, route_set);
// Caculate destination set. A DNS request can result in multiple
// IP address. In failover scenario's the request must be sent to
// the next IP address in the list. As the request will be copied
// in various places, the destination set must be calculated now.
// In previous version the DNS request was done by the transaction
// manager. This is too late as the transaction manager gets a copy
// of the request. The destination set should be set in the copy
// kept by the dialog.
r->calc_destinations(*user_config);
// The Via header can only be created after the destinations
// are calculated, because the destination deterimines which
// local IP address should be used.
// Via header
IPaddr local_ip = r->get_local_ip();
t_via via(USER_HOST(user_config, h_ip2str(local_ip)), PUBLIC_SIP_PORT(user_config));
r->hdr_via.add_via(via);
return r;
}
void t_abstract_dialog::create_route_set(t_response *r) {
// Originally the check was this:
// if (route_set.empty() && r->hdr_record_route.is_populated())
// This prevented the route set from being altered between a 18X response
// and a 2XX response. This is allowed per RFC 3261 13.2.2.4
if (r->hdr_record_route.is_populated())
{
route_set = r->hdr_record_route.route_list;
route_set.reverse();
} else {
route_set.clear();
}
}
void t_abstract_dialog::create_remote_target(t_response *r) {
if (r->hdr_contact.is_populated()) {
remote_target_uri = r->hdr_contact.contact_list.front().uri;
remote_target_display = r->hdr_contact.contact_list.front().display;
}
}
void t_abstract_dialog::resend_request(t_client_request *cr) {
t_user *user_config = phone_user->get_user_profile();
t_request *req = cr->get_request();
// A new sequence number must be assigned
req->hdr_cseq.set_seqnr(++local_seqnr);
// Create a new via-header. Otherwise the
// request will be seen as a retransmission
IPaddr local_ip = req->get_local_ip();
req->hdr_via.via_list.clear();
t_via via(USER_HOST(user_config, h_ip2str(local_ip)), PUBLIC_SIP_PORT(user_config));
req->hdr_via.add_via(via);
cr->renew(0);
send_request(req, cr->get_tuid());
}
bool t_abstract_dialog::resend_request_auth(t_client_request *cr, t_response *resp) {
t_user *user_config = phone_user->get_user_profile();
t_request *req = cr->get_request();
// Add authorization header, increment CSeq and create new branch id
if (phone->authorize(user_config, req, resp)) {
resend_request(cr);
return true;
}
return false;
}
bool t_abstract_dialog::redirect_request(t_client_request *cr, t_response *resp,
t_contact_param &contact)
{
t_user *user_config = phone_user->get_user_profile();
// If the response is a 3XX response then add redirection contacts
if (resp->get_class() == R_3XX && resp->hdr_contact.is_populated()) {
cr->redirector.add_contacts(
resp->hdr_contact.contact_list);
}
// Get next destination
if (!cr->redirector.get_next_contact(contact)) {
// There is no next destination
return false;
}
t_request *req = cr->get_request();
// Ask user for permission to redirect if indicated by user config
if (user_config->get_ask_user_to_redirect()) {
if(!ui->cb_ask_user_to_redirect_request(user_config,
contact.uri, contact.display, resp->hdr_cseq.method))
{
// User did not permit to redirect
return false;
}
}
// Change the request URI to the new URI.
// As the URI changes the destination set must be recalculated
req->uri = contact.uri;
req->calc_destinations(*user_config);
resend_request(cr);
return true;
}
bool t_abstract_dialog::failover_request(t_client_request *cr) {
log_file->write_report("Failover to next destination.",
"t_abstract_dialog::failover_request");
t_request *req = cr->get_request();
// Get next destination
if (!req->next_destination()) {
log_file->write_report("No next destination for failover.",
"t_abstract_dialog::failover_request");
return false;
}
resend_request(cr);
return true;
}
////////////
// Public
////////////
t_abstract_dialog::t_abstract_dialog(t_phone_user *pu) :
t_id_object()
{
assert(pu);
phone_user = pu;
call_id_owner = false;
local_seqnr = 0;
remote_seqnr = 0;
remote_seqnr_set = false;
local_resp_nr = 0;
remote_resp_nr = 0;
remote_ip_port.clear();
log_file->write_header("t_abstract_dialog::t_abstract_dialog", LOG_NORMAL, LOG_DEBUG);
log_file->write_raw("Created dialog, id=");
log_file->write_raw(get_object_id());
log_file->write_endl();
log_file->write_footer();
}
t_abstract_dialog::~t_abstract_dialog() {
log_file->write_header("t_abstract_dialog::~t_abstract_dialog", LOG_NORMAL, LOG_DEBUG);
log_file->write_raw("Destroy dialog, id=");
log_file->write_raw(get_object_id());
log_file->write_endl();
log_file->write_footer();
}
t_user *t_abstract_dialog::get_user(void) const {
return phone_user->get_user_profile();
}
void t_abstract_dialog::recvd_response(t_response *r, t_tuid tuid, t_tid tid) {
// The source address and port of a message may be 0 when the
// message was sent internally.
if (!r->src_ip_port.is_null()) {
remote_ip_port = r->src_ip_port;
}
}
void t_abstract_dialog::recvd_request(t_request *r, t_tuid tuid, t_tid tid) {
// The source address and port of a message may be 0 when the
// message was sent internally.
if (!r->src_ip_port.is_null()) {
remote_ip_port = r->src_ip_port;
}
}
bool t_abstract_dialog::match_response(t_response *r, t_tuid tuid) {
return (call_id == r->hdr_call_id.call_id &&
local_tag == r->hdr_from.tag &&
(remote_tag.size() == 0 || remote_tag == r->hdr_to.tag));
}
bool t_abstract_dialog::match_request(t_request *r) {
return match(r->hdr_call_id.call_id, r->hdr_to.tag, r->hdr_from.tag);
}
bool t_abstract_dialog::match_partial_request(t_request *r) {
return (r->hdr_call_id.call_id == call_id &&
r->hdr_to.tag == local_tag);
}
bool t_abstract_dialog::match(const string &_call_id, const string &to_tag,
const string &from_tag) const
{
return (call_id == _call_id &&
local_tag == to_tag &&
remote_tag == from_tag);
}
t_url t_abstract_dialog::get_remote_target_uri(void) const {
return remote_target_uri;
}
string t_abstract_dialog::get_remote_target_display(void) const {
return remote_target_display;
}
t_url t_abstract_dialog::get_remote_uri(void) const {
return remote_uri;
}
string t_abstract_dialog::get_remote_display(void) const {
return remote_display;
}
t_ip_port t_abstract_dialog::get_remote_ip_port(void) const {
return remote_ip_port;
}
string t_abstract_dialog::get_call_id(void) const {
return call_id;
}
string t_abstract_dialog::get_local_tag(void) const {
return local_tag;
}
string t_abstract_dialog::get_remote_tag(void) const {
return remote_tag;
}
bool t_abstract_dialog::remote_extension_supported(const string &extension) const {
return (remote_extensions.find(extension) != remote_extensions.end());
}
bool t_abstract_dialog::is_call_id_owner(void) const {
return call_id_owner;
}
================================================
FILE: src/abstract_dialog.h
================================================
/*
Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
/**
* @file
* Abstract class for all types of SIP dialogs.
*/
#ifndef _ABSTRACT_DIALOG_H
#define _ABSTRACT_DIALOG_H
#include <string>
#include <list>
#include <set>
#include <queue>
#include "client_request.h"
#include "id_object.h"
#include "protocol.h"
#include "sockets/url.h"
#include "parser/request.h"
using namespace std;
// Forward declaration
class t_phone_user;
/**
* Abstract class for all types of SIP dialogs.
* Concrete classes for all SIP dialogs inherit from this class.
*/
class t_abstract_dialog : public t_id_object {
protected:
/**
* Phone user for which this dialog is created.
* This pointer should never be deleted.
*/
t_phone_user *phone_user;
string call_id; /**< SIP call id. */
bool call_id_owner; /**< Indicates if the call id is generated locally. */
string local_tag; /**< Local tag value. */
string remote_tag; /**< Remote tag value. */
unsigned long local_seqnr; /**< Last local sequence number issued. */
unsigned long remote_seqnr; /**< Last remote sequence number received. */
/**
* The remote_seqnr_set indicates if the remote_seqnr is set by the far-end.
* RFC 3261 allows the CSeq sequence number to be 0. So there is no
* invalid sequence number.
*/
bool remote_seqnr_set;
t_url local_uri; /**< URI of the local party (From/To headers). */
string local_display; /**< Display name of the local party. */
t_url remote_uri; /**< URI of the remote party (From/To headers). */
string remote_display; /**< Display name of the remote party. */
/** URI of the remote target (Contact header). This is the destination for a request. */
t_url remote_target_uri;
string remote_target_display; /**< Display name of the remote target. */
list<t_route> route_set; /**< The route set. */
unsigned long local_resp_nr; /**< Last local response number (for 100rel) issued. */
unsigned long remote_resp_nr; /**< Last remote response number (for 100rel) received. */
set<string> remote_extensions; /**< SIP extensions supported by the remote party. */
/** The IP transport/address/port from which the last SIP message was received. */
t_ip_port remote_ip_port;
/**
* Remove a client request. Pass one of the client request
* pointers to this member. The reference count of the
* request will be decremented. If it becomes zero, then
* the request object is deleted.
* In all cases the passed pointer will be set to NULL.
* @param cr [in] The client request.
*/
void remove_client_request(t_client_request **cr);
/**
* Create route set from the Record-Route header of a response.
* If the response does not have a Record-Route header, then the route
* set is cleared.
* @param r [in] The response.
*/
void create_route_set(t_response *r);
/**
* Create remote target uri and display from the Contact header of a response.
* @param r [in] The response.
*/
void create_remote_target(t_response *r);
/**
* Send a request within the dialog.
* Sending a request will create a SIP transaction.
* @param r [in] The request.
* @param tuid [in] The transaction user id to be assigend to the transaction.
*/
virtual void send_request(t_request *r, t_tuid tuid) = 0;
/**
* Resend an existing client request.
* A new Via and CSeq header will be put in the request.
* Resending is different from retransmitting. Requests are automatically
* retransmitted by the transaction layer. Resending creates a new SIP
* transaction. Resending is f.i. done when a request must be redirected.
* @param cr [in] The client request.
*/
virtual void resend_request(t_client_request *cr);
/**
* Resend mid-dialog request with an authorization header containing
* credentials for the challenge in the response.
* @param cr [in] The request.
* @param resp [in] The 401 or 407 response.
* @return true, if resending succeeded.
* @return false, if credentials could not be determined.
*
* @pre The response must be a 401 or 407.
*/
bool resend_request_auth(t_client_request *cr, t_response *resp);
/**
* Redirect mid-dialog request to the next destination.
* There are multiple reasons for redirection:
* - A 3XX response was received.
* - The request failed with a non-3XX response. A next contact should be tried.
*
* @param cr [in] The request.
* @param resp [in] The failure response that was received on the request.
* @param contact [out] Contains on successful return the contact to which the request is sent.
* @return true, if the request is sent to a next destination.
* @return false, if no next destination exists.
*/
bool redirect_request(t_client_request *cr, t_response *resp,
t_contact_param &contact);
/**
* Failover request to the next destination from DNS lookup.
* @param cr [in] The request.
* @return true, if the request is sent to a next destination.
* @return false, if no next destination exists.
*/
bool failover_request(t_client_request *cr);
public:
/**
* Constructor.
* @param pu [in] Phone user for which the dialog must be created.
*/
t_abstract_dialog(t_phone_user *pu);
/**
* Destructor.
*/
virtual ~t_abstract_dialog();
/**
* Create a request using the stored dialog state information.
* @param m [in] Request method.
* @return The request.
*/
virtual t_request *create_request(t_method m);
/**
* Copy a dialog.
* @return A copy of the dialog.
*/
virtual t_abstract_dialog *copy(void) = 0;
/**
* Get a pointer to the user profile of the user for whom this dialog
* was created.
* @return The user profile.
*/
t_user *get_user(void) const;
/**
* Resend mid-dialog request with an authorization header containing
* credentials for the challenge in the response.
* @param resp [in] The 401 or 407 response to the request that must be resent.
* @return true, if resending succeeded.
* @return false, if credentials could not be determined.
*
* @pre The response must be a 401 or 407.
*/
virtual bool resend_request_auth(t_response *resp) = 0;
/**
* Redirect mid-dialog request to the next destination.
* @param resp [in] The response to the request that must be resent.
* @return true, if the request is sent to a next destination.
* @return false, if no next destination exists.
*/
virtual bool redirect_request(t_response *resp) = 0;
/**
* Failover request to the next destination from DNS lookup.
* @param resp [in] The response to the request that must be resent.
* @return true, if the request is sent to a next destination.
* @return false, if no next destination exists.
*/
virtual bool failover_request(t_response *resp) = 0;
/**
* Process a received response.
* @param r [in] The received response.
* @param tuid [in] The transaction user id of the transaction for the response.
* @param tid [in] The transaction id of the transaction for the response.
*/
virtual void recvd_response(t_response *r, t_tuid tuid, t_tid tid);
/**
* Process a received request.
* @param r [in] The received request.
* @param tuid [in] The transaction user id of the transaction for the request.
* @param tid [in] The transaction id of the transaction for the request.
*/
virtual void recvd_request(t_request *r, t_tuid tuid, t_tid tid);
/**
* Match a response with the dialog.
* @param r [in] The response.
* @param tuid [in] The transaction user id of the transaction for the response.
* @return true, if the response matches the dialog.
* @return false, otherwise.
*/
virtual bool match_response(t_response *r, t_tuid tuid);
/**
* Match a request with the dialog.
* @param r [in] The request.
* @return true, if the request matches the dialog.
* @return false, otherwise.
*/
virtual bool match_request(t_request *r);
/**
* Partially match a request with the dialog, i.e. do not match remote tag.
* @param r [in] The request.
* @return true, if the request partially matches the dialog.
* @return false, otherwise.
*/
virtual bool match_partial_request(t_request *r);
/**
* Match call-id and tags with the dialog.
* @param _call_id [in] SIP call-id.
* @param to_tag [in] SIP to-tag.
* @param from_tag [in] SIP from-tag.
* @return true, if call-id and tags match the dialog.
* @return false, otherwise.
*/
virtual bool match(const string &_call_id, const string &to_tag,
const string &from_tag) const;
/**
* Get the URI of the remote target.
* @return remote target URI.
* @see remote_target_uri
*/
t_url get_remote_target_uri(void) const;
/**
* Get the display name of the remote target.
* @return display name of remote target.
* @see remote_target_display
*/
string get_remote_target_display(void) const;
/**
* Get the URI of the remote party.
* @return URI of remote party.
* @see remote_uri
*/
t_url get_remote_uri(void) const;
/**
* Get the display name of the remote party.
* @return display name of the remote party.
* @see remote_display
*/
string get_remote_display(void) const;
/**
* Get the IP transport/address/port from which the last SIP message was received.
* @return transport/address/port
*/
t_ip_port get_remote_ip_port(void) const;
/**
* Get the SIP call id.
* @return SIP call id.
*/
string get_call_id(void) const;
/**
* Get the local tag.
* @return local tag.
*/
string get_local_tag(void) const;
/**
* Get the remote tag.
* @return remote tag.
*/
string get_remote_tag(void) const;
/**
* Check if the remote party supports a particular SIP exentsion.
* @param extension [in] Name of the SIP extension.
* @return true, if remote party supports the extension.
* @return false, otherwise.
*/
virtual bool remote_extension_supported(const string &extension) const;
/**
* Check if this dialog is the owner of the call id.
* @return true, if this dialog is the owner.
* @return false, otherwise.
* @see call_id_owner
*/
bool is_call_id_owner(void) const;
};
#endif
================================================
FILE: src/address_book.cpp
================================================
/*
Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include "address_book.h"
#include "sys_settings.h"
#include "translator.h"
#include "userintf.h"
#include "util.h"
// Call history file
#define ADDRESS_BOOK_FILE "twinkle.ab";
// Field seperator in call history file
#define REC_SEPARATOR '|'
////////////////////////////
// class t_address_card
////////////////////////////
string t_address_card::get_display_name(void) const {
string s;
if (!name_first.empty()) {
s = name_first;
}
if (!name_infix.empty()) {
if (!s.empty()) s += ' ';
s += name_infix;
}
if (!name_last.empty()) {
if (!s.empty()) s += ' ';
s += name_last;
}
return s;
}
bool t_address_card::create_file_record(vector<string> &v) const {
v.clear();
v.push_back(name_first);
v.push_back(name_infix);
v.push_back(name_last);
v.push_back(sip_address);
v.push_back(remark);
return true;
}
bool t_address_card::populate_from_file_record(const vector<string> &v) {
// Check number of fields
if (v.size() != 5) return false;
name_first = v[0];
name_infix = v[1];
name_last = v[2];
sip_address = v[3];
remark = v[4];
return true;
}
bool t_address_card::operator==(const t_address_card other) const {
return (name_first == other.name_first &&
name_infix == other.name_infix &&
name_last == other.name_last &&
sip_address == other.sip_address &&
remark == other.remark);
}
////////////////////////////
// class t_address_book
////////////////////////////
// Private
void t_address_book::find_address(t_user *user_config, const t_url &u) const {
if (u == last_url) return;
last_url = u;
last_name.clear();
// Normalize url using number conversion rules
t_url u_normalized(u);
u_normalized.apply_conversion_rules(user_config);
for (list<t_address_card>::const_iterator i = records.begin();
i != records.end(); i++)
{
string full_address = ui->expand_destination(user_config, i->sip_address,
u_normalized.get_scheme());
t_url url_phone(full_address);
if (!url_phone.is_valid()) continue;
if (u_normalized.user_host_match(url_phone,
user_config->get_remove_special_phone_symbols(),
user_config->get_special_phone_symbols()))
{
last_name = i->get_display_name();
return;
}
}
}
// Public
t_address_book::t_address_book() : utils::t_record_file<t_address_card>()
{
set_header("first_name|infix_name|last_name|sip_address|remark");
set_separator(REC_SEPARATOR);
string s(DIR_HOME);
s += "/";
s += USER_DIR;
s += "/";
s += ADDRESS_BOOK_FILE;
set_filename(s);
}
void t_address_book::add_address(const t_address_card &address) {
mtx_records.lock();
records.push_back(address);
mtx_records.unlock();
}
bool t_address_book::del_address(const t_address_card &address) {
mtx_records.lock();
list<t_address_card>::iterator it = find(records.begin(), records.end(),
address);
if (it == records.end()) {
mtx_records.unlock();
return false;
}
records.erase(it);
// Invalidate the cache for the address finder
last_url.set_url("");
mtx_records.unlock();
return true;
}
bool t_address_book::update_address(const t_address_card &old_address,
const t_address_card &new_address)
{
mtx_records.lock();
if (!del_address(old_address)) {
mtx_records.unlock();
return false;
}
records.push_back(new_address);
mtx_records.unlock();
return true;
}
string t_address_book::find_name(t_user *user_config, const t_url &u) const {
mtx_records.lock();
find_address(user_config, u);
string name = last_name;
mtx_records.unlock();
return name;
}
const list<t_address_card> &t_address_book::get_address_list(void) const {
return records;
}
================================================
FILE: src/address_book.h
================================================
/*
Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
/**
* @file
* Local address book.
*/
#ifndef _ADDRESS_BOOK_H
#define _ADDRESS_BOOK_H
#include <string>
#include <list>
#include "user.h"
#include "sockets/url.h"
#include "threads/mutex.h"
#include "utils/record_file.h"
using namespace std;
/** A single address card. */
class t_address_card : public utils::t_record {
public:
string name_last; /**< Last name. */
string name_first; /**< First name. */
string name_infix; /**< Infix name. */
string sip_address; /**< SIP address. */
string remark; /**< Remark. */
/**
* Get the display name derived from first, last and infix name.
* @return The display name.
*/
string get_display_name(void) const;
virtual bool create_file_record(vector<string> &v) const;
virtual bool populate_from_file_record(const vector<string> &v);
/** Equality check. */
bool operator==(const t_address_card other) const;
};
/**
* A book containing address cards. The user can
* create different address books.
*/
class t_address_book : public utils::t_record_file<t_address_card> {
private:
/** @name Cache for last searched name/url mapping */
//@{
mutable t_url last_url; /**< Last URL. */
mutable string last_name; /**< Lat name. */
//@}
/**
* Find a matching address for a url and cache the display name.
* @param user_config [in] The user profile.
* @param u [in] The url to find.
* @post If a matching address is found, then the URL and name are
* put in the cache. Otherwise the cache is cleared.
*/
void find_address(t_user *user_config, const t_url &u) const;
public:
/** Constructor. */
t_address_book();
/**
* Add an address.
* @param address [in] The address to be added.
*/
void add_address(const t_address_card &address);
/**
* Delete an address.
* @return true, if the address was successfully deleted.
* @return false, if the address does not exist.
*/
bool del_address(const t_address_card &address);
/**
* Update an address.
* @param old_address [in] The address to be updated.
* @param new_address [in] The updated address information.
* @return true, if the update was successful.
* @return false, if the old address does not exist.
*/
bool update_address(const t_address_card &old_address,
const t_address_card &new_address);
/**
* Find the display name for a SIP URL.
* @param user_config [in] The user profile.
* @param u [in] The SIP URL.
* @return The display name if a match was found.
* @return Empty string if no match can be found.
*/
string find_name(t_user *user_config, const t_url &u) const;
/**
* Get the list of addresses.
* @return The list of addresses.
*/
const list<t_address_card> &get_address_list(void) const;
};
extern t_address_book *ab_local;
#endif
================================================
FILE: src/audio/CMakeLists.txt
================================================
project(libtwinkle-audio)
set(LIBTWINKLE_AUDIO-SRCS
audio_device.cpp
audio_decoder.cpp
audio_encoder.cpp
audio_codecs.cpp
audio_rx.cpp
audio_session.cpp
audio_tx.cpp
dtmf_player.cpp
freq_gen.cpp
g711.cpp
g721.cpp
g722_decode.c
g722_encode.c
g723_16.cpp
g723_24.cpp
g723_40.cpp
g72x.cpp
media_buffer.cpp
rtp_telephone_event.cpp
tone_gen.cpp
twinkle_rtp_session.cpp
twinkle_zrtp_ui.cpp
)
add_library(libtwinkle-audio OBJECT ${LIBTWINKLE_AUDIO-SRCS})
================================================
FILE: src/audio/README_G711
================================================
The files in this directory comprise ANSI-C language reference implementations
of the CCITT (International Telegraph and Telephone Consultative Committee)
G.711, G.721 and G.723 voice compressions. They have been tested on Sun
SPARCstations and passed 82 out of 84 test vectors published by CCITT
(Dec. 20, 1988) for G.721 and G.723. [The two remaining test vectors,
which the G.721 decoder implementation for u-law samples did not pass,
may be in error because they are identical to two other vectors for G.723_40.]
This source code is released by Sun Microsystems, Inc. to the public domain.
Please give your acknowledgement in product literature if this code is used
in your product implementation.
Sun Microsystems supports some CCITT audio formats in Solaris 2.0 system
software. However, Sun's implementations have been optimized for higher
performance on SPARCstations.
The source files for CCITT conversion routines in this directory are:
g72x.h header file for g721.c, g723_24.c and g723_40.c
g711.c CCITT G.711 u-law and A-law compression
g72x.c common denominator of G.721 and G.723 ADPCM codes
g721.c CCITT G.721 32Kbps ADPCM coder (with g72x.c)
g723_24.c CCITT G.723 24Kbps ADPCM coder (with g72x.c)
g723_40.c CCITT G.723 40Kbps ADPCM coder (with g72x.c)
Simple conversions between u-law, A-law, and 16-bit linear PCM are invoked
as follows:
unsigned char ucode, acode;
short pcm_val;
ucode = linear2ulaw(pcm_val);
ucode = alaw2ulaw(acode);
acode = linear2alaw(pcm_val);
acode = ulaw2alaw(ucode);
pcm_val = ulaw2linear(ucode);
pcm_val = alaw2linear(acode);
The other CCITT compression routines are invoked as follows:
#include "g72x.h"
struct g72x_state state;
int sample, code;
g72x_init_state(&state);
code = {g721,g723_24,g723_40}_encoder(sample, coding, &state);
sample = {g721,g723_24,g723_40}_decoder(code, coding, &state);
where
coding = AUDIO_ENCODING_ULAW for 8-bit u-law samples
AUDIO_ENCODING_ALAW for 8-bit A-law samples
AUDIO_ENCODING_LINEAR for 16-bit linear PCM samples
This directory also includes the following sample programs:
encode.c CCITT ADPCM encoder
decode.c CCITT ADPCM decoder
Makefile makefile for the sample programs
The sample programs contain examples of how to call the various compression
routines and pack/unpack the bits. The sample programs read byte streams from
stdin and write to stdout. The input/output data is raw data (no file header
or other identifying information is embedded). The sample programs are
invoked as follows:
encode [-3|4|5] [-a|u|l] <infile >outfile
decode [-3|4|5] [-a|u|l] <infile >outfile
where:
-3 encode to (decode from) G.723 24kbps (3-bit) data
-4 encode to (decode from) G.721 32kbps (4-bit) data [the default]
-5 encode to (decode from) G.723 40kbps (5-bit) data
-a encode from (decode to) A-law data
-u encode from (decode to) u-law data [the default]
-l encode from (decode to) 16-bit linear data
Examples:
# Read 16-bit linear and output G.721
encode -4 -l <pcmfile >g721file
# Read 40Kbps G.723 and output A-law
decode -5 -a <g723file >alawfile
# Compress and then decompress u-law data using 24Kbps G.723
encode -3 <ulawin | deoced -3 >ulawout
================================================
FILE: src/audio/audio_codecs.cpp
================================================
/*
Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include <cstdlib>
#include "audio_codecs.h"
unsigned short audio_sample_rate(t_audio_codec codec) {
switch(codec) {
case CODEC_G711_ALAW:
case CODEC_G711_ULAW:
case CODEC_GSM:
case CODEC_SPEEX_NB:
case CODEC_ILBC:
case CODEC_G729A:
case CODEC_G726_16:
case CODEC_G726_24:
case CODEC_G726_32:
case CODEC_G726_40:
case CODEC_TELEPHONE_EVENT:
return 8000;
case CODEC_G722:
case CODEC_SPEEX_WB:
return 16000;
case CODEC_SPEEX_UWB:
return 32000;
default:
// Use 8000 as default rate
return 8000;
}
}
unsigned short audio_sample_rate_rtp(t_audio_codec codec) {
switch(codec) {
case CODEC_G722:
// RFC 3551 (s. 4.5.2) requires the RTP clock rate to be 8 kHz
return 8000;
default:
return audio_sample_rate(codec);
}
}
unsigned short audio_sample_rate_rtp_ratio(t_audio_codec codec) {
return audio_sample_rate(codec) / audio_sample_rate_rtp(codec);
}
bool is_speex_codec(t_audio_codec codec) {
return (codec == CODEC_SPEEX_NB ||
codec == CODEC_SPEEX_WB ||
codec == CODEC_SPEEX_UWB);
}
int resample(short *input_buf, int input_len, int input_sample_rate,
short *output_buf, int output_len, int output_sample_rate)
{
if (input_sample_rate > output_sample_rate) {
int downsample_factor = input_sample_rate / output_sample_rate;
int output_idx = -1;
for (int i = 0; i < input_len; i += downsample_factor) {
output_idx = i / downsample_factor;
if (output_idx >= output_len) {
// Output buffer is full
return output_len;
}
output_buf[output_idx] = input_buf[i];
}
return output_idx + 1;
} else {
int upsample_factor = output_sample_rate / input_sample_rate;
int output_idx = -1;
for (int i = 0; i < input_len; i++) {
for (int j = 0; j < upsample_factor; j++) {
output_idx = i * upsample_factor + j;
if (output_idx >= output_len) {
// Output buffer is full
return output_len;
}
output_buf[output_idx] = input_buf[i];
}
}
return output_idx + 1;
}
}
short mix_linear_pcm(short pcm1, short pcm2) {
long mixed_sample = long(pcm1) + long(pcm2);
// Compress a 17 bit PCM value into a 16-bit value.
// The easy way is to divide the value by 2, but this lowers
// the volume.
// Only lower the volume for the loud values. As for a normal
// voice call the values are not that loud, this gives better
// quality.
if (mixed_sample > 16384) {
mixed_sample = 16384 + (mixed_sample - 16384) / 3;
} else if (mixed_sample < -16384) {
mixed_sample = -16384 - (-16384 - mixed_sample) / 3;
}
return short(mixed_sample);
}
================================================
FILE: src/audio/audio_codecs.h
================================================
/*
Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef _AUDIO_CODECS_H
#define _AUDIO_CODECS_H
#include "g711.h"
#include "g72x.h"
// Audio codecs
enum t_audio_codec {
CODEC_NULL,
CODEC_UNSUPPORTED,
CODEC_G711_ALAW,
CODEC_G711_ULAW,
CODEC_GSM,
CODEC_SPEEX_NB,
CODEC_SPEEX_WB,
CODEC_SPEEX_UWB,
CODEC_ILBC,
CODEC_G722,
CODEC_G726_16,
CODEC_G726_24,
CODEC_G726_32,
CODEC_G726_40,
CODEC_TELEPHONE_EVENT,
CODEC_G729A
};
// Default ptime values (ms) for audio codecs
#define PTIME_G711_ALAW 20
#define PTIME_G711_ULAW 20
#define PTIME_G722 20
#define PTIME_G726 20
#define PTIME_GSM 20
#define PTIME_SPEEX 20
#define MIN_PTIME 10
#define MAX_PTIME 80
// Audio sample settings
#define AUDIO_SAMPLE_SIZE 16
// Maximum length (in packets) for concealment of lost packets
#define MAX_CONCEALMENT 2
// Size of jitter buffer in ms
// The jitter buffer is used to smooth playing out incoming RTP packets.
// The size of the buffer is also used as the expiry time in the ccRTP
// stack. Packets that have timestamp that is older than then size of
// the jitter buffer will not be sent out anymore.
#define JITTER_BUF_MS 80
// Duration of the expiry timer in the RTP stack.
// The ccRTP stack checks all data delivered to it against its clock.
// If the data is too old it will not send it out. Data can be old
// for several reasons:
//
// 1) The thread reading the soundcard has been paused for a while
// 2) The audio card buffers sound before releasing it.
//
// Especially the latter seems to happen on some soundcards. Data
// not older than defined delay are still allowed to go out. It's up
// to the receiving and to deal with the jitter this may cause.
#define MAX_OUT_AUDIO_DELAY_MS 160
// Buffer sizes
#define JITTER_BUF_SIZE(sample_rate) (JITTER_BUF_MS * (sample_rate)/1000 * AUDIO_SAMPLE_SIZE/8)
// Log speex errors
#define LOG_SPEEX_ERROR(func, spxfunc, spxerr) {\
log_file->write_header((func), LOG_NORMAL, LOG_DEBUG);\
log_file->write_raw("Speex error: ");\
log_file->write_raw((spxfunc));\
log_file->write_raw(" returned ");\
log_file->write_raw((spxerr));\
log_file->write_footer(); }
// Return the sampling rate for a codec
unsigned short audio_sample_rate(t_audio_codec codec);
// Some codecs (namely G.722 as far as we are concerned) are required to have
// an RTP clock rate that differs from the actual sampling rate
unsigned short audio_sample_rate_rtp(t_audio_codec codec);
// Ratio of sampling clock rate to RTP clock rate
unsigned short audio_sample_rate_rtp_ratio(t_audio_codec codec);
// Returns true if the codec is a speex codec
bool is_speex_codec(t_audio_codec codec);
// Resample the input buffer to the output buffer
// Returns the number of samples put in the output buffer
// If the output buffer is too small, the number of samples will be
// truncated.
int resample(short *input_buf, int input_len, int input_sample_rate,
short *output_buf, int output_len, int output_sample_rate);
// Mix 2 16 bits signed linear PCM values
short mix_linear_pcm(short pcm1, short pcm2);
#endif
================================================
FILE: src/audio/audio_decoder.cpp
================================================
/*
Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include <cassert>
#include <iostream>
#include "audio_decoder.h"
#include "log.h"
#ifdef HAVE_ILBC
#ifndef HAVE_ILBC_CPP
extern "C" {
#endif
#include <ilbc/iLBC_decode.h>
#ifndef HAVE_ILBC_CPP
}
#endif
#endif
//////////////////////////////////////////
// class t_audio_decoder
//////////////////////////////////////////
t_audio_decoder::t_audio_decoder(uint16 default_ptime, bool plc, t_user *user_config) :
_default_ptime(default_ptime),
_plc(plc),
_user_config(user_config)
{}
t_audio_codec t_audio_decoder::get_codec(void) const {
return _codec;
}
uint16 t_audio_decoder::get_default_ptime(void) const {
return _default_ptime;
}
bool t_audio_decoder::has_plc(void) const {
return _plc;
}
uint16 t_audio_decoder::conceal(int16 *pcm_buf, uint16 pcm_buf_size) {
return 0;
}
//////////////////////////////////////////
// class t_g711a_audio_decoder
//////////////////////////////////////////
t_g711a_audio_decoder::t_g711a_audio_decoder(uint16 default_ptime, t_user *user_config) :
t_audio_decoder(default_ptime, false, user_config)
{
_codec = CODEC_G711_ALAW;
if (default_ptime == 0) {
_default_ptime = PTIME_G711_ALAW;
}
}
uint16 t_g711a_audio_decoder::get_ptime(uint16 payload_size) const {
return payload_size / (audio_sample_rate(_codec) / 1000);
}
uint16 t_g711a_audio_decoder::decode(uint8 *payload, uint16 payload_size,
int16 *pcm_buf, uint16 pcm_buf_size)
{
assert(pcm_buf_size >= payload_size);
for (int i = 0; i < payload_size; i++) {
pcm_buf[i] = alaw2linear(payload[i]);
}
return payload_size;
}
bool t_g711a_audio_decoder::valid_payload_size(uint16 payload_size, uint16 sample_buf_size) const
{
return payload_size <= sample_buf_size;
}
//////////////////////////////////////////
// class t_g711u_audio_decoder
//////////////////////////////////////////
t_g711u_audio_decoder::t_g711u_audio_decoder(uint16 default_ptime, t_user *user_config) :
t_audio_decoder(default_ptime, false, user_config)
{
_codec = CODEC_G711_ULAW;
if (default_ptime == 0) {
_default_ptime = PTIME_G711_ULAW;
}
}
uint16 t_g711u_audio_decoder::get_ptime(uint16 payload_size) const {
return payload_size / (audio_sample_rate(_codec) / 1000);
}
uint16 t_g711u_audio_decoder::decode(uint8 *payload, uint16 payload_size,
int16 *pcm_buf, uint16 pcm_buf_size)
{
assert(pcm_buf_size >= payload_size);
for (int i = 0; i < payload_size; i++) {
pcm_buf[i] = ulaw2linear(payload[i]);
}
return payload_size;
}
bool t_g711u_audio_decoder::valid_payload_size(uint16 payload_size, uint16 sample_buf_size) const
{
return payload_size <= sample_buf_size;
}
//////////////////////////////////////////
// class t_gsm_audio_decoder
//////////////////////////////////////////
t_gsm_audio_decoder::t_gsm_audio_decoder(t_user *user_config) :
t_audio_decoder(PTIME_GSM, false, user_config)
{
_codec = CODEC_GSM;
gsm_decoder = gsm_create();
}
t_gsm_audio_decoder::~t_gsm_audio_decoder() {
gsm_destroy(gsm_decoder);
}
uint16 t_gsm_audio_decoder::get_ptime(uint16 payload_size) const {
return get_default_ptime();
}
uint16 t_gsm_audio_decoder::decode(uint8 *payload, uint16 payload_size,
int16 *pcm_buf, uint16 pcm_buf_size)
{
assert(pcm_buf_size >= 160);
gsm_decode(gsm_decoder, payload, pcm_buf);
return 160;
}
bool t_gsm_audio_decoder::valid_payload_size(uint16 payload_size, uint16 sample_buf_size) const
{
return payload_size == 33;
}
#ifdef HAVE_SPEEX
//////////////////////////////////////////
// class t_speex_audio_decoder
//////////////////////////////////////////
t_speex_audio_decoder::t_speex_audio_decoder(t_mode mode, t_user *user_config) :
t_audio_decoder(0, true, user_config)
{
speex_bits_init(&speex_bits);
_mode = mode;
switch (mode) {
case MODE_NB:
_codec = CODEC_SPEEX_NB;
speex_dec_state = speex_decoder_init(&speex_nb_mode);
break;
case MODE_WB:
_codec = CODEC_SPEEX_WB;
speex_dec_state = speex_decoder_init(&speex_wb_mode);
break;
case MODE_UWB:
_codec = CODEC_SPEEX_UWB;
speex_dec_state = speex_decoder_init(&speex_uwb_mode);
break;
default:
assert(false);
}
int frame_size = 0;
speex_decoder_ctl(speex_dec_state, SPEEX_GET_FRAME_SIZE, &frame_size);
// Initialize decoder with user settings
int arg = (user_config->get_speex_penh() ? 1 : 0);
speex_decoder_ctl(speex_dec_state, SPEEX_SET_ENH, &arg);
_default_ptime = frame_size / (audio_sample_rate(_codec) / 1000);
}
t_speex_audio_decoder::~t_speex_audio_decoder() {
speex_bits_destroy(&speex_bits);
speex_decoder_destroy(speex_dec_state);
}
uint16 t_speex_audio_decoder::get_ptime(uint16 payload_size) const {
return get_default_ptime();
}
uint16 t_speex_audio_decoder::decode(uint8 *payload, uint16 payload_size,
int16 *pcm_buf, uint16 pcm_buf_size)
{
int retval;
int speex_frame_size;
speex_decoder_ctl(speex_dec_state, SPEEX_GET_FRAME_SIZE,
&speex_frame_size);
assert(pcm_buf_size >= speex_frame_size);
speex_bits_read_from(&speex_bits, reinterpret_cast<char *>(payload), payload_size);
retval = speex_decode_int(speex_dec_state, &speex_bits, pcm_buf);
if (retval < 0) {
LOG_SPEEX_ERROR("t_speex_audio_decoder::decode",
"speex_decode_int", retval);
return 0;
}
return speex_frame_size;
}
uint16 t_speex_audio_decoder::conceal(int16 *pcm_buf, uint16 pcm_buf_size) {
int retval;
int speex_frame_size;
speex_decoder_ctl(speex_dec_state, SPEEX_GET_FRAME_SIZE,
&speex_frame_size);
assert(pcm_buf_size >= speex_frame_size);
retval = speex_decode_int(speex_dec_state, NULL, pcm_buf);
if (retval < 0) {
LOG_SPEEX_ERROR("t_speex_audio_decoder::conceal",
"speex_decode_int", retval);
return 0;
}
return speex_frame_size;
}
bool t_speex_audio_decoder::valid_payload_size(uint16 payload_size, uint16 sample_buf_size) const
{
return true;
}
#endif
#ifdef HAVE_ILBC
//////////////////////////////////////////
// class t_ilbc_audio_decoder
//////////////////////////////////////////
t_ilbc_audio_decoder::t_ilbc_audio_decoder(uint16 default_ptime, t_user *user_config) :
t_audio_decoder(default_ptime, true, user_config)
{
_codec = CODEC_ILBC;
_last_received_ptime = 0;
initDecode(&_ilbc_decoder_20, 20, 1);
initDecode(&_ilbc_decoder_30, 30, 1);
}
uint16 t_ilbc_audio_decoder::get_ptime(uint16 payload_size) const {
if (payload_size == NO_OF_BYTES_20MS) {
return 20;
} else {
return 30;
}
}
uint16 t_ilbc_audio_decoder::decode(uint8 *payload, uint16 payload_size,
int16 *pcm_buf, uint16 pcm_buf_size)
{
float sample;
float block[BLOCKL_MAX];
int block_len;
if (get_ptime(payload_size) == 20) {
block_len = BLOCKL_20MS;
assert(pcm_buf_size >= block_len);
iLBC_decode(block, (unsigned char*)payload, &_ilbc_decoder_20, 1);
_last_received_ptime = 20;
} else {
block_len = BLOCKL_30MS;
assert(pcm_buf_size >= block_len);
iLBC_decode(block, (unsigned char*)payload, &_ilbc_decoder_30, 1);
_last_received_ptime = 30;
}
for (int i = 0; i < block_len; i++) {
sample = block[i];
if (sample < MIN_SAMPLE) sample = MIN_SAMPLE;
if (sample > MAX_SAMPLE) sample = MAX_SAMPLE;
pcm_buf[i] = static_cast<int16>(sample);
}
return block_len;
}
uint16 t_ilbc_audio_decoder::conceal(int16 *pcm_buf, uint16 pcm_buf_size) {
float sample;
float block[BLOCKL_MAX];
int block_len;
if (_last_received_ptime == 0) return 0;
if (_last_received_ptime == 20) {
block_len = BLOCKL_20MS;
assert(pcm_buf_size >= block_len);
iLBC_decode(block, NULL, &_ilbc_decoder_20, 0);
} else {
block_len = BLOCKL_30MS;
assert(pcm_buf_size >= block_len);
iLBC_decode(block, NULL, &_ilbc_decoder_30, 0);
}
for (int i = 0; i < block_len; i++) {
sample = block[i];
if (sample < MIN_SAMPLE) sample = MIN_SAMPLE;
if (sample > MAX_SAMPLE) sample = MAX_SAMPLE;
pcm_buf[i] = static_cast<int16>(sample);
}
return block_len;
}
bool t_ilbc_audio_decoder::valid_payload_size(uint16 payload_size, uint16 sample_buf_size) const
{
return payload_size == NO_OF_BYTES_20MS || payload_size == NO_OF_BYTES_30MS;
}
#endif
//////////////////////////////////////////
// class t_g722_audio_decoder
///////////
gitextract_nh3snu39/ ├── .github/ │ └── workflows/ │ └── main.yml ├── .gitignore ├── AUTHORS ├── CMakeLists.txt ├── COPYING ├── Doxyfile ├── NEWS ├── README.md ├── THANKS ├── TODO ├── cmake/ │ ├── CheckCXX11Regex.cmake │ ├── FindCcrtp.cmake │ ├── FindCommoncpp.cmake │ ├── FindG729.cmake │ ├── FindGsm.cmake │ ├── FindIlbc.cmake │ ├── FindLibMagic.cmake │ ├── FindLibSndfile.cmake │ ├── FindReadline.cmake │ ├── FindSpeex.cmake │ ├── FindUcommon.cmake │ └── FindZrtpcpp.cmake ├── data/ │ ├── providers.csv │ └── twinkle.1 ├── sip.protocol ├── src/ │ ├── CMakeLists.txt │ ├── abstract_dialog.cpp │ ├── abstract_dialog.h │ ├── address_book.cpp │ ├── address_book.h │ ├── audio/ │ │ ├── CMakeLists.txt │ │ ├── README_G711 │ │ ├── audio_codecs.cpp │ │ ├── audio_codecs.h │ │ ├── audio_decoder.cpp │ │ ├── audio_decoder.h │ │ ├── audio_device.cpp │ │ ├── audio_device.h │ │ ├── audio_encoder.cpp │ │ ├── audio_encoder.h │ │ ├── audio_rx.cpp │ │ ├── audio_rx.h │ │ ├── audio_session.cpp │ │ ├── audio_session.h │ │ ├── audio_tx.cpp │ │ ├── audio_tx.h │ │ ├── dtmf_player.cpp │ │ ├── dtmf_player.h │ │ ├── freq_gen.cpp │ │ ├── freq_gen.h │ │ ├── g711.cpp │ │ ├── g711.h │ │ ├── g721.cpp │ │ ├── g722.h │ │ ├── g722_decode.c │ │ ├── g722_encode.c │ │ ├── g722_local.h │ │ ├── g723_16.cpp │ │ ├── g723_24.cpp │ │ ├── g723_40.cpp │ │ ├── g72x.cpp │ │ ├── g72x.h │ │ ├── gsm/ │ │ │ ├── COPYRIGHT │ │ │ ├── ChangeLog │ │ │ ├── INSTALL │ │ │ ├── MACHINES │ │ │ ├── README │ │ │ ├── inc/ │ │ │ │ ├── config.h │ │ │ │ ├── gsm.h │ │ │ │ ├── private.h │ │ │ │ ├── proto.h │ │ │ │ └── unproto.h │ │ │ └── src/ │ │ │ ├── CMakeLists.txt │ │ │ ├── add.cpp │ │ │ ├── code.cpp │ │ │ ├── debug.cpp │ │ │ ├── decode.cpp │ │ │ ├── gsm_create.cpp │ │ │ ├── gsm_decode.cpp │ │ │ ├── gsm_destroy.cpp │ │ │ ├── gsm_encode.cpp │ │ │ ├── gsm_explode.cpp │ │ │ ├── gsm_implode.cpp │ │ │ ├── gsm_option.cpp │ │ │ ├── gsm_print.cpp │ │ │ ├── long_term.cpp │ │ │ ├── lpc.cpp │ │ │ ├── preprocess.cpp │ │ │ ├── rpe.cpp │ │ │ ├── short_term.cpp │ │ │ └── table.cpp │ │ ├── media_buffer.cpp │ │ ├── media_buffer.h │ │ ├── rtp_telephone_event.cpp │ │ ├── rtp_telephone_event.h │ │ ├── tone_gen.cpp │ │ ├── tone_gen.h │ │ ├── twinkle_rtp_session.cpp │ │ ├── twinkle_rtp_session.h │ │ ├── twinkle_zrtp_ui.cpp │ │ └── twinkle_zrtp_ui.h │ ├── audits/ │ │ ├── CMakeLists.txt │ │ ├── memman.cpp │ │ └── memman.h │ ├── auth.cpp │ ├── auth.h │ ├── call_history.cpp │ ├── call_history.h │ ├── call_script.cpp │ ├── call_script.h │ ├── client_request.cpp │ ├── client_request.h │ ├── cmd_socket.cpp │ ├── cmd_socket.h │ ├── dialog.cpp │ ├── dialog.h │ ├── diamondcard.cpp │ ├── diamondcard.h │ ├── epa.cpp │ ├── epa.h │ ├── events.cpp │ ├── events.h │ ├── exceptions.h │ ├── gui/ │ │ ├── CMakeLists.txt │ │ ├── address_finder.cpp │ │ ├── address_finder.h │ │ ├── addresscardform.cpp │ │ ├── addresscardform.h │ │ ├── addresscardform.ui │ │ ├── addresstablemodel.cpp │ │ ├── addresstablemodel.h │ │ ├── akonadiaddressbook.cpp │ │ ├── akonadiaddressbook.h │ │ ├── authenticationform.cpp │ │ ├── authenticationform.h │ │ ├── authenticationform.ui │ │ ├── buddyform.cpp │ │ ├── buddyform.h │ │ ├── buddyform.ui │ │ ├── buddylistview.cpp │ │ ├── buddylistview.h │ │ ├── command_args.h │ │ ├── core_strings.h │ │ ├── deregisterform.cpp │ │ ├── deregisterform.h │ │ ├── deregisterform.ui │ │ ├── diamondcardprofileform.cpp │ │ ├── diamondcardprofileform.h │ │ ├── diamondcardprofileform.ui │ │ ├── dtmfform.cpp │ │ ├── dtmfform.h │ │ ├── dtmfform.ui │ │ ├── getaddressform.cpp │ │ ├── getaddressform.h │ │ ├── getaddressform.ui │ │ ├── getprofilenameform.cpp │ │ ├── getprofilenameform.h │ │ ├── getprofilenameform.ui │ │ ├── gui.cpp │ │ ├── gui.h │ │ ├── historyform.cpp │ │ ├── historyform.h │ │ ├── historyform.ui │ │ ├── icons.qrc │ │ ├── idlesession_inhibitor.cpp │ │ ├── idlesession_inhibitor.h │ │ ├── idlesession_manager.cpp │ │ ├── idlesession_manager.h │ │ ├── images/ │ │ │ ├── editcopy │ │ │ ├── editcut │ │ │ ├── editpaste │ │ │ ├── filenew │ │ │ ├── filesave │ │ │ ├── print │ │ │ ├── redo │ │ │ ├── searchfind │ │ │ └── undo │ │ ├── incoming_call_popup.cpp │ │ ├── incoming_call_popup.h │ │ ├── inviteform.cpp │ │ ├── inviteform.h │ │ ├── inviteform.ui │ │ ├── kcontactstablemodel.cpp │ │ ├── kcontactstablemodel.h │ │ ├── lang/ │ │ │ ├── twinkle_cs.ts │ │ │ ├── twinkle_de.ts │ │ │ ├── twinkle_fr.ts │ │ │ ├── twinkle_nl.ts │ │ │ ├── twinkle_ru.ts │ │ │ ├── twinkle_sk.ts │ │ │ ├── twinkle_sv.ts │ │ │ └── twinkle_xx.ts │ │ ├── logviewform.cpp │ │ ├── logviewform.h │ │ ├── logviewform.ui │ │ ├── main.cpp │ │ ├── messageform.cpp │ │ ├── messageform.h │ │ ├── messageform.ui │ │ ├── messageformview.cpp │ │ ├── messageformview.h │ │ ├── mphoneform.cpp │ │ ├── mphoneform.h │ │ ├── mphoneform.ui │ │ ├── numberconversionform.cpp │ │ ├── numberconversionform.h │ │ ├── numberconversionform.ui │ │ ├── osd.cpp │ │ ├── osd.h │ │ ├── qml/ │ │ │ ├── ImageButton.qml │ │ │ ├── TextImageButton.qml │ │ │ ├── incoming_call.qml │ │ │ ├── osd.qml │ │ │ └── qml.qrc │ │ ├── qt_translator.h │ │ ├── redirectform.cpp │ │ ├── redirectform.h │ │ ├── redirectform.ui │ │ ├── selectnicform.cpp │ │ ├── selectnicform.h │ │ ├── selectnicform.ui │ │ ├── selectprofileform.cpp │ │ ├── selectprofileform.h │ │ ├── selectprofileform.ui │ │ ├── selectuserform.cpp │ │ ├── selectuserform.h │ │ ├── selectuserform.ui │ │ ├── sendfileform.cpp │ │ ├── sendfileform.h │ │ ├── sendfileform.ui │ │ ├── srvredirectform.cpp │ │ ├── srvredirectform.h │ │ ├── srvredirectform.ui │ │ ├── syssettingsform.cpp │ │ ├── syssettingsform.h │ │ ├── syssettingsform.ui │ │ ├── termcapform.cpp │ │ ├── termcapform.h │ │ ├── termcapform.ui │ │ ├── transferform.cpp │ │ ├── transferform.h │ │ ├── transferform.ui │ │ ├── twinkle-uri-handler │ │ ├── twinkleapplication.cpp │ │ ├── twinkleapplication.h │ │ ├── userprofileform.cpp │ │ ├── userprofileform.h │ │ ├── userprofileform.ui │ │ ├── wizardform.cpp │ │ ├── wizardform.h │ │ ├── wizardform.ui │ │ ├── yesnodialog.cpp │ │ └── yesnodialog.h │ ├── id_object.cpp │ ├── id_object.h │ ├── im/ │ │ ├── CMakeLists.txt │ │ ├── im_iscomposing_body.cpp │ │ ├── im_iscomposing_body.h │ │ ├── msg_session.cpp │ │ └── msg_session.h │ ├── line.cpp │ ├── line.h │ ├── listener.cpp │ ├── listener.h │ ├── log.cpp │ ├── log.h │ ├── main.cpp │ ├── mwi/ │ │ ├── CMakeLists.txt │ │ ├── mwi.cpp │ │ ├── mwi.h │ │ ├── mwi_dialog.cpp │ │ ├── mwi_dialog.h │ │ ├── mwi_subscription.cpp │ │ ├── mwi_subscription.h │ │ ├── simple_msg_sum_body.cpp │ │ └── simple_msg_sum_body.h │ ├── parser/ │ │ ├── CMakeLists.txt │ │ ├── challenge.cpp │ │ ├── challenge.h │ │ ├── coding.cpp │ │ ├── coding.h │ │ ├── credentials.cpp │ │ ├── credentials.h │ │ ├── definitions.cpp │ │ ├── definitions.h │ │ ├── hdr_accept.cpp │ │ ├── hdr_accept.h │ │ ├── hdr_accept_encoding.cpp │ │ ├── hdr_accept_encoding.h │ │ ├── hdr_accept_language.cpp │ │ ├── hdr_accept_language.h │ │ ├── hdr_alert_info.cpp │ │ ├── hdr_alert_info.h │ │ ├── hdr_allow.cpp │ │ ├── hdr_allow.h │ │ ├── hdr_allow_events.cpp │ │ ├── hdr_allow_events.h │ │ ├── hdr_auth_info.cpp │ │ ├── hdr_auth_info.h │ │ ├── hdr_authorization.cpp │ │ ├── hdr_authorization.h │ │ ├── hdr_call_id.cpp │ │ ├── hdr_call_id.h │ │ ├── hdr_call_info.cpp │ │ ├── hdr_call_info.h │ │ ├── hdr_contact.cpp │ │ ├── hdr_contact.h │ │ ├── hdr_content_disp.cpp │ │ ├── hdr_content_disp.h │ │ ├── hdr_content_encoding.cpp │ │ ├── hdr_content_encoding.h │ │ ├── hdr_content_language.cpp │ │ ├── hdr_content_language.h │ │ ├── hdr_content_length.cpp │ │ ├── hdr_content_length.h │ │ ├── hdr_content_type.cpp │ │ ├── hdr_content_type.h │ │ ├── hdr_cseq.cpp │ │ ├── hdr_cseq.h │ │ ├── hdr_date.cpp │ │ ├── hdr_date.h │ │ ├── hdr_error_info.cpp │ │ ├── hdr_error_info.h │ │ ├── hdr_event.cpp │ │ ├── hdr_event.h │ │ ├── hdr_expires.cpp │ │ ├── hdr_expires.h │ │ ├── hdr_from.cpp │ │ ├── hdr_from.h │ │ ├── hdr_in_reply_to.cpp │ │ ├── hdr_in_reply_to.h │ │ ├── hdr_max_forwards.cpp │ │ ├── hdr_max_forwards.h │ │ ├── hdr_mime_version.cpp │ │ ├── hdr_mime_version.h │ │ ├── hdr_min_expires.cpp │ │ ├── hdr_min_expires.h │ │ ├── hdr_min_se.cpp │ │ ├── hdr_min_se.h │ │ ├── hdr_organization.cpp │ │ ├── hdr_organization.h │ │ ├── hdr_p_asserted_identity.cpp │ │ ├── hdr_p_asserted_identity.h │ │ ├── hdr_p_preferred_identity.cpp │ │ ├── hdr_p_preferred_identity.h │ │ ├── hdr_priority.cpp │ │ ├── hdr_priority.h │ │ ├── hdr_privacy.cpp │ │ ├── hdr_privacy.h │ │ ├── hdr_proxy_authenticate.cpp │ │ ├── hdr_proxy_authenticate.h │ │ ├── hdr_proxy_authorization.cpp │ │ ├── hdr_proxy_authorization.h │ │ ├── hdr_proxy_require.cpp │ │ ├── hdr_proxy_require.h │ │ ├── hdr_rack.cpp │ │ ├── hdr_rack.h │ │ ├── hdr_reason.cpp │ │ ├── hdr_reason.h │ │ ├── hdr_record_route.cpp │ │ ├── hdr_record_route.h │ │ ├── hdr_refer_sub.cpp │ │ ├── hdr_refer_sub.h │ │ ├── hdr_refer_to.cpp │ │ ├── hdr_refer_to.h │ │ ├── hdr_referred_by.cpp │ │ ├── hdr_referred_by.h │ │ ├── hdr_replaces.cpp │ │ ├── hdr_replaces.h │ │ ├── hdr_reply_to.cpp │ │ ├── hdr_reply_to.h │ │ ├── hdr_request_disposition.cpp │ │ ├── hdr_request_disposition.h │ │ ├── hdr_require.cpp │ │ ├── hdr_require.h │ │ ├── hdr_retry_after.cpp │ │ ├── hdr_retry_after.h │ │ ├── hdr_route.cpp │ │ ├── hdr_route.h │ │ ├── hdr_rseq.cpp │ │ ├── hdr_rseq.h │ │ ├── hdr_server.cpp │ │ ├── hdr_server.h │ │ ├── hdr_service_route.cpp │ │ ├── hdr_service_route.h │ │ ├── hdr_session_expires.cpp │ │ ├── hdr_session_expires.h │ │ ├── hdr_sip_etag.cpp │ │ ├── hdr_sip_etag.h │ │ ├── hdr_sip_if_match.cpp │ │ ├── hdr_sip_if_match.h │ │ ├── hdr_subject.cpp │ │ ├── hdr_subject.h │ │ ├── hdr_subscription_state.cpp │ │ ├── hdr_subscription_state.h │ │ ├── hdr_supported.cpp │ │ ├── hdr_supported.h │ │ ├── hdr_timestamp.cpp │ │ ├── hdr_timestamp.h │ │ ├── hdr_to.cpp │ │ ├── hdr_to.h │ │ ├── hdr_unsupported.cpp │ │ ├── hdr_unsupported.h │ │ ├── hdr_user_agent.cpp │ │ ├── hdr_user_agent.h │ │ ├── hdr_via.cpp │ │ ├── hdr_via.h │ │ ├── hdr_warning.cpp │ │ ├── hdr_warning.h │ │ ├── hdr_www_authenticate.cpp │ │ ├── hdr_www_authenticate.h │ │ ├── header.cpp │ │ ├── header.h │ │ ├── identity.cpp │ │ ├── identity.h │ │ ├── media_type.cpp │ │ ├── media_type.h │ │ ├── milenage.cpp │ │ ├── milenage.h │ │ ├── parameter.cpp │ │ ├── parameter.h │ │ ├── parse_ctrl.cpp │ │ ├── parse_ctrl.h │ │ ├── parser.yxx │ │ ├── request.cpp │ │ ├── request.h │ │ ├── response.cpp │ │ ├── response.h │ │ ├── rijndael.cpp │ │ ├── rijndael.h │ │ ├── route.cpp │ │ ├── route.h │ │ ├── scanner.lxx │ │ ├── sip_body.cpp │ │ ├── sip_body.h │ │ ├── sip_message.cpp │ │ └── sip_message.h │ ├── patterns/ │ │ ├── CMakeLists.txt │ │ ├── observer.cpp │ │ └── observer.h │ ├── phone.cpp │ ├── phone.h │ ├── phone_user.cpp │ ├── phone_user.h │ ├── presence/ │ │ ├── CMakeLists.txt │ │ ├── buddy.cpp │ │ ├── buddy.h │ │ ├── pidf_body.cpp │ │ ├── pidf_body.h │ │ ├── presence_dialog.cpp │ │ ├── presence_dialog.h │ │ ├── presence_epa.cpp │ │ ├── presence_epa.h │ │ ├── presence_state.cpp │ │ ├── presence_state.h │ │ ├── presence_subscription.cpp │ │ └── presence_subscription.h │ ├── prohibit_thread.cpp │ ├── prohibit_thread.h │ ├── protocol.h │ ├── redirect.cpp │ ├── redirect.h │ ├── sdp/ │ │ ├── CMakeLists.txt │ │ ├── sdp.cpp │ │ ├── sdp.h │ │ ├── sdp_parse_ctrl.cpp │ │ ├── sdp_parse_ctrl.h │ │ ├── sdp_parser.h │ │ ├── sdp_parser.yxx │ │ └── sdp_scanner.lxx │ ├── sender.cpp │ ├── sender.h │ ├── sequence_number.h │ ├── service.cpp │ ├── service.h │ ├── session.cpp │ ├── session.h │ ├── sockets/ │ │ ├── CMakeLists.txt │ │ ├── connection.cpp │ │ ├── connection.h │ │ ├── connection_table.cpp │ │ ├── connection_table.h │ │ ├── dnssrv.cpp │ │ ├── dnssrv.h │ │ ├── interfaces.cpp │ │ ├── interfaces.h │ │ ├── ipaddr.h │ │ ├── socket.cpp │ │ ├── socket.h │ │ ├── url.cpp │ │ └── url.h │ ├── stun/ │ │ ├── CMakeLists.txt │ │ ├── stun.cxx │ │ ├── stun.h │ │ ├── stun_transaction.cpp │ │ ├── stun_transaction.h │ │ ├── udp.cxx │ │ └── udp.h │ ├── sub_refer.cpp │ ├── sub_refer.h │ ├── subscription.cpp │ ├── subscription.h │ ├── subscription_dialog.cpp │ ├── subscription_dialog.h │ ├── sys_settings.cpp │ ├── sys_settings.h │ ├── threads/ │ │ ├── CMakeLists.txt │ │ ├── mutex.cpp │ │ ├── mutex.h │ │ ├── sema.cpp │ │ ├── sema.h │ │ ├── thread.cpp │ │ └── thread.h │ ├── timekeeper.cpp │ ├── timekeeper.h │ ├── transaction.cpp │ ├── transaction.h │ ├── transaction_layer.cpp │ ├── transaction_layer.h │ ├── transaction_mgr.cpp │ ├── transaction_mgr.h │ ├── translator.h │ ├── user.cpp │ ├── user.h │ ├── userintf.cpp │ ├── userintf.h │ ├── util.cpp │ ├── util.h │ └── utils/ │ ├── CMakeLists.txt │ ├── file_utils.cpp │ ├── file_utils.h │ ├── mime_database.cpp │ ├── mime_database.h │ ├── record_file.h │ └── record_file.hpp ├── twinkle.desktop.in ├── twinkle.spec.in └── twinkle_config.h.in
SYMBOL INDEX (1321 symbols across 345 files)
FILE: src/abstract_dialog.cpp
function t_request (line 45) | t_request *t_abstract_dialog::create_request(t_method m) {
function t_user (line 244) | t_user *t_abstract_dialog::get_user(void) const {
function t_url (line 287) | t_url t_abstract_dialog::get_remote_target_uri(void) const {
function string (line 291) | string t_abstract_dialog::get_remote_target_display(void) const {
function t_url (line 295) | t_url t_abstract_dialog::get_remote_uri(void) const {
function string (line 299) | string t_abstract_dialog::get_remote_display(void) const {
function t_ip_port (line 303) | t_ip_port t_abstract_dialog::get_remote_ip_port(void) const {
function string (line 307) | string t_abstract_dialog::get_call_id(void) const {
function string (line 311) | string t_abstract_dialog::get_local_tag(void) const {
function string (line 315) | string t_abstract_dialog::get_remote_tag(void) const {
FILE: src/abstract_dialog.h
function class (line 45) | class t_abstract_dialog : public t_id_object {
FILE: src/address_book.cpp
function string (line 35) | string t_address_card::get_display_name(void) const {
function string (line 181) | string t_address_book::find_name(t_user *user_config, const t_url &u) co...
FILE: src/address_book.h
function class (line 37) | class t_address_card : public utils::t_record {
function class (line 62) | class t_address_book : public utils::t_record_file<t_address_card> {
FILE: src/audio/audio_codecs.cpp
function audio_sample_rate (line 21) | unsigned short audio_sample_rate(t_audio_codec codec) {
function audio_sample_rate_rtp (line 46) | unsigned short audio_sample_rate_rtp(t_audio_codec codec) {
function audio_sample_rate_rtp_ratio (line 56) | unsigned short audio_sample_rate_rtp_ratio(t_audio_codec codec) {
function is_speex_codec (line 60) | bool is_speex_codec(t_audio_codec codec) {
function resample (line 66) | int resample(short *input_buf, int input_len, int input_sample_rate,
function mix_linear_pcm (line 98) | short mix_linear_pcm(short pcm1, short pcm2) {
FILE: src/audio/audio_codecs.h
type t_audio_codec (line 25) | enum t_audio_codec {
FILE: src/audio/audio_decoder.cpp
function t_audio_codec (line 43) | t_audio_codec t_audio_decoder::get_codec(void) const {
function uint16 (line 47) | uint16 t_audio_decoder::get_default_ptime(void) const {
function uint16 (line 55) | uint16 t_audio_decoder::conceal(int16 *pcm_buf, uint16 pcm_buf_size) {
function uint16 (line 73) | uint16 t_g711a_audio_decoder::get_ptime(uint16 payload_size) const {
function uint16 (line 77) | uint16 t_g711a_audio_decoder::decode(uint8 *payload, uint16 payload_size,
function uint16 (line 107) | uint16 t_g711u_audio_decoder::get_ptime(uint16 payload_size) const {
function uint16 (line 111) | uint16 t_g711u_audio_decoder::decode(uint8 *payload, uint16 payload_size,
function uint16 (line 142) | uint16 t_gsm_audio_decoder::get_ptime(uint16 payload_size) const {
function uint16 (line 146) | uint16 t_gsm_audio_decoder::decode(uint8 *payload, uint16 payload_size,
function uint16 (line 203) | uint16 t_speex_audio_decoder::get_ptime(uint16 payload_size) const {
function uint16 (line 207) | uint16 t_speex_audio_decoder::decode(uint8 *payload, uint16 payload_size,
function uint16 (line 230) | uint16 t_speex_audio_decoder::conceal(int16 *pcm_buf, uint16 pcm_buf_siz...
function uint16 (line 269) | uint16 t_ilbc_audio_decoder::get_ptime(uint16 payload_size) const {
function uint16 (line 277) | uint16 t_ilbc_audio_decoder::decode(uint8 *payload, uint16 payload_size,
function uint16 (line 308) | uint16 t_ilbc_audio_decoder::conceal(int16 *pcm_buf, uint16 pcm_buf_size) {
function uint16 (line 358) | uint16 t_g722_audio_decoder::get_ptime(uint16 payload_size) const
function uint16 (line 364) | uint16 t_g722_audio_decoder::decode(uint8 *payload, uint16 payload_size,
function uint16 (line 418) | uint16 t_g726_audio_decoder::get_ptime(uint16 payload_size) const {
function uint16 (line 422) | uint16 t_g726_audio_decoder::decode_16(uint8 *payload, uint16 payload_size,
function uint16 (line 443) | uint16 t_g726_audio_decoder::decode_24(uint8 *payload, uint16 payload_size,
function uint16 (line 469) | uint16 t_g726_audio_decoder::decode_32(uint8 *payload, uint16 payload_size,
function uint16 (line 490) | uint16 t_g726_audio_decoder::decode_40(uint8 *payload, uint16 payload_size,
function uint16 (line 518) | uint16 t_g726_audio_decoder::decode(uint8 *payload, uint16 payload_size,
function uint16 (line 573) | uint16 t_g729a_audio_decoder::get_ptime(uint16 payload_size) const
function uint16 (line 578) | uint16 t_g729a_audio_decoder::decode(uint8 *payload, uint16 payload_size,
function uint16 (line 601) | uint16 t_g729a_audio_decoder::conceal(int16 *pcm_buf, uint16 pcm_buf_size)
FILE: src/audio/audio_decoder.h
function class (line 62) | class t_audio_decoder {
function class (line 97) | class t_g711a_audio_decoder : public t_audio_decoder {
function class (line 108) | class t_g711u_audio_decoder : public t_audio_decoder {
function class (line 119) | class t_gsm_audio_decoder : public t_audio_decoder {
function class (line 135) | class t_speex_audio_decoder : public t_audio_decoder {
function class (line 162) | class t_ilbc_audio_decoder : public t_audio_decoder {
function class (line 184) | class t_g722_audio_decoder : public t_audio_decoder {
function class (line 199) | class t_g726_audio_decoder : public t_audio_decoder {
function class (line 230) | class t_g729a_audio_decoder : public t_audio_decoder {
FILE: src/audio/audio_device.cpp
function t_audio_io (line 36) | t_audio_io* t_audio_io::open(const t_audio_device& dev, bool playback, b...
function alsa_fill_soundcards (line 855) | void alsa_fill_soundcards(list<t_audio_device>& l, bool playback)
FILE: src/audio/audio_device.h
type t_audio_sampleformat (line 30) | enum t_audio_sampleformat {
function class (line 37) | class t_audio_io {
function class (line 75) | class t_oss_io : public t_audio_io {
function class (line 96) | class t_alsa_io : public t_audio_io {
FILE: src/audio/audio_encoder.cpp
function t_audio_codec (line 42) | t_audio_codec t_audio_encoder::get_codec(void) const {
function uint16 (line 46) | uint16 t_audio_encoder::get_payload_id(void) const {
function uint16 (line 50) | uint16 t_audio_encoder::get_ptime(void) const {
function uint16 (line 54) | uint16 t_audio_encoder::get_sample_rate(void) const {
function uint16 (line 58) | uint16 t_audio_encoder::get_sample_rate_rtp(void) const {
function uint16 (line 62) | uint16 t_audio_encoder::get_sample_rate_rtp_ratio(void) const {
function uint16 (line 66) | uint16 t_audio_encoder::get_max_payload_size(void) const {
function uint16 (line 84) | uint16 t_g711a_audio_encoder::encode(int16 *sample_buf, uint16 nsamples,
function uint16 (line 111) | uint16 t_g711u_audio_encoder::encode(int16 *sample_buf, uint16 nsamples,
function uint16 (line 142) | uint16 t_gsm_audio_encoder::encode(int16 *sample_buf, uint16 nsamples,
function uint16 (line 231) | uint16 t_speex_audio_encoder::encode(int16 *sample_buf, uint16 nsamples,
function uint16 (line 267) | uint16 t_ilbc_audio_encoder::encode(int16 *sample_buf, uint16 nsamples,
function uint16 (line 306) | uint16 t_g722_audio_encoder::encode(int16 *sample_buf, uint16 nsamples,
function uint16 (line 354) | uint16 t_g726_audio_encoder::encode_16(int16 *sample_buf, uint16 nsamples,
function uint16 (line 377) | uint16 t_g726_audio_encoder::encode_24(int16 *sample_buf, uint16 nsamples,
function uint16 (line 402) | uint16 t_g726_audio_encoder::encode_32(int16 *sample_buf, uint16 nsamples,
function uint16 (line 425) | uint16 t_g726_audio_encoder::encode_40(int16 *sample_buf, uint16 nsamples,
function uint16 (line 452) | uint16 t_g726_audio_encoder::encode(int16 *sample_buf, uint16 nsamples,
function uint16 (line 490) | uint16 t_g729a_audio_encoder::encode(int16 *sample_buf, uint16 nsamples,
FILE: src/audio/audio_encoder.h
function class (line 61) | class t_audio_encoder {
function class (line 93) | class t_g711a_audio_encoder : public t_audio_encoder {
function class (line 103) | class t_g711u_audio_encoder : public t_audio_encoder {
function class (line 113) | class t_gsm_audio_encoder : public t_audio_encoder {
function class (line 127) | class t_speex_audio_encoder : public t_audio_encoder {
function class (line 151) | class t_ilbc_audio_encoder : public t_audio_encoder {
function class (line 165) | class t_g722_audio_encoder : public t_audio_encoder {
function class (line 177) | class t_g726_audio_encoder : public t_audio_encoder {
function class (line 209) | class t_g729a_audio_encoder : public t_audio_encoder
FILE: src/audio/audio_rx.cpp
type timespec (line 54) | struct timespec
type timespec (line 412) | struct timespec
function t_line (line 684) | t_line *t_audio_rx::get_line(void) const {
FILE: src/audio/audio_rx.h
function class (line 50) | class t_audio_rx {
FILE: src/audio/audio_session.cpp
function t_audio_session (line 51) | t_audio_session *t_audio_session::get_peer_3way(void) const {
function t_line (line 487) | t_line *t_audio_session::get_line(void) const {
function t_audio_io (line 536) | t_audio_io* t_audio_session::get_dsp_speaker(void) const {
function t_audio_io (line 540) | t_audio_io* t_audio_session::get_dsp_mic(void) const {
function string (line 604) | string t_audio_session::get_zrtp_sas(void) const {
function string (line 618) | string t_audio_session::get_srtp_cipher_mode(void) const {
function SpeexEchoState (line 663) | SpeexEchoState *t_audio_session::get_speex_echo_state(void) {
FILE: src/audio/audio_session.h
function class (line 41) | class t_audio_session {
FILE: src/audio/audio_tx.cpp
type timespec (line 157) | struct timespec
type timespec (line 411) | struct timespec
function t_line (line 816) | t_line *t_audio_tx::get_line(void) const {
FILE: src/audio/audio_tx.h
function class (line 49) | class t_audio_tx {
FILE: src/audio/dtmf_player.cpp
function uint32 (line 45) | uint32 t_dtmf_player::get_timestamp(void) {
function uint16 (line 66) | uint16 t_rtp_event_dtmf_player::get_payload(uint8 *payload,
function uint16 (line 135) | uint16 t_inband_dtmf_player::get_payload(uint8 *payload,
FILE: src/audio/dtmf_player.h
function class (line 32) | class t_dtmf_player {
function class (line 70) | class t_rtp_event_dtmf_player : public t_dtmf_player {
function class (line 82) | class t_inband_dtmf_player : public t_dtmf_player {
FILE: src/audio/freq_gen.cpp
function int16 (line 116) | int16 t_freq_gen::get_sample(uint32 ts_usec) const {
FILE: src/audio/freq_gen.h
function class (line 34) | class t_freq_gen {
FILE: src/audio/g711.cpp
function search (line 101) | static short
function linear2alaw (line 135) | unsigned char
function alaw2linear (line 173) | short
function linear2ulaw (line 230) | unsigned char
function ulaw2linear (line 274) | short
function alaw2ulaw (line 294) | unsigned char
function ulaw2alaw (line 304) | unsigned char
FILE: src/audio/g721.cpp
function g721_encoder (line 79) | int
function g721_decoder (line 136) | int
FILE: src/audio/g722.h
type g722_encode_state_t (line 56) | typedef struct
type g722_decode_state_t (line 94) | typedef struct
FILE: src/audio/g722_decode.c
function saturate (line 47) | static __inline__ int16_t saturate(int32_t amp)
function block4 (line 63) | static void block4(g722_decode_state_t *s, int band, int d)
function g722_decode_state_t (line 153) | g722_decode_state_t *g722_decode_init(g722_decode_state_t *s, int rate, ...
function g722_decode_release (line 179) | int g722_decode_release(g722_decode_state_t *s)
function g722_decode (line 186) | int g722_decode(g722_decode_state_t *s, int16_t amp[], const uint8_t g72...
FILE: src/audio/g722_encode.c
function saturate (line 49) | static __inline__ int16_t saturate(int32_t amp)
function block4 (line 63) | static void block4(g722_encode_state_t *s, int band, int d)
function g722_encode_state_t (line 152) | g722_encode_state_t *g722_encode_init(g722_encode_state_t *s, int rate, ...
function g722_encode_release (line 178) | int g722_encode_release(g722_encode_state_t *s)
function g722_encode (line 185) | int g722_encode(g722_encode_state_t *s, uint8_t g722_data[], const int16...
FILE: src/audio/g723_16.cpp
function g723_16_encoder (line 81) | int
function g723_16_decoder (line 144) | int
FILE: src/audio/g723_24.cpp
function g723_24_encoder (line 67) | int
function g723_24_decoder (line 122) | int
FILE: src/audio/g723_40.cpp
function g723_40_encoder (line 86) | int
function g723_40_decoder (line 142) | int
FILE: src/audio/g72x.cpp
function quan (line 48) | static int
function fmult (line 68) | static int
function g72x_init_state (line 97) | void
function predictor_zero (line 126) | int
function predictor_pole (line 144) | int
function step_size (line 157) | int
function quantize (line 188) | int
function reconstruct (line 239) | int
function update (line 268) | void
function tandem_adjust_alaw (line 475) | int
function tandem_adjust_ulaw (line 524) | int
FILE: src/audio/g72x.h
type g72x_state (line 49) | struct g72x_state {
type g72x_state (line 75) | struct g72x_state
type g72x_state (line 76) | struct g72x_state
type g72x_state (line 77) | struct g72x_state
type g72x_state (line 98) | struct g72x_state
type g72x_state (line 117) | struct g72x_state
type g72x_state (line 121) | struct g72x_state
type g72x_state (line 125) | struct g72x_state
type g72x_state (line 129) | struct g72x_state
type g72x_state (line 133) | struct g72x_state
type g72x_state (line 137) | struct g72x_state
type g72x_state (line 141) | struct g72x_state
type g72x_state (line 145) | struct g72x_state
type g72x_state (line 149) | struct g72x_state
FILE: src/audio/gsm/inc/gsm.h
type gsm_state (line 39) | struct gsm_state
type gsm_signal (line 40) | typedef short gsm_signal;
type gsm_byte (line 41) | typedef unsigned char gsm_byte;
type gsm_byte (line 42) | typedef gsm_byte gsm_frame[33];
FILE: src/audio/gsm/inc/private.h
type word (line 12) | typedef short word;
type longword (line 13) | typedef long longword;
type uword (line 15) | typedef unsigned short uword;
type ulongword (line 16) | typedef unsigned long ulongword;
type gsm_state (line 18) | struct gsm_state {
type gsm_state (line 144) | struct gsm_state
type gsm_state (line 154) | struct gsm_state
type gsm_state (line 163) | struct gsm_state
type gsm_state (line 168) | struct gsm_state
type gsm_state (line 172) | struct gsm_state
type gsm_state (line 180) | struct gsm_state
type gsm_state (line 185) | struct gsm_state
type gsm_state (line 195) | struct gsm_state
type gsm_state (line 202) | struct gsm_state
type gsm_state (line 209) | struct gsm_state
type gsm_state (line 216) | struct gsm_state
type gsm_state (line 223) | struct gsm_state
FILE: src/audio/gsm/src/gsm_create.cpp
function gsm (line 34) | gsm gsm_create P0()
FILE: src/audio/media_buffer.h
function class (line 27) | class t_media_buffer {
FILE: src/audio/rtp_telephone_event.cpp
function t_dtmf_ev (line 62) | t_dtmf_ev char2dtmf_ev(char sym) {
function dtmf_ev2char (line 73) | char dtmf_ev2char(t_dtmf_ev ev) {
FILE: src/audio/rtp_telephone_event.h
type t_dtmf_ev (line 27) | typedef unsigned char t_dtmf_ev;
function is_valid_dtmf_ev (line 47) | static inline bool is_valid_dtmf_ev(t_dtmf_ev ev)
function is_valid_dtmf_sym (line 52) | static inline bool is_valid_dtmf_sym(char s)
type t_rtp_telephone_event (line 67) | struct t_rtp_telephone_event {
FILE: src/audio/tone_gen.h
function class (line 35) | class t_tone_gen {
FILE: src/audio/twinkle_rtp_session.cpp
function uint32 (line 91) | uint32 t_twinkle_rtp_session::getLastTimestamp(const SyncSource *src) co...
FILE: src/audio/twinkle_rtp_session.h
function class (line 42) | class t_twinkle_rtp_session : public SymmetricRTPSession {
FILE: src/audio/twinkle_zrtp_ui.cpp
function string (line 268) | const string *const TwinkleZrtpUI::mapCodesToString(MessageSeverity seve...
FILE: src/audio/twinkle_zrtp_ui.h
function class (line 42) | class TwinkleZrtpUI : public ZrtpUserCallback {
FILE: src/audits/memman.h
function class (line 36) | class t_ptr_info {
function class (line 51) | class t_memman {
FILE: src/auth.h
function class (line 37) | class t_cr_cache_entry {
function class (line 61) | class t_auth {
FILE: src/call_history.cpp
type timeval (line 92) | struct timeval
type timeval (line 134) | struct timeval
type timeval (line 155) | struct timeval
type timeval (line 172) | struct timeval
function string (line 188) | string t_call_record::get_rel_cause(void) const {
function string (line 201) | string t_call_record::get_rel_cause_internal(void) const {
function string (line 214) | string t_call_record::get_direction(void) const {
function string (line 225) | string t_call_record::get_direction_internal(void) const {
function t_call_record (line 347) | t_call_record& t_call_record::operator=(const t_call_record& that) {
FILE: src/call_history.h
function class (line 38) | class t_call_record : public utils::t_record {
function class (line 192) | class t_call_history : public utils::t_record_file<t_call_record> {
FILE: src/call_script.cpp
function string (line 120) | string t_call_script::trigger2str(t_trigger t) const {
function string (line 143) | string t_call_script::cf_dest2str(const list<t_display_url> &cf_dest) co...
FILE: src/call_script.h
function class (line 81) | class t_script_result {
function class (line 125) | class t_call_script {
FILE: src/client_request.cpp
function t_client_request (line 65) | t_client_request *t_client_request::copy(void) {
function t_request (line 82) | t_request *t_client_request::get_request(void) const {
function StunMessage (line 86) | StunMessage *t_client_request::get_stun_request(void) const {
function t_tuid (line 90) | t_tuid t_client_request::get_tuid(void) const {
function t_tid (line 94) | t_tid t_client_request::get_tid(void) const {
FILE: src/client_request.h
function class (line 36) | class t_client_request {
FILE: src/cmd_socket.cpp
type cmdsocket (line 29) | namespace cmdsocket {
type t_cmd_code (line 32) | enum t_cmd_code {
function string (line 39) | string cmd_code2str(t_cmd_code opcode) {
function exec_cmd (line 54) | void exec_cmd(t_socket_local &sock_client) {
function write_cmd_to_socket (line 155) | void write_cmd_to_socket(t_cmd_code opcode, bool immediate, const stri...
function cmd_call (line 183) | void cmd_call(const string &destination, bool immediate) {
function cmd_cli (line 187) | void cmd_cli(const string &cli_command, bool immediate) {
function cmd_show (line 191) | void cmd_show(void) {
function cmd_hide (line 195) | void cmd_hide(void) {
FILE: src/cmd_socket.h
function namespace (line 33) | namespace cmdsocket {
FILE: src/dialog.cpp
function t_request (line 49) | t_request *t_dialog::create_request(t_method m) {
function t_dialog (line 2461) | t_dialog *t_dialog::copy(void) {
function t_dialog_state (line 3924) | t_dialog_state t_dialog::get_state(void) const {
function t_phone (line 4006) | t_phone *t_dialog::get_phone(void) const {
function t_line (line 4010) | t_line *t_dialog::get_line(void) const {
function t_session (line 4014) | t_session *t_dialog::get_session(void) const {
function t_audio_session (line 4018) | t_audio_session *t_dialog::get_audio_session(void) const {
FILE: src/dialog.h
type t_dialog_state (line 53) | enum t_dialog_state {
type t_reinvite_purpose (line 78) | enum t_reinvite_purpose {
function class (line 193) | class t_dialog : public t_abstract_dialog {
FILE: src/diamondcard.cpp
function string (line 31) | string diamondcard_url(t_dc_action action, const string &accountId, cons...
function diamondcard_set_user_config (line 65) | void diamondcard_set_user_config(t_user &user, const string &displayName,
function diamondcard_get_users (line 114) | list<t_user *>diamondcard_get_users(t_phone *phone) {
FILE: src/diamondcard.h
type t_dc_action (line 35) | enum t_dc_action {
FILE: src/epa.cpp
function t_request (line 67) | t_request *t_epa::create_publish(unsigned long expires, t_sip_body *body...
function string (line 210) | string t_epa::get_failure_msg(void) const {
function t_phone_user (line 214) | t_phone_user *t_epa::get_phone_user(void) const {
function t_user (line 218) | t_user *t_epa::get_user_profile(void) const {
FILE: src/epa.h
function class (line 39) | class t_epa {
FILE: src/events.cpp
function string (line 25) | string event_type2str(t_event_type t) {
function t_event_type (line 67) | t_event_type t_event_network::get_type(void) const {
function t_sip_message (line 71) | t_sip_message *t_event_network::get_msg(void) const {
function t_event_type (line 81) | t_event_type t_event_quit::get_type(void) const {
function t_event_type (line 128) | t_event_type t_event_user::get_type(void) const {
function t_sip_message (line 132) | t_sip_message *t_event_user::get_msg(void) const {
function t_user (line 148) | t_user *t_event_user::get_user_config(void) const {
function t_event_type (line 165) | t_event_type t_event_timeout::get_type(void) const {
function t_timer (line 169) | t_timer *t_event_timeout::get_timer(void) const {
function t_event_type (line 190) | t_event_type t_event_failure::get_type(void) const {
function t_failure (line 194) | t_failure t_event_failure::get_failure(void) const {
function string (line 202) | string t_event_failure::get_branch(void) const {
function t_method (line 206) | t_method t_event_failure::get_cseq_method(void) const {
function t_event_type (line 223) | t_event_type t_event_start_timer::get_type(void) const {
function t_timer (line 227) | t_timer *t_event_start_timer::get_timer(void) const {
function t_event_type (line 240) | t_event_type t_event_stop_timer::get_type(void) const {
function t_event_type (line 257) | t_event_type t_event_abort_trans::get_type(void) const {
function t_event_type (line 290) | t_event_type t_event_stun_request::get_type(void) const {
function StunMessage (line 294) | StunMessage *t_event_stun_request::get_msg(void) const {
function t_stun_event_type (line 305) | t_stun_event_type t_event_stun_request::get_stun_event_type(void) const {
function t_user (line 309) | t_user *t_event_stun_request::get_user_config(void) const {
function t_event_type (line 331) | t_event_type t_event_stun_response::get_type(void) const {
function StunMessage (line 335) | StunMessage *t_event_stun_response::get_msg(void) const {
function t_event_type (line 350) | t_event_type t_event_nat_keepalive::get_type(void) const {
function t_event_type (line 359) | t_event_type t_event_icmp::get_type(void) const {
function t_icmp_msg (line 363) | t_icmp_msg t_event_icmp::get_icmp(void) const {
function t_event_type (line 375) | t_event_type t_event_ui::get_type(void) const {
function t_event_type (line 451) | t_event_type t_event_async_response::get_type(void) const {
function t_event_type (line 476) | t_event_type t_event_broken_connection::get_type(void) const {
function t_url (line 480) | t_url t_event_broken_connection::get_user_uri(void) const {
function t_event_type (line 495) | t_event_type t_event_tcp_ping::get_type(void) const {
function t_url (line 499) | t_url t_event_tcp_ping::get_user_uri(void) const {
function IPaddr (line 503) | IPaddr t_event_tcp_ping::get_dst_addr(void) const {
function t_event_type (line 523) | t_event_type t_event_fncall::get_type(void) const {
function t_event (line 705) | t_event *t_event_queue::pop(void) {
function t_event (line 728) | t_event *t_event_queue::pop(bool &interrupted) {
FILE: src/events.h
type t_event_type (line 45) | enum t_event_type {
function class (line 66) | class t_event {
function class (line 79) | class t_event_quit : public t_event {
function class (line 91) | class t_event_network : public t_event {
function class (line 127) | class t_event_user : public t_event {
function class (line 194) | class t_event_timeout : public t_event {
function class (line 224) | class t_event_failure : public t_event {
function class (line 278) | class t_event_start_timer : public t_event {
function class (line 304) | class t_event_stop_timer : public t_event {
function class (line 331) | class t_event_abort_trans : public t_event {
type t_stun_event_type (line 352) | enum t_stun_event_type {
function class (line 360) | class t_event_stun_request : public t_event {
function class (line 401) | class t_event_stun_response : public t_event {
function class (line 431) | class t_event_nat_keepalive : public t_event {
function class (line 444) | class t_event_icmp : public t_event {
type t_ui_event_type (line 466) | enum t_ui_event_type {
type t_msg_priority (line 479) | enum t_msg_priority {
function class (line 493) | class t_event_ui : public t_event {
function class (line 543) | class t_event_async_response : public t_event {
function class (line 588) | class t_event_broken_connection : public t_event {
function class (line 610) | class t_event_tcp_ping : public t_event {
function class (line 632) | class t_event_fncall : public t_event {
function class (line 649) | class t_event_queue {
FILE: src/exceptions.h
type t_exception (line 29) | enum t_exception {
function class (line 34) | class empty_list_exception : public std::exception {
FILE: src/gui/address_finder.cpp
function t_address_finder (line 89) | t_address_finder *t_address_finder::get_instance(void) {
function string (line 101) | string t_address_finder::find_name(t_user *user_config, const t_url &u) {
function QImage (line 109) | QImage t_address_finder:: find_photo(t_user *user_config, const t_url &u) {
FILE: src/gui/address_finder.h
function class (line 36) | class t_address_finder : public QObject {
FILE: src/gui/addresstablemodel.cpp
function QVariant (line 38) | QVariant AddressTableModel::data(const QModelIndex &index, int role) const
function QVariant (line 57) | QVariant AddressTableModel::headerData(int section, Qt::Orientation orie...
FILE: src/gui/addresstablemodel.h
function class (line 30) | class AddressTableModel : public QAbstractTableModel
FILE: src/gui/akonadiaddressbook.cpp
function AkonadiAddressBook (line 54) | AkonadiAddressBook *AkonadiAddressBook::self()
FILE: src/gui/akonadiaddressbook.h
function class (line 46) | class AkonadiAddressBook : public QObject
FILE: src/gui/buddylistview.cpp
function QString (line 62) | QString AbstractBLVItem::get_tip(void) {
function t_buddy (line 151) | t_buddy *BuddyListViewItem::get_buddy(void) {
function t_presence_epa (line 245) | t_presence_epa *BLViewUserItem::get_presence_epa(void) {
FILE: src/gui/buddylistview.h
function class (line 28) | class AbstractBLVItem : public QTreeWidgetItem {
FILE: src/gui/command_args.h
type t_command_args (line 24) | struct t_command_args {
FILE: src/gui/getprofilenameform.cpp
function QString (line 85) | QString GetProfileNameForm:: getProfileName()
FILE: src/gui/gui.cpp
function QString (line 83) | QString str2html(const QString &s)
function setDisabledIcon (line 94) | void setDisabledIcon(QAction *action, const QString &icon) {
function setDisabledIcon (line 100) | void setDisabledIcon(QToolButton *toolButton, const QString &icon) {
function QString (line 427) | QString t_gui::gui_get_current_profile()
function string (line 1030) | string t_gui::select_network_intf(void) {
function string (line 2875) | string t_gui::get_name_from_abook(t_user *user_config, const t_url &u) {
function QString (line 3137) | QString t_gui::get_last_file_browse_path(void) const {
function string (line 3232) | string t_gui::mime2file_extension(t_media media) {
FILE: src/gui/gui.h
type t_select_purpose (line 52) | enum t_select_purpose {
FILE: src/gui/historyform.cpp
type timeval (line 263) | struct timeval
FILE: src/gui/idlesession_inhibitor.h
type _state (line 48) | enum _state
type _state (line 57) | enum _state
type _state (line 60) | enum _state
FILE: src/gui/idlesession_manager.h
function class (line 31) | class IdleSessionManager : public QObject
FILE: src/gui/incoming_call_popup.h
function class (line 7) | class IncomingCallPopup : public QObject
FILE: src/gui/kcontactstablemodel.cpp
function QVariant (line 30) | QVariant KContactsTableModel::headerData(int section, Qt::Orientation or...
function t_address_card (line 56) | t_address_card KContactsTableModel::addressCard(const KContacts::Address...
FILE: src/gui/kcontactstablemodel.h
function class (line 33) | class KContactsTableModel : public AddressTableModel
FILE: src/gui/main.cpp
class t_init_rand (line 74) | class t_init_rand {
function parse_main_args (line 184) | void parse_main_args(int argc, char **argv, bool &cli_mode, bool &overri...
function open_sip_socket (line 441) | bool open_sip_socket(bool cli_mode) {
function QApplication (line 479) | QApplication *create_user_interface(bool cli_mode, int argc, char **argv...
function blockSignals (line 547) | void blockSignals()
function main (line 578) | int main( int argc, char ** argv )
FILE: src/gui/mphoneform.cpp
function QString (line 364) | QString MphoneForm::lineSubstate2str( int line) {
type timeval (line 440) | struct timeval
function QString (line 1053) | QString MphoneForm::getMWIStatus(const t_mwi &mwi, bool &msg_waiting) const
function QSystemTrayIcon (line 2631) | QSystemTrayIcon *MphoneForm::getSysTray()
type timeval (line 3320) | struct timeval
FILE: src/gui/osd.h
function class (line 12) | class OSD : public QObject
FILE: src/gui/qt_translator.h
function class (line 26) | class t_qt_translator : public t_translator {
FILE: src/gui/syssettingsform.cpp
function string (line 110) | string SysSettingsForm::comboItem2audio_dev(QString item, QLineEdit *qle...
FILE: src/gui/twinkleapplication.h
function class (line 32) | class t_twinkle_application : public QApplication {
FILE: src/gui/userprofileform.cpp
function t_audio_codec (line 235) | t_audio_codec UserProfileForm::label2codec(const QString &label) {
function QString (line 267) | QString UserProfileForm::codec2label(t_audio_codec &codec) {
function t_ext_support (line 318) | t_ext_support UserProfileForm::indexComboItem2ext_support(int index) {
FILE: src/gui/wizardform.cpp
type t_provider (line 32) | struct t_provider {
FILE: src/gui/wizardform.h
type t_provider (line 4) | struct t_provider
FILE: src/gui/yesnodialog.h
function class (line 25) | class YesNoDialog : public QDialog {
function class (line 43) | class ReferPermissionDialog : public YesNoDialog {
FILE: src/id_object.cpp
function t_object_id (line 31) | t_object_id t_id_object::get_object_id() {
FILE: src/id_object.h
type t_object_id (line 31) | typedef unsigned short t_object_id;
function class (line 36) | class t_id_object {
FILE: src/im/im_iscomposing_body.cpp
function t_sip_body (line 134) | t_sip_body *t_im_iscomposing_xml_body::copy(void) const {
function t_body_type (line 147) | t_body_type t_im_iscomposing_xml_body::get_type(void) const {
function t_media (line 151) | t_media t_im_iscomposing_xml_body::get_media(void) const {
function string (line 167) | string t_im_iscomposing_xml_body::get_state(void) const {
function time_t (line 171) | time_t t_im_iscomposing_xml_body::get_refresh(void) const {
FILE: src/im/im_iscomposing_body.h
function class (line 40) | class t_im_iscomposing_xml_body : public t_sip_body_xml {
FILE: src/im/msg_session.cpp
function t_composing_state (line 38) | t_composing_state im::string2composing_state(const string &state_name) {
function string (line 46) | string im::composing_state2string(t_composing_state state) {
type timeval (line 64) | struct timeval
type timeval (line 76) | struct timeval
function t_user (line 139) | t_user *t_msg_session::get_user(void) const {
function t_display_url (line 143) | t_display_url t_msg_session::get_remote_party(void) const {
function t_composing_state (line 147) | t_composing_state t_msg_session::get_remote_composing_state(void) const {
function t_msg (line 163) | t_msg t_msg_session::get_last_message(void) {
function string (line 263) | string t_msg_session::take_error(void) {
function string (line 279) | string t_msg_session::take_delivery_notification(void) {
FILE: src/im/msg_session.h
function namespace (line 41) | namespace im {
FILE: src/line.cpp
function t_call_info (line 44) | t_call_info& t_call_info::operator=(const t_call_info& that) {
function string (line 96) | string t_call_info::get_from_display_presentation(void) const {
function t_dialog (line 115) | t_dialog *t_line::match_response(t_response *r,
function t_dialog (line 126) | t_dialog *t_line::match_response(StunMessage *r, t_tuid tuid,
function t_dialog (line 137) | t_dialog *t_line::match_call_id_tags(const string &call_id,
function t_dialog (line 149) | t_dialog *t_line::get_dialog(t_object_id did) const {
function t_line_state (line 435) | t_line_state t_line::get_state(void) const {
function t_line_substate (line 439) | t_line_substate t_line::get_substate(void) const {
function t_refer_state (line 443) | t_refer_state t_line::get_refer_state(void) const {
function string (line 1987) | string t_line::create_user_contact(const string &auto_ip) const {
function string (line 1993) | string t_line::create_user_uri(void) const {
function t_response (line 1999) | t_response *t_line::create_options_response(t_request *r, bool in_dialog...
function t_phone (line 2019) | t_phone *t_line::get_phone(void) const {
function t_url (line 2087) | t_url t_line::get_remote_target_uri(void) const {
function t_url (line 2092) | t_url t_line::get_remote_target_uri_pending(void) const {
function string (line 2097) | string t_line::get_remote_target_display(void) const {
function string (line 2102) | string t_line::get_remote_target_display_pending(void) const {
function t_url (line 2107) | t_url t_line::get_remote_uri(void) const {
function t_url (line 2112) | t_url t_line::get_remote_uri_pending(void) const {
function string (line 2117) | string t_line::get_remote_display(void) const {
function string (line 2122) | string t_line::get_remote_display_pending(void) const {
function string (line 2127) | string t_line::get_call_id(void) const {
function string (line 2132) | string t_line::get_call_id_pending(void) const {
function string (line 2137) | string t_line::get_local_tag(void) const {
function string (line 2142) | string t_line::get_local_tag_pending(void) const {
function string (line 2147) | string t_line::get_remote_tag(void) const {
function string (line 2152) | string t_line::get_remote_tag_pending(void) const {
function t_session (line 2180) | t_session *t_line::get_session(void) const {
function t_audio_session (line 2186) | t_audio_session *t_line::get_audio_session(void) const {
function t_call_info (line 2214) | t_call_info t_line::get_call_info(void) const {
function t_user (line 2248) | t_user *t_line::get_user(void) const {
function t_phone_user (line 2258) | t_phone_user *t_line::get_phone_user(void) const {
function string (line 2262) | string t_line::get_ringtone(void) const {
function t_dialog (line 2345) | t_dialog *t_line::get_dialog_with_active_session(void) const {
FILE: src/line.h
function class (line 44) | class t_call_info {
function class (line 82) | class t_line : public t_id_object {
FILE: src/listener.cpp
function recvd_stun_msg (line 52) | void recvd_stun_msg(char *datagram, int datagram_size,
function t_sip_body (line 75) | t_sip_body *parse_body(const string &data, const t_sip_message *msg) {
function process_sip_msg (line 190) | static void process_sip_msg(t_sip_message *msg, const string &raw_header...
FILE: src/log.cpp
type timeval (line 158) | struct timeval
type tm (line 159) | struct tm
function string (line 340) | string t_log::get_filename(void) const {
FILE: src/log.h
type t_log_severity (line 32) | enum t_log_severity {
type t_log_class (line 40) | enum t_log_class {
function class (line 47) | class t_log {
FILE: src/main.cpp
class t_init_rand (line 50) | class t_init_rand {
function main (line 147) | int main(int argc, char *argv[]) {
FILE: src/mwi/mwi.cpp
function t_msg_summary (line 42) | t_msg_summary t_mwi::get_voice_msg_summary(void) const {
FILE: src/mwi/mwi.h
function class (line 30) | class t_mwi {
FILE: src/mwi/mwi_dialog.cpp
function t_mwi_dialog (line 31) | t_mwi_dialog *t_mwi_dialog::copy(void) {
FILE: src/mwi/mwi_dialog.h
function class (line 27) | class t_mwi_dialog : public t_subscription_dialog {
FILE: src/mwi/mwi_subscription.cpp
function t_request (line 26) | t_request *t_mwi_subscription::create_subscribe(unsigned long expires) c...
FILE: src/mwi/mwi_subscription.h
function class (line 28) | class t_mwi_subscription : public t_subscription {
FILE: src/mwi/simple_msg_sum_body.cpp
function string (line 87) | string t_simple_msg_sum_body::encode(void) const {
function t_sip_body (line 120) | t_sip_body *t_simple_msg_sum_body::copy(void) const {
function t_body_type (line 126) | t_body_type t_simple_msg_sum_body::get_type(void) const {
function t_media (line 130) | t_media t_simple_msg_sum_body::get_media(void) const {
function t_url (line 142) | t_url t_simple_msg_sum_body::get_msg_account(void) const {
FILE: src/mwi/simple_msg_sum_body.h
type t_msg_summary (line 42) | struct t_msg_summary {
type string (line 61) | typedef string t_msg_context;
type map (line 62) | typedef map<t_msg_context, t_msg_summary>::const_iterator t_msg_sum_cons...
function class (line 64) | class t_simple_msg_sum_body : public t_sip_body {
FILE: src/parser/challenge.cpp
function string (line 31) | string t_digest_challenge::encode(void) const {
function string (line 161) | string t_challenge::encode(void) const {
FILE: src/parser/challenge.h
function class (line 31) | class t_digest_challenge {
function class (line 54) | class t_challenge {
FILE: src/parser/coding.cpp
function string (line 30) | string t_coding::encode(void) const {
FILE: src/parser/coding.h
function class (line 27) | class t_coding {
FILE: src/parser/credentials.cpp
function string (line 26) | string t_digest_response::encode(void) const {
function string (line 141) | string t_credentials::encode(void) const {
FILE: src/parser/credentials.h
function class (line 31) | class t_digest_response {
function class (line 57) | class t_credentials {
FILE: src/parser/definitions.cpp
function string (line 22) | string method2str(const t_method &m, const string &unknown) {
function t_method (line 43) | t_method str2method(const string &s) {
FILE: src/parser/definitions.h
type t_method (line 48) | enum t_method {
FILE: src/parser/hdr_accept.cpp
function string (line 33) | string t_hdr_accept::encode_value(void) const {
FILE: src/parser/hdr_accept.h
function class (line 27) | class t_hdr_accept : public t_header {
FILE: src/parser/hdr_accept_encoding.cpp
function string (line 28) | string t_hdr_accept_encoding::encode_value(void) const {
FILE: src/parser/hdr_accept_encoding.h
function class (line 30) | class t_hdr_accept_encoding : public t_header {
FILE: src/parser/hdr_accept_language.cpp
function string (line 32) | string t_language::encode(void) const {
function string (line 52) | string t_hdr_accept_language::encode_value(void) const {
FILE: src/parser/hdr_accept_language.h
function class (line 29) | class t_language {
function class (line 39) | class t_hdr_accept_language : public t_header {
FILE: src/parser/hdr_alert_info.cpp
function string (line 25) | string t_alert_param::encode(void) const {
function string (line 42) | string t_hdr_alert_info::encode_value(void) const {
FILE: src/parser/hdr_alert_info.h
function class (line 31) | class t_alert_param {
function class (line 40) | class t_hdr_alert_info : public t_header {
FILE: src/parser/hdr_allow.cpp
function string (line 52) | string t_hdr_allow::encode_value(void) const {
FILE: src/parser/hdr_allow.h
function class (line 30) | class t_hdr_allow : public t_header {
FILE: src/parser/hdr_allow_events.cpp
function string (line 28) | string t_hdr_allow_events::encode_value(void) const {
FILE: src/parser/hdr_allow_events.h
function class (line 30) | class t_hdr_allow_events : public t_header {
FILE: src/parser/hdr_auth_info.cpp
function string (line 51) | string t_hdr_auth_info::encode_value(void) const {
FILE: src/parser/hdr_auth_info.h
function class (line 28) | class t_hdr_auth_info : public t_header {
FILE: src/parser/hdr_authorization.cpp
function string (line 28) | string t_hdr_authorization::encode(void) const {
function string (line 47) | string t_hdr_authorization::encode_value(void) const {
FILE: src/parser/hdr_authorization.h
function class (line 32) | class t_hdr_authorization : public t_header {
FILE: src/parser/hdr_call_id.cpp
function string (line 29) | string t_hdr_call_id::encode_value(void) const {
FILE: src/parser/hdr_call_id.h
function class (line 28) | class t_hdr_call_id : public t_header {
FILE: src/parser/hdr_call_info.cpp
function string (line 25) | string t_info_param::encode(void) const {
function string (line 42) | string t_hdr_call_info::encode_value(void) const {
FILE: src/parser/hdr_call_info.h
function class (line 31) | class t_info_param {
function class (line 40) | class t_hdr_call_info : public t_header {
FILE: src/parser/hdr_contact.cpp
function string (line 34) | string t_contact_param::encode(void) const {
function t_contact_param (line 127) | t_contact_param *t_hdr_contact::find_contact(const t_url &u) {
function string (line 159) | string t_hdr_contact::encode_value(void) const {
FILE: src/parser/hdr_contact.h
function class (line 31) | class t_contact_param {
function class (line 57) | class t_hdr_contact : public t_header {
FILE: src/parser/hdr_content_disp.cpp
function string (line 43) | string t_hdr_content_disp::encode_value(void) const {
FILE: src/parser/hdr_content_disp.h
function class (line 35) | class t_hdr_content_disp : public t_header {
FILE: src/parser/hdr_content_encoding.cpp
function string (line 29) | string t_hdr_content_encoding::encode_value(void) const {
FILE: src/parser/hdr_content_encoding.h
function class (line 30) | class t_hdr_content_encoding : public t_header {
FILE: src/parser/hdr_content_language.cpp
function string (line 29) | string t_hdr_content_language::encode_value(void) const {
FILE: src/parser/hdr_content_language.h
function class (line 30) | class t_hdr_content_language : public t_header {
FILE: src/parser/hdr_content_length.cpp
function string (line 32) | string t_hdr_content_length::encode_value(void) const {
FILE: src/parser/hdr_content_length.h
function class (line 28) | class t_hdr_content_length : public t_header {
FILE: src/parser/hdr_content_type.cpp
function string (line 29) | string t_hdr_content_type::encode_value(void) const {
FILE: src/parser/hdr_content_type.h
function class (line 26) | class t_hdr_content_type : public t_header {
FILE: src/parser/hdr_cseq.cpp
function string (line 46) | string t_hdr_cseq::encode_value(void) const {
FILE: src/parser/hdr_cseq.h
function class (line 29) | class t_hdr_cseq : public t_header {
FILE: src/parser/hdr_date.cpp
type tm (line 27) | struct tm
type timeval (line 33) | struct timeval
function string (line 40) | string t_hdr_date::encode_value(void) const {
FILE: src/parser/hdr_date.h
function class (line 27) | class t_hdr_date : public t_header {
FILE: src/parser/hdr_error_info.cpp
function string (line 25) | string t_error_param::encode(void) const {
function string (line 42) | string t_hdr_error_info::encode_value(void) const {
FILE: src/parser/hdr_error_info.h
function class (line 31) | class t_error_param {
function class (line 40) | class t_hdr_error_info : public t_header {
FILE: src/parser/hdr_event.cpp
function string (line 38) | string t_hdr_event::encode_value(void) const {
FILE: src/parser/hdr_event.h
function class (line 35) | class t_hdr_event : public t_header {
FILE: src/parser/hdr_expires.cpp
function string (line 31) | string t_hdr_expires::encode_value(void) const {
FILE: src/parser/hdr_expires.h
function class (line 28) | class t_hdr_expires : public t_header {
FILE: src/parser/hdr_from.cpp
function string (line 55) | string t_hdr_from::encode_value(void) const {
function string (line 81) | string t_hdr_from::get_display_presentation(void) const {
FILE: src/parser/hdr_from.h
function class (line 30) | class t_hdr_from : public t_header {
FILE: src/parser/hdr_in_reply_to.cpp
function string (line 28) | string t_hdr_in_reply_to::encode_value(void) const {
FILE: src/parser/hdr_in_reply_to.h
function class (line 29) | class t_hdr_in_reply_to : public t_header {
FILE: src/parser/hdr_max_forwards.cpp
function string (line 31) | string t_hdr_max_forwards::encode_value(void) const {
FILE: src/parser/hdr_max_forwards.h
function class (line 28) | class t_hdr_max_forwards : public t_header {
FILE: src/parser/hdr_mime_version.cpp
function string (line 28) | string t_hdr_mime_version::encode_value(void) const {
FILE: src/parser/hdr_mime_version.h
function class (line 27) | class t_hdr_mime_version : public t_header {
FILE: src/parser/hdr_min_expires.cpp
function string (line 31) | string t_hdr_min_expires::encode_value(void) const {
FILE: src/parser/hdr_min_expires.h
function class (line 28) | class t_hdr_min_expires : public t_header {
FILE: src/parser/hdr_min_se.cpp
function string (line 42) | string t_hdr_min_se::encode_value(void) const {
FILE: src/parser/hdr_min_se.h
function class (line 29) | class t_hdr_min_se : public t_header {
FILE: src/parser/hdr_organization.cpp
function string (line 28) | string t_hdr_organization::encode_value(void) const {
FILE: src/parser/hdr_organization.h
function class (line 27) | class t_hdr_organization : public t_header {
FILE: src/parser/hdr_p_asserted_identity.cpp
function string (line 29) | string t_hdr_p_asserted_identity::encode_value(void) const {
FILE: src/parser/hdr_p_asserted_identity.h
function class (line 30) | class t_hdr_p_asserted_identity : public t_header {
FILE: src/parser/hdr_p_preferred_identity.cpp
function string (line 29) | string t_hdr_p_preferred_identity::encode_value(void) const {
FILE: src/parser/hdr_p_preferred_identity.h
function class (line 30) | class t_hdr_p_preferred_identity : public t_header {
FILE: src/parser/hdr_priority.cpp
function string (line 28) | string t_hdr_priority::encode_value(void) const {
FILE: src/parser/hdr_priority.h
function class (line 27) | class t_hdr_priority : public t_header {
FILE: src/parser/hdr_privacy.cpp
function string (line 37) | string t_hdr_privacy::encode_value(void) const {
FILE: src/parser/hdr_privacy.h
function class (line 37) | class t_hdr_privacy : public t_header {
FILE: src/parser/hdr_proxy_authenticate.cpp
function string (line 28) | string t_hdr_proxy_authenticate::encode_value(void) const {
FILE: src/parser/hdr_proxy_authenticate.h
function class (line 30) | class t_hdr_proxy_authenticate : public t_header {
FILE: src/parser/hdr_proxy_authorization.cpp
function string (line 28) | string t_hdr_proxy_authorization::encode(void) const {
function string (line 47) | string t_hdr_proxy_authorization::encode_value(void) const {
FILE: src/parser/hdr_proxy_authorization.h
function class (line 32) | class t_hdr_proxy_authorization : public t_header {
FILE: src/parser/hdr_proxy_require.cpp
function string (line 28) | string t_hdr_proxy_require::encode_value(void) const {
FILE: src/parser/hdr_proxy_require.h
function class (line 27) | class t_hdr_proxy_require : public t_header {
FILE: src/parser/hdr_rack.cpp
function string (line 52) | string t_hdr_rack::encode_value(void) const {
FILE: src/parser/hdr_rack.h
function class (line 30) | class t_hdr_rack : public t_header {
FILE: src/parser/hdr_reason.h
function class (line 31) | class t_reason {
function class (line 47) | class t_hdr_reason : public t_header {
FILE: src/parser/hdr_record_route.cpp
function string (line 30) | string t_hdr_record_route::encode(void) const {
function string (line 35) | string t_hdr_record_route::encode_multi_header(void) const {
function string (line 52) | string t_hdr_record_route::encode_value(void) const {
FILE: src/parser/hdr_record_route.h
function class (line 32) | class t_hdr_record_route : public t_header {
FILE: src/parser/hdr_refer_sub.cpp
function string (line 39) | string t_hdr_refer_sub::encode_value(void) const {
FILE: src/parser/hdr_refer_sub.h
function class (line 32) | class t_hdr_refer_sub : public t_header {
FILE: src/parser/hdr_refer_to.cpp
function string (line 50) | string t_hdr_refer_to::encode_value(void) const {
FILE: src/parser/hdr_refer_to.h
function class (line 31) | class t_hdr_refer_to : public t_header {
FILE: src/parser/hdr_referred_by.cpp
function string (line 55) | string t_hdr_referred_by::encode_value(void) const {
FILE: src/parser/hdr_referred_by.h
function class (line 31) | class t_hdr_referred_by : public t_header {
FILE: src/parser/hdr_replaces.cpp
function string (line 54) | string t_hdr_replaces::encode_value(void) const {
FILE: src/parser/hdr_replaces.h
function class (line 31) | class t_hdr_replaces : public t_header {
FILE: src/parser/hdr_reply_to.cpp
function string (line 48) | string t_hdr_reply_to::encode_value(void) const {
FILE: src/parser/hdr_reply_to.h
function class (line 30) | class t_hdr_reply_to : public t_header {
FILE: src/parser/hdr_request_disposition.cpp
function string (line 139) | string t_hdr_request_disposition::encode_value(void) const {
FILE: src/parser/hdr_request_disposition.h
function class (line 45) | class t_hdr_request_disposition : public t_header {
FILE: src/parser/hdr_require.cpp
function string (line 56) | string t_hdr_require::encode_value(void) const {
FILE: src/parser/hdr_require.h
function class (line 27) | class t_hdr_require : public t_header {
FILE: src/parser/hdr_retry_after.cpp
function string (line 47) | string t_hdr_retry_after::encode_value(void) const {
FILE: src/parser/hdr_retry_after.h
function class (line 30) | class t_hdr_retry_after : public t_header {
FILE: src/parser/hdr_route.cpp
function string (line 31) | string t_hdr_route::encode(void) const {
function string (line 36) | string t_hdr_route::encode_multi_header(void) const {
function string (line 53) | string t_hdr_route::encode_value(void) const {
FILE: src/parser/hdr_route.h
function class (line 31) | class t_hdr_route : public t_header {
FILE: src/parser/hdr_rseq.cpp
function string (line 31) | string t_hdr_rseq::encode_value(void) const {
FILE: src/parser/hdr_rseq.h
function class (line 30) | class t_hdr_rseq : public t_header {
FILE: src/parser/hdr_server.cpp
function string (line 32) | string t_server::encode(void) const {
function string (line 59) | string t_hdr_server::get_server_info(void) const {
function string (line 72) | string t_hdr_server::encode_value(void) const {
FILE: src/parser/hdr_server.h
function class (line 29) | class t_server {
function class (line 41) | class t_hdr_server : public t_header {
FILE: src/parser/hdr_service_route.cpp
function string (line 30) | string t_hdr_service_route::encode(void) const {
function string (line 35) | string t_hdr_service_route::encode_multi_header(void) const {
function string (line 52) | string t_hdr_service_route::encode_value(void) const {
FILE: src/parser/hdr_service_route.h
function class (line 32) | class t_hdr_service_route : public t_header {
FILE: src/parser/hdr_session_expires.cpp
function string (line 63) | string t_hdr_session_expires::encode_value(void) const {
FILE: src/parser/hdr_session_expires.h
function class (line 32) | class t_hdr_session_expires : public t_header {
FILE: src/parser/hdr_sip_etag.cpp
function string (line 27) | string t_hdr_sip_etag::encode_value(void) const {
FILE: src/parser/hdr_sip_etag.h
function class (line 32) | class t_hdr_sip_etag : public t_header {
FILE: src/parser/hdr_sip_if_match.cpp
function string (line 27) | string t_hdr_sip_if_match::encode_value(void) const {
FILE: src/parser/hdr_sip_if_match.h
function class (line 32) | class t_hdr_sip_if_match : public t_header {
FILE: src/parser/hdr_subject.cpp
function string (line 29) | string t_hdr_subject::encode_value(void) const {
FILE: src/parser/hdr_subject.h
function class (line 27) | class t_hdr_subject : public t_header {
FILE: src/parser/hdr_subscription_state.cpp
function string (line 52) | string t_hdr_subscription_state::encode_value(void) const {
FILE: src/parser/hdr_subscription_state.h
function class (line 44) | class t_hdr_subscription_state : public t_header {
FILE: src/parser/hdr_supported.cpp
function string (line 58) | string t_hdr_supported::encode_value(void) const {
FILE: src/parser/hdr_supported.h
function class (line 32) | class t_hdr_supported : public t_header {
FILE: src/parser/hdr_timestamp.cpp
function string (line 37) | string t_hdr_timestamp::encode_value(void) const {
FILE: src/parser/hdr_timestamp.h
function class (line 28) | class t_hdr_timestamp : public t_header {
FILE: src/parser/hdr_to.cpp
function string (line 55) | string t_hdr_to::encode_value(void) const {
FILE: src/parser/hdr_to.h
function class (line 30) | class t_hdr_to : public t_header {
FILE: src/parser/hdr_unsupported.cpp
function string (line 45) | string t_hdr_unsupported::encode_value(void) const {
FILE: src/parser/hdr_unsupported.h
function class (line 27) | class t_hdr_unsupported : public t_header {
FILE: src/parser/hdr_user_agent.cpp
function string (line 29) | string t_hdr_user_agent::get_ua_info(void) const {
function string (line 42) | string t_hdr_user_agent::encode_value(void) const {
FILE: src/parser/hdr_user_agent.h
function class (line 30) | class t_hdr_user_agent : public t_header {
FILE: src/parser/hdr_via.cpp
function string (line 55) | string t_via::encode(void) const {
function string (line 166) | string t_hdr_via::encode(void) const {
function string (line 171) | string t_hdr_via::encode_multi_header(void) const {
function string (line 188) | string t_hdr_via::encode_value(void) const {
FILE: src/parser/hdr_via.h
function class (line 28) | class t_via {
function class (line 58) | class t_hdr_via : public t_header {
FILE: src/parser/hdr_warning.cpp
function string (line 54) | string t_warning::encode(void) const {
function string (line 75) | string t_hdr_warning::encode_value(void) const {
FILE: src/parser/hdr_warning.h
function class (line 57) | class t_warning {
function class (line 73) | class t_hdr_warning : public t_header {
FILE: src/parser/hdr_www_authenticate.cpp
function string (line 41) | string t_hdr_www_authenticate::encode_value(void) const {
FILE: src/parser/hdr_www_authenticate.h
function class (line 30) | class t_hdr_www_authenticate : public t_header {
FILE: src/parser/header.cpp
function string (line 33) | string t_header::encode(void) const {
function string (line 47) | string t_header::encode_env(void) const {
function string (line 60) | string t_header::get_name(void) const {
function string (line 64) | string t_header::get_value(void) const {
FILE: src/parser/header.h
function class (line 27) | class t_header {
FILE: src/parser/identity.cpp
function string (line 35) | string t_identity::encode(void) const {
FILE: src/parser/identity.h
function class (line 26) | class t_identity {
FILE: src/parser/media_type.cpp
function string (line 76) | string t_media::encode(void) const {
function string (line 96) | string t_media::get_file_glob(void) const {
FILE: src/parser/media_type.h
function class (line 33) | class t_media {
FILE: src/parser/milenage.cpp
function f1 (line 35) | void f1 ( u8 k[16], u8 rand[16], u8 sqn[6], u8 amf[2],
function f2345 (line 96) | void f2345 ( u8 k[16], u8 rand[16],
function f1star (line 174) | void f1star( u8 k[16], u8 rand[16], u8 sqn[6], u8 amf[2],
function f5star (line 234) | void f5star( u8 k[16], u8 rand[16],
function ComputeOPc (line 275) | void ComputeOPc( u8 op_c[16], u8 op[16] )
FILE: src/parser/milenage.h
type u8 (line 21) | typedef unsigned char u8;
FILE: src/parser/parameter.cpp
function string (line 36) | string t_parameter::encode(void) const {
function t_parameter (line 57) | t_parameter str2param(const string &s) {
function string (line 66) | string param_list2str(const list<t_parameter> &l) {
function str2param_list (line 79) | list<t_parameter> str2param_list(const string &s) {
FILE: src/parser/parameter.h
function class (line 26) | class t_parameter {
FILE: src/parser/parse_ctrl.cpp
type yy_buffer_state (line 27) | struct yy_buffer_state
type yy_buffer_state (line 28) | struct yy_buffer_state
type yy_buffer_state (line 29) | struct yy_buffer_state
function string (line 38) | string t_parser::unfold(const string &h) {
function t_sip_message (line 66) | t_sip_message *t_parser::parse(const string &s, list<string> &parse_erro...
function t_sip_message (line 94) | t_sip_message *t_parser::parse_headers(const string &s, list<string> &pa...
FILE: src/parser/parse_ctrl.h
function class (line 46) | class t_parser {
function class (line 124) | class t_syntax_error {
FILE: src/parser/request.cpp
function b64_enc (line 34) | int b64_enc(const u8 * src, u8 * dst, int len)
function b64_val (line 92) | static int b64_val(u8 x)
function b64_dec (line 108) | int b64_dec(const u8 * src, u8 * dst, int len)
function t_sip_message (line 413) | t_sip_message *t_request::copy(void) const {
function t_response (line 452) | t_response *t_request::create_response(int code, std::string reason) const
FILE: src/parser/request.h
function class (line 34) | class t_request : public t_sip_message {
FILE: src/parser/response.cpp
function string (line 116) | string t_response::encode(bool add_content_length) {
function t_sip_message (line 142) | t_sip_message *t_response::copy(void) const {
FILE: src/parser/response.h
function class (line 175) | class t_response : public t_sip_message {
FILE: src/parser/rijndael.cpp
function u32 (line 52) | __inline u32 byte_swap(const u32 x)
function u32 (line 56) | __inline u32 u32_in(const u8 x[])
function u32_out (line 60) | __inline void u32_out(u8 x[], const u32 v)
function RijndaelKeySchedule (line 391) | void RijndaelKeySchedule(u8 key[16])
function RijndaelEncrypt (line 417) | void RijndaelEncrypt(u8 in[16], u8 out[16])
FILE: src/parser/route.cpp
function string (line 31) | string t_route::encode(void) const {
FILE: src/parser/route.h
function class (line 29) | class t_route {
FILE: src/parser/sip_body.cpp
function string (line 92) | string t_sip_body_xml::encode(void) const {
function string (line 137) | string t_sip_body_opaque::encode(void) const {
function t_sip_body (line 141) | t_sip_body *t_sip_body_opaque::copy(void) const {
function t_body_type (line 147) | t_body_type t_sip_body_opaque::get_type(void) const {
function t_media (line 151) | t_media t_sip_body_opaque::get_media(void) const {
function string (line 172) | string t_sip_body_sipfrag::encode(void) const {
function t_sip_body (line 176) | t_sip_body *t_sip_body_sipfrag::copy(void) const {
function t_body_type (line 182) | t_body_type t_sip_body_sipfrag::get_type(void) const {
function t_media (line 186) | t_media t_sip_body_sipfrag::get_media(void) const {
function string (line 203) | string t_sip_body_dtmf_relay::encode(void) const {
function t_sip_body (line 215) | t_sip_body *t_sip_body_dtmf_relay::copy(void) const {
function t_body_type (line 221) | t_body_type t_sip_body_dtmf_relay::get_type(void) const {
function t_media (line 225) | t_media t_sip_body_dtmf_relay::get_media(void) const {
function string (line 274) | string t_sip_body_plain_text::encode(void) const {
function t_sip_body (line 278) | t_sip_body *t_sip_body_plain_text::copy(void) const {
function t_body_type (line 284) | t_body_type t_sip_body_plain_text::get_type(void) const {
function t_media (line 288) | t_media t_sip_body_plain_text::get_media(void) const {
function string (line 305) | string t_sip_body_html_text::encode(void) const {
function t_sip_body (line 309) | t_sip_body *t_sip_body_html_text::copy(void) const {
function t_body_type (line 315) | t_body_type t_sip_body_html_text::get_type(void) const {
function t_media (line 319) | t_media t_sip_body_html_text::get_media(void) const {
FILE: src/parser/sip_body.h
type t_body_type (line 58) | enum t_body_type {
function class (line 71) | class t_sip_body {
function class (line 125) | class t_sip_body_xml : public t_sip_body {
function class (line 171) | class t_sip_body_opaque : public t_sip_body {
function class (line 193) | class t_sip_body_sipfrag : public t_sip_body {
function class (line 206) | class t_sip_body_dtmf_relay : public t_sip_body {
function class (line 221) | class t_sip_body_plain_text : public t_sip_body {
function class (line 242) | class t_sip_body_html_text : public t_sip_body {
FILE: src/parser/sip_message.cpp
function t_msg_type (line 123) | t_msg_type t_sip_message::get_type(void) const {
function string (line 188) | string t_sip_message::encode(bool add_content_length) {
function t_sip_message (line 391) | t_sip_message *t_sip_message::copy(void) const {
function IPaddr (line 481) | IPaddr t_sip_message::get_local_ip(void) {
FILE: src/parser/sip_message.h
type t_msg_type (line 99) | enum t_msg_type {
function class (line 106) | class t_sip_message {
FILE: src/patterns/observer.h
function namespace (line 32) | namespace patterns {
FILE: src/phone.cpp
function t_request (line 58) | t_request *t_transfer_data::get_refer_request(void) const {
function t_phone_user (line 70) | t_phone_user *t_transfer_data::get_phone_user(void) const {
function t_phone_user (line 720) | t_phone_user *t_phone::find_phone_user(const string &profile_name) const {
function t_phone_user (line 736) | t_phone_user *t_phone::find_phone_user(const t_url &user_uri) const {
function t_phone_user (line 752) | t_phone_user *t_phone::match_phone_user(t_response *r, t_tuid tuid, bool...
function t_phone_user (line 765) | t_phone_user *t_phone::match_phone_user(t_request *r, bool active_only) {
function t_phone_user (line 778) | t_phone_user *t_phone::match_phone_user(StunMessage *r, t_tuid tuid, boo...
function t_phone_user (line 1480) | t_phone_user *t_phone::find_phone_user_out_dialog_request(t_request *r, ...
function t_line (line 1509) | t_line *t_phone::find_line_in_dialog_request(t_request *r, t_tid tid) {
type timeval (line 2202) | struct timeval
function t_phone_state (line 2588) | t_phone_state t_phone::get_state(void) const {
function t_line (line 2639) | t_line *t_phone::get_line_by_id(t_object_id id) const {
function t_line (line 2650) | t_line *t_phone::get_line(unsigned short lineno) const {
function t_line_state (line 2692) | t_line_state t_phone::get_line_state(unsigned short lineno) const {
function t_line_substate (line 2700) | t_line_substate t_phone::get_line_substate(unsigned short lineno) const {
function t_refer_state (line 2760) | t_refer_state t_phone::get_line_refer_state(unsigned short lineno) const {
function t_user (line 2768) | t_user *t_phone::get_line_user(unsigned short lineno) {
function t_mwi (line 2803) | t_mwi t_phone::get_mwi(t_user *user) const {
function t_url (line 2823) | t_url t_phone::get_remote_uri(unsigned short lineno) const {
function string (line 2831) | string t_phone::get_remote_display(unsigned short lineno) const {
function t_line (line 2857) | t_line *t_phone::get_3way_peer_line(unsigned short lineno) {
function t_call_info (line 2988) | t_call_info t_phone::get_call_info(unsigned short lineno) const {
function t_call_record (line 2996) | t_call_record t_phone::get_call_hist(unsigned short lineno) const {
function string (line 3004) | string t_phone::get_ringtone(unsigned short lineno) const {
function time_t (line 3012) | time_t t_phone::get_startup_time(void) const {
function t_user (line 3100) | t_user *t_phone::ref_user_display_uri(const string &display_uri) {
function t_user (line 3117) | t_user *t_phone::ref_user_profile(const string &profile_name) {
function t_service (line 3127) | t_service *t_phone::ref_service(t_user *user) {
function t_buddy_list (line 3138) | t_buddy_list *t_phone::ref_buddy_list(t_user *user) {
function t_presence_epa (line 3149) | t_presence_epa *t_phone::ref_presence_epa(t_user *user) {
function string (line 3160) | string t_phone::get_ip_sip(const t_user *user, const string &auto_ip) co...
function string (line 3165) | string t_phone::get_ip_sip_locked(const t_user *user, const string &auto...
function t_response (line 3289) | t_response *t_phone::create_options_response(t_user *user, t_request *r,
type sigaction (line 3341) | struct sigaction
function phone_sighandler (line 3533) | void phone_sighandler(int sig) {
FILE: src/phone.h
type t_phone_state (line 64) | enum t_phone_state {
type t_line_state (line 69) | enum t_line_state {
type t_line_substate (line 74) | enum t_line_substate {
function class (line 87) | class t_transfer_data {
function class (line 111) | class t_phone : public t_transaction_layer {
FILE: src/phone_user.cpp
function t_user (line 223) | t_user *t_phone_user::get_user_profile(void) {
function t_buddy_list (line 227) | t_buddy_list *t_phone_user::get_buddy_list(void) {
function t_presence_epa (line 231) | t_presence_epa *t_phone_user::get_presence_epa(void) {
function t_request (line 1411) | t_request *t_phone_user::create_request(t_method m, const t_url &request...
function t_response (line 1452) | t_response *t_phone_user::create_options_response(t_request *r,
function string (line 1500) | string t_phone_user::get_ip_sip(const string &auto_ip) const {
FILE: src/phone_user.h
function class (line 46) | class t_phone_user {
FILE: src/presence/buddy.cpp
function string (line 120) | string t_buddy::get_name(void) const {
function string (line 124) | string t_buddy::get_sip_address(void) const {
function t_presence_state (line 132) | const t_presence_state *t_buddy::get_presence_state(void) const {
function t_user (line 136) | t_user *t_buddy::get_user_profile(void) {
function t_buddy_list (line 141) | t_buddy_list *t_buddy::get_buddy_list(void) {
function t_user (line 397) | t_user *t_buddy_list::get_user_profile(void) {
function t_buddy (line 401) | t_buddy *t_buddy_list::add_buddy(const t_buddy &buddy) {
FILE: src/presence/buddy.h
function class (line 235) | class t_buddy_list : public utils::t_record_file<t_buddy> {
FILE: src/presence/pidf_body.cpp
function t_sip_body (line 162) | t_sip_body *t_pidf_xml_body::copy(void) const {
function t_body_type (line 175) | t_body_type t_pidf_xml_body::get_type(void) const {
function t_media (line 179) | t_media t_pidf_xml_body::get_media(void) const {
function string (line 183) | string t_pidf_xml_body::get_pres_entity(void) const {
function string (line 187) | string t_pidf_xml_body::get_tuple_id(void) const {
function string (line 191) | string t_pidf_xml_body::get_basic_status(void) const {
FILE: src/presence/pidf_body.h
function class (line 34) | class t_pidf_xml_body : public t_sip_body_xml {
FILE: src/presence/presence_dialog.cpp
function t_presence_dialog (line 31) | t_presence_dialog *t_presence_dialog::copy(void) {
FILE: src/presence/presence_dialog.h
function class (line 33) | class t_presence_dialog : public t_subscription_dialog {
FILE: src/presence/presence_state.cpp
function string (line 25) | string t_presence_state::basic_state2str(t_presence_state::t_basic_state...
function string (line 42) | string t_presence_state::basic_state2pidf_str(t_presence_state::t_basic_...
function string (line 69) | string t_presence_state::get_failure_msg(void) const {
FILE: src/presence/presence_state.h
function class (line 35) | class t_presence_state {
FILE: src/presence/presence_subscription.cpp
function t_request (line 29) | t_request *t_presence_subscription::create_subscribe(unsigned long expir...
FILE: src/presence/presence_subscription.h
function class (line 31) | class t_presence_subscription : public t_subscription {
FILE: src/prohibit_thread.h
function class (line 30) | class i_prohibit_thread {
FILE: src/protocol.h
type t_failure (line 52) | enum t_failure {
type t_transfer_type (line 58) | enum t_transfer_type {
type t_refer_state (line 65) | enum t_refer_state {
type t_register_type (line 74) | enum t_register_type {
type t_sip_timer (line 85) | enum t_sip_timer {
type t_phone_timer (line 122) | enum t_phone_timer {
type t_line_timer (line 129) | enum t_line_timer {
type t_subscribe_timer (line 144) | enum t_subscribe_timer {
type t_publish_timer (line 149) | enum t_publish_timer {
type t_stun_timer (line 154) | enum t_stun_timer {
FILE: src/redirect.h
function class (line 28) | class t_redirector {
FILE: src/sdp/sdp.cpp
function string (line 32) | string sdp_ntwk_type2str(t_sdp_ntwk_type n) {
function t_sdp_ntwk_type (line 42) | t_sdp_ntwk_type str2sdp_ntwk_type(string s) {
function string (line 48) | string sdp_addr_type2str(t_sdp_addr_type a) {
function t_sdp_addr_type (line 59) | t_sdp_addr_type str2sdp_addr_type(string s) {
function string (line 66) | string sdp_transport2str(t_sdp_transport t) {
function t_sdp_transport (line 76) | t_sdp_transport str2sdp_transport(string s) {
function t_sdp_media_type (line 84) | t_sdp_media_type str2sdp_media_type(string s) {
function string (line 90) | string sdp_media_type2str(t_sdp_media_type m) {
function string (line 100) | string get_rtpmap(unsigned format, t_audio_codec codec) {
function string (line 156) | string sdp_media_direction2str(t_sdp_media_direction d) {
function string (line 188) | string t_sdp_origin::encode(void) const {
function string (line 219) | string t_sdp_connection::encode(void) const {
function string (line 245) | string t_sdp_attr::encode(void) const {
function string (line 294) | string t_sdp_media::encode(void) const {
function t_sdp_attr (line 364) | t_sdp_attr *t_sdp_media::get_attribute(const string &name) {
function t_sdp_media_direction (line 387) | t_sdp_media_direction t_sdp_media::get_direction(void) const {
function t_sdp_media_type (line 404) | t_sdp_media_type t_sdp_media::get_media_type(void) const {
function t_sdp_transport (line 408) | t_sdp_transport t_sdp_media::get_transport(void) const {
function string (line 444) | string t_sdp::encode(void) const {
function t_sip_body (line 483) | t_sip_body *t_sdp::copy(void) const {
function t_body_type (line 489) | t_body_type t_sdp::get_type(void) const {
function t_media (line 493) | t_media t_sdp::get_media(void) const {
function string (line 580) | string t_sdp::get_rtp_host(t_sdp_media_type media_type) const {
function string (line 609) | string t_sdp::get_codec_description(t_sdp_media_type media_type,
function t_audio_codec (line 630) | t_audio_codec t_sdp::get_rtpmap_codec(const string &rtpmap) const {
function t_audio_codec (line 677) | t_audio_codec t_sdp::get_codec(t_sdp_media_type media_type,
function t_sdp_media_direction (line 702) | t_sdp_media_direction t_sdp::get_direction(t_sdp_media_type media_type) ...
function string (line 709) | string t_sdp::get_fmtp(t_sdp_media_type media_type, unsigned short codec...
function t_sdp_media (line 808) | const t_sdp_media *t_sdp::get_first_media(t_sdp_media_type media_type) c...
FILE: src/sdp/sdp.h
type t_sdp_ntwk_type (line 74) | enum t_sdp_ntwk_type {
type t_sdp_addr_type (line 83) | enum t_sdp_addr_type {
type t_sdp_transport (line 94) | enum t_sdp_transport {
type t_sdp_media_direction (line 104) | enum t_sdp_media_direction {
type t_sdp_media_type (line 114) | enum t_sdp_media_type {
function class (line 124) | class t_sdp_origin {
function class (line 140) | class t_sdp_connection {
function class (line 151) | class t_sdp_attr {
function class (line 165) | class t_sdp_media {
function class (line 215) | class t_sdp : public t_sip_body {
FILE: src/sdp/sdp_parse_ctrl.cpp
type yy_buffer_state (line 25) | struct yy_buffer_state
type yy_buffer_state (line 26) | struct yy_buffer_state
type yy_buffer_state (line 27) | struct yy_buffer_state
function t_sdp (line 33) | t_sdp *t_sdp_parser::parse(const string &s) {
FILE: src/sdp/sdp_parse_ctrl.h
function class (line 35) | class t_sdp_parser {
function class (line 56) | class t_sdp_syntax_error {
FILE: src/sdp/sdp_parser.h
type yytokentype (line 39) | enum yytokentype {
FILE: src/sender.cpp
function handle_socket_err (line 68) | static bool handle_socket_err(int err, IPaddr dst_addr, unsigned short d...
function send_sip_udp (line 133) | static void send_sip_udp(t_event *event) {
function send_sip_tcp (line 183) | static void send_sip_tcp(t_event *event) {
function send_stun (line 322) | static void send_stun(t_event *event) {
function send_nat_keepalive (line 369) | static void send_nat_keepalive(t_event *event) {
function send_tcp_ping (line 401) | static void send_tcp_ping(t_event *event) {
FILE: src/sequence_number.h
function U (line 56) | U get_number(void) const {
function operator (line 63) | operator U(void) const {
function S (line 72) | S distance(const sequence_number_t &number) const {
type sequence_number_t (line 139) | typedef sequence_number_t<uint16, int16> seq16_t;
type sequence_number_t (line 144) | typedef sequence_number_t<uint32, int32> seq32_t;
FILE: src/service.cpp
type stat (line 219) | struct stat
type stat (line 326) | struct stat
FILE: src/service.h
type t_cf_type (line 31) | enum t_cf_type {
function class (line 37) | class t_service {
FILE: src/session.cpp
function t_session (line 64) | t_session *t_session::get_peer_3way(void) const {
function t_session (line 155) | t_session *t_session::create_new_version(void) const {
function t_session (line 175) | t_session *t_session::create_call_hold(void) const {
function t_session (line 201) | t_session *t_session::create_call_retrieve(void) const {
function t_session (line 221) | t_session *t_session::create_session_refresh(void) const {
function t_session (line 231) | t_session *t_session::create_clean_copy(void) const {
function t_audio_session (line 796) | t_audio_session *t_session::get_audio_session(void) const {
function t_line (line 824) | t_line *t_session::get_line(void) const {
FILE: src/session.h
function class (line 40) | class t_session {
FILE: src/sockets/connection.cpp
function t_socket (line 47) | t_socket *t_connection::get_socket(void) {
function t_sip_message (line 97) | t_sip_message *t_connection::get_sip_msg(string &raw_headers, string &ra...
function string (line 205) | string t_connection::get_data(size_t nbytes) const {
FILE: src/sockets/connection.h
function class (line 37) | class t_connection {
FILE: src/sockets/connection_table.cpp
function t_connection (line 138) | t_connection *t_connection_table::get_connection(IPaddr remote_addr,
type timeval (line 187) | struct timeval
type timeval (line 263) | struct timeval
type timespec (line 398) | struct timespec
FILE: src/sockets/connection_table.h
function class (line 38) | class t_connection_table {
FILE: src/sockets/dnssrv.cpp
function insrv_init (line 45) | void insrv_init (unsigned long flags) {
function srv_testflag (line 54) | int srv_testflag (unsigned long flags) {
function srvcmp (line 60) | int srvcmp (const void *left, const void *right) {
function insrv_lookup (line 80) | int insrv_lookup (const char *service, const char *proto, const char *do...
FILE: src/sockets/dnssrv.h
type t_dns_result (line 26) | typedef struct {
FILE: src/sockets/interfaces.cpp
function string (line 27) | string t_interface::get_ip_addr(void) const {
function string (line 31) | string t_interface::get_ip_netmask(void) const {
type ifaddrs (line 36) | struct ifaddrs
type sockaddr_in (line 37) | struct sockaddr_in
type sockaddr_in (line 59) | struct sockaddr_in
type in_addr (line 61) | struct in_addr
type sockaddr_in (line 62) | struct sockaddr_in
type in_addr (line 64) | struct in_addr
function exists_interface (line 77) | bool exists_interface(const string &hostname) {
function exists_interface_dev (line 99) | bool exists_interface_dev(const string &devname, string &ip_address) {
FILE: src/sockets/interfaces.h
function class (line 32) | class t_interface {
FILE: src/sockets/ipaddr.h
type IPaddr (line 5) | typedef unsigned long IPaddr;
type IPNaddr (line 7) | typedef unsigned long IPNaddr;
FILE: src/sockets/socket.cpp
type sockaddr_in (line 80) | struct sockaddr_in
type sockaddr (line 89) | struct sockaddr
type sockaddr_in (line 94) | struct sockaddr_in
type sockaddr (line 103) | struct sockaddr
type sockaddr_in (line 108) | struct sockaddr_in
type sockaddr (line 114) | struct sockaddr
type sockaddr_in (line 122) | struct sockaddr_in
type sockaddr (line 129) | struct sockaddr
type sockaddr_in (line 144) | struct sockaddr_in
type sockaddr (line 150) | struct sockaddr
type timeval (line 171) | struct timeval
type sockaddr (line 203) | struct sockaddr
type msghdr (line 205) | struct msghdr
type cmsghdr (line 206) | struct cmsghdr
type msghdr (line 210) | struct msghdr
type sockaddr (line 214) | struct sockaddr
function string (line 258) | string h_ip2str(IPaddr ipaddr) {
type sockaddr_in (line 279) | struct sockaddr_in
type sockaddr (line 298) | struct sockaddr
function t_socket_tcp (line 310) | t_socket_tcp *t_socket_tcp::accept(IPaddr &src_addr, unsigned short &src...
type sockaddr_in (line 325) | struct sockaddr_in
type sockaddr (line 331) | struct sockaddr
type sockaddr_in (line 352) | struct sockaddr_in
type sockaddr (line 355) | struct sockaddr
type sockaddr_un (line 378) | struct sockaddr_un
type sockaddr (line 388) | struct sockaddr
type sockaddr_un (line 407) | struct sockaddr_un
type sockaddr (line 417) | struct sockaddr
FILE: src/sockets/socket.h
function class (line 39) | class t_icmp_msg {
function class (line 57) | class t_socket {
function class (line 97) | class t_socket_udp : public t_socket {
function class (line 142) | class t_socket_tcp : public t_socket {
function class (line 202) | class t_socket_local : public t_socket {
FILE: src/sockets/url.cpp
function get_default_port (line 35) | unsigned short get_default_port(const string &protocol) {
function IPaddr (line 45) | IPaddr gethostbyname(const string &name) {
function gethostbyname_all (line 53) | list<IPaddr> gethostbyname_all(const string &name) {
function string (line 69) | string get_local_hostname(void) {
function IPaddr (line 86) | IPaddr get_src_ip4_address_for_dst(IPaddr dst_ip4) {
function string (line 141) | string display_and_url2str(const string &display, const string &url) {
function string (line 186) | string t_ip_port::tostring(void) const {
function string (line 390) | string t_url::escape_user_value(const string &user_value) {
function string (line 402) | string t_url::escape_passwd_value(const string &passwd_value) {
function string (line 413) | string t_url::escape_hnv(const string &hnv) {
function t_url (line 440) | t_url t_url::copy_without_headers(void) const {
function string (line 485) | string t_url::get_scheme(void) const {
function string (line 489) | string t_url::get_user(void) const {
function string (line 493) | string t_url::get_password(void) const {
function string (line 497) | string t_url::get_host(void) const {
function IPNaddr (line 514) | IPNaddr t_url::get_n_ip(void) const {
function IPaddr (line 526) | IPaddr t_url::get_h_ip(void) const {
function string (line 536) | string t_url::get_ip(void) const {
function string (line 592) | string t_url::get_transport(void) const {
function string (line 596) | string t_url::get_maddr(void) const {
function string (line 604) | string t_url::get_user_param(void) const {
function string (line 608) | string t_url::get_method(void) const {
function string (line 616) | string t_url::get_other_params(void) const {
function string (line 620) | string t_url::get_headers(void) const {
function string (line 749) | string t_url::encode(void) const {
function string (line 823) | string t_url::encode_noscheme(void) const {
function string (line 834) | string t_url::encode_no_params_hdrs(bool escape) const {
function string (line 895) | string t_display_url::encode(void) const {
FILE: src/sockets/url.h
function class (line 33) | class t_ip_port {
function class (line 77) | class t_url {
function class (line 269) | class t_display_url {
FILE: src/stun/stun.cxx
function stunParseAtrAddress (line 52) | static bool
function stunParseAtrChangeRequest (line 85) | static bool
function stunParseAtrError (line 103) | static bool
function stunParseAtrUnknown (line 125) | static bool
function stunParseAtrString (line 146) | static bool
function stunParseAtrIntegrity (line 170) | static bool
function stunParseMessage (line 186) | bool
function stunEncodeMessage (line 544) | unsigned int
function stunRand (line 651) | int
function randomPort (line 702) | static int
function computeHmac (line 717) | static void
function computeHmac (line 725) | static void
function toHex (line 738) | static void
function stunCreateUserName (line 758) | void
function stunCreatePassword (line 796) | void
function UInt64 (line 811) | UInt64
function ostream (line 830) | ostream& operator<< ( ostream& strm, const UInt128& r )
function ostream (line 841) | ostream&
function stunParseHostName (line 857) | bool
function stunParseServerName (line 958) | bool
function stunCreateErrorResponse (line 974) | static void
function StunMessage (line 985) | StunMessage *stunBuildError(const StunMessage &m, int code, const char *...
function string (line 999) | string stunMsg2Str(const StunMessage &m) {
function stunEqualId (line 1087) | bool stunEqualId(const StunMessage &m1, const StunMessage &m2) {
function string (line 1098) | string stunNatType2Str(NatType t) {
function stunCreateSharedSecretErrorResponse (line 1125) | static void
function stunCreateSharedSecretResponse (line 1136) | static void
function stunServerProcessMsg (line 1153) | bool
function stunInitServer (line 1383) | bool
function stunStopServer (line 1461) | void
function stunServerProcess (line 1484) | bool
function stunFindLocalInterfaces (line 1763) | int
function stunBuildReqSimple (line 1830) | void
function stunSendTest (line 1867) | static void
function stunGetUserNameAndPassword (line 1934) | void
function stunTest (line 1946) | void
function NatType (line 2009) | NatType
function stunOpenStunSocket (line 2336) | int
function stunOpenStunSocketPair (line 2403) | bool
FILE: src/stun/stun.h
type UInt8 (line 20) | typedef unsigned char UInt8;
type UInt16 (line 21) | typedef unsigned short UInt16;
type UInt32 (line 22) | typedef unsigned int UInt32;
type UInt64 (line 24) | typedef unsigned __int64 UInt64;
type UInt64 (line 26) | typedef unsigned long long UInt64;
type UInt128 (line 28) | typedef struct { unsigned char octet[16]; } UInt128;
type StunMsgHdr (line 63) | typedef struct
type StunAtrHdr (line 71) | typedef struct
type StunAddress4 (line 77) | typedef struct
type StunAtrAddress4 (line 83) | typedef struct
type StunAtrChangeRequest (line 90) | typedef struct
type StunAtrError (line 95) | typedef struct
type StunAtrUnknown (line 104) | typedef struct
type StunAtrString (line 110) | typedef struct
type StunAtrIntegrity (line 116) | typedef struct
type StunHmacStatus (line 121) | typedef enum
type StunMessage (line 130) | typedef struct
type NatType (line 181) | typedef enum
type SOCKET (line 195) | typedef SOCKET StunSocket;
type StunSocket (line 197) | typedef int StunSocket;
type StunMediaRelay (line 204) | typedef struct
type StunServerInfo (line 212) | typedef struct
FILE: src/stun/stun_transaction.cpp
function get_stun_binding (line 36) | bool get_stun_binding(t_user *user_config, unsigned short src_port, IPad...
function stun_discover_nat (line 234) | bool stun_discover_nat(t_phone_user *pu, string &err_msg) {
function t_tid (line 420) | t_tid t_stun_transaction::get_id(void) const {
function t_trans_state (line 424) | t_trans_state t_stun_transaction::get_state(void) const {
FILE: src/stun/stun_transaction.h
function class (line 52) | class t_stun_transaction {
function class (line 123) | class t_sip_stun_trans : public t_stun_transaction {
function class (line 143) | class t_media_stun_trans : public t_stun_transaction {
FILE: src/stun/udp.cxx
function StunSocket (line 37) | StunSocket
function getMessage (line 113) | bool
function sendMessage (line 182) | bool
function initNetwork (line 257) | void
FILE: src/stun/udp.h
type socklen_t (line 6) | typedef int socklen_t;
type socklen_t (line 16) | typedef int socklen_t;
type SOCKET (line 17) | typedef SOCKET StunSocket;
type LONGLONG (line 55) | typedef LONGLONG Int64;
function getErrno (line 56) | inline int getErrno() { return WSAGetLastError(); }
type StunSocket (line 60) | typedef int StunSocket;
function closesocket (line 64) | inline int closesocket( StunSocket fd ) { return close(fd); }
function getErrno (line 66) | inline int getErrno() { return errno; }
FILE: src/sub_refer.cpp
function t_dialog (line 26) | t_dialog *t_sub_refer::get_dialog(void) const {
function t_sub_refer_result (line 321) | t_sub_refer_result t_sub_refer::get_sr_result(void) const {
FILE: src/sub_refer.h
type t_sub_refer_result (line 28) | enum t_sub_refer_result {
function class (line 34) | class t_sub_refer : public t_subscription {
FILE: src/subscription.cpp
function string (line 31) | string t_subscription_state2str(t_subscription_state state) {
function t_request (line 65) | t_request *t_subscription::create_subscribe(unsigned long expires) const {
function t_request (line 81) | t_request *t_subscription::create_notify(const string &sub_state,
function t_subscription_role (line 216) | t_subscription_role t_subscription::get_role(void) const {
function t_subscription_state (line 220) | t_subscription_state t_subscription::get_state(void) const {
function string (line 224) | string t_subscription::get_reason_termination(void) const {
function string (line 236) | string t_subscription::get_event_type(void) const {
function string (line 240) | string t_subscription::get_event_id(void) const {
FILE: src/subscription.h
type t_subscription_role (line 31) | enum t_subscription_role {
type t_subscription_state (line 37) | enum t_subscription_state {
function class (line 57) | class t_subscription {
FILE: src/subscription_dialog.cpp
function t_request (line 147) | t_request *t_subscription_dialog::create_request(t_method m) {
function t_subscription_state (line 357) | t_subscription_state t_subscription_dialog::get_subscription_state(void)...
function string (line 361) | string t_subscription_dialog::get_reason_termination(void) const {
FILE: src/subscription_dialog.h
function class (line 37) | class t_subscription_dialog : public t_abstract_dialog {
FILE: src/sys_settings.cpp
function string (line 141) | string t_audio_device::get_description(void) const {
function string (line 167) | string t_audio_device::get_settings_value(void) const {
function string (line 208) | string t_win_geometry::encode(void) const {
function t_audio_device (line 310) | t_audio_device t_sys_settings::get_dev_ringtone(void) const {
function t_audio_device (line 318) | t_audio_device t_sys_settings::get_dev_speaker(void) const {
function t_audio_device (line 326) | t_audio_device t_sys_settings::get_dev_mic(void) const {
function string (line 431) | string t_sys_settings::get_gui_browser_cmd(void) const {
function string (line 551) | string t_sys_settings::get_ringtone_file(void) const {
function string (line 567) | string t_sys_settings::get_ringback_file(void) const {
function string (line 575) | string t_sys_settings::get_last_used_profile(void) const {
function t_url (line 583) | t_url t_sys_settings::get_redial_url(void) const {
function string (line 591) | string t_sys_settings::get_redial_display(void) const {
function string (line 599) | string t_sys_settings::get_redial_subject(void) const {
function string (line 607) | string t_sys_settings::get_redial_profile(void) const {
function string (line 660) | string t_sys_settings::get_ui_session_id(void) const {
function t_win_geometry (line 670) | t_win_geometry t_sys_settings::get_ui_session_main_geometry(void) const {
function string (line 690) | string t_sys_settings::get_mime_shared_database(void) const {
function string (line 1013) | string t_sys_settings::about(bool html) const {
function string (line 1150) | string t_sys_settings::get_product_date(void) const {
function string (line 1167) | string t_sys_settings::get_options_built(void) const {
type stat (line 1198) | struct stat
function string (line 1286) | string t_sys_settings::get_dir_share(void) const {
function string (line 1294) | string t_sys_settings::get_dir_lang(void) const {
function string (line 1300) | string t_sys_settings::get_dir_user(void) const {
function string (line 1308) | string t_sys_settings::get_history_file(void) const {
function string (line 1316) | string t_sys_settings::get_dir_tmpfile(void) const {
type dirent (line 1441) | struct dirent
type flock (line 1484) | struct flock
type flock (line 1489) | struct flock
type flock (line 1504) | struct flock
type flock (line 1520) | struct flock
type stat (line 1532) | struct stat
type stat (line 1708) | struct stat
type stat (line 1878) | struct stat
type mixer_info (line 1902) | struct mixer_info
function t_audio_device (line 2025) | t_audio_device t_sys_settings::audio_device(string device) {
FILE: src/sys_settings.h
function class (line 64) | class t_audio_device {
type t_win_geometry (line 81) | struct t_win_geometry {
FILE: src/threads/mutex.h
function class (line 31) | class t_mutex {
function class (line 55) | class t_recursive_mutex : public t_mutex {
function class (line 69) | class t_mutex_guard {
type optional_pthread_t (line 103) | struct optional_pthread_t {
function isUpgradeOwnershipOurs (line 130) | bool isUpgradeOwnershipOurs() const;
function class (line 167) | class t_rwmutex_reader : public t_rwmutex_guard {
function class (line 174) | class t_rwmutex_future_writer : public t_rwmutex_guard {
function class (line 181) | class t_rwmutex_writer : public t_rwmutex_guard {
FILE: src/threads/sema.h
function class (line 23) | class t_semaphore {
FILE: src/threads/thread.cpp
type sched_param (line 56) | struct sched_param
function pthread_t (line 63) | pthread_t t_thread::get_tid(void) const {
function pthread_t (line 67) | pthread_t t_thread::self(void) {
FILE: src/threads/thread.h
function class (line 23) | class t_thread {
FILE: src/timekeeper.cpp
function string (line 39) | string timer_type2str(t_timer_type t) {
function t_timer (line 95) | t_timer *t_tmr_transaction::copy(void) const {
function t_timer_type (line 101) | t_timer_type t_tmr_transaction::get_type(void) const {
function t_sip_timer (line 109) | t_sip_timer t_tmr_transaction::get_sip_timer(void) const {
function string (line 113) | string t_tmr_transaction::get_name(void) const {
function t_timer (line 147) | t_timer *t_tmr_phone::copy(void) const {
function t_timer_type (line 153) | t_timer_type t_tmr_phone::get_type(void) const {
function t_phone_timer (line 157) | t_phone_timer t_tmr_phone::get_phone_timer(void) const {
function t_phone (line 161) | t_phone *t_tmr_phone::get_phone(void) const {
function string (line 165) | string t_tmr_phone::get_name(void) const {
function t_timer (line 190) | t_timer *t_tmr_line::copy(void) const {
function t_timer_type (line 196) | t_timer_type t_tmr_line::get_type(void) const {
function t_line_timer (line 200) | t_line_timer t_tmr_line::get_line_timer(void) const {
function t_object_id (line 204) | t_object_id t_tmr_line::get_line_id(void) const {
function t_object_id (line 208) | t_object_id t_tmr_line::get_dialog_id(void) const {
function string (line 212) | string t_tmr_line::get_name(void) const {
function t_timer (line 248) | t_timer *t_tmr_subscribe::copy(void) const {
function t_timer_type (line 254) | t_timer_type t_tmr_subscribe::get_type(void) const {
function t_subscribe_timer (line 258) | t_subscribe_timer t_tmr_subscribe::get_subscribe_timer(void) const {
function t_object_id (line 262) | t_object_id t_tmr_subscribe::get_line_id(void) const {
function t_object_id (line 266) | t_object_id t_tmr_subscribe::get_dialog_id(void) const {
function string (line 270) | string t_tmr_subscribe::get_sub_event_type(void) const {
function string (line 274) | string t_tmr_subscribe::get_sub_event_id(void) const {
function string (line 278) | string t_tmr_subscribe::get_name(void) const {
function t_timer (line 299) | t_timer *t_tmr_publish::copy(void) const {
function t_timer_type (line 305) | t_timer_type t_tmr_publish::get_type(void) const {
function t_publish_timer (line 309) | t_publish_timer t_tmr_publish::get_publish_timer(void) const {
function string (line 313) | string t_tmr_publish::get_name(void) const {
function t_timer (line 337) | t_timer *t_tmr_stun_trans::copy(void) const {
function t_timer_type (line 343) | t_timer_type t_tmr_stun_trans::get_type(void) const {
function t_stun_timer (line 351) | t_stun_timer t_tmr_stun_trans::get_stun_timer(void) const {
function string (line 355) | string t_tmr_stun_trans::get_name(void) const {
type itimerval (line 377) | struct itimerval
type itimerval (line 440) | struct itimerval
type itimerval (line 522) | struct itimerval
type itimerval (line 658) | struct itimerval
type itimerval (line 671) | struct itimerval
function timeout_handler (line 710) | void timeout_handler(int signum) {
FILE: src/timekeeper.h
type t_timer_type (line 36) | enum t_timer_type {
function class (line 48) | class t_timer : public t_id_object {
function class (line 74) | class t_tmr_transaction : public t_timer {
function class (line 93) | class t_tmr_phone : public t_timer {
function class (line 112) | class t_tmr_line : public t_timer {
function class (line 134) | class t_tmr_subscribe : public t_timer {
function class (line 159) | class t_tmr_publish : public t_timer {
function class (line 178) | class t_tmr_stun_trans : public t_timer {
function class (line 203) | class t_timekeeper {
FILE: src/transaction.cpp
function string (line 33) | string trans_state2str(t_trans_state s) {
function t_tid (line 83) | t_tid t_transaction::get_id(void) const {
function t_trans_state (line 103) | t_trans_state t_transaction::get_state(void) const {
function t_method (line 111) | t_method t_transaction::get_method(void) const {
function string (line 115) | string t_transaction::get_to_tag(void) {
function t_response (line 126) | t_response *t_transaction::create_response(int code, string reason) {
FILE: src/transaction.h
type t_tid (line 30) | typedef unsigned short t_tid;
type t_trans_state (line 35) | enum t_trans_state {
function class (line 58) | class t_transaction {
function class (line 121) | class t_trans_client : public t_transaction {
function class (line 181) | class t_tc_invite : public t_trans_client {
function class (line 230) | class t_tc_non_invite : public t_trans_client {
function class (line 274) | class t_trans_server : public t_transaction {
function class (line 318) | class t_ts_invite : public t_trans_server {
function class (line 353) | class t_ts_non_invite : public t_trans_server {
FILE: src/transaction_layer.h
type t_tuid (line 29) | typedef unsigned short t_tuid;
function class (line 31) | class t_transaction_layer : public i_prohibit_thread {
FILE: src/transaction_mgr.cpp
function t_trans_client (line 32) | t_trans_client *t_transaction_mgr::find_trans_client(t_response *r) const {
function t_trans_client (line 43) | t_trans_client *t_transaction_mgr::find_trans_client(t_tid tid) const {
function t_trans_client (line 51) | t_trans_client *t_transaction_mgr::find_trans_client(const string &branc...
function t_trans_client (line 62) | t_trans_client *t_transaction_mgr::find_trans_client(const t_icmp_msg &i...
function t_trans_server (line 73) | t_trans_server *t_transaction_mgr::find_trans_server(t_request *r) const {
function t_trans_server (line 85) | t_trans_server *t_transaction_mgr::find_trans_server(t_tid tid) const {
function t_stun_transaction (line 93) | t_stun_transaction *t_transaction_mgr::find_stun_trans(StunMessage *r) c...
function t_stun_transaction (line 104) | t_stun_transaction *t_transaction_mgr::find_stun_trans(t_tid tid) const {
function t_stun_transaction (line 112) | t_stun_transaction *t_transaction_mgr::find_stun_trans(const t_icmp_msg ...
function t_trans_server (line 123) | t_trans_server *t_transaction_mgr::find_cancel_target(t_request *r) const {
function t_tc_invite (line 134) | t_tc_invite *t_transaction_mgr::create_tc_invite(t_user *user_config, t_...
function t_tc_non_invite (line 148) | t_tc_non_invite *t_transaction_mgr::create_tc_non_invite(t_user *user_co...
function t_ts_invite (line 162) | t_ts_invite *t_transaction_mgr::create_ts_invite(t_request *r) {
function t_ts_non_invite (line 169) | t_ts_non_invite *t_transaction_mgr::create_ts_non_invite(t_request *r) {
function t_sip_stun_trans (line 176) | t_sip_stun_trans *t_transaction_mgr::create_sip_stun_trans(t_user *user_...
function t_media_stun_trans (line 189) | t_media_stun_trans *t_transaction_mgr::create_media_stun_trans(t_user *u...
function t_object_id (line 638) | t_object_id t_transaction_mgr::start_timer(long dur, t_sip_timer tmr,
function t_object_id (line 650) | t_object_id t_transaction_mgr::start_stun_timer(long dur, t_stun_timer tmr,
FILE: src/transaction_mgr.h
function class (line 32) | class t_transaction_mgr {
FILE: src/translator.h
function class (line 32) | class t_translator {
FILE: src/user.cpp
function t_ext_support (line 190) | t_ext_support t_user::str2ext_support(const string &s) const {
function string (line 198) | string t_user::ext_support2str(t_ext_support e) const {
function t_bit_rate_type (line 212) | t_bit_rate_type t_user::str2bit_rate_type(const string &s) const {
function string (line 219) | string t_user::bit_rate_type2str(t_bit_rate_type b) const {
function t_dtmf_transport (line 231) | t_dtmf_transport t_user::str2dtmf_transport(const string &s) const {
function string (line 239) | string t_user::dtmf_transport2str(t_dtmf_transport d) const {
function t_g726_packing (line 251) | t_g726_packing t_user::str2g726_packing(const string &s) const {
function string (line 257) | string t_user::g726_packing2str(t_g726_packing packing) const {
function t_sip_transport (line 267) | t_sip_transport t_user::str2sip_transport(const string &s) const {
function string (line 274) | string t_user::sip_transport2str(t_sip_transport transport) const {
function string (line 285) | string t_user::expand_filename(const string &filename) {
function t_user (line 596) | t_user *t_user::copy(void) const {
function string (line 602) | string t_user::get_name(void) const {
function string (line 610) | string t_user::get_domain(void) const {
function string (line 618) | string t_user::get_display(bool anonymous) const {
function string (line 628) | string t_user::get_organization(void) const {
function string (line 636) | string t_user::get_auth_realm(void) const {
function string (line 644) | string t_user::get_auth_name(void) const {
function string (line 652) | string t_user::get_auth_pass(void) const {
function t_url (line 678) | t_url t_user::get_outbound_proxy(void) const {
function t_url (line 710) | t_url t_user::get_registrar(void) const {
function t_bit_rate_type (line 806) | t_bit_rate_type t_user::get_speex_bit_rate_type(void) const {
function t_g726_packing (line 950) | t_g726_packing t_user::get_g726_packing(void) const {
function t_dtmf_transport (line 958) | t_dtmf_transport t_user::get_dtmf_transport(void) const {
function t_hold_variant (line 998) | t_hold_variant t_user::get_hold_variant(void) const {
function t_ext_support (line 1086) | t_ext_support t_user::get_ext_100rel(void) const {
function t_sip_transport (line 1153) | t_sip_transport t_user::get_sip_transport(void) const {
function string (line 1171) | string t_user::get_nat_public_ip(void) const {
function t_url (line 1187) | t_url t_user::get_stun_server(void) const {
function string (line 1250) | string t_user::get_special_phone_symbols(void) const {
function string (line 1263) | string t_user::get_ringtone_file(void) const {
function string (line 1271) | string t_user::get_ringback_file(void) const {
function string (line 1279) | string t_user::get_script_incoming_call(void) const {
function string (line 1287) | string t_user::get_script_in_call_answered(void) const {
function string (line 1295) | string t_user::get_script_in_call_failed(void) const {
function string (line 1303) | string t_user::get_script_outgoing_call(void) const {
function string (line 1311) | string t_user::get_script_out_call_answered(void) const {
function string (line 1319) | string t_user::get_script_out_call_failed(void) const {
function string (line 1327) | string t_user::get_script_local_release(void) const {
function string (line 1335) | string t_user::get_script_remote_release(void) const {
function string (line 1391) | string t_user::get_mwi_user(void) const {
function t_url (line 1399) | t_url t_user::get_mwi_server(void) const {
function string (line 1423) | string t_user::get_mwi_vm_address(void) const {
type stat (line 2572) | struct stat
function string (line 2923) | string t_user::get_filename(void) const {
type stat (line 2936) | struct stat
function string (line 2944) | string t_user::get_profile_name(void) const {
function string (line 2962) | string t_user::get_contact_name(void) const {
function string (line 3002) | string t_user::get_display_uri(void) const {
function string (line 3053) | string t_user::create_user_contact(bool anonymous, const string &auto_ip) {
function string (line 3103) | string t_user::create_user_uri(bool anonymous) {
function string (line 3127) | string t_user::convert_number(const string &number, const list<t_number_...
function string (line 3171) | string t_user::convert_number(const string &number) const {
function t_url (line 3175) | t_url t_user::get_mwi_uri(void) const {
FILE: src/user.h
type t_hold_variant (line 53) | enum t_hold_variant {
type t_sip_transport (line 59) | enum t_sip_transport {
type t_ext_support (line 65) | enum t_ext_support {
type t_bit_rate_type (line 73) | enum t_bit_rate_type {
type t_dtmf_transport (line 80) | enum t_dtmf_transport {
type t_g726_packing (line 87) | enum t_g726_packing {
type t_number_conversion (line 92) | struct t_number_conversion {
function class (line 100) | class t_user {
FILE: src/userintf.cpp
function tw_readline_cb (line 101) | static void tw_readline_cb(char *line)
function sigwinch_handler (line 123) | static void sigwinch_handler(int signum)
function string (line 133) | string t_userintf::expand_destination(t_user *user_config, const string ...
function string (line 2060) | string t_userintf::complete_command(const string &c, bool &ambiguous) {
function string (line 2154) | string t_userintf::format_sip_address(t_user *user_config, const string ...
function string (line 2222) | string t_userintf::format_codec(t_audio_codec codec) const {
function string (line 2403) | string t_userintf::select_network_intf(void) {
function string (line 3637) | string t_userintf::get_name_from_abook(t_user *user_config, const t_url ...
FILE: src/userintf.h
type t_command_arg (line 49) | struct t_command_arg {
function class (line 54) | class t_userintf : public i_prohibit_thread {
FILE: src/util.cpp
function string (line 41) | string random_token(int length) {
function string (line 51) | string random_hexstr(int length) {
function string (line 66) | string float2str(float f, int precision) {
function string (line 79) | string int2str(int i, const char *format) {
function string (line 86) | string int2str(int i) {
function string (line 90) | string ulong2str(unsigned long i, const char *format) {
function string (line 97) | string ulong2str(unsigned long i) {
function string (line 101) | string ptr2str(void *p) {
function string (line 108) | string bool2str(bool b) {
function string (line 112) | string time2str(time_t t, const char *format) {
function string (line 121) | string current_time2str(const char *format) {
function string (line 128) | string weekday2str(int wkday) {
function string (line 133) | string month2str(int month) {
function str2month_full (line 138) | int str2month_full(const string &month) {
function string (line 148) | string duration2str(unsigned long seconds) {
function string (line 173) | string timer2str(unsigned long seconds) {
function uint8 (line 187) | static uint8 hexdig2value(char hexdig) {
function value2hexdig (line 200) | static char value2hexdig(uint8 val) {
function hex2int (line 212) | unsigned long hex2int(const string &h) {
function hex2binary (line 224) | void hex2binary(const string &h, uint8 *buf) {
function string (line 239) | string binary2hex(uint8 *buf, unsigned long len) {
function string (line 250) | string tolower(const string &s) {
function string (line 260) | string toupper(const string &s) {
function string (line 270) | string rtrim(const string &s) {
function string (line 279) | string ltrim(const string &s) {
function string (line 288) | string trim(const string &s) {
function string (line 292) | string padleft(const string &s, char c, unsigned long len) {
function cmp_nocase (line 298) | int cmp_nocase(const string &s1, const string &s2) {
function must_quote (line 315) | bool must_quote(const string &s) {
function string (line 322) | string escape(const string &s, char c) {
function string (line 336) | string unescape(const string &s) {
function string (line 350) | string escape_hex(const string &s, const string &unreserved) {
function string (line 365) | string unescape_hex(const string &s) {
function string (line 384) | string replace_char(const string &s, char from, char to) {
function string (line 394) | string replace_first(const string &s, const string &from, const string &...
function split (line 405) | vector<string> split(const string &s, char c) {
function split (line 431) | vector<string> split(const string &s, const string& separator) {
function split_linebreak (line 457) | vector<string> split_linebreak(const string &s) {
function split_on_first (line 467) | vector<string> split_on_first(const string &s, char c) {
function split_on_last (line 489) | vector<string> split_on_last(const string &s, char c) {
function split_escaped (line 511) | vector<string> split_escaped(const string &s, char c) {
function split_ws (line 537) | vector<string> split_ws(const string &s, bool quote_sensitive) {
function string (line 566) | string join_strings(const vector<string> &v, const string &separator) {
function string (line 579) | string unquote(const string &s) {
function is_number (line 588) | bool is_number(const string &s) {
function is_ipaddr (line 598) | bool is_ipaddr(const string &s) {
function yesno2bool (line 609) | bool yesno2bool(const string &yesno) {
function string (line 612) | string bool2yesno(bool b) {
function string (line 616) | string str2dtmf(const string &s) {
function looks_like_phone (line 689) | bool looks_like_phone(const string &s, const string &special_symbols) {
function string (line 700) | string remove_symbols(const string &s, const string &special_symbols) {
function string (line 712) | string remove_white_space(const string &s) {
function string (line 724) | string dotted_truncate(const string &s, string::size_type len) {
function string (line 730) | string to_printable(const string &s) {
function string (line 744) | string get_error_str(int errnum) {
FILE: src/utils/file_utils.cpp
function string (line 51) | string utils::strip_path_from_filename(const string &filename) {
function string (line 56) | string utils::get_path_from_filename(const string &filename) {
function string (line 67) | string utils::get_extension_from_filename(const string &filename) {
function string (line 78) | string utils::apply_glob_to_filename(const string &filename, const strin...
function string (line 102) | string get_working_dir(void) {
FILE: src/utils/file_utils.h
function namespace (line 30) | namespace utils {
FILE: src/utils/mime_database.cpp
function string (line 75) | string t_mime_database::get_glob(const string &mimetype) const {
function string (line 85) | string t_mime_database::get_mimetype(const string &filename) const {
FILE: src/utils/mime_database.h
function namespace (line 35) | namespace utils {
FILE: src/utils/record_file.h
function namespace (line 41) | namespace utils {
FILE: src/utils/record_file.hpp
function string (line 30) | string t_record_file<R>::join_fields(const vector<string> &v) const {
type stat (line 84) | struct stat
Condensed preview — 538 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (6,139K chars).
[
{
"path": ".github/workflows/main.yml",
"chars": 5786,
"preview": "name: Build\n\non: [push, pull_request]\n\nenv:\n # CMake flags used for default builds -- can be overridden by matrix.flags"
},
{
"path": ".gitignore",
"chars": 514,
"preview": "# generated by cmake\n*.cmake\n!cmake/*.cmake\n*.depends\nCMakeFiles\nMakefile\n/CMakeCache.txt\n/twinkle_config.h\n/twinkle.des"
},
{
"path": "AUTHORS",
"chars": 1231,
"preview": "Author of Twinkle:\n\nMichel de Boer <michel@twinklephone.com> designed and implemented Twinkle.\nLubos Dolezel <lubos@dole"
},
{
"path": "CMakeLists.txt",
"chars": 7359,
"preview": "cmake_minimum_required(VERSION 2.8.10...3.22 FATAL_ERROR)\n\nproject(twinkle)\n\nset(PRODUCT_VERSION \"1.10.3\")\nset(PRODUCT_D"
},
{
"path": "COPYING",
"chars": 18092,
"preview": " GNU GENERAL PUBLIC LICENSE\n Version 2, June 1991\n\n Copyright (C) 1989, 1991 Fr"
},
{
"path": "Doxyfile",
"chars": 51917,
"preview": "# Doxyfile 1.5.0\n\n# This file describes the settings to be used by the documentation system\n# doxygen (www.doxygen.org) "
},
{
"path": "NEWS",
"chars": 33060,
"preview": "18 February 2022 - 1.10.3\n=========================\n- Replace manual URL.\n\n14 February 2019 - 1.10.2\n==================="
},
{
"path": "README.md",
"chars": 10353,
"preview": "[](https://github.com/LubosD/twinkle/act"
},
{
"path": "THANKS",
"chars": 496,
"preview": "Thanks to the following people for testing and finding all\nthose lovely bugs:\n\nRichard Bos\nSchelte Bron\nRuud Linders\nJoh"
},
{
"path": "TODO",
"chars": 654,
"preview": "* make KDE support work again\n\n\tAfter cleaning up the autotools config, twinkle only builds with\n\t--without-kde. This is"
},
{
"path": "cmake/CheckCXX11Regex.cmake",
"chars": 1432,
"preview": "# Check if C++11 regular expressions are available and actually work.\n#\n# libstdc++ 4.8 shipped with a buggy prototype f"
},
{
"path": "cmake/FindCcrtp.cmake",
"chars": 563,
"preview": "FIND_PATH(CCRTP_INCLUDE_DIR ccrtp/rtp.h)\nFIND_LIBRARY(CCRTP_LIBRARIES NAMES ccrtp)\n\nIF(CCRTP_INCLUDE_DIR AND CCRTP_LIBRA"
},
{
"path": "cmake/FindCommoncpp.cmake",
"chars": 657,
"preview": "FIND_PATH(COMMONCPP_INCLUDE_DIR commoncpp/config.h)\nFIND_LIBRARY(COMMONCPP_LIBRARIES NAMES commoncpp)\n\nIF(COMMONCPP_INCL"
},
{
"path": "cmake/FindG729.cmake",
"chars": 1733,
"preview": "INCLUDE(CMakePushCheckState)\nINCLUDE(CheckCSourceCompiles)\n\nFIND_PATH(G729_INCLUDE_DIR bcg729/decoder.h)\nFIND_LIBRARY(G7"
},
{
"path": "cmake/FindGsm.cmake",
"chars": 514,
"preview": "FIND_PATH(GSM_INCLUDE_DIR gsm/gsm.h)\nFIND_LIBRARY(GSM_LIBRARY NAMES gsm)\n\nIF(GSM_INCLUDE_DIR AND GSM_LIBRARY)\n\tSET(GSM_F"
},
{
"path": "cmake/FindIlbc.cmake",
"chars": 1042,
"preview": "include (CMakePushCheckState)\ninclude (CheckCXXSourceCompiles)\n\nFIND_PATH(ILBC_INCLUDE_DIR ilbc/iLBC_decode.h)\nFIND_LIBR"
},
{
"path": "cmake/FindLibMagic.cmake",
"chars": 2070,
"preview": "# - Try to find libmagic header and library\n#\n# Usage of this module as follows:\n#\n# find_package(LibMagic)\n#\n# Vari"
},
{
"path": "cmake/FindLibSndfile.cmake",
"chars": 602,
"preview": "FIND_PATH(LIBSNDFILE_INCLUDE_DIR sndfile.h)\n\nSET(LIBSNDFILE_NAMES ${LIBSNDFILE_NAMES} sndfile)\nFIND_LIBRARY(LIBSNDFILE_L"
},
{
"path": "cmake/FindReadline.cmake",
"chars": 1508,
"preview": "# - Try to find readline include dirs and libraries \n#\n# Usage of this module as follows:\n#\n# find_package(Readline)"
},
{
"path": "cmake/FindSpeex.cmake",
"chars": 708,
"preview": "FIND_PATH(SPEEX_INCLUDE_DIR speex/speex.h)\nFIND_LIBRARY(SPEEX_LIBRARY NAMES speex)\nFIND_LIBRARY(SPEEXDSP_LIBRARY NAMES s"
},
{
"path": "cmake/FindUcommon.cmake",
"chars": 771,
"preview": "FIND_PATH(UCOMMON_INCLUDE_DIR ucommon/ucommon.h)\nFIND_LIBRARY(UCOMMON_LIBRARIES NAMES ucommon)\nFIND_LIBRARY(USECURE_LIBR"
},
{
"path": "cmake/FindZrtpcpp.cmake",
"chars": 721,
"preview": "FIND_PATH(ZRTPCPP_INCLUDE_DIR libzrtpcpp/zrtpccrtp.h)\nFIND_LIBRARY(ZRTPCPP_LIBRARIES NAMES zrtpcpp)\n\nIF(ZRTPCPP_INCLUDE_"
},
{
"path": "data/providers.csv",
"chars": 203,
"preview": "# provider;domain;sip proxy;stun server\nsipgate.at;sipgate.at;;sipgate.at\nsipgate.co.uk;sipgate.co.uk;;sipgate.co.uk\nsip"
},
{
"path": "data/twinkle.1",
"chars": 4060,
"preview": ".\\\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.2.\n.TH TWINKLE \"1\" \"January 2016\" \"Twinkle 1.10.0 - 15 J"
},
{
"path": "sip.protocol",
"chars": 164,
"preview": "[Protocol]\nexec=twinkle --call %u\nprotocol=sip\ninput=none\noutput=none\nhelper=true\nlisting=\nreading=false\nwriting=false\nm"
},
{
"path": "src/CMakeLists.txt",
"chars": 2215,
"preview": "project(libtwinkle)\n\ninclude_directories(\"${CMAKE_CURRENT_SOURCE_DIR}\")\n\nadd_subdirectory(audio)\nif (NOT WITH_GSM)\n\tadd_"
},
{
"path": "src/abstract_dialog.cpp",
"chars": 9134,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/abstract_dialog.h",
"chars": 10742,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/address_book.cpp",
"chars": 4340,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/address_book.h",
"chars": 3484,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/audio/CMakeLists.txt",
"chars": 472,
"preview": "project(libtwinkle-audio)\n\nset(LIBTWINKLE_AUDIO-SRCS\n\taudio_device.cpp\n\taudio_decoder.cpp\n\taudio_encoder.cpp\n\taudio_code"
},
{
"path": "src/audio/README_G711",
"chars": 3217,
"preview": "The files in this directory comprise ANSI-C language reference implementations\nof the CCITT (International Telegraph and"
},
{
"path": "src/audio/audio_codecs.cpp",
"chars": 3262,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/audio/audio_codecs.h",
"chars": 3735,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/audio/audio_decoder.cpp",
"chars": 15538,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/audio/audio_decoder.h",
"chars": 7122,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/audio/audio_device.cpp",
"chars": 26646,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/audio/audio_device.h",
"chars": 4184,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/audio/audio_encoder.cpp",
"chars": 13324,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/audio/audio_encoder.h",
"chars": 5633,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/audio/audio_rx.cpp",
"chars": 29306,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/audio/audio_rx.h",
"chars": 6486,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/audio/audio_session.cpp",
"chars": 17687,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/audio/audio_session.h",
"chars": 4908,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/audio/audio_tx.cpp",
"chars": 30736,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/audio/audio_tx.h",
"chars": 6728,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/audio/dtmf_player.cpp",
"chars": 5864,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/audio/dtmf_player.h",
"chars": 3028,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/audio/freq_gen.cpp",
"chars": 3372,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/audio/freq_gen.h",
"chars": 1440,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/audio/g711.cpp",
"chars": 8361,
"preview": "/*\n * This source code is a product of Sun Microsystems, Inc. and is provided\n * for unrestricted use. Users may copy o"
},
{
"path": "src/audio/g711.h",
"chars": 408,
"preview": "#ifndef _G711_H\n#define _G711_H\n\n// The linear PCM codes are signed 16 bit values\n\n// G.711 A-law\nunsigned char linear2a"
},
{
"path": "src/audio/g721.cpp",
"chars": 5275,
"preview": "/*\n * This source code is a product of Sun Microsystems, Inc. and is provided\n * for unrestricted use. Users may copy o"
},
{
"path": "src/audio/g722.h",
"chars": 3583,
"preview": "/*\n * SpanDSP - a series of DSP components for telephony\n *\n * g722.h - The ITU G.722 codec.\n *\n * Written by Steve Unde"
},
{
"path": "src/audio/g722_decode.c",
"chars": 11348,
"preview": "/*\n * SpanDSP - a series of DSP components for telephony\n *\n * g722_decode.c - The ITU G.722 codec, decode part.\n *\n * W"
},
{
"path": "src/audio/g722_encode.c",
"chars": 11162,
"preview": "/*\n * SpanDSP - a series of DSP components for telephony\n *\n * g722_encode.c - The ITU G.722 codec, encode part.\n *\n * W"
},
{
"path": "src/audio/g722_local.h",
"chars": 1066,
"preview": "/*\n Copyright (C) 2019 Frédéric Brière <fbriere@fbriere.net>\n\n This program is free software; you can redistribut"
},
{
"path": "src/audio/g723_16.cpp",
"chars": 5375,
"preview": "/*\n * This source code is a product of Sun Microsystems, Inc. and is provided\n * for unrestricted use. Users may copy o"
},
{
"path": "src/audio/g723_24.cpp",
"chars": 4655,
"preview": "/*\n * This source code is a product of Sun Microsystems, Inc. and is provided\n * for unrestricted use. Users may copy o"
},
{
"path": "src/audio/g723_40.cpp",
"chars": 5542,
"preview": "/*\n * This source code is a product of Sun Microsystems, Inc. and is provided\n * for unrestricted use. Users may copy o"
},
{
"path": "src/audio/g72x.cpp",
"chars": 14384,
"preview": "/*\n * This source code is a product of Sun Microsystems, Inc. and is provided\n * for unrestricted use. Users may copy o"
},
{
"path": "src/audio/g72x.h",
"chars": 4668,
"preview": "/*\n * This source code is a product of Sun Microsystems, Inc. and is provided\n * for unrestricted use. Users may copy o"
},
{
"path": "src/audio/gsm/COPYRIGHT",
"chars": 690,
"preview": "Copyright 1992, 1993, 1994 by Jutta Degener and Carsten Bormann,\nTechnische Universitaet Berlin\n\nAny use of this softwar"
},
{
"path": "src/audio/gsm/ChangeLog",
"chars": 3206,
"preview": "\nFri Jul 5 19:26:37 1996 \tJutta Degener (jutta@cs.tu-berlin.de)\n\n\t* Release 1.0 Patchlevel 10\n\tsrc/toast_alaw.c: exchan"
},
{
"path": "src/audio/gsm/INSTALL",
"chars": 3143,
"preview": "How to get started:\n\n Edit the Makefile.\n\n\tYou should configure a few machine-dependencies and what\n\tcompiler you want"
},
{
"path": "src/audio/gsm/MACHINES",
"chars": 440,
"preview": "The gsm library has been tested successfully on the following platforms:\n\n- Various Sun4's running SunOS 4.1.2\n- SPARC1 "
},
{
"path": "src/audio/gsm/README",
"chars": 1671,
"preview": "\nGSM 06.10 13 kbit/s RPE/LTP speech compression available\n--------------------------------------------------------\n\nThe "
},
{
"path": "src/audio/gsm/inc/config.h",
"chars": 1398,
"preview": "/*\n * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\n * Universitaet Berlin. See the accompanying file"
},
{
"path": "src/audio/gsm/inc/gsm.h",
"chars": 1681,
"preview": "/*\n * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\n * Universitaet Berlin. See the accompanying file"
},
{
"path": "src/audio/gsm/inc/private.h",
"chars": 7787,
"preview": "/*\n * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\n * Universitaet Berlin. See the accompanying file"
},
{
"path": "src/audio/gsm/inc/proto.h",
"chars": 1611,
"preview": "/*\n * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\n * Universitaet Berlin. See the accompanying file"
},
{
"path": "src/audio/gsm/inc/unproto.h",
"chars": 476,
"preview": "/*\n * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\n * Universitaet Berlin. See the accompanying file"
},
{
"path": "src/audio/gsm/src/CMakeLists.txt",
"chars": 415,
"preview": "project(libtwinkle-gsm)\n\ninclude_directories(${CMAKE_CURRENT_SOURCE_DIR}/../inc)\n\nset(LIBTWINKLE_GSM-SRCS\n\tadd.cpp\n\tcode"
},
{
"path": "src/audio/gsm/src/add.cpp",
"chars": 5560,
"preview": "/*\n * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\n * Universitaet Berlin. See the accompanying file"
},
{
"path": "src/audio/gsm/src/code.cpp",
"chars": 2573,
"preview": "/*\n * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\n * Universitaet Berlin. See the accompanying file"
},
{
"path": "src/audio/gsm/src/debug.cpp",
"chars": 1579,
"preview": "/*\n * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\n * Universitaet Berlin. See the accompanying file"
},
{
"path": "src/audio/gsm/src/decode.cpp",
"chars": 1574,
"preview": "/*\n * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\n * Universitaet Berlin. See the accompanying file"
},
{
"path": "src/audio/gsm/src/gsm_create.cpp",
"chars": 860,
"preview": "/*\n * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\n * Universitaet Berlin. See the accompanying file"
},
{
"path": "src/audio/gsm/src/gsm_decode.cpp",
"chars": 10670,
"preview": "/*\n * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\n * Universitaet Berlin. See the accompanying file"
},
{
"path": "src/audio/gsm/src/gsm_destroy.cpp",
"chars": 573,
"preview": "/*\n * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\n * Universitaet Berlin. See the accompanying file"
},
{
"path": "src/audio/gsm/src/gsm_encode.cpp",
"chars": 11430,
"preview": "/*\n * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\n * Universitaet Berlin. See the accompanying file"
},
{
"path": "src/audio/gsm/src/gsm_explode.cpp",
"chars": 11174,
"preview": "/*\n * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\n * Universitaet Berlin. See the accompanying file"
},
{
"path": "src/audio/gsm/src/gsm_implode.cpp",
"chars": 13005,
"preview": "/*\n * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\n * Universitaet Berlin. See the accompanying file"
},
{
"path": "src/audio/gsm/src/gsm_option.cpp",
"chars": 1209,
"preview": "/*\n * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\n * Universitaet Berlin. See the accompanying file"
},
{
"path": "src/audio/gsm/src/gsm_print.cpp",
"chars": 4935,
"preview": "/*\n * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\n * Universitaet Berlin. See the accompanying file"
},
{
"path": "src/audio/gsm/src/long_term.cpp",
"chars": 23591,
"preview": "/*\n * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\n * Universitaet Berlin. See the accompanying file"
},
{
"path": "src/audio/gsm/src/lpc.cpp",
"chars": 7093,
"preview": "/*\n * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\n * Universitaet Berlin. See the accompanying file"
},
{
"path": "src/audio/gsm/src/preprocess.cpp",
"chars": 2517,
"preview": "/*\n * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\n * Universitaet Berlin. See the accompanying file"
},
{
"path": "src/audio/gsm/src/rpe.cpp",
"chars": 11064,
"preview": "/*\n * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\n * Universitaet Berlin. See the accompanying file"
},
{
"path": "src/audio/gsm/src/short_term.cpp",
"chars": 10406,
"preview": "/*\n * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\n * Universitaet Berlin. See the accompanying file"
},
{
"path": "src/audio/gsm/src/table.cpp",
"chars": 2151,
"preview": "/*\n * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische\n * Universitaet Berlin. See the accompanying file"
},
{
"path": "src/audio/media_buffer.cpp",
"chars": 3039,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/audio/media_buffer.h",
"chars": 2155,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/audio/rtp_telephone_event.cpp",
"chars": 2300,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/audio/rtp_telephone_event.h",
"chars": 2416,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/audio/tone_gen.cpp",
"chars": 5574,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/audio/tone_gen.h",
"chars": 1958,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/audio/twinkle_rtp_session.cpp",
"chars": 2943,
"preview": "\n/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can re"
},
{
"path": "src/audio/twinkle_rtp_session.h",
"chars": 1467,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/audio/twinkle_zrtp_ui.cpp",
"chars": 11087,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/audio/twinkle_zrtp_ui.h",
"chars": 2924,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/audits/CMakeLists.txt",
"chars": 134,
"preview": "project(libtwinkle-audits)\n\nset(LIBTWINKLE_AUDITS-SRCS\n\tmemman.cpp\n)\n\nadd_library(libtwinkle-audits OBJECT ${LIBTWINKLE_"
},
{
"path": "src/audits/memman.cpp",
"chars": 6567,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/audits/memman.h",
"chars": 2535,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/auth.cpp",
"chars": 6045,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/auth.h",
"chars": 4720,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/call_history.cpp",
"chars": 11771,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/call_history.h",
"chars": 6726,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/call_script.cpp",
"chars": 13891,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/call_script.h",
"chars": 7348,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/client_request.cpp",
"chars": 2836,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/client_request.h",
"chars": 3367,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/cmd_socket.cpp",
"chars": 5314,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/cmd_socket.h",
"chars": 1804,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/dialog.cpp",
"chars": 112097,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/dialog.h",
"chars": 27927,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/diamondcard.cpp",
"chars": 3592,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/diamondcard.h",
"chars": 2148,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/epa.cpp",
"chars": 12954,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/epa.h",
"chars": 5683,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/events.cpp",
"chars": 18076,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/events.h",
"chars": 22325,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/exceptions.h",
"chars": 1070,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/gui/CMakeLists.txt",
"chars": 2539,
"preview": "project(twinkle-gui)\n\n# Suppress deprecation warnings from Qt, as they often would require breaking\n# backwards compatib"
},
{
"path": "src/gui/address_finder.cpp",
"chars": 3615,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/gui/address_finder.h",
"chars": 1840,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/gui/addresscardform.cpp",
"chars": 2914,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n \n This program is free software; you can "
},
{
"path": "src/gui/addresscardform.h",
"chars": 410,
"preview": "#ifndef ADDRESSCARDFORM_H\n#define ADDRESSCARDFORM_H\n#include \"address_book.h\"\n#include \"ui_addresscardform.h\"\n\nclass Add"
},
{
"path": "src/gui/addresscardform.ui",
"chars": 7051,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\" stdsetdef=\"1\">\n <author></author>\n <comment></comment>\n <exp"
},
{
"path": "src/gui/addresstablemodel.cpp",
"chars": 3695,
"preview": "/*\n\tCopyright (C) 2015 Lubos Dolezel <lubos@dolezel.info>\n\n This program is free software; you can redistribute it an"
},
{
"path": "src/gui/addresstablemodel.h",
"chars": 1746,
"preview": "/*\n\tCopyright (C) 2015 Lubos Dolezel <lubos@dolezel.info>\n\n This program is free software; you can redistribute it an"
},
{
"path": "src/gui/akonadiaddressbook.cpp",
"chars": 4867,
"preview": "/*\n Copyright (C) 2018 Frédéric Brière <fbriere@fbriere.net>\n\n This program is free software; you can redistribut"
},
{
"path": "src/gui/akonadiaddressbook.h",
"chars": 2185,
"preview": "/*\n Copyright (C) 2018 Frédéric Brière <fbriere@fbriere.net>\n\n This program is free software; you can redistribut"
},
{
"path": "src/gui/authenticationform.cpp",
"chars": 1981,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/gui/authenticationform.h",
"chars": 444,
"preview": "#ifndef AUTHENTICATIONFORM_H\n#define AUTHENTICATIONFORM_H\n#include \"user.h\"\n#include \"ui_authenticationform.h\"\n\nclass Au"
},
{
"path": "src/gui/authenticationform.ui",
"chars": 9786,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\" stdsetdef=\"1\">\n <author></author>\n <comment></comment>\n <exp"
},
{
"path": "src/gui/buddyform.cpp",
"chars": 4734,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n \n This program is free software; you can "
},
{
"path": "src/gui/buddyform.h",
"chars": 838,
"preview": "#ifndef BUDDYFORM_H\n#define BUDDYFORM_H\n#include \"getaddressform.h\"\n#include \"presence/buddy.h\"\n#include <QTreeWidgetIte"
},
{
"path": "src/gui/buddyform.ui",
"chars": 6976,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\" stdsetdef=\"1\">\n <author></author>\n <comment></comment>\n <exp"
},
{
"path": "src/gui/buddylistview.cpp",
"chars": 7431,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/gui/buddylistview.h",
"chars": 2420,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/gui/command_args.h",
"chars": 1796,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/gui/core_strings.h",
"chars": 6478,
"preview": "// This file is generated by translator.py\n// It contains all strings that need translation from the\n// core of Twinkle."
},
{
"path": "src/gui/deregisterform.cpp",
"chars": 512,
"preview": "#include \"deregisterform.h\"\n\n/*\n * Constructs a DeregisterForm which is a child of 'parent', with the\n * name 'name' a"
},
{
"path": "src/gui/deregisterform.h",
"chars": 288,
"preview": "#ifndef DEREGISTERFORM_H\n#define DEREGISTERFORM_H\n\n#include <QDialog>\n\n#include \"ui_deregisterform.h\"\n\nclass DeregisterF"
},
{
"path": "src/gui/deregisterform.ui",
"chars": 2544,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\" stdsetdef=\"1\">\n <author></author>\n <comment></comment>\n <exp"
},
{
"path": "src/gui/diamondcardprofileform.cpp",
"chars": 4541,
"preview": "//Added by qt3to4:\n#include <QEvent>\n#include <QMouseEvent>\n\n/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twin"
},
{
"path": "src/gui/diamondcardprofileform.h",
"chars": 757,
"preview": "#ifndef DIAMONDCARDPROFILEFORM_H\n#define DIAMONDCARDPROFILEFORM_H\n#include <QLabel>\n#include <QLineEdit>\n#include \"user."
},
{
"path": "src/gui/diamondcardprofileform.ui",
"chars": 7360,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>DiamondcardProfileForm</class>\n <widget class=\"QDialog"
},
{
"path": "src/gui/dtmfform.cpp",
"chars": 4348,
"preview": "#include \"dtmfform.h\"\n#include <QClipboard>\n#include <QTimer>\n\n/*\n * Constructs a DtmfForm which is a child of 'parent'"
},
{
"path": "src/gui/dtmfform.h",
"chars": 771,
"preview": "#ifndef DTMFFORM_H\n#define DTMFFORM_H\n\n#include <QDialog>\n#include <QKeyEvent>\n#include <QTimer>\n#include \"ui_dtmfform.h"
},
{
"path": "src/gui/dtmfform.ui",
"chars": 20751,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>DtmfForm</class>\n <widget class=\"QDialog\" name=\"DtmfFo"
},
{
"path": "src/gui/getaddressform.cpp",
"chars": 6878,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/gui/getaddressform.h",
"chars": 857,
"preview": "#ifndef GETADDRESSFORM_UI_H\n#define GETADDRESSFORM_UI_H\n\n#include \"twinkle_config.h\"\n\n#include \"ui_getaddressform.h\"\n#in"
},
{
"path": "src/gui/getaddressform.ui",
"chars": 12029,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>GetAddressForm</class>\n <widget class=\"QDialog\" name=\""
},
{
"path": "src/gui/getprofilenameform.cpp",
"chars": 2726,
"preview": "#include \"getprofilenameform.h\"\n#include <QDir>\n#include <QMessageBox>\n#include <QRegularExpressionValidator>\n#include \""
},
{
"path": "src/gui/getprofilenameform.h",
"chars": 483,
"preview": "#ifndef GETPROFILENAMEFORM_H\n#define GETPROFILENAMEFORM_H\n\n#include <QDialog>\n#include \"ui_getprofilenameform.h\"\n\nclass "
},
{
"path": "src/gui/getprofilenameform.ui",
"chars": 5467,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\" stdsetdef=\"1\">\n <author></author>\n <comment></comment>\n <exp"
},
{
"path": "src/gui/gui.cpp",
"chars": 85609,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n \n This program is free software; you can"
},
{
"path": "src/gui/gui.h",
"chars": 17017,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/gui/historyform.cpp",
"chars": 13500,
"preview": "//Added by qt3to4:\n#include <QCloseEvent>\n#include <QPixmap>\n#include <QMenu>\n\n/*\n Copyright (C) 2005-2009 Michel de"
},
{
"path": "src/gui/historyform.h",
"chars": 1080,
"preview": "#ifndef HISTORYFORM_H\n#define HISTORYFORM_H\n#include \"phone.h\"\n#include <QMenu>\n#include <QStandardItemModel>\n#include <"
},
{
"path": "src/gui/historyform.ui",
"chars": 11937,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>HistoryForm</class>\n <widget class=\"QDialog\" name=\"His"
},
{
"path": "src/gui/icons.qrc",
"chars": 7275,
"preview": "<RCC>\n <qresource prefix=\"/icons\">\n <file>images/answer-disabled.png</file>\n <file>images/answer.png</f"
},
{
"path": "src/gui/idlesession_inhibitor.cpp",
"chars": 5607,
"preview": "/*\n (This file was initially copied from qBittorrent.)\n\n Copyright (C) 2019 Vladimir Golovnev <glassez@yandex.ru>\n "
},
{
"path": "src/gui/idlesession_inhibitor.h",
"chars": 1986,
"preview": "/*\n (This file was initially copied from qBittorrent.)\n\n Copyright (C) 2019 Vladimir Golovnev <glassez@yandex.ru>\n "
},
{
"path": "src/gui/idlesession_manager.cpp",
"chars": 2471,
"preview": "/*\n (This file was initially copied from qBittorrent.)\n\n Copyright (C) 2019 Vladimir Golovnev <glassez@yandex.ru>\n "
},
{
"path": "src/gui/idlesession_manager.h",
"chars": 1473,
"preview": "/*\n (This file was initially copied from qBittorrent.)\n\n Copyright (C) 2019 Vladimir Golovnev <glassez@yandex.ru>\n "
},
{
"path": "src/gui/incoming_call_popup.cpp",
"chars": 2365,
"preview": "#include \"incoming_call_popup.h\"\n#include <QDesktopWidget>\n#include <QApplication>\n#include <QQmlContext>\n#include <QSet"
},
{
"path": "src/gui/incoming_call_popup.h",
"chars": 676,
"preview": "#ifndef T_INCOMING_CALL_POPUP_H\n#define T_INCOMING_CALL_POPUP_H\n\n#include <QQuickItem>\n#include <QQuickView>\n\nclass Inco"
},
{
"path": "src/gui/inviteform.cpp",
"chars": 4270,
"preview": "#include \"inviteform.h\"\n//Added by qt3to4:\n#include <QCloseEvent>\n#include \"gui.h\"\n#include \"util.h\"\n#include \"audits/me"
},
{
"path": "src/gui/inviteform.h",
"chars": 926,
"preview": "#ifndef INVITEFORM_UI_H\n#define INVITEFORM_UI_H\n#include \"ui_inviteform.h\"\n#include \"sockets/url.h\"\n#include \"getaddress"
},
{
"path": "src/gui/inviteform.ui",
"chars": 10554,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\" stdsetdef=\"1\">\n <author></author>\n <comment></comment>\n <exp"
},
{
"path": "src/gui/kcontactstablemodel.cpp",
"chars": 2210,
"preview": "/*\n Copyright (C) 2018 Frédéric Brière <fbriere@fbriere.net>\n\n This program is free software; you can redistribut"
},
{
"path": "src/gui/kcontactstablemodel.h",
"chars": 1606,
"preview": "/*\n Copyright (C) 2018 Frédéric Brière <fbriere@fbriere.net>\n\n This program is free software; you can redistribut"
},
{
"path": "src/gui/lang/twinkle_cs.ts",
"chars": 274260,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"cs\" sourcelanguage=\"en\">\n<context>\n "
},
{
"path": "src/gui/lang/twinkle_de.ts",
"chars": 278824,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"de\" sourcelanguage=\"en\">\n<context>\n "
},
{
"path": "src/gui/lang/twinkle_fr.ts",
"chars": 271693,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.0\">\n<context>\n <name>AddressCardForm</name>\n <"
},
{
"path": "src/gui/lang/twinkle_nl.ts",
"chars": 277644,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"nl\" sourcelanguage=\"en\">\n<context>\n "
},
{
"path": "src/gui/lang/twinkle_ru.ts",
"chars": 253946,
"preview": "<?xml version=\"1.0\" ?><!DOCTYPE TS><TS language=\"ru\" version=\"2.1\">\n<context>\n <name>AddressCardForm</name>\n <mess"
},
{
"path": "src/gui/lang/twinkle_sk.ts",
"chars": 262119,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"sk\" sourcelanguage=\"en\">\n<context>\n "
},
{
"path": "src/gui/lang/twinkle_sv.ts",
"chars": 226172,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"sv\" sourcelanguage=\"en\">\n<context>\n "
},
{
"path": "src/gui/lang/twinkle_xx.ts",
"chars": 208478,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\">\n<context>\n <name>AddressCardForm</name>\n <"
},
{
"path": "src/gui/logviewform.cpp",
"chars": 2161,
"preview": "#include \"logviewform.h\"\n\n#include <QScrollBar>\n#include <QTimer>\n#include \"audits/memman.h\"\n#include \"log.h\"\n\n/*\n * Co"
},
{
"path": "src/gui/logviewform.h",
"chars": 564,
"preview": "#ifndef LOGVIEWFORM_H\n#define LOGVIEWFORM_H\n\n#include <QDialog>\n#include <QCloseEvent>\n#include <QTextStream>\n\n#include "
},
{
"path": "src/gui/logviewform.ui",
"chars": 2850,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>LogViewForm</class>\n <widget class=\"QDialog\" name=\"Log"
},
{
"path": "src/gui/main.cpp",
"chars": 36955,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/gui/messageform.cpp",
"chars": 16419,
"preview": "\n\n/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can r"
},
{
"path": "src/gui/messageform.h",
"chars": 1978,
"preview": "#ifndef MESSAGEFORM_H\n#define MESSAGEFORM_H\n#include \"getaddressform.h\"\n#include \"im/msg_session.h\"\n#include \"phone.h\"\n#"
},
{
"path": "src/gui/messageform.ui",
"chars": 7451,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\" stdsetdef=\"1\">\n <author></author>\n <comment></comment>\n <exp"
},
{
"path": "src/gui/messageformview.cpp",
"chars": 4431,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/gui/messageformview.h",
"chars": 1408,
"preview": "/*\n Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>\n\n This program is free software; you can red"
},
{
"path": "src/gui/mphoneform.cpp",
"chars": 92439,
"preview": "/****************************************************************************\n** ui.h extension file, included from the "
},
{
"path": "src/gui/mphoneform.h",
"chars": 7062,
"preview": "#ifndef MPHONEFORM_UI_H\n#define MPHONEFORM_UI_H\n#include <QMainWindow>\n#include \"ui_mphoneform.h\"\n#include \"phone.h\"\n#in"
},
{
"path": "src/gui/mphoneform.ui",
"chars": 78114,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>MphoneForm</class>\n <widget class=\"QMainWindow\" name=\""
},
{
"path": "src/gui/numberconversionform.cpp",
"chars": 1949,
"preview": "#include \"numberconversionform.h\"\n\n#include <QRegularExpressionValidator>\n#include \"gui.h\"\n\n/*\n * Constructs a NumberCo"
},
{
"path": "src/gui/numberconversionform.h",
"chars": 446,
"preview": "#ifndef NUMBERCONVERSIONFORM_H\n#define NUMBERCONVERSIONFORM_H\n\n#include <QDialog>\n#include \"ui_numberconversionform.h\"\n\n"
},
{
"path": "src/gui/numberconversionform.ui",
"chars": 4525,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\" stdsetdef=\"1\">\n <author></author>\n <comment></comment>\n <exp"
},
{
"path": "src/gui/osd.cpp",
"chars": 2473,
"preview": "#include \"osd.h\"\n#include <QtDebug>\n\n#include <QDesktopWidget>\n#include <QSettings>\n#include <QApplication>\n#include <QQ"
},
{
"path": "src/gui/osd.h",
"chars": 897,
"preview": "#ifndef OSD_H\n#define OSD_H\n#include <QObject>\n#include <QString>\n\n// Must use forward declaration, otherwise build fail"
}
]
// ... and 338 more files (download for full content)
About this extraction
This page contains the full source code of the LubosD/twinkle GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 538 files (5.5 MB), approximately 1.5M tokens, and a symbol index with 1321 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.