diff -r 4096754ee773 -r 52a167391590 localconnectivityservice/dun/utils/src/DunStream.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/localconnectivityservice/dun/utils/src/DunStream.cpp Wed Sep 01 12:20:40 2010 +0100 @@ -0,0 +1,320 @@ +/* +* Copyright (c) 2007 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: Definitions needed for common stream functionality +* +*/ + + +/* + * TODO: When local media is of type RComm, listening on it is started with + * RComm::NotifyDataAvailable() call. Check that USB ACM port and Irda RCOMM + * (and any other new media in the future) behaves correctly so that when + * RComm::ReadOneOrMore() is issued, the read is issued immediately without + * checking for new data. If waiting for new data happens in this + * NotifyDataAvailable/ReadOneOrMore combination, raise a defect to Symbian. + */ + +#include "DunStream.h" +#include "DunDebug.h" + +// --------------------------------------------------------------------------- +// Destructor. +// --------------------------------------------------------------------------- +// +CDunStream::~CDunStream() + { + FTRACE(FPrint( _L("CDunStream::~CDunStream()" ))); + ResetData(); + FTRACE(FPrint( _L("CDunStream::~CDunStream() complete" ))); + } + +// --------------------------------------------------------------------------- +// Resets data to initial values +// --------------------------------------------------------------------------- +// +void CDunStream::ResetData() + { + // APIs affecting this: + // AddConnMonCallback() + iCallbacksR.Close(); + iCallbacksW.Close(); + // AddSkippedError() + iOkErrorsR.Close(); + iOkErrorsW.Close(); + // Internal + Initialize(); + } + +// --------------------------------------------------------------------------- +// Adds error code to consider as "no error" to either endpoint +// --------------------------------------------------------------------------- +// +TInt CDunStream::AddSkippedError( TInt aError, + TDunOperationType aOperationType ) + { + FTRACE(FPrint( _L("CDunStream::AddSkippedError()" ) )); + RArray* okErrors = NULL; + if ( aOperationType == EDunOperationTypeRead ) + { + okErrors = &iOkErrorsR; + } + else if ( aOperationType == EDunOperationTypeWrite ) + { + okErrors = &iOkErrorsW; + } + else + { + FTRACE(FPrint( _L("CDunStream::AddSkippedError() (ERROR) complete" ) )); + return KErrGeneral; + } + if ( aError >= 0 ) // errors can't be >= 0 + { + FTRACE(FPrint( _L("CDunStream::AddSkippedError() (ERROR) complete" ) )); + return KErrGeneral; + } + TInt retTemp = okErrors->Find( aError ); + if ( retTemp != KErrNotFound ) + { + FTRACE(FPrint( _L("CDunStream::AddSkippedError() (already exists) complete" ) )); + return KErrAlreadyExists; + } + retTemp = okErrors->Append( aError ); + if ( retTemp != KErrNone ) + { + FTRACE(FPrint( _L("CDunStream::AddSkippedError() (append failed!) complete" ) )); + return retTemp; + } + FTRACE(FPrint( _L("CDunStream::AddSkippedError() complete" ) )); + return KErrNone; + } + +// --------------------------------------------------------------------------- +// Adds callback for line status change controlling +// The callback will be called when serious read error is detected +// --------------------------------------------------------------------------- +// +TInt CDunStream::AddConnMonCallback( MDunConnMon* aCallback, + TDunOperationType aOperationType ) + { + FTRACE(FPrint( _L("CDunStream::AddConnMonCallback()" ) )); + RPointerArray* callbacks = NULL; + if ( aOperationType == EDunOperationTypeRead ) + { + callbacks = &iCallbacksR; + } + else if ( aOperationType == EDunOperationTypeWrite ) + { + callbacks = &iCallbacksW; + } + else + { + FTRACE(FPrint( _L("CDunStream::AddConnMonCallback() (ERROR) complete" ) )); + return KErrGeneral; + } + if ( !aCallback ) + { + FTRACE(FPrint( _L("CDunStream::AddConnMonCallback() (aCallback) not initialized!" ) )); + return KErrGeneral; + } + TInt retTemp = callbacks->Find( aCallback ); + if ( retTemp != KErrNotFound ) + { + FTRACE(FPrint( _L("CDunStream::AddCallback() (already exists) complete" ) )); + return KErrAlreadyExists; + } + retTemp = callbacks->Append( aCallback ); + if ( retTemp != KErrNone ) + { + FTRACE(FPrint( _L("CDunStream::AddCallback() (append failed!) complete" ) )); + return retTemp; + } + FTRACE(FPrint( _L("CDunStream::AddCallback() complete" ) )); + return KErrNone; + } + +// --------------------------------------------------------------------------- +// Sets buffering for this stream +// --------------------------------------------------------------------------- +// +TInt CDunStream::SetBuffering( TPtr8* aBufferPtr ) + { + FTRACE(FPrint( _L("CDunStream::SetBuffering()" ) )); + if ( !aBufferPtr ) + { + FTRACE(FPrint( _L("CDunStream::SetBuffering() (aBufferPtr) not initialized!" ) )); + return KErrGeneral; + } + if ( iBufferPtr ) + { + FTRACE(FPrint( _L("CDunStream::SetBuffering() (already exists) complete" ) )); + return KErrAlreadyExists; + } + iBufferPtr = aBufferPtr; + FTRACE(FPrint( _L("CDunStream::SetBuffering() complete" ) )); + return KErrNone; + } + +// --------------------------------------------------------------------------- +// Sets media to use for this endpoint +// --------------------------------------------------------------------------- +// +TInt CDunStream::SetMedia( RComm* aComm, TDunMediaContext aMediaContext ) + { + FTRACE(FPrint( _L("CDunStream::SetMedia() (RComm)" ) )); + if ( !aComm ) + { + FTRACE(FPrint( _L("CDunStream::SetMedia() (RComm) (aComm not initialized!) complete" ) )); + return KErrGeneral; + } + if ( aMediaContext == EDunMediaContextNetwork ) + { + iNetwork = aComm; + } + else if ( aMediaContext == EDunMediaContextLocal ) + { + iComm = aComm; + } + else + { + FTRACE(FPrint( _L("CDunStream::SetMedia() (RComm) (ERROR) complete" ))); + return KErrGeneral; + } + FTRACE(FPrint( _L("CDunStream::SetMedia() (RComm) complete" ) )); + return KErrNone; + } + +// --------------------------------------------------------------------------- +// Sets media to use for this endpoint +// --------------------------------------------------------------------------- +// +TInt CDunStream::SetMedia( RSocket* aSocket, + TDunMediaContext aMediaContext ) + { + FTRACE(FPrint( _L("CDunStream::SetMedia() (RSocket)" ) )); + if ( !aSocket ) + { + FTRACE(FPrint( _L("CDunStream::SetMedia() (RSocket) (aSocket not initialized!) complete" ) )); + return KErrGeneral; + } + if ( aMediaContext == EDunMediaContextLocal ) + { + iSocket = aSocket; + } + else + { + FTRACE(FPrint( _L("CDunStream::SetMedia() (RSocket) (not supported) complete" ) )); + return KErrNotSupported; + } + FTRACE(FPrint( _L("CDunStream::SetMedia() (RSocket) complete" ) )); + return KErrNone; + } + +// --------------------------------------------------------------------------- +// Gets media context +// --------------------------------------------------------------------------- +// +TDunMediaContext CDunStream::GetMediaContext( TDunStreamType aStreamType ) + { + FTRACE(FPrint( _L("CDunStream::GetMediaContext()" ) )); + if ( aStreamType == EDunStreamTypeUpstream ) + { + if ( iOperationType == EDunOperationTypeRead ) + { + return EDunMediaContextLocal; + } + else if ( iOperationType == EDunOperationTypeWrite ) + { + return EDunMediaContextNetwork; + } + else + { + return EDunMediaContextUndefined; + } + } + else if ( aStreamType == EDunStreamTypeDownstream ) + { + if ( iOperationType == EDunOperationTypeRead ) + { + return EDunMediaContextNetwork; + } + else if ( iOperationType == EDunOperationTypeWrite ) + { + return EDunMediaContextLocal; + } + else + { + return EDunMediaContextUndefined; + } + } + FTRACE(FPrint( _L("CDunStream::GetMediaContext() complete" ) )); + return EDunMediaContextUndefined; + } + +// --------------------------------------------------------------------------- +// Check whether an error code is severe error or not +// --------------------------------------------------------------------------- +// +TInt CDunStream::ProcessErrorCondition( TInt aError, TBool& aIsError ) + { + FTRACE(FPrint( _L("CDunStream::ProcessErrorCondition() (Dir=%d)" ), iDirection)); + aIsError = EFalse; + if ( aError != KErrNone ) + { + aIsError = ETrue; + RArray* okErrors = NULL; + if ( iOperationType == EDunOperationTypeRead ) + { + okErrors = &iOkErrorsR; + } + else // iOperationType == EDunOperationTypeWrite + { + okErrors = &iOkErrorsW; + } + TInt retTemp = okErrors->Find( aError ); + if ( retTemp == KErrNotFound ) + { + FTRACE(FPrint( _L("CDunStream::ProcessErrorCondition() (Dir=%d) (%d=ETrue) complete" ), iDirection, aError)); + return ETrue; + } + } + FTRACE(FPrint( _L("CDunStream::ProcessErrorCondition() (Dir=%d) (%d=EFalse) complete" ), iDirection, aError)); + return EFalse; + } + +// --------------------------------------------------------------------------- +// CDunStream::CDunStream +// --------------------------------------------------------------------------- +// +CDunStream::CDunStream() : CActive( EPriorityHigh ) + { + Initialize(); + CActiveScheduler::Add( this ); + } + +// --------------------------------------------------------------------------- +// Initializes this class +// --------------------------------------------------------------------------- +// +void CDunStream::Initialize() + { + // Don't initialize iUtility here (it is set through NewL) + iBufferPtr = NULL; + iReadLengthSocket = 0; + iOperationType = EDunOperationTypeUndefined; + iTransferState = EDunStateIdle; + iDirection = EDunDirectionUndefined; + iNetwork = NULL; + iSocket = NULL; + iComm = NULL; + }