--- /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;
+ }