diff -r 000000000000 -r e4d67989cc36 genericopenlibs/openenvcore/backend/src/corebackend/uredirdesc.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/genericopenlibs/openenvcore/backend/src/corebackend/uredirdesc.cpp Tue Feb 02 02:01:42 2010 +0200 @@ -0,0 +1,327 @@ +// 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: +// + +#include +#include "fdesc.h" + +CRedirDesc::CRedirDesc() : CFileDescBase(O_RDWR) + { + iReadNone = EFalse; + iWriteNone = EFalse; + iStatus = ENotConnected; + iLock.CreateLocal(); + } +// ----------------------------------------------------------------------------- +// CRedirDesc::Configure +// Implementation for Configure the Media i.e. connect to stdio server +// ----------------------------------------------------------------------------- +// +TInt CRedirDesc::Configure() + { + TInt ret; + TBuf8<1> aDes; + iStatus = ENoServer; + ret = iSession.Connect(); + if( KErrNone == ret) + { + ret = iSession.CheckMedia(aDes); + if( KErrNone == ret) + { + iStatus = EConnected; + //In case both the media is NONE the server would fail the connection and + //this block of the code in not executed. If any of media either read or + //write in NONE specified in config.ini file then the iReadNone and iWriteNone + //flag is set to ETrue which is check in read and write functions. + if( !aDes.Compare(_L8("R")) ) + { + iReadNone = ETrue; + } + else + { + if( !aDes.Compare(_L8("W")) ) + { + iWriteNone = ETrue; + } + } + } + } + return ret; + } +// ----------------------------------------------------------------------------- +// CRedirDesc::Read +// Implementation for Read +// ----------------------------------------------------------------------------- +// +void CRedirDesc::Read(TDes8& aDes, TRequestStatus& aStatus) + { + if( ENotConnected == iStatus ) + { + iLock.Wait(); + if( ENotConnected == iStatus ) + { + Configure(); + } + iLock.Signal(); + } + if( EConnected == iStatus && !iReadNone ) + { + iSession.Read(aStatus, aDes, aDes.MaxLength()); + } + else + { + // If no session is there i.e. no server in production code or in the + // config.ini file for the stdioserver the both media type is NONE then + // just complete the request with EOF so that libc can handle it. + TRequestStatus* status = &aStatus; + User::RequestComplete(status, KErrEof); + } + + } + + +TInt CRedirDesc::WriteCompletion(TDes8& aDesc, TInt /*aStatus*/) + { + return aDesc.Length(); + } + +TInt CRedirDesc::ReadCompletion(TDes8& aDesc, TInt /*aStatus*/) + { + return aDesc.Length(); + } + +// ----------------------------------------------------------------------------- +// CRedirDesc::Write +// Implementation for Write +// ----------------------------------------------------------------------------- +// +void CRedirDesc::Write(TDes8& aDesc, TRequestStatus& aStatus) + { + if( ENotConnected == iStatus ) + { + iLock.Wait(); + if( ENotConnected == iStatus ) + { + Configure(); + } + iLock.Signal(); + } + if(EConnected == iStatus && !iWriteNone) + { + iSession.Write(aStatus, aDesc, aDesc.Length()); + } + else + { + // If no session is there i.e. no server in production code or the user + // has specified the media type in config.ini file as NONE put the write + // data in blackhole and just complete the request as done in Read call. + TRequestStatus* status = &aStatus; + User::RequestComplete(status, KErrNone); + } + } + +// ----------------------------------------------------------------------------- +// CRedirDesc::Fcntl +// Implementation for fcntl +// ----------------------------------------------------------------------------- +// +TInt CRedirDesc::Fcntl(TUint /*anArg*/, TUint aCmd) + { + if (aCmd == F_GETFL) + { + return iFcntlFlag; + } + return KErrNotSupported; + } + +// ----------------------------------------------------------------------------- +// CRedirDesc::FinalClose +// Cleanup function used by FID +// ----------------------------------------------------------------------------- +// +TInt CRedirDesc::FinalClose() + { + iSession.Close(); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CRedirDesc::Poll +// checks if that aEvents is ready or not. +// ----------------------------------------------------------------------------- +// +TInt CRedirDesc::Poll(TUint aEvents) + { + TInt readyEvents = 0; + + if ((aEvents & EReadyForWriting ) && !iWriteNone) + { + readyEvents |= EReadyForWriting; + } + + return readyEvents; + } + +// ----------------------------------------------------------------------------- +// CRedirDesc::NotifyActivity +// registers a notification for read event i.e. when data is ready for read. +// this function is only for reading because poll itself would return for writing +// if that media for writing is available. +// ----------------------------------------------------------------------------- +// +TInt CRedirDesc::NotifyActivity(TUint aEvents, TRequestStatus& aRequest, TTimeIntervalMicroSeconds32 /* timeout=0 */) + { + if( ENotConnected == iStatus ) + { + iLock.Wait(); + if( ENotConnected == iStatus ) + { + Configure(); + } + iLock.Signal(); + } + + if(EConnected != iStatus || aEvents & EReadyForWriting || iReadNone ) + { + //complete aStatus with KErrNone + TRequestStatus* status = &aRequest; + User::RequestComplete(status, KErrNone); + } + + if ((aEvents & EReadyForReading) && !iReadNone) + { + TInt events = 0; + events = EReadyForReading; + iSession.NotifyActivity((TInt)events, aRequest); + } + + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CRedirDesc::TweakReadyEvents +// Prepares the redir desc specific output events +// ----------------------------------------------------------------------------- +// +TInt CRedirDesc::TweakReadyEvents(TInt errval) + { + TInt returnEvents = 0; + // This file descriptor is pipe-like + if( errval >= KErrNone ) + { + returnEvents |= EReadyForReading; + returnEvents |= EReadyForWriting; + } + else + { + returnEvents |= EAnyException; + } + return returnEvents; + } + +// ----------------------------------------------------------------------------- +// CRedirDesc::CancelNotify +// To cancel notification. +// ----------------------------------------------------------------------------- +// +void CRedirDesc::CancelNotify() + { + if ( iSession.Handle() ) + { + iSession.CancelNotify(); + } + } + +//----------------------------------------------------------------------------- +//int CRedirDesc::SetEcho(TBool aEcho) +// +//Sets the echo flag to the given value. +//----------------------------------------------------------------------------- + +int CRedirDesc::SetEcho(TUint8 aEcho) + { + int err = KErrNone; + //start the redirection server if not already started... + if( ENotConnected == iStatus ) + { + iLock.Wait(); + Configure(); + iLock.Signal(); + } + //set the echo flag if the connection with the server is successfull... + if(EConnected == iStatus) + { + err = iSession.SetEcho(aEcho); + } + else + { + // If no session is there i.e. no server in production code or in the + // config.ini file for the stdioserver the both media type is NONE then + // just return EOF so that libc can handle it. + err = KErrEof; + } + return err; + } + + +// method definitions for CStdErrDesc +CStdErrDesc::CStdErrDesc() : CFileDescBase(O_RDWR) + { + // nada + } + +// ----------------------------------------------------------------------------- +// CStdErrDesc::Write +// Implementation for Write +// ----------------------------------------------------------------------------- +// +void CStdErrDesc::Write(TDes8& aDesc, TRequestStatus& aStatus) + { + HBufC16* des16 = NULL; + TRAPD(err, des16 = HBufC16::NewL(aDesc.Length())); + if (err != KErrNone) + { + //complete aStatus with that error code + TRequestStatus* status = &aStatus; + User::RequestComplete(status, err); + return; + } + TPtr16 ptr(des16->Des()); + ptr.Copy(aDesc); + #ifdef _DEBUG + RDebug::RawPrint(*des16); + #endif //_DEBUG + delete des16; + TRequestStatus* status = &aStatus; + User::RequestComplete(status, KErrNone); + } + +// ----------------------------------------------------------------------------- +// CStdErrDesc::Fcntl +// Implementation for fcntl +// ----------------------------------------------------------------------------- +// +TInt CStdErrDesc::Fcntl(TUint /*anArg*/, TUint aCmd) + { + if (aCmd == F_GETFL) + { + return iFcntlFlag; + } + return KErrNotSupported; + } + +TInt CStdErrDesc::WriteCompletion(TDes8& aDesc, TInt /*aStatus*/) + { + return aDesc.Length(); + }