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)
  * Sollicted MWI as specified by RFC 3842
  * Unsollicited 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 succesfully 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
