realtimenetprots/sipfw/SIP/Server/src/CSipCSServer.cpp
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/Server/src/CSipCSServer.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,187 @@
+// Copyright (c) 2004-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          : CSipCSServer.cpp
+// Part of       : SIPServerCore
+// Version       : SIP/3.0 
+//
+
+
+
+
+#include "sipclientserver.h"
+#include "CSipCSServer.h"
+#include "CSipServerCore.h"
+#include "CSipCSSession.h"
+#include "TSipCSPlatSecPolicy.h"
+
+// -----------------------------------------------------------------------------
+// CSipCSServer::NewL
+// -----------------------------------------------------------------------------
+//
+CSipCSServer* CSipCSServer::NewL(CSipServerCore& aServerCore)
+	{
+    CSipCSServer* self = CSipCSServer::NewLC(aServerCore);
+    CleanupStack::Pop(self);
+    return self;
+	}
+
+// -----------------------------------------------------------------------------
+// CSipCSServer::NewLC
+// -----------------------------------------------------------------------------
+//
+CSipCSServer* CSipCSServer::NewLC(CSipServerCore& aServerCore)
+	{
+	CSipCSServer* self = new(ELeave)CSipCSServer(EPriorityHigh,aServerCore);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return self;
+	}
+
+// -----------------------------------------------------------------------------
+// CSipCSServer::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CSipCSServer::ConstructL()
+	{
+    StartL(KSipServerName);
+	}
+
+// -----------------------------------------------------------------------------
+// CSipCSServer::CSipCSServer
+// -----------------------------------------------------------------------------
+//
+CSipCSServer::CSipCSServer(TInt aPriority, CSipServerCore& aServerCore)
+ : CPolicyServer(aPriority, TSipCSPlatSecPolicy),
+   iServerCore(aServerCore)
+	{
+	iSecurityInfo.SetToCurrentInfo();
+	iSecurityInfo.iCaps.RemoveCapability(ECapabilityProtServ);
+	}
+
+// -----------------------------------------------------------------------------
+// CSipCSServer::~CSipCSServer
+// -----------------------------------------------------------------------------
+//
+CSipCSServer::~CSipCSServer()
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CSipCSServer::NewSessionL
+// -----------------------------------------------------------------------------
+//
+CSession2* CSipCSServer::NewSessionL(const TVersion &aVersion,
+                                     const RMessage2& /*aMessage*/) const
+	{
+	// check we're the right version
+	if (!User::QueryVersionSupported (TVersion (KSipServerMajorVersionNumber,
+                                                KSipServerMinorVersionNumber,
+                                                KSipServerBuildVersionNumber),
+                                                aVersion))
+		{
+		User::Leave(KErrNotSupported);
+		}
+    return CSipCSSession::NewL(iServerCore);
+	}
+
+// -----------------------------------------------------------------------------
+// CSipCSServer::ConnectionStateChangedL
+// -----------------------------------------------------------------------------
+//
+void CSipCSServer::ConnectionStateChangedL(TUint32 aIapId,
+                                           CSIPConnection::TState aState)
+	{
+	// inform all the sessions
+	iSessionIter.SetToFirst();
+    CSipCSSession* session = 0;
+	for (CSession2* s=iSessionIter; s!=0; s=iSessionIter++)
+		{
+		session = static_cast<CSipCSSession*>(s);
+		session->ConnectionStateChangedL (aIapId,aState);
+		}
+	}
+	
+// -----------------------------------------------------------------------------
+// CSipCSServer::FindOwner
+// -----------------------------------------------------------------------------
+//    
+MTransactionOwner* CSipCSServer::FindOwner(TUint32 aIapId, const TUid& aUid)
+	{
+	MTransactionOwner* transactionOwner = NULL;
+	iSessionIter.SetToFirst();
+    CSipCSSession* session = 0;
+	for (CSession2* s=iSessionIter; s!=0 && !transactionOwner; s=iSessionIter++)
+		{
+		session = static_cast<CSipCSSession*>(s);
+		if (session->Uid() == aUid)
+			{
+			transactionOwner = &(session->FindOwner(aIapId));
+			}
+		}
+	return transactionOwner;
+	}	
+
+// -----------------------------------------------------------------------------
+// CSipCSServer::RunError
+// -----------------------------------------------------------------------------
+//
+TInt CSipCSServer::RunError(TInt aError)
+	{
+	if (aError == KErrBadDescriptor)
+		{
+        // A bad descriptor error implies a badly programmed client, 
+        // so panic it; otherwise report the error to the client
+		Message().Panic(KSipCSServerPanic, EBadDescriptor);
+		}
+	else
+		{
+		Message().Complete(aError);
+		}
+	//
+	// The leave will result in an early return from CServer::RunL(), skipping
+	// the call to request another message. So do that now in order to keep the
+	// server running.
+	ReStart();
+	return KErrNone; // handled the error fully
+	}
+
+// -----------------------------------------------------------------------------
+// CSipCSServer::CustomSecurityCheckL
+// -----------------------------------------------------------------------------
+//	
+CPolicyServer::TCustomResult CSipCSServer::CustomSecurityCheckL(
+    const RMessage2& aMsg,
+    TInt& /*aAction*/,
+    TSecurityInfo& /*aMissing*/)
+    {
+    // Profile server is allowed to set opts regardless of its capabilities 
+    const TUint32 KProfileServerUidVal = 0x101F413C;
+    TUid clientUid = aMsg.SecureId();
+        
+    if ( ( aMsg.Function() == ESipItcSetSIPSockOpt || 
+           aMsg.Function() == ESipItcSetSIPSockOptWithDes ) &&
+          clientUid.iUid != KProfileServerUidVal )
+        {
+        TSecurityInfo clientSecurityInfo(aMsg);
+        TCapabilitySet sipServerCaps;
+        sipServerCaps.SetEmpty();
+        sipServerCaps.Union(iSecurityInfo.iCaps);
+        sipServerCaps.RemoveCapability(ECapabilityReadUserData); // Maintain SC
+        if (!clientSecurityInfo.iCaps.HasCapabilities(sipServerCaps))
+            {
+            return CPolicyServer::EFail;
+            }
+        }
+    return CPolicyServer::EPass;
+    }