--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/Client/src/CSIPClient.cpp Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,400 @@
+// Copyright (c) 2007-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 : CSIPClient.cpp
+// Part of : SIPClient
+// Version : SIP/6.0
+//
+
+
+
+#include "sipclient.h"
+#include "RSIP.h"
+#include "CSIPClientReceiver.h"
+#include "sipclientconnection.h"
+
+
+const TInt KSupportedSecurityMechanismsMaxLength = 300;
+const TInt KNegotiatedSecurityMechanismMaxLength = 100;
+const TInt KCredentialsBufExpandSize = 100;
+
+// -----------------------------------------------------------------------------
+// CSIPClient::NewL
+// -----------------------------------------------------------------------------
+//
+CSIPClient* CSIPClient::NewL (const TUid& aUid,
+ MSIPClientObserver& aSIPObserver)
+ {
+ CSIPClient* self = CSIPClient::NewLC (aUid,aSIPObserver);
+ CleanupStack::Pop (self);
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPClient::NewLC
+// -----------------------------------------------------------------------------
+//
+CSIPClient* CSIPClient::NewLC (const TUid& aUid,
+ MSIPClientObserver& aSIPObserver)
+ {
+ CSIPClient* self = new(ELeave)CSIPClient;
+ CleanupStack::PushL (self);
+ self->ConstructL (aUid, aSIPObserver);
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPClient::CSIPClient
+// -----------------------------------------------------------------------------
+//
+CSIPClient::CSIPClient ()
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPClient::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CSIPClient::ConstructL (const TUid& aUid, MSIPClientObserver& aSIPObserver)
+ {
+ iSip = new(ELeave)RSIP;
+ if (aUid.iUid == 0)
+ {
+ // Allowing ProfileAgent to use a zero UID
+ User::LeaveIfError(iSip->Connect());
+ }
+ else
+ {
+ User::LeaveIfError(iSip->Connect(aUid));
+ }
+ iReceiver = new(ELeave)CSIPClientReceiver(*iSip,aSIPObserver);
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPClient::~CSIPClient
+// -----------------------------------------------------------------------------
+//
+CSIPClient::~CSIPClient()
+ {
+ delete iReceiver;
+ if (iSip)
+ {
+ iSip->Close();
+ }
+ delete iSip;
+
+ for (TInt i=0; i < iConnections.Count(); ++i)
+ {
+ iConnections[i]->DetachClient();
+ }
+ iConnections.Close();
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPClient::SupportedSecurityMechanismsL
+// -----------------------------------------------------------------------------
+//
+CDesC8Array* CSIPClient::SupportedSecurityMechanismsL () const
+ {
+ HBufC8* buf = HBufC8::NewLC(KSupportedSecurityMechanismsMaxLength);
+ TPtr8 bufPtr = buf->Des();
+ TIpcArgs args(TIpcArgs::ENothing);
+ args.Set (ESipItcArgAuthenticationMechanism,&bufPtr);
+
+ TInt err = iSip->Send(ESipItcSupportedSecurityMechanisms,args);
+ if (err != KErrNone)
+ {
+ User::Leave(err);
+ }
+ CDesC8ArraySeg* mechanisms = new(ELeave)CDesC8ArraySeg(1);
+ CleanupStack::PushL(mechanisms);
+ if (bufPtr.Length() > 0)
+ {
+ RDesReadStream readStream(bufPtr);
+ readStream.PushL();
+ TUint32 mechanismLength = readStream.ReadUint32L();
+ while (mechanismLength > 0)
+ {
+ HBufC8* mechanism = HBufC8::NewLC (mechanismLength);
+ TPtr8 mechanismPtr(mechanism->Des());
+ readStream.ReadL (mechanismPtr,mechanismLength);
+ mechanisms->AppendL(mechanismPtr);
+ CleanupStack::PopAndDestroy(mechanism);
+ mechanismLength = readStream.ReadUint32L();
+ }
+ readStream.Pop();
+ readStream.Close();
+ }
+ CleanupStack::Pop(mechanisms);
+ CleanupStack::PopAndDestroy(buf);
+ return mechanisms;
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPClient::NegotiatedSecurityMechanismL
+// -----------------------------------------------------------------------------
+//
+HBufC8* CSIPClient::NegotiatedSecurityMechanismL(const TDesC8& aHop)
+ {
+ HBufC8* mechanism = HBufC8::NewLC(KNegotiatedSecurityMechanismMaxLength);
+ TPtr8 mechanismPtr = mechanism->Des();
+ TIpcArgs args(TIpcArgs::ENothing);
+ args.Set (ESipItcArgAuthenticationMechanism,&mechanismPtr);
+ args.Set (ESipItcArgNextHop,&aHop);
+ TInt err = iSip->Send(ESipItcNegotiatedSecurityMechanism,args);
+ if (err != KErrNone)
+ {
+ User::Leave(err);
+ }
+ CleanupStack::Pop(mechanism);
+ if (mechanism->Length() == 0)
+ {
+ delete mechanism;
+ mechanism = NULL;
+ }
+ return mechanism;
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPClient::IsSigCompSupportedL
+// -----------------------------------------------------------------------------
+//
+TBool CSIPClient::IsSigCompSupportedL () const
+ {
+ TIpcArgs args(TIpcArgs::ENothing);
+ TInt err = iSip->Send(ESipItcIsSigCompSupported, args);
+
+ if (!(err == KErrNone || err == KErrNotSupported))
+ {
+ User::Leave(err);
+ }
+ return (err == KErrNone);
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPClient::Connection
+// -----------------------------------------------------------------------------
+//
+CSIPClientConnection* CSIPClient::Connection (TUint32 aIapId) const
+ {
+ TInt index = FindIndex (aIapId);
+ if (index >= 0)
+ {
+ return iConnections[index];
+ }
+ return 0;
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPClient::SetSecurityHandlingL
+// -----------------------------------------------------------------------------
+//
+void CSIPClient::SetSecurityHandlingL(TBool aEnabled)
+ {
+ TIpcArgs args(TIpcArgs::ENothing);
+ args.Set(ESipItcArgSecurityHandling,aEnabled);
+ User::LeaveIfError(iSip->Send(ESipItcSetSecurityHandling,args));
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPClient::SetHttpDigestObserver
+// -----------------------------------------------------------------------------
+//
+TInt CSIPClient::SetHttpDigestObserver(
+ MSIPHttpDigestChallengeObserver& aObserver)
+ {
+ TInt err =
+ SendHttpDigestObserverTypeToServer(ESipRealmHttpDigestObserver);
+
+ if (!err)
+ {
+ iReceiver->SetHttpDigestObserver(aObserver);
+ }
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPClient::SetHttpDigestObserver
+// -----------------------------------------------------------------------------
+//
+TInt CSIPClient::SetHttpDigestObserver(
+ MSIPHttpDigestChallengeObserver2& aObserver)
+ {
+ TInt err =
+ SendHttpDigestObserverTypeToServer(ESipResponseHttpDigestObserver);
+
+ if (!err)
+ {
+ iReceiver->SetHttpDigestObserver(aObserver);
+ }
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPClient::RemoveHttpDigestObserver
+// -----------------------------------------------------------------------------
+//
+void CSIPClient::RemoveHttpDigestObserver()
+ {
+ SendHttpDigestObserverTypeToServer(ESipNoHttpDigestObserver);
+ iReceiver->RemoveHttpDigestObserver();
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPClient::SetCredentialsL
+// -----------------------------------------------------------------------------
+//
+void CSIPClient::SetCredentialsL(TUint32 aRequestId,
+ TUint32 aRefreshId,
+ const TDesC8& aRealm,
+ const TDesC8& aUsername,
+ const TDesC8& aPasswd,
+ const TDesC8& aOutboundProxy)
+ {
+ TIpcArgs args(TIpcArgs::ENothing);
+ args.Set(ESipItcArgRealm, &aRealm);
+
+ TSIPIds ids;
+ ids.iRequestId = aRequestId;
+ ids.iRefreshId = aRefreshId;
+ TPckgBuf<TSIPIds> idsPckg(ids);
+ args.Set(ESipItcArgIds, &idsPckg);
+
+ CBufFlat* credentialsBuf = CBufFlat::NewL(KCredentialsBufExpandSize);
+ CleanupStack::PushL(credentialsBuf);
+ RBufWriteStream writeStream(*credentialsBuf,0);
+ writeStream.PushL();
+ writeStream.WriteUint32L(aUsername.Length());
+ writeStream.WriteL(aUsername);
+ writeStream.WriteUint32L(aPasswd.Length());
+ writeStream.WriteL(aPasswd);
+ TInt outboundProxyLength = aOutboundProxy.Length();
+ writeStream.WriteUint32L(outboundProxyLength);
+ if (outboundProxyLength > 0)
+ {
+ writeStream.WriteL(aOutboundProxy);
+ writeStream.WriteUint32L(0); // end of credentials
+ }
+ writeStream.Pop();
+ writeStream.Close();
+ TPtr8 credentialsPtr(credentialsBuf->Ptr(0));
+ args.Set(ESipItcArgCredentials, &credentialsPtr);
+
+ User::LeaveIfError(iSip->Send(ESipItcSetCredentials,args));
+
+ CleanupStack::PopAndDestroy(credentialsBuf);
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPClient::RemoveCredentials
+// -----------------------------------------------------------------------------
+//
+TInt CSIPClient::RemoveCredentials(const TDesC8& aRealm)
+ {
+ TIpcArgs args(TIpcArgs::ENothing);
+ args.Set(ESipItcArgRealm, &aRealm);
+ return iSip->Send(ESipItcRemoveCredentials,args);
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPClient::IgnoreChallenge
+// -----------------------------------------------------------------------------
+//
+TInt CSIPClient::IgnoreChallenge(TUint32 aRequestId,
+ TUint32 aRefreshId,
+ const TDesC8& aRealm)
+ {
+ TIpcArgs args(TIpcArgs::ENothing);
+ args.Set(ESipItcArgRealm, &aRealm);
+
+ TSIPIds ids;
+ ids.iRequestId = aRequestId;
+ ids.iRefreshId = aRefreshId;
+ TPckgBuf<TSIPIds> idsPckg(ids);
+ args.Set(ESipItcArgIds, &idsPckg);
+
+ return iSip->Send(ESipItcIgnoreChallenge,args);
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPClient::AddL
+// -----------------------------------------------------------------------------
+//
+void CSIPClient::AddL (CSIPClientConnection* aConnection)
+ {
+ __ASSERT_ALWAYS (aConnection, User::Leave(KErrArgument));
+ TInt index = FindIndex (aConnection->IapId());
+ if (index >= 0)
+ {
+ User::Leave (KErrAlreadyExists);
+ }
+ User::LeaveIfError (iConnections.Append(aConnection));
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPClient::Remove
+// -----------------------------------------------------------------------------
+//
+TInt CSIPClient::Remove (const CSIPClientConnection* aConnection)
+ {
+ if (aConnection == 0)
+ {
+ return KErrArgument;
+ }
+ TInt index = FindIndex (aConnection->IapId());
+ if (index >= 0)
+ {
+ iConnections.Remove(index);
+ return KErrNone;
+ }
+ return KErrNotFound;
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPClient::FindIndex
+// -----------------------------------------------------------------------------
+//
+TInt CSIPClient::FindIndex (TUint32 aIapId) const
+ {
+ for (TInt i=0; i < iConnections.Count(); i++)
+ {
+ if (iConnections[i]->IapId() == aIapId)
+ {
+ return i;
+ }
+ }
+ return KErrNotFound;
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPClient::SendHttpDigestObserverTypeToServer
+// -----------------------------------------------------------------------------
+//
+TInt CSIPClient::SendHttpDigestObserverTypeToServer(
+ const TSipHttpDigestObserverType& aObserverType)
+ {
+ TIpcArgs args(TIpcArgs::ENothing);
+ args.Set(ESipItcArgHttpDigestObserverType,aObserverType);
+ return iSip->Send(ESipItcSetHttpDigestObserver,args);
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPClient::SIP
+// -----------------------------------------------------------------------------
+//
+RSIP& CSIPClient::SIP ()
+ {
+ return *iSip;
+ }