localconnectivityservice/dun/utils/src/DunStream.cpp
branchRCL_3
changeset 19 0aa8cc770c8a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/localconnectivityservice/dun/utils/src/DunStream.cpp	Tue Aug 31 16:03:15 2010 +0300
@@ -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<TInt>* 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<MDunConnMon>* 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<TInt>* 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;
+    }