voipplugins/sipmxresolver/inc/sipmxresolver.h
branchRCL_3
changeset 22 d38647835c2e
parent 0 a4daefaec16c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/voipplugins/sipmxresolver/inc/sipmxresolver.h	Wed Sep 01 12:29:57 2010 +0100
@@ -0,0 +1,294 @@
+/*
+* Copyright (c) 2007-2008 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:  header file for sipmxresolver
+*
+*/
+
+#ifndef CSIPMXRESOLVER_H
+#define CSIPMXRESOLVER_H
+
+//  INCLUDES
+#include <apgcli.h>
+#include <e32base.h>
+#include <implementationproxy.h>
+#include <sipresolvedclient2.h>
+#include "sipmxresolverdebug.h"
+
+// FORWARD DECLARATIONS
+class CSdpDocument;
+class CSdpMediaField;
+class CMusManager;
+
+/**
+*  SIP MX Resolver 
+*  
+*  SIP MX Resolver implements CSIPResolvedClient2 ECOM API.
+*  It aids SIP Client Resolver component to route the incoming invites
+*  either to Multimedia Sharing / VoIP client according to
+*  request headers and content. It also takes relevant phone state
+*  variables into account when resolving.
+*  
+*  @lib sipmxresolver
+*  @since Series 60 3.2
+*/
+class CSipMXResolver : public CSIPResolvedClient2
+    {
+public: // Constructors and destructor
+	
+	/**
+	* Two-phased constructor.
+    */
+    static CSipMXResolver* NewL();
+    
+    /**
+    * Destructor.
+    */
+    virtual ~CSipMXResolver();
+
+
+public: // From CSIPResolvedClient2
+
+	/**
+    * Matches the Accept-Contact-headers
+    * to the client(s) represented by this plug-in.
+    * This function is called for an incoming SIP request
+    * if it contains Accept-Contact-header(s).
+    * 
+    * @param aMethod the method of the SIP request
+    * @param aRequestUri the request-URI of the SIP request
+    * @param aHeaders all the headers in the SIP request
+    * @param aContent SIP request body; 
+    *        zero-length descriptor if not present
+    * @param aContentType the content-type of the SIP request. 
+	*        Zero-pointer if body is not present.
+	* @param aClientUid indicates client's UID for 
+	*        SIP e.g. the one passed as a parameter to CSIP::NewL().
+	* @return ETrue, if the Accept-Contact-headers match to the client
+	*         represented by this plug-in, otherwise EFalse. 
+	*/
+	TBool MatchAcceptContactsL(
+            RStringF aMethod,
+            const CUri8& aRequestUri,
+            const RPointerArray<CSIPHeaderBase>& aHeaders,
+            const TDesC8& aContent,
+            const CSIPContentTypeHeader* aContentType,
+            TUid& aClientUid );
+	
+    /**
+    * Matches the Event-header to the client(s) represented by this plug-in.
+    * This function is called for an incoming SIP request, 
+    * if it contains an Event-header and 
+    * MatchAcceptContactsL returned EFalse.
+    * 
+    * @param aMethod the method of the SIP request
+	* @param aRequestUri the request-URI of the SIP request
+	* @param aHeaders all the headers in the SIP request
+	* @param aContent SIP request body; 
+	*        zero-length descriptor if not present
+	* @param aContentType the content-type of the SIP request. 
+	*        Zero-pointer if body is not present.
+	* @param aClientUid indicates client's UID for 
+	*        SIP e.g. the one passed as a parameter to CSIP::NewL().
+	* @return ETrue, if the Event-header matches to the client
+	*         represented by this plug-in, otherwise EFalse. 
+	*/
+	TBool MatchEventL(
+            RStringF aMethod,
+            const CUri8& aRequestUri,
+            const RPointerArray<CSIPHeaderBase>& aHeaders,
+            const TDesC8& aContent,
+            const CSIPContentTypeHeader* aContentType,
+            TUid& aClientUid );
+	
+	/**
+    * Matches the whole SIP request to the client(s)
+	* represented by this plug-in.
+	* This function is called if the SIP request does not contain
+	* Accept- or Event-headers or
+	* MatchAcceptContactsL and MatchEventL returned EFalse.
+	* 
+	* @param aMethod the method of the SIP request
+	* @param aRequestUri the request-URI of the SIP request
+	* @param aHeaders all the headers in the SIP request
+	* @param aContent SIP request body; 
+	*        zero-length descriptor if not present
+	* @param aContentType the content-type of the SIP request. 
+	*        Zero-pointer if body is not present.
+	* @param aClientUid indicates client's UID for 
+	*        SIP e.g. the one passed as a parameter to CSIP::NewL().
+	* @return ETrue, if the request can be handled by the client
+	*         represented by this plug-in, otherwise EFalse. 
+	*/
+	TBool MatchRequestL(
+            RStringF aMethod,
+            const CUri8& aRequestUri,
+            const RPointerArray<CSIPHeaderBase>& aHeaders,
+            const TDesC8& aContent,
+            const CSIPContentTypeHeader* aContentType,
+            TUid& aClientUid );
+	
+	/**
+	* Indicates whether the plug-in implements CSIPResolvedClient2::ConnectL
+	* and by calling CSIPResolvedClient2::ConnectL 
+	* SIP stack is able to force the client to connect to SIP stack.
+	* 
+	* @return ETrue, if the plug-in supports
+	*         CSIPResolvedClient2::ConnectL, otherwise EFalse.
+	*/
+	TBool ConnectSupported();
+	
+	/**
+	* Requests the client to connect to SIP with resolved
+	* UID in case there's no connection with resolved channel UID.
+	* 
+	* @param aClientUid previously resolved channel UID
+	* @leave KErrNoMemory if out of memory
+	* @leave KErrNotFound in case non-existing channel UID was provided
+	*/
+	void ConnectL( const TUid& aClientUid );
+	
+	/**
+	* Cancels a ConnectL request for a client.
+	* Is called when for example a CANCEL for an INVITE is received
+	* before the client connects to SIP stack.
+	* 
+	* @param aClientUid a UID for which ConnectL was previously called
+	*/
+	void CancelConnect( const TUid& aClientUid );
+	
+	/**
+	* Gets all the SIP message content types supported by the client.
+	* 
+	* @return 0..n SIP Content-Type-headers.
+	*         The ownership of the headers is transferred.
+	*/
+	RPointerArray<CSIPContentTypeHeader> SupportedContentTypesL();
+	
+	/**
+	* Gets all the SDP media-fields supported by the client.
+	* 
+	* @return 0..n SDP media-fields describing the client's media support.
+	*         The ownership of the media-fields is transferred.
+	*/
+	RPointerArray<CSdpMediaField> SupportedSdpMediasL();
+	
+	/**
+    * Adds client specific SIP-headers for the 200 OK for OPTIONS.
+	* Each plug-in must check that the header to be added
+	* is not yet in the array. For example when adding header
+	* "Allow: INVITE" the client must check that
+	* the header is not already present in the array.
+	* 
+	* @param aHeaders headers to be added to 200 OK for OPTIONS.
+	*        The ownership of the added headers is transferred to the caller.
+	*/
+	void AddClientSpecificHeadersForOptionsResponseL(
+            RPointerArray<CSIPHeaderBase>& aHeaders );
+
+
+private: // Constructors
+
+	/**
+    * C++ default constructor.
+	*/
+	CSipMXResolver();
+	
+	/**
+	* By default Symbian 2nd phase constructor is private.
+	*/
+	void ConstructL();
+
+
+private: // New functions
+
+	/**
+	* Checks given header array for accept-contact (AC) headers and
+	* returns ETrue if there is an AC header and it contains
+	* given feature tag.
+	* 
+	* @param aHeaders Headers from request to check
+	* @param aTag Feature specific tag to check AC header for
+	* @ret ETrue if the AC header contain the given feature tag
+	*/
+	TBool CheckForACHeaderTagL(
+            const RPointerArray<CSIPHeaderBase>& aHeaders,
+            const TDesC8& aTag ) const;
+	
+	/**
+	* Checks a SDP document for specified media type lines
+	* 
+	* @param aSpdDoc pointer to sdp document to check for medias
+	* @param aMediaType specifies the media type to check for
+	* @return ETrue if aSpdDoc contains m lines with
+	*         given media type.
+	*/
+	TBool CheckForMedia(
+            CSdpDocument* aSdpDoc,
+            const RStringF& aMediaType ) const;
+
+	/**
+	* Checks given sdp media fields array for VS specific attributes
+	* 
+	* @aFields array of media fields to check
+	* @return ETrue if the given media fields contain
+	*         VS specific attributes
+	*/
+	TBool CheckForVSAttributes(
+            RPointerArray<CSdpMediaField>& aFields ) const;
+	
+	/**
+	* Checks if a CS call is ongoing. This information is
+	* used in the resolving logic.
+	* 
+	* @return ETrue if there is an active CS call
+	*/
+	TBool IsCSCallActive() const;
+	
+	/**
+	* Resolves the Uid to return in VS cases based on request method
+	* 
+	* @param aMethod SIP request method
+	* @return Uid that corresponds to the given method. KNullUid if no match.
+	*/
+	TUid ResolveVSUidL( const RStringF& aMethod );
+	
+	/**
+	* Resolves the Uid of CCP plugin if VoIP is recogniced
+	* 
+	* @param aUid Resolved UID
+	* @param aRequestUri URI received in request
+	*/
+	void ResolveCPPluginUidL( TUid& aUid, const CUri8& aRequestUri );
+
+
+private: // Data
+        
+	///own: VoIP availability status
+	TBool iVoIPEnabled;
+	///own: Multimedia Sharing client for Uid resolving
+	CMusManager* iMuSManager;
+	///own: RStringF handles to video/audio media strings from SIPStrings
+	RStringF iVideoType;
+	RStringF iAudioType;
+	///own: String pool closing control; if ETrue, pool is closed in dtor
+	TBool iCloseStringPool;
+	
+	SIPMXR_TEST( UT_CSipMXResolver ) // for unit tests
+	
+    };
+
+#endif  // CSIPMXRESOLVER_H   
+            
+// End of File
+