localconnectivityservice/dun/utils/src/DunChanMan.cpp
branchRCL_3
changeset 20 4a793f564d72
parent 19 0aa8cc770c8a
child 21 74aa6861c87d
--- a/localconnectivityservice/dun/utils/src/DunChanMan.cpp	Tue Aug 31 16:03:15 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,577 +0,0 @@
-/*
-* Copyright (c) 2006-2008 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:  RComm channel management related functionality (waiter)
-*
-*/
-
-
-#include "DunSignalWaiter.h"
-#include "DunDataWaiter.h"
-#include "DunUpstream.h"
-#include "DunDownstream.h"
-#include "DunSignalCopy.h"
-#include "DunChanMan.h"
-#include "DunUtils.h"
-#include "DunDebug.h"
-#include "DunPlugin.h"
-
-// ---------------------------------------------------------------------------
-// Two-phased constructor.
-// ---------------------------------------------------------------------------
-//
-CDunChanMan* CDunChanMan::NewL( CDunTransporter& aParent,
-                                MDunTransporterUtility* aUtility,
-                                MDunTransporterUtilityAux* aUtilityAux,
-                                MDunPluginManager* aPluginManager )
-    {
-    CDunChanMan* self = new (ELeave) CDunChanMan( aParent,
-                                                  aUtility,
-                                                  aUtilityAux,
-                                                  aPluginManager );
-    CleanupStack::PushL( self );
-    self->ConstructL();
-    CleanupStack::Pop( self );
-    return self;
-    }
-
-// ---------------------------------------------------------------------------
-// Destructor.
-// ---------------------------------------------------------------------------
-//
-CDunChanMan::~CDunChanMan()
-    {
-    FTRACE(FPrint( _L("CDunChanMan::~CDunChanMan()") ));
-    ResetData();
-    FTRACE(FPrint( _L("CDunChanMan::~CDunChanMan() complete") ));
-    }
-
-// ---------------------------------------------------------------------------
-// Resets data to initial values
-// ---------------------------------------------------------------------------
-//
-void CDunChanMan::ResetData()
-    {
-    FTRACE(FPrint( _L("CDunChanMan::ResetData()") ));
-    // APIs affecting this:
-    // AddConnWaiterL()
-    // IssueConnWaiterRequest()
-    TInt i;
-    TInt count = iWaiterData.Count();
-    for ( i=0; i<count; i++ )
-        {
-        DeleteWaiters( i );
-        }
-    iWaiterData.Close();
-    FTRACE(FPrint( _L("CDunChanMan::ResetData() complete") ));
-    }
-
-// ---------------------------------------------------------------------------
-// Number of waiters
-// ---------------------------------------------------------------------------
-//
-TInt CDunChanMan::NumberOfWaiters()
-    {
-    FTRACE(FPrint( _L("CDunChanMan::NumberOfWaiters()" )));
-    TInt waiters = iWaiterData.Count();
-    FTRACE(FPrint( _L("CDunChanMan::NumberOfWaiters() complete" )));
-    return waiters;
-    }
-
-// ---------------------------------------------------------------------------
-// Gets number of waiters by owner UID
-// ---------------------------------------------------------------------------
-//
-TInt CDunChanMan::GetNumberOfWaitersByUid( TUid aOwnerUid )
-    {
-    FTRACE(FPrint( _L("CDunChanMan::GetNumberOfWaitersByUid()" )));
-    TInt i;
-    TInt waiters = 0;
-    TInt count = iWaiterData.Count();
-    for ( i=0; i<count; i++ )
-        {
-        TDunWaiterData& waiterData = iWaiterData[i];
-        if ( waiterData.iOwnerUid == aOwnerUid )
-            {
-            waiters++;
-            }
-        }
-    FTRACE(FPrint( _L("CDunChanMan::GetNumberOfWaitersByUid() complete" )));
-    return waiters;
-    }
-
-// ---------------------------------------------------------------------------
-// Adds new connection waiter to connection waiter array
-// ---------------------------------------------------------------------------
-//
-void CDunChanMan::AddConnWaiterL( RComm* aComm,
-                                  TUid aOwnerUid,
-                                  const TDesC8& aName,
-                                  TBool aEnqueuedFail,
-                                  MDunBufferCorrection* aCorrection )
-    {
-    FTRACE(FPrint( _L("CDunChanMan::AddConnWaiterL()" )));
-    if ( !aComm )
-        {
-        FTRACE(FPrint( _L("CDunChanMan::AddConnWaiterL() (aComm not initialized!) complete" )));
-        User::Leave( KErrGeneral );
-        }
-    CDunSignalWaiter* signalWaiter = CDunSignalWaiter::NewL( this );
-    CleanupStack::PushL( signalWaiter );
-    TInt retTemp = signalWaiter->SetMedia( aComm );
-    if ( retTemp != KErrNone )
-        {
-        FTRACE(FPrint( _L("CDunChanMan::AddConnWaiterL() (ERROR) complete" )));
-        User::Leave( retTemp );
-        }
-    CDunDataWaiter* dataWaiter = CDunDataWaiter::NewL( this );
-    CleanupStack::PushL( dataWaiter );
-    retTemp = dataWaiter->SetMedia( aComm );
-    if ( retTemp != KErrNone )
-        {
-        FTRACE(FPrint( _L("CDunChanMan::AddConnWaiterL() (ERROR) complete" )));
-        User::Leave( retTemp );
-        }
-    TDunWaiterData waiterData;
-    waiterData.iComm = aComm;
-    waiterData.iChannelName = HBufC8::NewMaxL( aName.Length() );
-    TPtr8 chanNamePtr = waiterData.iChannelName->Des();
-    chanNamePtr.Copy( aName );
-    waiterData.iSignalWaiter = signalWaiter;
-    waiterData.iDataWaiter = dataWaiter;
-    waiterData.iCorrection = aCorrection;
-    waiterData.iEnqueuedFail = aEnqueuedFail;
-    waiterData.iOwnerUid = aOwnerUid;
-    iWaiterData.AppendL( waiterData );
-    CleanupStack::Pop( dataWaiter );
-    CleanupStack::Pop( signalWaiter );
-    FTRACE(FPrint( _L("CDunChanMan::AddConnWaiterL() complete" )));
-    }
-
-// ---------------------------------------------------------------------------
-// Removes existing waiter from connection waiter array
-// ---------------------------------------------------------------------------
-//
-TInt CDunChanMan::RemoveConnWaiter( RComm* aComm )
-    {
-    FTRACE(FPrint( _L("CDunChanMan::RemoveConnWaiter()" )));
-    TInt i;
-    for ( i=iWaiterData.Count()-1; i>=0; i-- )
-        {
-        TDunWaiterData& waiterData = iWaiterData[i];
-        if ( waiterData.iComm == aComm )
-            {
-            DeleteWaiters( i );
-            iWaiterData.Remove( i );
-            FTRACE(FPrint( _L("CDunChanMan::RemoveConnWaiter() complete" )));
-            return KErrNone;
-            }
-        }
-    FTRACE(FPrint( _L("CDunChanMan::RemoveConnWaiter() (not found) complete" )));
-    return KErrNotFound;
-    }
-
-// ---------------------------------------------------------------------------
-// Makes CDunConnWaiter ready to detect new data
-// ---------------------------------------------------------------------------
-//
-TInt CDunChanMan::IssueConnWaiterRequest( RComm* aComm )
-    {
-    FTRACE(FPrint( _L("CDunChanMan::IssueConnWaiterRequest()" )));
-    TInt i;
-    TInt count = iWaiterData.Count();
-    for ( i=0; i<count; i++ )
-        {
-        TDunWaiterData& waiterData = iWaiterData[i];
-        if ( waiterData.iComm == aComm )
-            {
-            waiterData.iSignalWaiter->IssueRequest();
-            waiterData.iDataWaiter->IssueRequest();
-            FTRACE(FPrint( _L("CDunChanMan::IssueConnWaiterRequest() complete" )));
-            return KErrNone;
-            }
-        }
-    FTRACE(FPrint( _L("CDunChanMan::IssueConnWaiterRequest() (not found) complete" )));
-    return KErrNotFound;
-    }
-
-// ---------------------------------------------------------------------------
-// Stops CDunConnWaiter to detect new data
-// ---------------------------------------------------------------------------
-//
-TInt CDunChanMan::StopConnWaiter( RComm* aComm )
-    {
-    FTRACE(FPrint( _L("CDunChanMan::StopConnWaiter()" )));
-    TInt i;
-    TInt count = iWaiterData.Count();
-    for ( i=0; i<count; i++ )
-        {
-        TDunWaiterData& waiterData = iWaiterData[i];
-        if ( waiterData.iComm == aComm )
-            {
-            waiterData.iSignalWaiter->Stop();
-            waiterData.iDataWaiter->Stop();
-            FTRACE(FPrint( _L("CDunChanMan::StopConnWaiter() complete" )));
-            return KErrNone;
-            }
-        }
-    FTRACE(FPrint( _L("CDunChanMan::StopConnWaiter() (not found) complete" )));
-    return KErrNotFound;
-    }
-
-// ---------------------------------------------------------------------------
-// Saves waiter's connection monitor callback data
-// ---------------------------------------------------------------------------
-//
-TInt CDunChanMan::SaveWaiterConnMonCallbackL( RComm* aComm,
-                                              MDunConnMon* aCallback,
-                                              TDunDirection aDirection )
-    {
-    FTRACE(FPrint( _L("CDunChanMan::SaveWaiterConnMonCallbackL()" )));
-    TInt i;
-    TInt count = iWaiterData.Count();
-    for ( i=0; i<count; i++ )
-        {
-        TDunWaiterData& waiterData = iWaiterData[i];
-        if ( waiterData.iComm != aComm )
-            {
-            continue;
-            }
-        TDunConnMonCallback connMon;
-        connMon.iCallback = aCallback;
-        connMon.iDirection = aDirection;
-        if ( aDirection==EDunReaderUpstream ||
-             aDirection==EDunWriterDownstream )
-            {
-            // Local media -> add to object
-            // Add signal waiter's callback (for RunL error monitoring)
-            if ( !waiterData.iSignalWaiter )
-                {
-                FTRACE(FPrint( _L("CDunTransUtils::SaveWaiterConnMonCallbackL() (ERROR) complete" )));
-                return KErrGeneral;
-                }
-            waiterData.iSignalWaiter->AddCallback( aCallback );
-            // Add data waiter's callback (for RunL error monitoring)
-            if ( !waiterData.iDataWaiter )
-                {
-                FTRACE(FPrint( _L("CDunTransUtils::SaveWaiterConnMonCallbackL() (ERROR) complete" )));
-                return KErrGeneral;
-                }
-            waiterData.iDataWaiter->AddCallback( aCallback );
-            // Now just store information for R/W case
-            waiterData.iConnMons.AppendL( connMon );
-            FTRACE(FPrint( _L("CDunChanMan::SaveWaiterConnMonCallbackL() complete" )));
-            return KErrNone;
-            }
-        else if ( aDirection==EDunWriterUpstream ||
-                  aDirection==EDunReaderDownstream )
-            {
-            // Network -> just store information for R/W case
-            waiterData.iConnMons.AppendL( connMon );
-            FTRACE(FPrint( _L("CDunChanMan::SaveWaiterConnMonCallbackL() complete" )));
-            return KErrNone;
-            }
-        else
-            {
-            FTRACE(FPrint( _L("CDunTransUtils::SaveWaiterConnMonCallbackL() (ERROR) complete" )));
-            return KErrGeneral;
-            }
-        }
-    FTRACE(FPrint( _L("CDunChanMan::SaveWaiterConnMonCallbackL() (not found) complete" )));
-    return KErrNotFound;
-    }
-
-// ---------------------------------------------------------------------------
-// Saves waiter's skipped error data
-// ---------------------------------------------------------------------------
-//
-TInt CDunChanMan::SaveWaiterSkippedErrorL( TInt aError,
-                                           RComm* aComm,
-                                           TDunDirection aDirection )
-    {
-    FTRACE(FPrint( _L("CDunChanMan::SaveWaiterSkippedErrorL()" )));
-    TInt i;
-    TInt count = iWaiterData.Count();
-    for ( i=0; i<count; i++ )
-        {
-        TDunWaiterData& waiterData = iWaiterData[i];
-        if ( waiterData.iComm == aComm )
-            {
-            TDunSkippedError skippedError;
-            skippedError.iError = aError;
-            skippedError.iDirection = aDirection;
-            waiterData.iOkErrors.AppendL( skippedError );
-            FTRACE(FPrint( _L("CDunChanMan::SaveWaiterSkippedErrorL() complete" )));
-            return KErrNone;
-            }
-        }
-    FTRACE(FPrint( _L("CDunChanMan::SaveWaiterSkippedErrorL() (not found) complete" )));
-    return KErrNotFound;
-    }
-
-// ---------------------------------------------------------------------------
-// CDunChanMan::CDunChanMan
-// ---------------------------------------------------------------------------
-//
-CDunChanMan::CDunChanMan( CDunTransporter& aParent,
-                          MDunTransporterUtility* aUtility,
-                          MDunTransporterUtilityAux* aUtilityAux,
-                          MDunPluginManager* aPluginManager ) :
-    iParent( aParent ),
-    iUtility( aUtility ),
-    iUtilityAux( aUtilityAux ),
-    iPluginManager( aPluginManager )
-    {
-    Initialize();
-    }
-
-// ---------------------------------------------------------------------------
-// CDunChanMan::ConstructL
-// ---------------------------------------------------------------------------
-//
-void CDunChanMan::ConstructL()
-    {
-    FTRACE(FPrint( _L("CDunChanMan::ConstructL()" ) ));
-    if ( !iUtility || !iUtilityAux || !iPluginManager )
-        {
-        User::Leave( KErrGeneral );
-        }
-    FTRACE(FPrint( _L("CDunChanMan::ConstructL() complete" ) ));
-    }
-
-// ---------------------------------------------------------------------------
-// Initializes this class
-// ---------------------------------------------------------------------------
-//
-void CDunChanMan::Initialize()
-    {
-    FTRACE(FPrint( _L("CDunChanMan::Initialize()" ) ));
-    // Don't initialize iParent here (it is set through NewL)
-    // Don't initialize iUtility here (it is set through NewL)
-    // Don't initialize iUtilityAux here (it is set through NewL)
-    // Don't initialize iPluginManager here (it is set through NewL)
-    FTRACE(FPrint( _L("CDunChanMan::Initialize() complete" ) ));
-    }
-
-// ---------------------------------------------------------------------------
-// From class MDunChannelAllocator.
-// Notifies when new channel is wanted
-// ---------------------------------------------------------------------------
-//
-TInt CDunChanMan::NotifyNewChannelRequest( RComm* aComm )
-    {
-    FTRACE(FPrint( _L("CDunChanMan::NotifyNewChannelRequest()" )));
-    if ( !aComm->SubSessionHandle() )
-        {
-        FTRACE(FPrint( _L("CDunChanMan::NotifyNewChannelRequest() (RComm) (bad handle) complete" ) ));
-        return KErrBadHandle;
-        }
-    // Get plugin UID for connection ID
-    TInt i;
-    TUid foundUid = TUid::Null();
-    TInt count = iWaiterData.Count();
-    for ( i=0; i<count; i++ )
-        {
-        if ( iWaiterData[i].iComm == aComm )
-            {
-            foundUid = iWaiterData[i].iOwnerUid;
-            break;
-            }
-        }
-    if ( i >= count )
-        {
-        FTRACE(FPrint( _L("CDunChanMan::NotifyNewChannelRequest() (RComm) (not found) complete" )));
-        return KErrNotFound;
-        }
-    TDunWaiterData& waiterData = iWaiterData[i];
-    // Try to stop if either one of the waiters are still runnig
-    waiterData.iSignalWaiter->Stop();
-    waiterData.iDataWaiter->Stop();
-    // enqueued will be omitted (not needed to set to RComm)
-    TInt firstFree = iUtility->InitializeFirstFreeChannel( aComm );
-    if ( firstFree < 0 )
-        {
-        FTRACE(FPrint( _L("CDunChanMan::NotifyNewChannelRequest() (RComm) (firstfree failed!) complete" ) ));
-        return firstFree;
-        }
-    if ( firstFree >= iParent.iChannelData.Count() )
-        {
-        FTRACE(FPrint( _L("CDunChanMan::NotifyNewChannelRequest() (RComm) (firstfree failed!) complete" )));
-        return KErrGeneral;
-        }
-    TInt bufferLength = KErrNotFound;
-    MDunBufferCorrection* correction = waiterData.iCorrection;
-    TRAPD( retTrap,
-        iUtility->DoAllocateChannelL(aComm, bufferLength, firstFree, correction) );
-    if ( retTrap != KErrNone )
-        {
-        FTRACE(FPrint( _L("CDunChanMan::NotifyNewChannelRequest() trapped!" ) ));
-        iParent.UnInitializeOnDemand();  // remove unused initialized channel
-        if ( retTrap == KErrTooBig )
-            {
-            if ( waiterData.iEnqueuedFail )
-                {
-                // Inform plugin enqueue request
-                iPluginManager->NotifyPluginEnqueueRequest( foundUid );
-                }
-            FTRACE(FPrint( _L("CDunTransporter::AllocateChannel() (RSocket) complete" )));
-            return KErrTooBig;
-            }
-        iPluginManager->NotifyPluginCloseRequest( foundUid, EFalse );
-        FTRACE(FPrint( _L("CDunChanMan::NotifyNewChannelRequest() (ERROR) complete" )));
-        return retTrap;
-        }
-    TInt retTemp = CDunUtils::SetRCommBufferLength( *aComm, bufferLength );
-    if ( retTemp != KErrNone )
-        {
-        iParent.UnInitializeOnDemand();  // remove unused initialized channel
-        iPluginManager->NotifyPluginCloseRequest( foundUid, EFalse );
-        FTRACE(FPrint( _L("CDunChanMan::NotifyNewChannelRequest() (ERROR) complete" )));
-        }
-    // Next find aComm from iWaiterData and copy its contents to channel data
-    retTemp = FillNewWaiterChannelData( aComm, firstFree );
-    if ( retTemp != KErrNone )
-        {
-        iParent.UnInitializeOnDemand();  // remove unused initialized channel
-        iPluginManager->NotifyPluginCloseRequest( foundUid, EFalse );
-        FTRACE(FPrint( _L("CDunChanMan::NotifyNewChannelRequest() (RComm) (not found) complete" )));
-        }
-    FTRACE(FPrint( _L("CDunChanMan::NotifyNewChannelRequest() (RComm) complete" )));
-    return KErrNone;
-    }
-
-// ---------------------------------------------------------------------------
-// Fills data for channel created by waiter
-// ---------------------------------------------------------------------------
-//
-TInt CDunChanMan::FillNewWaiterChannelData( RComm* aComm,
-                                            TInt aFirstFree )
-    {
-    FTRACE(FPrint( _L("CDunChanMan::FillNewWaiterChannelData()" )));
-    TInt i;
-    TInt count = iWaiterData.Count();
-    for ( i=0; i<count; i++ )
-        {
-        if ( iWaiterData[i].iComm == aComm )
-            {
-            break;
-            }
-        }
-    if ( i >= count ||
-         aFirstFree < 0 ||
-         aFirstFree >= iParent.iChannelData.Count() )
-        {
-        FTRACE(FPrint( _L("CDunChanMan::FillNewWaiterChannelData() (not found) complete" )));
-        return KErrNotFound;
-        }
-    TUid thisUid = iWaiterData[i].iOwnerUid; // pick up before remove
-    TDunChannelData& channelData = iParent.iChannelData[aFirstFree];
-    TDunWaiterData& waiterData = iWaiterData[i];
-    channelData.iComm = waiterData.iComm;
-    channelData.iChannelName = waiterData.iChannelName;
-    channelData.iUpstreamRW->SetMedia( aComm, EDunMediaContextLocal );
-    channelData.iDownstreamRW->SetMedia( aComm, EDunMediaContextLocal );
-    channelData.iOwnerUid = thisUid;
-    // Channel now occupied
-    channelData.iChannelInUse = ETrue;
-    // Restore data from waiter to transfer objects
-    RestoreWaiterData( i, aFirstFree );
-    // Now delete waiters before request issuing
-    DeleteWaiters( i, ETrue );
-    iWaiterData.Remove( i );
-    // Issue transfer requests
-    iUtility->DoIssueTransferRequests( aFirstFree );
-    // Clear the queue, just to be sure
-    iPluginManager->NotifyPluginDequeueRequest( thisUid );
-    FTRACE(FPrint( _L("CDunChanMan::FillNewWaiterChannelData() complete" )));
-    return KErrNone;
-    }
-
-// ---------------------------------------------------------------------------
-// Restores saved waiter data to connection data
-// ---------------------------------------------------------------------------
-//
-TInt CDunChanMan::RestoreWaiterData( TInt aWaiterIndex,
-                                     TInt aChannelIndex )
-    {
-    FTRACE(FPrint( _L("CDunChanMan::RestoreWaiterData()" )));
-    if ( aWaiterIndex < 0 ||
-         aWaiterIndex >= iWaiterData.Count() ||
-         aChannelIndex < 0 ||
-         aChannelIndex >= iParent.iChannelData.Count() )
-        {
-        FTRACE(FPrint( _L("CDunChanMan::RestoreWaiterData() (not found) complete" )));
-        return KErrNotFound;
-        }
-    TInt i;
-    TInt count = iWaiterData[aWaiterIndex].iConnMons.Count();
-    for ( i=0; i<count; i++ )
-        {
-        TDunConnMonCallback& connMon = iWaiterData[aWaiterIndex].iConnMons[i];
-        // Add connection monitor callbacks (ignore errors)
-        // Errors are ignored because in this phase they cannot be reported to
-        // plugins. Instead add error checking to
-        // CDunTransporter::AddConnMonCallbackL() if needed
-        iUtility->DoAddConnMonCallback( aChannelIndex,
-                                        connMon.iCallback,
-                                        connMon.iDirection,
-                                        NULL );
-        }
-    count = iWaiterData[aWaiterIndex].iOkErrors.Count();
-    for (i=0; i<count; i++)
-        {
-        TDunSkippedError& skippedError = iWaiterData[aWaiterIndex].iOkErrors[i];
-        // Add skipped errors (ignore errors)
-        // Errors are ignored because in this phase they cannot be reported to
-        // plugins. Instead add error checking to
-        // CDunTransporter::AddSkippedErrorL() if needed
-        iUtility->DoAddSkippedError( aChannelIndex,
-                                     skippedError.iError,
-                                     skippedError.iDirection );
-        }
-    FTRACE(FPrint( _L("CDunChanMan::RestoreWaiterData() complete" )));
-    return KErrNone;
-    }
-
-// ---------------------------------------------------------------------------
-// Deletes waiter objects of aIndex:th waiters
-// ---------------------------------------------------------------------------
-//
-TInt CDunChanMan::DeleteWaiters( TInt aIndex, TBool aNewOwnership )
-    {
-    FTRACE(FPrint( _L("CDunChanMan::DeleteWaiters()" )));
-
-    if ( aIndex < 0 ||
-         aIndex >= iWaiterData.Count() )
-        {
-        FTRACE(FPrint( _L("CDunChanMan::DeleteWaiters() (not found) complete" )));
-        return KErrNotFound;
-        }
-
-    TDunWaiterData& waiterData = iWaiterData[aIndex];
-    if ( !aNewOwnership )
-        {
-        delete waiterData.iChannelName;
-        }
-    waiterData.iChannelName = NULL;
-    delete waiterData.iSignalWaiter;
-    waiterData.iSignalWaiter = NULL;
-    delete waiterData.iDataWaiter;
-    waiterData.iDataWaiter = NULL;
-
-    waiterData.iConnMons.Close();
-    waiterData.iOkErrors.Close();
-
-    FTRACE(FPrint( _L("CDunChanMan::DeleteWaiters() complete" )));
-    return KErrNone;
-    }