diff -r 000000000000 -r e4d67989cc36 genericopenlibs/openenvcore/backend/src/corebackend/fdtransfer_cli.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/genericopenlibs/openenvcore/backend/src/corebackend/fdtransfer_cli.cpp Tue Feb 02 02:01:42 2010 +0200 @@ -0,0 +1,117 @@ +// 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 session - client interface +// +// + +#include "fdtransfer_cli.h" +#include "fdtransfermsg.h" +#include "sysif.h" +#include "fdesc.h" +// ------------------------------------------------------------------------------- +// RFileDesTransferSession::Connect +// ------------------------------------------------------------------------------- +TInt RFileDesTransferSession::Connect(TDesC& aServerName) + { + return CreateSession(aServerName, TVersion(0, 0, 0), 1); + } + +//-------------------------------------------------------------------------------- +//This passes the pipe to server +//-------------------------------------------------------------------------------- + +TInt RFileDesTransferSession::TransferPipesToServer() + { + const CFileTable& ftable = Backend()->FileTable(); + int count = ftable.GetFileCount(); + CFileDescBase* fdesc = NULL; + for (TInt i = count-1; i >=3 ; --i) + { + if (ftable.At(i, fdesc) == KErrNone) + { + TUint attr = fdesc->Attributes(); + /* Named RPipes cannot be passed to another process by IPC + Hence the check for KFifoFd */ + if ((attr & KPipeFd) && !(attr & KFifoFd) && + !(attr & KCloseonExec) && !(attr & KSpawnCloseInChild)) + { + SendReceive(ETransferPipe, TIpcArgs(i,((CPipeDescBase*)fdesc)->Handle(),fdesc->FcntlFlag())); + } + } + + } + return KErrNone; + } + +//-------------------------------------------------------------------------------- +//This passes the files to server +//-------------------------------------------------------------------------------- +TInt RFileDesTransferSession::TransferFilesToServer() + { + TBuf<256> fname; + const CFileTable& ftable = Backend()->FileTable(); + CFileDescBase* fdesc = NULL; + int count = ftable.GetFileCount(); + TInt j; + for (int i = count-1; i >=3; --i) + { + if (ftable.At(i, fdesc) == KErrNone) + { + j=fdesc->Type(); + if((j==CFileDescBase::EFileDesc)||(j==CFileDescBase::EFileTempDesc)) + { + CFileDesc* fp = (CFileDesc*)(fdesc); + if (fp) + { + TUint attr = fp->Attributes(); + if (!(attr & KCloseonExec) && !(attr & KSpawnCloseInChild)) + { + fp->FileHandle().FullName(fname); + TParsePtr pars(fname); + if (pars.Path().FindC(_L("\\PRIVATE\\")) != 0) + { + + (Backend()->iFs).ShareProtected(); + fp->DoSync(); +#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 */ + params.AppendNum(fp->Offset()); + params.Append(' '); + params.AppendNum(fp->Extent()); + params.Append(' '); + params.AppendNum(fp->FcntlFlag()); + params.Append(' '); + params.AppendNum(fp->Attributes()); + params.Append(' '); + params.AppendNum(fp->Pos()); + params.Append(' '); + params.AppendNum(fp->Ext()); + params.Append(' '); + params.AppendNum(fp->Size()); + TIpcArgs args(i,¶ms); + if((fp->FileHandle()).TransferToServer(args, 2,3) == KErrNone) + SendReceive(ETransferFile, args); + (Backend()->iFs).ShareAuto(); + } + } + } + } + } + } //for + return KErrNone; + }