This release addresses the following issues:
1. The crash bug fix when receiving file
2. Now the sending is based on MSRP messages, there is no longer file receiving or sending. Client sends data as MSRP was designed.
3. Soma MSRP stack was created so that the client told the correct session-id, Symbian stack generated it by itself. This is not allowed, it was changed so that clients tell the session-id (same as used in SIP INVITE).
4. Unnecessary division of data to chunks removed when there is no need to interrupt sending. The message is sent in as few chunks as possible.
5. Stack can now receive files and chunks with ?unlimited? size. Old stack wrote the incoming data to memory and did not utilize disk space until the end of chunk was reached (large chunks from another client crashed it).
6. Now when writing the incoming data to file, it will take into account the byte-range header values. So, this complies with the RFC4975 requirements that stack must be able to handle chunks that come in any sequence.
7. Some buffering changes to outgoing/incoming data.
8. The outgoing data is now checked that it does not contain the created transaction-id before sending the data.
9. MSRP success reports are now implemented and tested against servers.
10. Progress report system fixed so progress is now visible on client (all the way to 100%).
11. Message Cancel receiving / Cancel sending now corrected and made to work as rfc4975 requires. (termination from sender and error code from receiver when cancelling).
12. Bug correction related to messages received not belonging to any session, old stack implementation did send error response, but after response was written it did give the buffer to client anyway. Now corrected.
/*
* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:
* Name : sipregistrationbinding.h
* Part of : SIP Client
* Interface : SDK API, SIP Client API
* Version : 1.0
*
*/
#ifndef CSIPREGISTRATIONBINDING_H
#define CSIPREGISTRATIONBINDING_H
// INCLUDES
#include "sipregistrationcontext.h"
//CONSTANTS
/** Property to modify the registration behaviour of the SIP stack.
* Property value is of type boolean. When the value is set to false,
* registration will be attempted without expires value.
* Default value for this property is true.
*/
const TUint32 KSIPSendWithExpires = 200;
/** Property to modify the registration behaviour of the SIP stack.
* Property value is of type boolean. When the value is set to true,
* resolved outbound proxy ip of the registration will be used for all
* transactions which uses this registration context(id). The resolved ip is
* updated on every successful registration in that context.
* Default value for this property is false.
*/
const TUint32 KSIPCacheOutboundProxyIP = 201;
// FORWARD DECLARATIONS
class CUri8;
class CSIPToHeader;
class CSIPFromHeader;
class CSIPContactHeader;
class CSIPRouteHeader;
class CSIPMessageElements;
class CSIPConnection;
class CSIPRefresh;
class CSIPClientTransaction;
class CRegBindingImplementation;
// CLASS DECLARATION
/**
* @publishedAll
* @released
*
* Class for managing SIP registration binding.
* Class provides functions for creating and updating SIP registration bindings.
*
* @lib sipclient.lib
*/
class CSIPRegistrationBinding :
public CBase,
public MSIPRegistrationContext
{
public: // Constructors and destructor
/**
* Two-phased constructor.
* @pre aAor != 0 &&
* aContact != 0
* @pre "Expires" parameter in aContact must be >= KSIPMinExpirationValue
* @param aConnection a SIP connection to be used
* @param aAor contains user's address-of-record to register;
* the ownership is transfered
* @param aContact contact(s) to be registered. The "expires" parameter
* indicates how long the client would like the binding to be
* valid.
* "expires" parameter value must be >= KSIPMinExpirationValue;
* the ownership is transfered
* @param aRefresh if set, created binding will be refreshed;
* the ownership is transfered
* @param aOutboundProxy an outbound proxy address;
* the ownership is transfered
* @param aRemoteUri if set, will be used in request-uri construction;
* the ownership is transfered
* @param aFrom From header, the ownership is transferred
* @return New object, ownership is transferred.
* @leave KErrArgument if aAor == 0, aContact == 0 or if "Expires"
* parameter in aContact is less than KSIPMinExpirationValue
*/
IMPORT_C static CSIPRegistrationBinding*
NewL(CSIPConnection& aConnection,
CSIPToHeader* aAor,
CSIPContactHeader* aContact,
CSIPRefresh* aRefresh=0,
CSIPRouteHeader* aOutboundProxy=0,
CUri8* aRemoteUri=0,
CSIPFromHeader* aFrom=0);
/**
* Two-phased constructor.
* @pre aAor != 0 &&
* aContact != 0
* @pre "Expires" parameter in aContact must be >= KSIPMinExpirationValue
* @param aConnection a SIP connection to be used
* @param aAor contains user's address-of-record to register;
* the ownership is transfered
* @param aContact contact to be registered; The "expires" parameter
* indicates how long the client would like the binding to be
* valid.
* "expires" parameter value must be >= KSIPMinExpirationValue;
* the ownership is transfered
* @param aRefresh if set, created binding will be refreshed;
* the ownership is transfered
* @param aOutboundProxy an outbound proxy address;
* the ownership is transfered
* @param aRemoteUri if set, will be used in request-uri construction;
* the ownership is transfered
* @param aFrom From header, the ownership is transferred
* @return New object, ownership is transferred.
* @leave KErrArgument if aAor == 0, aContact == 0 or if "Expires"
* parameter in aContact is less than KSIPMinExpirationValue
*/
IMPORT_C static CSIPRegistrationBinding*
NewLC(CSIPConnection& aConnection,
CSIPToHeader* aAor,
CSIPContactHeader* aContact,
CSIPRefresh* aRefresh=0,
CSIPRouteHeader* aOutboundProxy=0,
CUri8* aRemoteUri=0,
CSIPFromHeader* aFrom=0);
/**
* Destructor
*/
IMPORT_C ~CSIPRegistrationBinding();
public: //From MSIPRegistrationContext:
/**
* Checks if the registration context can be
* used for creating SIP messages/dialogs
* @return ETrue if the registration binding exists; EFalse
* otherwise
*/
IMPORT_C TBool IsContextActive() const;
/**
* Gets the context id
* @return context id
* For internal use only
*/
IMPORT_C TUint32 ContextId() const;
public: // New functions
/**
* Creates SIP REGISTER request, sends it to the given destination.
* Received 2xx response will create at least one registration
* binding.
* @pre Connection().State()==EActive
* @param aElements contains user SIP headers and content; the ownership
* is taken
* @return SIP REGISTER transaction; the ownership is transfered
* @leave KErrSIPMalformedMessage if aElements contains contact or
* expires headers
* @leave KErrSIPInvalidRegistrationState if already registered or
* registering is in progress or deregistering is in progress.
* @capability NetworkServices
*/
IMPORT_C CSIPClientTransaction*
RegisterL(CSIPMessageElements* aElements=0);
/**
* Creates SIP (de)REGISTER request, sends it to the given destination.
* This function will remove registration binding.
* Any SIP response (2xx - 6xx) to this request removes the binding.
* Note that deregistration can be done then the 2xx is received to the
* initial REGISTER transaction and there is no on-going registration
* updates.
* @pre Connection().State()==EActive
* @pre IsContextActive()==ETrue
* @param aElements contains user SIP headers and content; the ownership
* is transfered. If set, user SIP headers must not contain any
* Contact-header nor Expires-header
* @return SIP REGISTER transaction; the ownership is transfered
* @leave KErrSIPInvalidRegistrationState if IsContextActive()==EFalse
* @capability NetworkServices
*/
IMPORT_C CSIPClientTransaction*
DeregisterL(CSIPMessageElements* aElements=0);
/**
* Updates the registration binding. Note that update can be done
* then the 2xx is received to the REGISTER transaction that relates
* to the initial registration or to update.
* @pre aElements!=0
* @pre Connection().State()==EActive
* @pre IsContextActive()==ETrue
* @param aElements contains user SIP header and content, must not
* contain any Contact-header nor Expires-header;
* the ownership is transferred.
* @return SIP REGISTER transaction; the ownership is transfered
* @leave KErrArgument if aElements == NULL
* @leave KErrSIPInvalidRegistrationState if IsContextActive()==EFalse
* @capability NetworkServices
*/
IMPORT_C CSIPClientTransaction* UpdateL(CSIPMessageElements* aElements);
/**
* Updates the regisration binding. Note that update can be done
* then the 2xx is received to the REGISTER transaction that relates
* to the initial registration or to update.
* @pre aExpirationValue >= KSIPMinExpirationValue
* @pre Connection().State()==EActive
* @pre IsContextActive()==ETrue
* @param aExpirationValue a new expiration value in seconds
* @param aElements contains user SIP headers and content; must not
* contain any Contact-header nor Expires-header;
* the ownership is transferred.
* @return SIP REGISTER transaction; the ownership is transfered
* @leave KErrSIPInvalidRegistrationState if IsContextActive()==EFalse
* @capability NetworkServices
*/
IMPORT_C CSIPClientTransaction*
UpdateL(TUint aExpirationValue, CSIPMessageElements* aElements=0);
/**
* Gets the SIP connection used for the registration.
* @return SIP connection used for the registration, or 0-pointer if the
* connection has been deleted. Ownership is not transferred.
*/
IMPORT_C CSIPConnection* Connection();
/**
* Gets the SIP connection used for the registration.
* @return SIP connection used for the registration, or 0-pointer if the
* connection has been deleted. Ownership is not transferred.
*/
IMPORT_C const CSIPConnection* Connection() const;
/**
* Sets/resets outbound proxy.
* If a 0-pointer is given the outbound proxy will be reset.
* @param aOutboundProxy an outbound proxy. Ownership is transferred.
* @leave KErrSIPResourceNotAvailable if a required SIP Client API
* object has been deleted
*/
IMPORT_C void SetOutboundProxyL(CSIPRouteHeader* aOutboundProxy);
/**
* Gets the address-of-record (AOR) used for creating binding
* @return address-of-record (AOR)
*/
IMPORT_C const CSIPToHeader& Aor() const;
/**
* Gets Contact header associated with the registration binding
* @return Contact header
*/
IMPORT_C const CSIPContactHeader& ContactHeader() const;
/**
* Gets Contact header associated with the registration binding
* @return Contact header
*/
IMPORT_C CSIPContactHeader& ContactHeader();
/**
* Gets used outbound proxy
* @return outbound proxy or a 0-pointer if not set. Ownership is not
* transferred.
*/
IMPORT_C const CSIPRouteHeader* OutboundProxy() const;
/**
* Gets associated refresh in case the user has requested the refresh of
* the registration. Note that client cannot use update or terminate
* functions defined in the CSIPRefresh class.
* @return Associated refresh or a 0-pointer if the user has not
* requested a refresh of registration binding. Ownership is not
* transferred.
*/
IMPORT_C const CSIPRefresh* SIPRefresh() const;
/**
* Gets associated refresh in case the user has requested the refresh of
* the registration. Note that client cannot use update or terminate
* functions defined in the CSIPRefresh class.
* @return Associated refresh or a 0-pointer if the user has not
* requested a refresh of registration binding. Ownership is not
* transferred.
*/
IMPORT_C CSIPRefresh* SIPRefresh();
/**
* Compares this object to another object
* @param aRegistration CSIPRegistrationBinding object to compare
* @return ETrue if the objects are equal, otherwise EFalse
*/
IMPORT_C TBool
operator==(const CSIPRegistrationBinding& aRegistration) const;
/**
* Gets the registered Contact-header received in the 200 OK response.
* @return Contact header, or NULL if IsContextActive() is EFalse.
* Ownership is not transferred.
*/
IMPORT_C const CSIPContactHeader* RegisteredContact() const;
/**
* Sets/resets properties.
* @param aProperty. Property name
* @param aValue. Property value
* @return KErrSIPInvalidRegistrationState if IsContextActive() is ETrue
* @return KErrNotFound if property is not found, KErrNone otherwise
*/
IMPORT_C TInt SetProperty(TUint32 aProperty,TBool aValue);
public: // New functions, for internal use
/**
* Returns the implementation instance.
*
* @return CRegBindingImplementation
*/
CRegBindingImplementation& Implementation();
private: // Constructors
CSIPRegistrationBinding();
void ConstructL(CSIPConnection& aConnection,
CSIPToHeader* aAor,
CSIPContactHeader* aContacts,
CSIPRefresh* aRefresh,
CSIPRouteHeader* aOutboundProxy,
CUri8* aRemoteUri,
CSIPFromHeader* aFrom);
private: // Data
CRegBindingImplementation* iImplementation;
private: // For testing purposes
#ifdef CPPUNIT_TEST
friend class CSIP_Test;
friend class CSIPRegistrationBinding_Test;
friend class CSIPInviteDialogAssoc_Test;
friend class CSIPSubscribeDialogAssoc_Test;
friend class CSIPReferDialogAssoc_Test;
#endif
void __DbgTestInvariant() const;
};
#endif