genericopenlibs/openenvcore/backend/src/corebackend/fdtransfer_srv.cpp
changeset 0 e4d67989cc36
child 44 97b0fb8a2cc2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/genericopenlibs/openenvcore/backend/src/corebackend/fdtransfer_srv.cpp	Tue Feb 02 02:01:42 2010 +0200
@@ -0,0 +1,306 @@
+// 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:
+// file descriptor transfer server - server implementation
+// 
+//
+
+#include "fdtransfer_srv.h"
+#include "sysif.h"
+#include "fdesc.h"
+
+// -------------------------------------------------------------------------------
+// CShutdown::ConstructL
+// -------------------------------------------------------------------------------
+inline void CShutdown::ConstructL()
+	{
+	CTimer::ConstructL();
+	}
+
+// -------------------------------------------------------------------------------
+// CShutdown::Start
+// Starts the timer for the specified time given
+// -------------------------------------------------------------------------------
+inline void CShutdown::Start()
+	{
+	CActiveScheduler::Add(this);
+	After(KFDTransferServerShutdownDelay);
+	}
+
+// -------------------------------------------------------------------------------
+// CShutdown::RunL
+// Initiate server exit when timer expires
+// -------------------------------------------------------------------------------
+inline void CShutdown::RunL()
+    {
+    CActiveScheduler::Stop();
+    }
+    
+
+
+	
+// -------------------------------------------------------------------------------
+// CFileDesTransferSession::CreateL
+// 2nd phase construction for sessions. Invoked by the CServer2 framework
+// -------------------------------------------------------------------------------
+inline void CFileDesTransferSession::CreateL()
+    {
+    Server().AddSession();
+    }
+
+
+// -------------------------------------------------------------------------------
+// CFileDesTransferSession::ServiceL
+// Handle a client request. Leaves are handled by the ServiceError method.
+// -------------------------------------------------------------------------------
+void CFileDesTransferSession::ServiceL(const RMessage2& aMsg)
+    {
+    switch (aMsg.Function())
+        {
+    case ETransferFile:
+    	{
+    	GetfilesFromClient(aMsg);
+    	break;
+    	}
+    case ETransferPipe:
+        {
+        GetPipesFromClient(aMsg);
+    	break;    	
+        }
+    default:
+    	{
+    	#ifdef _DEBUG
+    	RDebug::Printf("CFileDesTransferSession: Illegal message received");
+    	#endif
+        break;	//_DEBUG
+    	}
+       	
+        }
+    }
+
+// -------------------------------------------------------------------------------
+// CFileDesTransferSession::GetPipesFromClient
+// Inherits pipes from the client.  
+// -------------------------------------------------------------------------------
+void CFileDesTransferSession::GetPipesFromClient(const RMessage2& aMsg) const
+{
+	CFileTable& ftable = const_cast<CFileTable&>(Backend()->FileTable());
+	TInt indx = aMsg.Int0();
+	RPipe pipe;
+	TInt err = pipe.Open(aMsg, 1);
+	
+	if (err == KErrNone)
+	{
+		TUint16 mode = 0;
+		if(aMsg.Int2()& O_NONBLOCK)
+			mode |= O_NONBLOCK;
+	    
+		if(indx > (ftable.iFids.Count()-1))
+		{
+			TRAP(err,ftable.ExpandFTableL(indx+1));
+		}
+		if(KErrNone == err)
+			err = ftable.CreatePipeDesc(indx,pipe,mode);
+		if (err != KErrNone)
+		{
+			pipe.Close();
+		}
+		
+	}
+	aMsg.Complete(KErrNone);
+}
+
+// -------------------------------------------------------------------------------
+// CFileDesTransferSession::GetfilesFromClient
+// Inherits normal files the client.  
+// -------------------------------------------------------------------------------
+void CFileDesTransferSession::GetfilesFromClient(const RMessage2& aMsg) const
+{
+
+	CFileTable& ftable = const_cast<CFileTable&>((Backend()->FileTable()));
+	TInt indx = aMsg.Int0();
+	CFileDesc* fdesc = (CFileDesc*)ftable.iPrivateHeap->AllocZ(sizeof(CFileDesc));
+	if (!fdesc)
+	{
+	     aMsg.Complete(KErrNone);
+	     return;				
+	}
+	fdesc = new (fdesc) CFileDesc;
+	
+#if defined(SYMBIAN_OE_LARGE_FILE_SUPPORT) && !defined(SYMBIAN_OE_NO_LFS)
+	//The integer width is bigger for 64 bit sizes
+	TBuf<140> params;
+#else		
+	TBuf<60> params;
+#endif /* SYMBIAN_OE_LARGE_FILE_SUPPORT && !SYMBIAN_OE_NO_LFS */
+	
+	aMsg.Read(1,params);
+	TInt err = (fdesc->FileHandle()).AdoptFromClient(aMsg,2,3);
+	if(indx > (ftable.iFids.Count()-1))
+	{
+		TRAP(err,ftable.ExpandFTableL(indx+1));
+	}
+	if (err == KErrNone)
+	{
+		fdesc->SetState(params);
+		err = fdesc->CreateLock();
+	}
+	if(err == KErrNone)
+		{
+		err = fdesc->Alloc();
+		}
+	if(err == KErrNone)
+	{
+	   ftable.Attach(indx, fdesc);
+    
+	}
+	else
+	{
+		delete fdesc;
+		(fdesc->FileHandle()).Close();
+	}
+	aMsg.Complete(KErrNone);  
+	return ;
+}
+
+// -------------------------------------------------------------------------------
+// CFileDesTransferSession::ServiceError
+// Handle an error from CFileTransferSession::ServiceL().
+// -------------------------------------------------------------------------------
+void CFileDesTransferSession::ServiceError(const RMessage2& aMsg, TInt aError)
+    {
+    CSession2::ServiceError(aMsg, aError);
+    }
+
+// -------------------------------------------------------------------------------
+// CFileDesTransferSession::Server
+// Obtain a reference to the server
+// -------------------------------------------------------------------------------
+inline CFileDesTransferServer& CFileDesTransferSession::Server()
+    {
+	return *(static_cast<CFileDesTransferServer*>(const_cast<CServer2*>(CSession2::Server())));
+    }
+    
+// -------------------------------------------------------------------------------
+// CFileDesTransferSession::~CFileDesTransferSession
+// This session is destroyed. Gone forever.
+// -------------------------------------------------------------------------------
+CFileDesTransferSession::~CFileDesTransferSession()
+    {
+    Server().DropSession();
+    }
+
+
+// -------------------------------------------------------------------------------
+// CFileDesTransferServer::NewLC
+// Server constructor
+// -------------------------------------------------------------------------------
+CFileDesTransferServer* CFileDesTransferServer::NewLC(RSemaphore& sem)
+	{
+	CFileDesTransferServer* pServer = new(ELeave) CFileDesTransferServer;
+	CleanupStack::PushL(pServer);
+	pServer->iSem = sem;
+	pServer->ConstructL();
+	// Leave pServer on the cleanup stack
+	return pServer;
+	}
+
+
+// -------------------------------------------------------------------------------
+// CFileDesTransferServer::ConstructL
+// Second phase construction. Create the shutdown timer object and the semaphore
+// -------------------------------------------------------------------------------
+void CFileDesTransferServer::ConstructL()
+    {
+    iShutdown = new(ELeave) CShutdown;
+    CleanupStack::PushL(iShutdown);
+    iShutdown->ConstructL();
+	CleanupStack::Pop();
+    }
+
+// -------------------------------------------------------------------------------
+// CFileDesTransferServer::AddToScheduler
+// Add both the server and the shutdown timer objects to the active scheduler
+// -------------------------------------------------------------------------------
+TInt CFileDesTransferServer::AddToScheduler(const TDesC& aName)
+	{
+	iShutdown->Start();
+	return CServer2::Start(aName);
+	}
+
+// -------------------------------------------------------------------------------
+// CFileDesTransferServer::RemoveFromScheduler
+// Remove both the server and the shutdown timer objects from the active scheduler
+// -------------------------------------------------------------------------------
+void CFileDesTransferServer::RemoveFromScheduler()
+	{
+	if (iShutdown->IsAdded())
+		{
+		iShutdown->Deque();
+		}
+	Deque();
+	}
+
+// -------------------------------------------------------------------------------
+// CFileDesTransferServer::NewSessionL
+// Create a new client session.
+// -------------------------------------------------------------------------------
+CSession2* CFileDesTransferServer::NewSessionL(const TVersion&, const RMessage2&) const
+    {
+    return new(ELeave) CFileDesTransferSession;
+    }
+
+// -------------------------------------------------------------------------------
+// CFileDesTransferServer::AddSession
+// A new session is created. Cancel the shutdown timer if it was running.
+// -------------------------------------------------------------------------------
+inline void CFileDesTransferServer::AddSession()
+    {
+    iShutdown->Deque();
+    ++iSessionCount;
+    
+    }
+
+// -------------------------------------------------------------------------------
+// CFileDesTransferServer::DropSession
+// The session is destroyed. Stop the ActiveScheduler
+// -------------------------------------------------------------------------------
+inline void CFileDesTransferServer::DropSession()
+    {
+    if (--iSessionCount==0)
+    	{
+        CActiveScheduler::Stop();
+    	}
+    }
+
+// -------------------------------------------------------------------------------
+// CFileDesTransferServer::StartServer
+// Start serving. Blocks until the active scheduler is stopped from CShutdown::RunL
+// -------------------------------------------------------------------------------
+
+void CFileDesTransferServer::StartServer()
+	{
+    iSem.Signal();
+    // Start the scheduler
+    CActiveScheduler::Start();
+    // Block until 
+    }
+
+// -------------------------------------------------------------------------------
+// CFileDesTransferServer::~CFileDesTransferServer
+// -------------------------------------------------------------------------------
+CFileDesTransferServer::~CFileDesTransferServer()
+	{
+	iSem.Close();
+	delete iShutdown;
+	}