Index: Doxyfile
===================================================================
--- Doxyfile	(.../0.8)	(revision 1356)
+++ Doxyfile	(.../0.8.1-sic)	(revision 1356)
@@ -92,7 +92,7 @@
 INLINE_SOURCES         = NO
 STRIP_CODE_COMMENTS    = YES
 REFERENCED_BY_RELATION = YES
-REFERENCES_RELATION    = YES
+REFERENCES_RELATION    = NO
 USE_HTAGS              = NO
 VERBATIM_HEADERS       = YES
 #---------------------------------------------------------------------------
Index: ChangeLog
===================================================================
--- ChangeLog	(.../0.8)	(revision 1356)
+++ ChangeLog	(.../0.8.1-sic)	(revision 1356)
@@ -1,3 +1,18 @@
+v0.8.1 -- 28 Jul 2006
+---------------------
+- Registration: allow registration with services (*)
+- async inbandbytestreams ack
+- fixed memory leak in RosterItem
+- RosterListener: announce un/available resource in itemUn/Available() (*)
+- RosterManager: don't sync self contact to server
+- PrivacyManager: give a privacy list a proper name (thanks to Chris Bond)
+- InBandBytestreams: ack closing with correct ID
+- Adhoc: provide requesting entities JID in the callback (*)
+- DataForm: fixed few minor field handling bugs
+- Client: allow lazy username provisioning
+(*) these changes render 0.8.1 source incompatible compared to 0.8
+
+
 v0.8 -- 08 Apr 2006
 -------------------
 - added an extensible message session abstraction
Index: src/inbandbytestreamhandler.h
===================================================================
--- src/inbandbytestreamhandler.h	(.../0.8)	(revision 1356)
+++ src/inbandbytestreamhandler.h	(.../0.8.1-sic)	(revision 1356)
@@ -40,11 +40,16 @@
 
       /**
        * Notifies the implementor of a new incoming IBB request.
-       * Attach the IBB to a MessageSession using InBandBytestream::attachTo().
+       * Attach the IBB to a MessageSession using InBandBytestream::attachTo().<br>
+       * For @b synchronous InBandBytestreamHandler:<br>
        * If the return value is @b true the bytestream holds as accepted and the
        * InBandBytestreamHandler becomes the owner of the InBandBytestream object. If
        * @b false is returned, the InBandBytestream is deleted by the InBandBytestreamManager
-       * and the bytestream request will be declined.
+       * and the bytestream request will be declined.<br>
+       * For @b asynchronous InBandBytestreamHandler:<br>
+       * The return value is ignored. You have to call either
+       * InBandBytestreamManager::acceptInBandBytestream() or
+       * InBandBytestreamManager::rejectInBandBytestream(), respectively.
        * @param from The remote initiator of the bytestream request.
        * @param ibb The bytestream.
        * @return @b True to accept the byte stream, @b false to reject.
Index: src/connection.cpp
===================================================================
--- src/connection.cpp	(.../0.8)	(revision 1356)
+++ src/connection.cpp	(.../0.8.1-sic)	(revision 1356)
@@ -496,7 +496,7 @@
 
     while( !m_cancel )
     {
-      ConnectionError r = recv();
+      ConnectionError r = recv( 1 );
       if( r != ConnNoError )
         return r;
     }
Index: src/dataformfield.h
===================================================================
--- src/dataformfield.h	(.../0.8)	(revision 1356)
+++ src/dataformfield.h	(.../0.8.1-sic)	(revision 1356)
@@ -118,7 +118,9 @@
       void setName( const std::string& name ) { m_name = name; };
 
       /**
-       * Use this function to set the optional values of a field.
+       * Use this function to set the optional values of the field. The key of the map
+       * will be used as the label of the option, while the value will be used as ... the
+       * value. ;)
        * @param options The optional values of a list* or *multi type of field.
        */
       void setOptions( const StringMap& options ) { m_options = options; };
Index: src/registration.h
===================================================================
--- src/registration.h	(.../0.8)	(revision 1356)
+++ src/registration.h	(.../0.8.1-sic)	(revision 1356)
@@ -17,6 +17,7 @@
 #include "iqhandler.h"
 #include "registrationhandler.h"
 #include "dataform.h"
+#include "jid.h"
 
 #include <string>
 #include <map>
@@ -33,22 +34,31 @@
    * Derive your object from @ref RegistrationHandler and implement the
    * virtual functions offered by that interface. Then use it like this:
    * @code
-   * Client *c = new Client( "example.org" );
-   * c->disableRoster(); // a roster is not necessary for registration
-   * c->disableDisco(); // the disco client is not necessary for registration
+   * void MyClass::myFunc()
+   * {
+   *   m_client = new Client( "example.org" );
+   *   m_client->disableRoster(); // a roster is not necessary for registration
+   *   m_client->disableDisco(); // the disco client is not necessary for registration
+   *   m_client->registerConnectionListener( this );
    *
-   * Registration* r = new Registration( c );
-   * r->registerRegistrationHandler( this );
-   * r->fetchRegistrationFields();
+   *   m_reg = new Registration( c );
+   *   m_reg->registerRegistrationHandler( this );
    *
-   * c->connect();
+   *   m_client->connect();
+   * }
+   *
+   * void MyClass::onConnect()
+   * {
+   *   m_reg->fetchRegistrationFields();
+   * }
    * @endcode
+   *
    * In RegistrationHandler::handleRegistrationFields() you should check which information the server
    * requires to open a new account. You might not always get away with just username and password.
-   * Then call createAccount() with a filled-in fieldStruct and an @c int representing the bit-wise ORed
-   * fields you want to have included in the registration attempt. For your convenience you can use the
-   * 'fields' argument of handleRegistrationFields(). ;) It's your responsibility to make sure at
-   * least those fields the server requested are filled in.
+   * Then call createAccount() with a filled-in fieldStruct and an @c int representing the bit-wise
+   * ORed fields you want to have included in the registration attempt. For your convenience you can
+   * use the 'fields' argument of handleRegistrationFields(). ;) It's your responsibility to make
+   * sure at least those fields the server requested are filled in.
    *
    * Check @c tests/register_test.cpp for an example.
    *
@@ -109,7 +119,15 @@
       /**
        * Constructor.
        * @param parent The ClientBase which is used for establishing a connection.
+       * @param to The server or service to register with. If empty the currently connected
+       * server will be used.
        */
+      Registration( ClientBase *parent, const JID& to );
+
+      /**
+       * Constructor. Registration will be attempted with the ClientBase's connected host.
+       * @param parent The ClientBase which is used for establishing a connection.
+       */
       Registration( ClientBase *parent );
 
       /**
@@ -129,7 +147,8 @@
        * @c fields will be sent. This can only be called with an unauthenticated parent (@ref Client).
        * @note It is recommended to use @ref fetchRegistrationFields to find out which fields the
        * server requires.
-       * @param fields The fields to use to generate the registration request. OR'ed @ref fieldEnum values.
+       * @param fields The fields to use to generate the registration request. OR'ed
+       * @ref fieldEnum values.
        * @param values The struct contains the values which shall be used for the registration.
        */
       void createAccount( int fields, const fieldStruct& values );
@@ -151,8 +170,10 @@
       /**
        * Tells the server to change the password for the current account.
        * @param password The new password.
+       * @param username The username to change the password for. You might want to use
+       * Client::username() to get the current prepped username.
        */
-      void changePassword( const std::string& password );
+      void changePassword( const std::string& username, const std::string& password );
 
       /**
        * Registers the given @c rh as RegistrationHandler. Only one handler is possible at a time.
@@ -181,6 +202,7 @@
       };
 
       ClientBase *m_parent;
+      const JID m_to;
       RegistrationHandler *m_registrationHandler;
   };
 
Index: src/inbandbytestreammanager.h
===================================================================
--- src/inbandbytestreammanager.h	(.../0.8)	(revision 1356)
+++ src/inbandbytestreammanager.h	(.../0.8.1-sic)	(revision 1356)
@@ -224,12 +224,36 @@
       bool dispose( InBandBytestream *ibb );
 
       /**
+       * When using asynchronous InBandBytestream notifications (if you used
+       * registerInBandBytestreamHandler() with a second argument of @b true) you have to
+       * call either this function or rejectInBandBytestream() after receiving an InBandBytestream
+       * from the InBandBytestreamHandler. Else the initiator will never know whether the
+       * request was actually received.
+       * @param ibb The InBandBytestream (as received from InBandBytestreamHandler) to accept.
+       * @since 0.8.1
+       */
+      void acceptInBandBytestream( InBandBytestream *ibb );
+
+      /**
+       * When using asynchronous InBandBytestream notifications (if you used
+       * registerInBandBytestreamHandler() with a second argument of @b true) you have to
+       * call either this function or acceptInBandBytestream() after receiving an InBandBytestream
+       * from the InBandBytestreamHandler. Else the initiator will never know whether the
+       * request was actually received.
+       * @param ibb The InBandBytestream (as received from InBandBytestreamHandler) to reject.
+       * @since 0.8.1
+       */
+      void rejectInBandBytestream( InBandBytestream *ibb );
+
+      /**
        * Use this function to register an object that will receive new @b incoming bytestream
        * requests from the InBandBytestreamManager. Only one InBandBytestreamHandler can be
        * registered at any one time.
        * @param ibbh The InBandBytestreamHandler derived object to receive notifications.
+       * @param sync Whether incoming bytestrams shall be announced syncronously.
+       * Default: true (syncronous)
        */
-      void registerInBandBytestreamHandler( InBandBytestreamHandler *ibbh );
+      void registerInBandBytestreamHandler( InBandBytestreamHandler *ibbh, bool sync = true );
 
       /**
        * Removes the registered InBandBytestreamHandler.
@@ -243,6 +267,9 @@
       virtual bool handleIqID( Stanza *stanza, int context );
 
     private:
+      void acceptInBandBytestream( InBandBytestream *ibb, const JID& from, const std::string& id );
+      void rejectInBandBytestream( InBandBytestream *ibb, const JID& from, const std::string& id );
+
       enum IBBActionType
       {
         IBBOpenStream,
@@ -258,11 +285,21 @@
         InBandBytestreamHandler *ibbh;
       };
       typedef std::map<std::string, TrackItem> TrackMap;
+      TrackMap m_trackMap;
 
+      struct AsyncIBBItem
+      {
+        InBandBytestream *ibb;
+        JID from;
+        std::string id;
+      };
+      typedef std::map<std::string, AsyncIBBItem> AsyncTrackMap;
+      AsyncTrackMap m_asyncTrackMap;
+
       ClientBase *m_parent;
       InBandBytestreamHandler *m_inbandBytestreamHandler;
+      bool m_syncInbandBytestreams;
       int m_blockSize;
-      TrackMap m_trackMap;
 
   };
 
Index: src/dataformfield.cpp
===================================================================
--- src/dataformfield.cpp	(.../0.8)	(revision 1356)
+++ src/dataformfield.cpp	(.../0.8.1-sic)	(revision 1356)
@@ -24,6 +24,9 @@
   DataFormField::DataFormField( Tag *tag )
     : m_type( FIELD_TYPE_INVALID ), m_required( false )
   {
+    if( !tag )
+      return;
+
     if( tag->hasAttribute( "type", "boolean" ) )
       m_type = FIELD_TYPE_BOOLEAN;
     else if( tag->hasAttribute( "type", "fixed" ) )
@@ -45,6 +48,12 @@
     else if( tag->hasAttribute( "type", "text-single" ) )
       m_type = FIELD_TYPE_TEXT_SINGLE;
 
+    if( tag->hasAttribute( "var" ) )
+      m_name = tag->findAttribute( "var" );
+
+    if( tag->hasAttribute( "label" ) )
+      m_label = tag->findAttribute( "label" );
+
     Tag::TagList l = tag->children();
     Tag::TagList::const_iterator it = l.begin();
     for( ; it != l.end(); ++it )
@@ -55,20 +64,19 @@
         m_required = true;
       else if( (*it)->name() == "value" )
       {
-        if( m_type == FIELD_TYPE_TEXT_MULTI )
+        if( m_type == FIELD_TYPE_TEXT_MULTI || m_type == FIELD_TYPE_LIST_MULTI )
           m_values.push_back( (*it)->cdata() );
         else
           m_value = (*it)->cdata();
       }
       else if( (*it)->name() == "option" )
-        m_options[(*it)->findAttribute( "label" )] = (*it)->findChild( "value" )->cdata();
+      {
+        Tag *v = (*it)->findChild( "value" );
+        if( v )
+          m_options[(*it)->findAttribute( "label" )] = v->cdata();
+      }
     }
 
-    if( tag->hasAttribute( "var" ) )
-      m_name = tag->findAttribute( "var" );
-
-    if( tag->hasAttribute( "label" ) )
-      m_label = tag->findAttribute( "label" );
   }
 
   DataFormField::~DataFormField()
@@ -125,7 +133,7 @@
         break;
     }
 
-    if( ( m_type == FIELD_TYPE_LIST_SINGLE ) || ( m_type == FIELD_TYPE_LIST_MULTI ) )
+    if( m_type == FIELD_TYPE_LIST_SINGLE || m_type == FIELD_TYPE_LIST_MULTI )
     {
       StringMap::const_iterator it = m_options.begin();
       for( ; it != m_options.end(); ++it )
@@ -142,13 +150,15 @@
       else
         new Tag( field, "value", "1" );
     }
-    else if( m_type == FIELD_TYPE_TEXT_MULTI )
+    
+    if( m_type == FIELD_TYPE_TEXT_MULTI || m_type == FIELD_TYPE_LIST_MULTI )
     {
       StringList::const_iterator it = m_values.begin();
       for( ; it != m_values.end() ; ++it )
         new Tag( field, "value", (*it) );
     }
-    else if( !m_value.empty() )
+
+    if( !m_value.empty() )
       new Tag( field, "value", m_value );
 
     return field;
Index: src/rostermanager.cpp
===================================================================
--- src/rostermanager.cpp	(.../0.8)	(revision 1356)
+++ src/rostermanager.cpp	(.../0.8.1-sic)	(revision 1356)
@@ -35,6 +35,7 @@
       if( self )
       {
         RosterItem *i = new RosterItem( m_parent->jid().bare() );
+        i->setSynchronized();
         m_roster[m_parent->jid().bare()] = i;
       }
 
@@ -127,14 +128,14 @@
       if( stanza->show() == PresenceAvailable )
       {
         if( !online )
-          m_rosterListener->itemAvailable( (*(*it).second), stanza->status() );
+          m_rosterListener->itemAvailable( (*(*it).second), stanza->status(), stanza->from() );
         else
           m_rosterListener->presenceUpdated( (*(*it).second), stanza->show(), stanza->status() );
       }
       else if( stanza->show() == PresenceUnavailable )
       {
         (*it).second->removeResource( stanza->from().resource() );
-        m_rosterListener->itemUnavailable( (*(*it).second), stanza->status() );
+        m_rosterListener->itemUnavailable( (*(*it).second), stanza->status(), stanza->from() );
       }
       else
         m_rosterListener->presenceUpdated( (*(*it).second), stanza->show(), stanza->status() );
@@ -379,8 +380,9 @@
             a = true;
           (*it_d).second->setSubscription( sub, a );
           (*it_d).second->setGroups( gl );
+          (*it_d).second->setSynchronized();
 
-          if( m_rosterListener )
+          if( isPush && m_rosterListener )
             m_rosterListener->itemUpdated( jid );
         }
         else
@@ -410,6 +412,7 @@
 
     m_roster[jid]->setSubscription( sub, ask );
     m_roster[jid]->setGroups( groups );
+    m_roster[jid]->setSynchronized();
   }
 
   void RosterManager::setDelimiter( const std::string& delimiter )
Index: src/client.cpp
===================================================================
--- src/client.cpp	(.../0.8)	(revision 1356)
+++ src/client.cpp	(.../0.8.1-sic)	(revision 1356)
@@ -88,6 +88,12 @@
     m_disco->setIdentity( "client", "bot" );
   }
 
+  void Client::setUsername( const std::string &username )
+  {
+    m_jid.setUsername( username );
+    m_doAuth = true;
+  }
+
   bool Client::handleNormalNode( Stanza *stanza )
   {
     if( stanza->name() == "stream:features" )
Index: src/tag.h
===================================================================
--- src/tag.h	(.../0.8)	(revision 1356)
+++ src/tag.h	(.../0.8.1-sic)	(revision 1356)
@@ -143,15 +143,16 @@
       virtual bool hasAttribute( const std::string& name, const std::string& value = "" ) const;
 
       /**
-       * This function finds and returns an element within the child elements of the current tag.
+       * This function finds and returns the @b first element within the child elements of the current tag
+       * that has a matching tag name.
        * @param name The name of the element to search for.
        * @return The found Tag, or NUL.
        */
       virtual Tag* findChild( const std::string& name );
 
       /**
-       * This function finds and returns an element within the child elements of the current tag, that
-       * has a certain attribute with a certain value.
+       * This function finds and returns the @b first element within the child elements of the current tag,
+       * that has a certan name, and a certain attribute with a certain value.
        * @param name The name of the element to search for.
        * @param attr The name of the attribute of the child element.
        * @param value The value of the attribute of the child element.
@@ -168,8 +169,8 @@
        * @param value The value of the attribute of the child element.
        * @return @b True if the given child element exists, @b false otherwise.
        */
-      virtual bool hasChild( const std::string& name,
-                             const std::string& attr = "", const std::string& value = "" ) const;
+      virtual bool hasChild( const std::string& name, const std::string& attr = "",
+                             const std::string& value = "" ) const;
 
       /**
        * This function checks whether the Tag has a child element which posesses a given attribute
Index: src/rosterlistener.h
===================================================================
--- src/rosterlistener.h	(.../0.8)	(revision 1356)
+++ src/rosterlistener.h	(.../0.8.1-sic)	(revision 1356)
@@ -113,19 +113,23 @@
 
       /**
        * This function is called whenever a roster item comes online (is available).
-       * However, it will not be called for status changes form Away (or any other
+       * However, it will not be called for status changes from Away (or any other
        * status which is not Unavailable) to Available.
-       * @param item The changed roster item.
+       * @param item A reference to the changed roster item.
        * @param msg The status change message.
+       * @param from The full JID that became available.
        */
-      virtual void itemAvailable( const RosterItem& item, const std::string& msg ) = 0;
+      virtual void itemAvailable( const RosterItem& item, const std::string& msg,
+                                  const JID& from ) = 0;
 
       /**
        * This function is called whenever a roster item goes offline (is unavailable).
-       * @param item The roster item.
+       * @param item A reference to the changed roster item.
        * @param msg The status change message.
+       * @param from The full JID that became unavailable.
        */
-      virtual void itemUnavailable( const RosterItem& item, const std::string& msg ) = 0;
+      virtual void itemUnavailable( const RosterItem& item, const std::string& msg,
+                                    const JID& from ) = 0;
 
       /**
        * This function is called when an entity wishes to subscribe to this entity's presence.
Index: src/dataform.cpp
===================================================================
--- src/dataform.cpp	(.../0.8)	(revision 1356)
+++ src/dataform.cpp	(.../0.8.1-sic)	(revision 1356)
@@ -26,7 +26,7 @@
   DataForm::DataForm( Tag *tag )
     : m_type( FORM_TYPE_INVALID )
   {
-    if( !tag->hasAttribute( "xmlns", XMLNS_X_DATA ) || tag->name() != "x" )
+    if( !tag || !tag->hasAttribute( "xmlns", XMLNS_X_DATA ) || tag->name() != "x" )
       return;
 
     if( tag->hasAttribute( "type", "form" ) )
Index: src/rosteritem.cpp
===================================================================
--- src/rosteritem.cpp	(.../0.8)	(revision 1356)
+++ src/rosteritem.cpp	(.../0.8.1-sic)	(revision 1356)
@@ -24,6 +24,12 @@
 
   RosterItem::~RosterItem()
   {
+    ResourceMap::iterator it = m_resources.begin();
+    for( ; it != m_resources.end(); ++it )
+    {
+      delete (*it).second;
+      (*it).second = 0;
+    }
   }
 
   void RosterItem::setName( const std::string& name )
Index: src/adhoccommandprovider.h
===================================================================
--- src/adhoccommandprovider.h	(.../0.8)	(revision 1356)
+++ src/adhoccommandprovider.h	(.../0.8.1-sic)	(revision 1356)
@@ -16,6 +16,7 @@
 #define ADHOCCOMMANDPROVIDER_H__
 
 #include "tag.h"
+#include "jid.h"
 
 #include <list>
 #include <map>
@@ -44,8 +45,9 @@
        * handling etc.
        * @param command The name of the command to be executed.
        * @param tag The complete command tag.
+       * @param from The sender of the command request.
        */
-      virtual void handleAdhocCommand( const std::string& command, Tag *tag ) = 0;
+      virtual void handleAdhocCommand( const std::string& command, Tag *tag, const JID& from ) = 0;
 
   };
 
Index: src/privacymanager.cpp
===================================================================
--- src/privacymanager.cpp	(.../0.8)	(revision 1356)
+++ src/privacymanager.cpp	(.../0.8.1-sic)	(revision 1356)
@@ -292,7 +292,7 @@
             PrivacyListHandler::PrivacyList items;
 
             Tag *list = stanza->findChild( "query" )->findChild( "list" );
-            const std::string name = list->name();
+            const std::string name = list->findAttribute( "name" );
             Tag::TagList l = list->children();
             Tag::TagList::iterator it = l.begin();
             for( ; it != l.end(); ++it )
Index: src/registrationhandler.h
===================================================================
--- src/registrationhandler.h	(.../0.8)	(revision 1356)
+++ src/registrationhandler.h	(.../0.8.1-sic)	(revision 1356)
@@ -40,34 +40,37 @@
        */
       enum resultEnum
       {
-        REGISTRATION_SUCCESS = 0,             /*!< The last operation (account registration, account
-                                               * deletion or password change) was successful. */
-        REGISTRATION_NOT_ACCEPTABLE,          /*!< 406: Not all necessary information provided */
-        REGISTRATION_CONFLICT,                /*!< 409: Username alreday exists. */
-        REGISTRATION_NOT_AUTHORIZED,          /*!< Account removal: Unregistered entity waits too long
-                                               * before authentication or performs tasks other than
-                                               * authentication after registration.<br>
-                                               * Password change: The server or service does not consider
-                                               * the channel safe enough to enable a password change. */
-        REGISTRATION_BAD_REQUEST,             /*!< Account removal: The &lt;remove/&gt; element was not the
-                                               * only child element of the &lt;query/&gt; element. Should not
-                                               * happen when only gloox functions are being used.<br>
-                                               * Password change: The password change request does not
-                                               * contain complete information (both &lt;username/&gt; and
-                                               * &lt;password/&gt; are required). */
-        REGISTRATION_FORBIDDEN,               /*!< Account removal: The sender does not have sufficient
-                                               * permissions to cancel the registration. */
-        REGISTRATION_REGISTRATION_REQUIRED,   /*!< Account removal: The entity sending the remove request was
-                                               * not previously registered. */
-        REGISTRATION_UNEXPECTED_REQUEST,      /*!< Account removal: The host is an instant messaging server
-                                               * and the IQ get does not contain a 'from' address because the
-                                               * entity is not registered with the server.<br>
-                                               * Password change: The host is an instant messaging server and
-                                               * the IQ set does not contain a 'from' address because the
-                                               * entity is not registered with the server. */
-        REGISTRATION_NOT_ALLOWED,             /*!< Password change: The server or service does not allow
-                                               * password changes. */
-        UNKNOWN_ERROR                         /**< An unknown error condition occured. */
+        REGISTRATION_SUCCESS = 0,          /*!< The last operation (account registration, account
+                                            * deletion or password change) was successful. */
+        REGISTRATION_NOT_ACCEPTABLE,       /*!< 406: Not all necessary information provided */
+        REGISTRATION_CONFLICT,             /*!< 409: Username alreday exists. */
+        REGISTRATION_NOT_AUTHORIZED,       /*!< Account removal: Unregistered entity waits too long
+                                            * before authentication or performs tasks other than
+                                            * authentication after registration.<br>
+                                            * Password change: The server or service does not consider
+                                            * the channel safe enough to enable a password change. */
+        REGISTRATION_BAD_REQUEST,          /*!< Account removal: The &lt;remove/&gt; element was not
+                                            * the only child element of the &lt;query/&gt; element.
+                                            * Should not happen when only gloox functions are being
+                                            * used.<br>
+                                            * Password change: The password change request does not
+                                            * contain complete information (both &lt;username/&gt; and
+                                            * &lt;password/&gt; are required). */
+        REGISTRATION_FORBIDDEN,            /*!< Account removal: The sender does not have sufficient
+                                            * permissions to cancel the registration. */
+        REGISTRATION_REGISTRATION_REQUIRED,/*!< Account removal: The entity sending the remove
+                                            * request was not previously registered. */
+        REGISTRATION_UNEXPECTED_REQUEST,   /*!< Account removal: The host is an instant messaging
+                                            * server and the IQ get does not contain a 'from'
+                                            * address because the entity is not registered with
+                                            * the server.<br>
+                                            * Password change: The host is an instant messaging
+                                            * server and the IQ set does not contain a 'from'
+                                            * address because the entity is not registered with
+                                            * the server. */
+        REGISTRATION_NOT_ALLOWED,          /*!< Password change: The server or service does not allow
+                                            * password changes. */
+        UNKNOWN_ERROR                      /*!< An unknown error condition occured. */
       };
 
       /**
@@ -76,40 +79,46 @@
       virtual ~RegistrationHandler() {};
 
       /**
-       * Reimplement this function to receive results of the @ref Registration::fetchRegistrationFields()
-       * function.
+       * Reimplement this function to receive results of the
+       * @ref Registration::fetchRegistrationFields() function.
+       * @param from The server or service the registration fields came from.
        * @param fields The OR'ed fields the server requires. From @ref Registration::fieldEnum.
        * @param instructions Any additional information the server sends along.
        */
-      virtual void handleRegistrationFields( int fields, std::string instructions ) = 0;
+      virtual void handleRegistrationFields( const JID& from, int fields,
+                                             std::string instructions ) = 0;
 
       /**
        * This function is called if @ref Registration::createAccount() was called on an authenticated
        * stream and the server lets us know about this.
        */
-      virtual void handleAlreadyRegistered() = 0;
+      virtual void handleAlreadyRegistered( const JID& from ) = 0;
 
       /**
        * This funtion is called to notify about the result of an operation.
+       * @param from The server or service the result came from.
        * @param result The result of the last operation.
        */
-      virtual void handleRegistrationResult( resultEnum result ) = 0;
+      virtual void handleRegistrationResult( const JID& from, resultEnum result ) = 0;
 
       /**
        * This function is called additionally to @ref handleRegistrationFields() if the server
        * supplied a data form together with legacy registration fields.
+       * @param from The server or service the data form came from.
        * @param form The DataForm conataining registration information.
        */
-      virtual void handleDataForm( const DataForm &form ) = 0;
+      virtual void handleDataForm( const JID& from, const DataForm &form ) = 0;
 
       /**
        * This function is called if the server does not offer in-band registration
        * but wants to refer the user to an external URL.
+       * @param from The server or service the referal came from.
        * @param url The external URL where registration is possible (or where more information
        * can be found).
        * @param desc Some descriptive text.
        */
-      virtual void handleOOB( const std::string& url, const std::string& desc ) = 0;
+      virtual void handleOOB( const JID& from, const std::string& url,
+                              const std::string& desc ) = 0;
 
   };
 
Index: src/adhoc.cpp
===================================================================
--- src/adhoc.cpp	(.../0.8)	(revision 1356)
+++ src/adhoc.cpp	(.../0.8.1-sic)	(revision 1356)
@@ -94,7 +94,7 @@
       AdhocCommandProviderMap::const_iterator it = m_adhocCommandProviders.find( node );
       if( !node.empty() && ( it != m_adhocCommandProviders.end() ) )
       {
-        (*it).second->handleAdhocCommand( node, c );
+        (*it).second->handleAdhocCommand( node, c, stanza->from() );
         return true;
       }
     }
Index: src/tests/register_test.cpp
===================================================================
--- src/tests/register_test.cpp	(.../0.8)	(revision 1356)
+++ src/tests/register_test.cpp	(.../0.8.1-sic)	(revision 1356)
@@ -59,7 +59,7 @@
       return true;
     };
 
-    virtual void handleRegistrationFields( int fields, std::string instructions )
+    virtual void handleRegistrationFields( const JID& /*from*/, int fields, std::string instructions )
     {
       printf( "fields: %d\ninstructions: %s\n", fields, instructions.c_str() );
       Registration::fieldStruct vals;
@@ -68,23 +68,23 @@
       m_reg->createAccount( fields, vals );
     };
 
-    virtual void handleRegistrationResult( resultEnum result )
+    virtual void handleRegistrationResult( const JID& /*from*/, resultEnum result )
     {
       printf( "result: %d\n", result );
       j->disconnect();
     };
 
-    virtual void handleAlreadyRegistered()
+    virtual void handleAlreadyRegistered( const JID& /*from*/ )
     {
       printf( "the account already exists.\n" );
     };
 
-    virtual void handleDataForm( const DataForm& /*form*/ )
+    virtual void handleDataForm( const JID& /*from*/, const DataForm& /*form*/ )
     {
       printf( "datForm received\n" );
     };
 
-    virtual void handleOOB( const std::string& url, const std::string& desc )
+    virtual void handleOOB( const JID& /*from*/, const std::string& url, const std::string& desc )
     {
       printf( "OOB registration requested. %s: %s\n", desc.c_str(), url.c_str() );
     }
Index: src/tests/roster_test.cpp
===================================================================
--- src/tests/roster_test.cpp	(.../0.8)	(revision 1356)
+++ src/tests/roster_test.cpp	(.../0.8.1-sic)	(revision 1356)
@@ -21,7 +21,7 @@
     {
       setlocale( LC_ALL, "" );
 
-      JID jid( "hurkhurk@example.org/gloox" );
+      JID jid( "hurkhurk@example.org" );
       j = new Client( jid, "hurkhurks" );
       j->setAutoPresence( true );
       j->setInitialPriority( 3 );
@@ -98,14 +98,16 @@
       printf( "item changed: %s\n", item.jid().c_str() );
     }
 
-    virtual void itemAvailable( const RosterItem& item, const std::string& /*msg*/ )
+    virtual void itemAvailable( const RosterItem& /*item*/, const std::string& /*msg*/,
+                                                        const JID& from )
     {
-      printf( "item online: %s\n", item.jid().c_str() );
+      printf( "item online: %s\n", from.full().c_str() );
     }
 
-    virtual void itemUnavailable( const RosterItem& item, const std::string& /*msg*/ )
+    virtual void itemUnavailable( const RosterItem& /*item*/, const std::string& /*msg*/,
+                                                          const JID& from )
     {
-      printf( "item offline: %s\n", item.jid().c_str() );
+      printf( "item offline: %s\n", from.full().c_str() );
     };
 
     virtual bool subscriptionRequest( const std::string& jid, const std::string& /*msg*/ )
Index: src/tests/adhoc_test.cpp
===================================================================
--- src/tests/adhoc_test.cpp	(.../0.8)	(revision 1356)
+++ src/tests/adhoc_test.cpp	(.../0.8.1-sic)	(revision 1356)
@@ -38,15 +38,15 @@
       delete( j );
     }
 
-    void handleAdhocCommand( const std::string& command, Tag */*tag*/ )
+    void handleAdhocCommand( const std::string& command, Tag */*tag*/, const JID& from )
     {
       if( command == "helloworld" )
-        printf( "Hello World!\n" );
+        printf( "saying Hello World! to %s\n", from.full().c_str() );
       else if( command == "config" )
-        printf( "configuration called\n" );
+        printf( "configuration command called by %s\n", from.full().c_str() );
       else if( command == "shutdown" )
       {
-        printf( "shutting down\n" );
+        printf( "shutting down, called from %s\n", from.full().c_str() );
       }
     }
 
Index: src/client.h
===================================================================
--- src/client.h	(.../0.8)	(revision 1356)
+++ src/client.h	(.../0.8.1-sic)	(revision 1356)
@@ -174,7 +174,7 @@
        * Sets the username to use to connect to the XMPP server.
        * @param username The username to authenticate with.
        */
-      void setUsername( const std::string &username ) { m_jid.setUsername( username ); };
+      void setUsername( const std::string &username );
 
       /**
        * Sets the resource to use to connect to the XMPP server.
@@ -197,7 +197,7 @@
       void setAutoPresence( bool autoPresence ) { m_autoPresence = autoPresence; };
 
       /**
-       * This is a temporary hack to force Non-SASL login. You should not need to use it. 
+       * This is a temporary hack to enforce Non-SASL login. You should not need to use it.
        * @param force Whether to force non-SASL auth. Default @b true.
        * @deprecated
        */
Index: src/gloox.h
===================================================================
--- src/gloox.h	(.../0.8)	(revision 1356)
+++ src/gloox.h	(.../0.8.1-sic)	(revision 1356)
@@ -272,8 +272,9 @@
  *
  * @section filetransfer_sec File Transfer
  *
- * For file transfer there is currently an implementation of JEP-0047 (In-Band Bytestreams). No other
- * file transfer protocols are currently supported. See
+ * For file transfer there is currently an implementation of JEP-0047 (In-Band Bytestreams). However,
+ * this protocol is probably not suited for offering file transfer to end-users. No other file
+ * transfer protocols are currently supported. See
  * @link gloox::InBandBytestreamManager InBandBytestreamManager @endlink for a starting point.
  */
 
@@ -307,6 +308,8 @@
   const std::string XMLNS_CHAT_STATES       = "http://jabber.org/protocol/chatstates";
   const std::string XMLNS_AMP               = "http://jabber.org/protocol/amp";
   const std::string XMLNS_IBB               = "http://jabber.org/protocol/ibb";
+  const std::string XMLNS_CHATNEG           = "http://jabber.org/protocol/chatneg";
+  const std::string XMLNS_XHTML_IM          = "http://jabber.org/protocol/xhtml-im";
   const std::string XMLNS_ROSTER            = "jabber:iq:roster";
   const std::string XMLNS_VERSION           = "jabber:iq:version";
   const std::string XMLNS_REGISTER          = "jabber:iq:register";
@@ -335,7 +338,7 @@
 
   const int XMPP_STREAM_VERSION_MAJOR       = 1;
   const int XMPP_STREAM_VERSION_MINOR       = 0;
-  const std::string GLOOX_VERSION           = "0.8";
+  const std::string GLOOX_VERSION           = "0.8.1";
 
   /**
    * This describes the possible states of a stream.
Index: src/inbandbytestream.h
===================================================================
--- src/inbandbytestream.h	(.../0.8)	(revision 1356)
+++ src/inbandbytestream.h	(.../0.8.1-sic)	(revision 1356)
@@ -74,7 +74,7 @@
        * Lets you retrieve this bytestream's block-size.
        * @return The bytestream's block-size.
        */
-      int blockSize() const { return m_blockSize; };
+      int blockSize() const { return (int)m_blockSize; };
 
       /**
        * Use this function to register an object that will receive any notifications from
Index: src/registration.cpp
===================================================================
--- src/registration.cpp	(.../0.8)	(revision 1356)
+++ src/registration.cpp	(.../0.8.1-sic)	(revision 1356)
@@ -20,8 +20,15 @@
 namespace gloox
 {
 
+  Registration::Registration( ClientBase *parent, const JID& to )
+    : m_parent( parent ), m_to( to ), m_registrationHandler( 0 )
+  {
+    if( m_parent )
+      m_parent->registerIqHandler( this, XMLNS_REGISTER );
+  }
+
   Registration::Registration( ClientBase *parent )
-    : m_parent( parent ), m_registrationHandler( 0 )
+  : m_parent( parent ), m_registrationHandler( 0 )
   {
     if( m_parent )
       m_parent->registerIqHandler( this, XMLNS_REGISTER );
@@ -41,6 +48,8 @@
     std::string id = m_parent->getID();
 
     Tag *iq = new Tag( "iq" );
+    if( !m_to.empty() )
+      iq->addAttribute( "to", m_to.full() );
     iq->addAttribute( "type", "get" );
     iq->addAttribute( "id", id );
     Tag *q = new Tag( iq, "query" );
@@ -58,6 +67,8 @@
     const std::string id = m_parent->getID();
 
     Tag *iq = new Tag( "iq" );
+    if( !m_to.empty() )
+      iq->addAttribute( "to", m_to.full() );
     iq->addAttribute( "id", id );
     iq->addAttribute( "type", "set" );
     Tag *q = new Tag( iq, "query" );
@@ -118,6 +129,8 @@
     const std::string id = m_parent->getID();
 
     Tag *iq = new Tag( "iq" );
+    if( !m_to.empty() )
+      iq->addAttribute( "to", m_to.full() );
     iq->addAttribute( "type", "set" );
     iq->addAttribute( "id", id );
     iq->addAttribute( "from", m_parent->jid().full() );
@@ -129,7 +142,7 @@
     m_parent->send( iq );
   }
 
-  void Registration::changePassword( const std::string& password )
+  void Registration::changePassword( const std::string& username, const std::string& password )
   {
     if( !m_parent || !m_parent->authed() )
       return;
@@ -137,12 +150,13 @@
     const std::string id = m_parent->getID();
 
     Tag *iq = new Tag( "iq" );
+    if( !m_to.empty() )
+      iq->addAttribute( "to", m_to.full() );
     iq->addAttribute( "type", "set" );
     iq->addAttribute( "id", id );
-    iq->addAttribute( "to", m_parent->server() );
     Tag *q = new Tag( iq, "query" );
     q->addAttribute( "xmlns", XMLNS_REGISTER );
-    new Tag( q, "username", m_parent->username() );
+    new Tag( q, "username", username );
     new Tag( q, "password", password );
 
     m_parent->trackID( this, id, CHANGE_PASSWORD );
@@ -169,25 +183,32 @@
         return false;
 
       if( e->hasChild( "conflict" ) || e->hasAttribute( "code", "409" ) )
-        m_registrationHandler->handleRegistrationResult( RegistrationHandler::REGISTRATION_CONFLICT );
+        m_registrationHandler->handleRegistrationResult( stanza->from(),
+            RegistrationHandler::REGISTRATION_CONFLICT );
       else if( e->hasChild( "not-acceptable" ) || e->hasAttribute( "code", "406" ) )
-        m_registrationHandler->handleRegistrationResult( RegistrationHandler::REGISTRATION_NOT_ACCEPTABLE );
+        m_registrationHandler->handleRegistrationResult( stanza->from(),
+            RegistrationHandler::REGISTRATION_NOT_ACCEPTABLE );
       else if( e->hasChild( "bad-request" ) || e->hasAttribute( "code", "400" ) )
-        m_registrationHandler->handleRegistrationResult( RegistrationHandler::REGISTRATION_BAD_REQUEST );
+        m_registrationHandler->handleRegistrationResult( stanza->from(),
+            RegistrationHandler::REGISTRATION_BAD_REQUEST );
       else if( e->hasChild( "forbidden" ) || e->hasAttribute( "code", "403" ) )
-        m_registrationHandler->handleRegistrationResult( RegistrationHandler::REGISTRATION_FORBIDDEN );
+        m_registrationHandler->handleRegistrationResult( stanza->from(),
+            RegistrationHandler::REGISTRATION_FORBIDDEN );
       else if( e->hasChild( "registration-required" ) || e->hasAttribute( "code", "407" ) )
-        m_registrationHandler->handleRegistrationResult(
+        m_registrationHandler->handleRegistrationResult( stanza->from(),
             RegistrationHandler::REGISTRATION_REGISTRATION_REQUIRED );
       else if( e->hasChild( "unexpected-request" ) || e->hasAttribute( "code", "400" ) )
-        m_registrationHandler->handleRegistrationResult(
+        m_registrationHandler->handleRegistrationResult( stanza->from(),
             RegistrationHandler::REGISTRATION_UNEXPECTED_REQUEST );
       else if( e->hasChild( "not-authorized" ) || e->hasAttribute( "code", "401" ) )
-        m_registrationHandler->handleRegistrationResult( RegistrationHandler::REGISTRATION_NOT_AUTHORIZED );
+        m_registrationHandler->handleRegistrationResult( stanza->from(),
+            RegistrationHandler::REGISTRATION_NOT_AUTHORIZED );
       else if( e->hasChild( "not-allowed" ) || e->hasAttribute( "code", "405" ) )
-        m_registrationHandler->handleRegistrationResult( RegistrationHandler::REGISTRATION_NOT_ALLOWED );
+        m_registrationHandler->handleRegistrationResult( stanza->from(),
+            RegistrationHandler::REGISTRATION_NOT_ALLOWED );
       else
-        m_registrationHandler->handleRegistrationResult( RegistrationHandler::UNKNOWN_ERROR );
+        m_registrationHandler->handleRegistrationResult( stanza->from(),
+          RegistrationHandler::UNKNOWN_ERROR );
     }
     return false;
   }
@@ -208,14 +229,14 @@
 
         if( q->hasChild( "registered" ) )
         {
-          m_registrationHandler->handleAlreadyRegistered();
+          m_registrationHandler->handleAlreadyRegistered( stanza->from() );
           break;
         }
 
         if( q->hasChild( "x", "xmlns", XMLNS_X_DATA ) )
         {
           DataForm form( q->findChild( "x", "xmlns", XMLNS_X_DATA ) );
-          m_registrationHandler->handleDataForm( form );
+          m_registrationHandler->handleDataForm( stanza->from(), form );
         }
 
         if( q->hasChild( "x", "xmlns", XMLNS_X_OOB ) )
@@ -229,7 +250,7 @@
           if( x->hasChild( "url" ) )
             url = x->findChild( "url" )->cdata();
 
-          m_registrationHandler->handleOOB( url, desc );
+          m_registrationHandler->handleOOB( stanza->from(), url, desc );
         }
 
         int fields = 0;
@@ -270,20 +291,23 @@
         if( q->hasChild( "instructions" ) )
           instructions = q->findChild( "instructions" )->cdata();
 
-        m_registrationHandler->handleRegistrationFields( fields, instructions );
+        m_registrationHandler->handleRegistrationFields( stanza->from(), fields, instructions );
         break;
       }
 
       case CREATE_ACCOUNT:
-        m_registrationHandler->handleRegistrationResult( RegistrationHandler::REGISTRATION_SUCCESS );
+        m_registrationHandler->handleRegistrationResult( stanza->from(),
+            RegistrationHandler::REGISTRATION_SUCCESS );
         break;
 
       case CHANGE_PASSWORD:
-        m_registrationHandler->handleRegistrationResult( RegistrationHandler::REGISTRATION_SUCCESS );
+        m_registrationHandler->handleRegistrationResult( stanza->from(),
+            RegistrationHandler::REGISTRATION_SUCCESS );
         break;
 
       case REMOVE_ACCOUNT:
-        m_registrationHandler->handleRegistrationResult( RegistrationHandler::REGISTRATION_SUCCESS );
+        m_registrationHandler->handleRegistrationResult( stanza->from(),
+            RegistrationHandler::REGISTRATION_SUCCESS );
         break;
     }
     return false;
Index: src/inbandbytestreammanager.cpp
===================================================================
--- src/inbandbytestreammanager.cpp	(.../0.8)	(revision 1356)
+++ src/inbandbytestreammanager.cpp	(.../0.8.1-sic)	(revision 1356)
@@ -20,7 +20,8 @@
 {
 
   InBandBytestreamManager::InBandBytestreamManager( ClientBase *parent, Disco *disco )
-    : m_parent( parent ), m_inbandBytestreamHandler( 0 ), m_blockSize( 4096 )
+    : m_parent( parent ), m_inbandBytestreamHandler( 0 ), m_syncInbandBytestreams( true ),
+      m_blockSize( 4096 )
   {
     if( m_parent )
       m_parent->registerIqHandler( this, XMLNS_IBB );
@@ -78,30 +79,27 @@
       const std::string sid = o->findAttribute( "sid" );
       ibb->setSid( sid );
 
-      if( !m_inbandBytestreamHandler ||
-           !m_inbandBytestreamHandler->handleIncomingInBandBytestream( stanza->from(), ibb ) )
+      if( !m_inbandBytestreamHandler )
+        rejectInBandBytestream( ibb, stanza->from(), stanza->id() );
+
+      if( !m_syncInbandBytestreams )
       {
-        delete ibb;
-        Tag *iq = new Tag( "iq" );
-        iq->addAttribute( "type", "error" );
-        iq->addAttribute( "to", stanza->from().full() );
-        iq->addAttribute( "id", stanza->id() );
-        Tag *e = new Tag( iq, "error" );
-        e->addAttribute( "code", "501" );
-        e->addAttribute( "type", "cancel" );
-        Tag *f = new Tag( e, "feature-not-implemented" );
-        f->addAttribute( "xmlns", XMLNS_XMPP_STANZAS );
-        m_parent->send( iq );
+        AsyncIBBItem item;
+        item.ibb = ibb;
+        item.from = stanza->from();
+        item.id = stanza->id();
+        m_asyncTrackMap[sid] = item;
       }
-      else
+
+      bool t = m_inbandBytestreamHandler->handleIncomingInBandBytestream( stanza->from(), ibb );
+      if( m_syncInbandBytestreams && t )
       {
-        m_ibbMap[sid] = ibb;
-        Tag *iq = new Tag( "iq" );
-        iq->addAttribute( "type", "result" );
-        iq->addAttribute( "to", stanza->from().full() );
-        iq->addAttribute( "id", stanza->id() );
-        m_parent->send( iq );
+        acceptInBandBytestream( ibb, stanza->from(), stanza->id() );
       }
+      else if( m_syncInbandBytestreams && !t )
+      {
+        rejectInBandBytestream( ibb, stanza->from(), stanza->id() );
+      }
     }
     else if( ( stanza->subtype() == StanzaIqSet ) &&
                ( ( o = stanza->findChild( "close", "xmlns", XMLNS_IBB ) ) != 0 ) &&
@@ -111,6 +109,13 @@
       if( it != m_ibbMap.end() )
       {
         (*it).second->closed();
+
+        Tag *iq = new Tag( "iq" );
+        iq->addAttribute( "type", "result" );
+        iq->addAttribute( "to", stanza->from().full() );
+        iq->addAttribute( "id", stanza->id() );
+
+        m_parent->send( iq );
       }
     }
     else
@@ -121,6 +126,59 @@
     return true;
   }
 
+  void InBandBytestreamManager::acceptInBandBytestream( InBandBytestream *ibb )
+  {
+    if( m_syncInbandBytestreams )
+      return;
+
+    AsyncTrackMap::iterator it = m_asyncTrackMap.find( ibb->sid() );
+    if( it != m_asyncTrackMap.end() )
+    {
+      acceptInBandBytestream( ibb, (*it).second.from, (*it).second.id );
+      m_asyncTrackMap.erase( it );
+    }
+  }
+
+  void InBandBytestreamManager::rejectInBandBytestream( InBandBytestream *ibb )
+  {
+    if( m_syncInbandBytestreams )
+      return;
+
+    AsyncTrackMap::iterator it = m_asyncTrackMap.find( ibb->sid() );
+    if( it != m_asyncTrackMap.end() )
+    {
+      rejectInBandBytestream( ibb, (*it).second.from, (*it).second.id );
+      m_asyncTrackMap.erase( it );
+    }
+  }
+
+  void InBandBytestreamManager::acceptInBandBytestream( InBandBytestream *ibb,
+      const JID& from, const std::string& id )
+  {
+    m_ibbMap[ibb->sid()] = ibb;
+    Tag *iq = new Tag( "iq" );
+    iq->addAttribute( "type", "result" );
+    iq->addAttribute( "to", from.full() );
+    iq->addAttribute( "id", id );
+    m_parent->send( iq );
+  }
+
+  void InBandBytestreamManager::rejectInBandBytestream( InBandBytestream *ibb,
+      const JID& from, const std::string& id )
+  {
+    delete ibb;
+    Tag *iq = new Tag( "iq" );
+    iq->addAttribute( "type", "error" );
+    iq->addAttribute( "to", from.full() );
+    iq->addAttribute( "id", id );
+    Tag *e = new Tag( iq, "error" );
+    e->addAttribute( "code", "501" );
+    e->addAttribute( "type", "cancel" );
+    Tag *f = new Tag( e, "feature-not-implemented" );
+    f->addAttribute( "xmlns", XMLNS_XMPP_STANZAS );
+    m_parent->send( iq );
+  }
+
   bool InBandBytestreamManager::handleIqID( Stanza *stanza, int context )
   {
     switch( context )
@@ -138,8 +196,9 @@
               ibb->setSid( (*it).second.sid );
               ibb->setBlockSize( m_blockSize );
               m_ibbMap[(*it).second.sid] = ibb;
+              InBandBytestreamHandler *t = (*it).second.ibbh;
               m_trackMap.erase( it );
-              (*it).second.ibbh->handleOutgoingInBandBytestream( stanza->from(), ibb );
+              t->handleOutgoingInBandBytestream( stanza->from(), ibb );
               break;
             }
             case StanzaIqError:
@@ -171,9 +230,11 @@
     return false;
   }
 
-  void InBandBytestreamManager::registerInBandBytestreamHandler( InBandBytestreamHandler *ibbh )
+  void InBandBytestreamManager::registerInBandBytestreamHandler( InBandBytestreamHandler *ibbh,
+      bool sync )
   {
     m_inbandBytestreamHandler = ibbh;
+    m_syncInbandBytestreams = sync;
   }
 
   void InBandBytestreamManager::removeInBandBytestreamHandler()
Index: src/Makefile.am
===================================================================
--- src/Makefile.am	(.../0.8)	(revision 1356)
+++ src/Makefile.am	(.../0.8.1-sic)	(revision 1356)
@@ -19,8 +19,8 @@
                         inbandbytestream.cpp inbandbytestreammanager.cpp messagefilter.cpp vcard.cpp \
                         vcardmanager.cpp
 
-libgloox_la_LDFLAGS = -version-info 2:0:0 -no-undefined -no-allow-shlib-undefined
-libgloox_la_LIBADD =
+libgloox_la_LDFLAGS = -version-info 3:0:0 -no-undefined -no-allow-shlib-undefined
+libgloox_la_LIBADD = 
 libgloox_la_CFLAGS = $(CPPFLAGS) $(IKSEMEL_CFLAGS)
 
 libglooxincludedir = $(includedir)/gloox
Index: src/inbandbytestream.cpp
===================================================================
--- src/inbandbytestream.cpp	(.../0.8)	(revision 1356)
+++ src/inbandbytestream.cpp	(.../0.8.1-sic)	(revision 1356)
@@ -128,14 +128,6 @@
 
     if( !m_parent )
       return;
-
-    const std::string id = m_clientbase->getID();
-    Tag *iq = new Tag( "iq" );
-    iq->addAttribute( "type", "result" );
-    iq->addAttribute( "to", m_parent->target().full() );
-    iq->addAttribute( "id", id );
-
-    m_clientbase->send( iq );
   }
 
   void InBandBytestream::close()
Index: configure.ac
===================================================================
--- configure.ac	(.../0.8)	(revision 1356)
+++ configure.ac	(.../0.8.1-sic)	(revision 1356)
@@ -4,7 +4,7 @@
 AC_INIT
 AC_CONFIG_SRCDIR([configure.ac])
 dnl Every other copy of the package version number gets its value from here
-AM_INIT_AUTOMAKE(gloox,0.8)
+AM_INIT_AUTOMAKE(gloox,0.8.1-sic)
 
 dnl create a config.h file (Automake will add -DHAVE_CONFIG_H)
 AM_CONFIG_HEADER(config.h)
@@ -23,6 +23,26 @@
 AC_PROG_RANLIB
 AM_PROG_LIBTOOL
 
+dnl
+dnl extra paths
+dnl
+
+AC_ARG_WITH(extra_include_path, AC_HELP_STRING([--with-extra-include-path],
+                                           [use additional include paths]),
+            extra_include_path=$withval)
+split_includes="`echo $extra_include_path | sed -e 's/:/ /g'`"
+for incpath in $split_includes ; do
+    CPPFLAGS="-I$incpath $CPPFLAGS"
+done
+
+AC_ARG_WITH(extra_library_path, AC_HELP_STRING([--with-extra-library-path],
+                                               [use additional library paths]),
+            extra_library_path=$withval)
+split_libs="`echo $extra_library_path | sed -e 's/:/ /g'`"
+for libpath in $split_libs ; do
+    LDFLAGS="-L$libpath $LDFLAGS"
+done
+
 dnl Checks for libraries.
 
 dnl Iksemel

Property changes on: .
___________________________________________________________________
Name: svn:ignore
   - configure
Makefile.in
config.log
depcomp
config.guess
config.h
config.sub
ltmain.sh
INSTALL
.libs
COPYING
.deps
Makefile
config.status
stamp-h1
config.h.in
libtool
autom4te.cache
missing
aclocal.m4
install-sh
*~
gloox.pc
*.gz
*.bz2


   + configure
Makefile.in
config.log
depcomp
config.guess
config.h
config.sub
ltmain.sh
INSTALL
.libs
COPYING
.deps
Makefile
config.status
stamp-h1
config.h.in
libtool
autom4te.cache
missing
aclocal.m4
install-sh
*~
gloox.pc
gloox-config
*.gz
*.bz2



