realtimenetprots/sipfw/SampleApp/resolverplugin/Src/SIPExResolverPlugin.cpp
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SampleApp/resolverplugin/Src/SIPExResolverPlugin.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,151 @@
+// Copyright (c) 2005-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:
+//
+
+
+
+#include "SIPExResolverPlugin.h"
+
+#include <apacmdln.h>
+
+// SIPEx capabilities - could be also defined in resource of this plugin
+// but then length of capablities text is in resource file limited to 
+// 255 characters. However, defining capabilities in resource file's opaque_data 
+// field is more efficient way.
+_LIT8(KCapabilities,
+"<SIP_CLIENT ALLOW_STARTING=\"YES\">\
+<SIP_HEADERS>\
+<ACCEPT value=\"application/sdp\"/>\
+<ACCEPT value=\"SIPEx/InstantMessage\"/>\
+</SIP_HEADERS>\
+<SDP_LINES>\
+<LINE name=\"m\" value=\"application 0 TCP SIPEx\"/>\
+</SDP_LINES>\
+</SIP_CLIENT>");
+
+// -----------------------------------------------------------------------------
+// CTTCNResolverPlugin1::NewL
+// -----------------------------------------------------------------------------
+//
+CSIPExResolverPlugin* CSIPExResolverPlugin::NewL()
+	{
+	CSIPExResolverPlugin* self = new ( ELeave ) CSIPExResolverPlugin;
+	CleanupStack::PushL( self );
+	self->ConstructL();
+	CleanupStack::Pop( self );
+	return self;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPExResolverPlugin::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CSIPExResolverPlugin::ConstructL()
+	{
+	const TUid KMyImplementationUid = { KSIPExResolverPluginUID };
+
+	RImplInfoPtrArray infoArray;
+	REComSession::ListImplementationsL( KSIPResolvedClientIFUid, infoArray );
+	CleanupStack::PushL( TCleanupItem( ResetAndDestroy, &infoArray ) );
+
+	TBool found = EFalse;
+	for ( TInt i=0; !found && i < infoArray.Count(); i++ )
+		{
+		CImplementationInformation* info = infoArray[ i ];
+		if ( info->ImplementationUid() == KMyImplementationUid )
+			{
+			TLex8 lex( info->DataType() );
+			TUint value( 0 );
+			User::LeaveIfError( lex.Val( value, EHex ) );
+		    iApplicationUID.iUid = value;
+			found = ETrue;
+			}
+		}
+
+	CleanupStack::PopAndDestroy( 1 ); // infoArray
+
+	if ( !found )
+		{
+		User::Leave( KErrNotFound );
+		}
+		
+	User::LeaveIfError( iApaSession.Connect() );
+	User::LeaveIfError( iApaSession.GetAppInfo( iAppInfo, iApplicationUID ) );		
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPExResolverPlugin::~CSIPExResolverPlugin
+// -----------------------------------------------------------------------------
+//
+CSIPExResolverPlugin::~CSIPExResolverPlugin()
+	{
+	iApaSession.Close();
+	}
+	
+// -----------------------------------------------------------------------------
+// CSIPExResolverPlugin::ChannelL
+// -----------------------------------------------------------------------------
+//	
+TUid CSIPExResolverPlugin::ChannelL( RStringF /*aMethod*/,
+    const TDesC8& /*aRequestUri*/,
+    const RPointerArray<CSIPHeaderBase>& /*aHeaders*/,
+    const TDesC8& /*aContent*/,
+    const CSIPContentTypeHeader* /*aContentType*/)
+    {
+    return iApplicationUID;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CSIPExResolverPlugin::ConnectL
+// -----------------------------------------------------------------------------
+//
+void CSIPExResolverPlugin::ConnectL( TUid aUid )
+	{
+	// Launch app based on uid passed from SIP stack
+	//
+	TApaAppInfo appInfo;
+	User::LeaveIfError( iApaSession.GetAppInfo( appInfo, aUid ) );
+	CApaCommandLine* cmdLine = CApaCommandLine::NewLC();
+#ifdef EKA2
+	cmdLine->SetExecutableNameL( appInfo.iFullName );
+#else
+	cmdLine->SetLibraryNameL( appInfo.iFullName );
+#endif
+	User::LeaveIfError( iApaSession.StartApp( *cmdLine ) );
+	CleanupStack::PopAndDestroy( cmdLine ); 
+	}
+	
+// -----------------------------------------------------------------------------
+// CTTCNResolverPlugin1::Capabilities
+// -----------------------------------------------------------------------------
+//
+const TDesC8& CSIPExResolverPlugin::Capabilities()
+    {
+    return KCapabilities;
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPExResolverPlugin::ResetAndDestroy
+// -----------------------------------------------------------------------------
+//
+void CSIPExResolverPlugin::ResetAndDestroy( TAny* anArray )
+	{
+    RImplInfoPtrArray* array = reinterpret_cast<RImplInfoPtrArray*>( anArray );
+    if (array)
+        {
+        array->ResetAndDestroy();
+        }
+	}
+