connectionmonitoring/connmon/connectionmonitor/src/connmonasyncstopdaemon.cpp
author hgs
Wed, 27 Oct 2010 17:51:11 +0300
changeset 71 9f263f780e41
permissions -rw-r--r--
201039_1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
71
9f263f780e41 201039_1
hgs
parents:
diff changeset
     1
/*
9f263f780e41 201039_1
hgs
parents:
diff changeset
     2
* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
9f263f780e41 201039_1
hgs
parents:
diff changeset
     3
* All rights reserved.
9f263f780e41 201039_1
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
9f263f780e41 201039_1
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
9f263f780e41 201039_1
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
9f263f780e41 201039_1
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
9f263f780e41 201039_1
hgs
parents:
diff changeset
     8
*
9f263f780e41 201039_1
hgs
parents:
diff changeset
     9
* Initial Contributors:
9f263f780e41 201039_1
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
9f263f780e41 201039_1
hgs
parents:
diff changeset
    11
*
9f263f780e41 201039_1
hgs
parents:
diff changeset
    12
* Contributors:
9f263f780e41 201039_1
hgs
parents:
diff changeset
    13
*
9f263f780e41 201039_1
hgs
parents:
diff changeset
    14
* Description:  Active object that starts a connection stop operation
9f263f780e41 201039_1
hgs
parents:
diff changeset
    15
*               in a new thread and waits for it to complete.
9f263f780e41 201039_1
hgs
parents:
diff changeset
    16
*/
9f263f780e41 201039_1
hgs
parents:
diff changeset
    17
9f263f780e41 201039_1
hgs
parents:
diff changeset
    18
#include "ConnMonIAP.h"
9f263f780e41 201039_1
hgs
parents:
diff changeset
    19
#include "CPsdFax.h"
9f263f780e41 201039_1
hgs
parents:
diff changeset
    20
#include "connmonasyncstopdaemon.h"
9f263f780e41 201039_1
hgs
parents:
diff changeset
    21
#include "log.h"
9f263f780e41 201039_1
hgs
parents:
diff changeset
    22
9f263f780e41 201039_1
hgs
parents:
diff changeset
    23
TAsyncStopThreadData::TAsyncStopThreadData(
9f263f780e41 201039_1
hgs
parents:
diff changeset
    24
        TUint32 aIapId,
9f263f780e41 201039_1
hgs
parents:
diff changeset
    25
        TUint32 aNetId )
9f263f780e41 201039_1
hgs
parents:
diff changeset
    26
        :
9f263f780e41 201039_1
hgs
parents:
diff changeset
    27
        iIapId( aIapId ),
9f263f780e41 201039_1
hgs
parents:
diff changeset
    28
        iNetId( aNetId )
9f263f780e41 201039_1
hgs
parents:
diff changeset
    29
    {
9f263f780e41 201039_1
hgs
parents:
diff changeset
    30
    iStep = 0;
9f263f780e41 201039_1
hgs
parents:
diff changeset
    31
    iErrorCode = 0;
9f263f780e41 201039_1
hgs
parents:
diff changeset
    32
    }
9f263f780e41 201039_1
hgs
parents:
diff changeset
    33
9f263f780e41 201039_1
hgs
parents:
diff changeset
    34
9f263f780e41 201039_1
hgs
parents:
diff changeset
    35
TInt ConnectionStopThreadFunction( TAny* aPtr )
9f263f780e41 201039_1
hgs
parents:
diff changeset
    36
    {
9f263f780e41 201039_1
hgs
parents:
diff changeset
    37
    TInt err( KErrNone );
9f263f780e41 201039_1
hgs
parents:
diff changeset
    38
    TAsyncStopThreadData* threadData = (TAsyncStopThreadData*)aPtr;
9f263f780e41 201039_1
hgs
parents:
diff changeset
    39
9f263f780e41 201039_1
hgs
parents:
diff changeset
    40
    RSocketServ socketServer;
9f263f780e41 201039_1
hgs
parents:
diff changeset
    41
    RConnection connection;
9f263f780e41 201039_1
hgs
parents:
diff changeset
    42
    TConnectionInfo info;
9f263f780e41 201039_1
hgs
parents:
diff changeset
    43
9f263f780e41 201039_1
hgs
parents:
diff changeset
    44
    err = socketServer.Connect( KCmESockMessageSlots );
9f263f780e41 201039_1
hgs
parents:
diff changeset
    45
    threadData->iErrorCode = err;
9f263f780e41 201039_1
hgs
parents:
diff changeset
    46
    if ( !err )
9f263f780e41 201039_1
hgs
parents:
diff changeset
    47
        {
9f263f780e41 201039_1
hgs
parents:
diff changeset
    48
        err = connection.Open( socketServer, KAfInet );
9f263f780e41 201039_1
hgs
parents:
diff changeset
    49
        threadData->iStep++; // Step 1
9f263f780e41 201039_1
hgs
parents:
diff changeset
    50
        threadData->iErrorCode = err;
9f263f780e41 201039_1
hgs
parents:
diff changeset
    51
        if ( !err )
9f263f780e41 201039_1
hgs
parents:
diff changeset
    52
            {
9f263f780e41 201039_1
hgs
parents:
diff changeset
    53
            info.iIapId = threadData->iIapId;
9f263f780e41 201039_1
hgs
parents:
diff changeset
    54
            info.iNetId = threadData->iNetId;
9f263f780e41 201039_1
hgs
parents:
diff changeset
    55
            err = connection.Attach(
9f263f780e41 201039_1
hgs
parents:
diff changeset
    56
                    TPckg<TConnectionInfo>( info ),
9f263f780e41 201039_1
hgs
parents:
diff changeset
    57
                    RConnection::EAttachTypeNormal );
9f263f780e41 201039_1
hgs
parents:
diff changeset
    58
            threadData->iStep++; // Step 2
9f263f780e41 201039_1
hgs
parents:
diff changeset
    59
            threadData->iErrorCode = err;
9f263f780e41 201039_1
hgs
parents:
diff changeset
    60
            if ( !err )
9f263f780e41 201039_1
hgs
parents:
diff changeset
    61
                {
9f263f780e41 201039_1
hgs
parents:
diff changeset
    62
                err = connection.Stop( RConnection::EStopAuthoritative );
9f263f780e41 201039_1
hgs
parents:
diff changeset
    63
                threadData->iStep++; // Step 3
9f263f780e41 201039_1
hgs
parents:
diff changeset
    64
                threadData->iErrorCode = err;
9f263f780e41 201039_1
hgs
parents:
diff changeset
    65
                }
9f263f780e41 201039_1
hgs
parents:
diff changeset
    66
            connection.Close();
9f263f780e41 201039_1
hgs
parents:
diff changeset
    67
            }
9f263f780e41 201039_1
hgs
parents:
diff changeset
    68
        socketServer.Close();
9f263f780e41 201039_1
hgs
parents:
diff changeset
    69
        }
9f263f780e41 201039_1
hgs
parents:
diff changeset
    70
9f263f780e41 201039_1
hgs
parents:
diff changeset
    71
    return err;
9f263f780e41 201039_1
hgs
parents:
diff changeset
    72
    }
9f263f780e41 201039_1
hgs
parents:
diff changeset
    73
9f263f780e41 201039_1
hgs
parents:
diff changeset
    74
CConnMonAsyncStopDaemon* CConnMonAsyncStopDaemon::NewL( CConnMonIAP* aIap )
9f263f780e41 201039_1
hgs
parents:
diff changeset
    75
    {
9f263f780e41 201039_1
hgs
parents:
diff changeset
    76
    CConnMonAsyncStopDaemon* self = CConnMonAsyncStopDaemon::NewLC( aIap );
9f263f780e41 201039_1
hgs
parents:
diff changeset
    77
    CleanupStack::Pop( self );
9f263f780e41 201039_1
hgs
parents:
diff changeset
    78
    return self;
9f263f780e41 201039_1
hgs
parents:
diff changeset
    79
    }
9f263f780e41 201039_1
hgs
parents:
diff changeset
    80
9f263f780e41 201039_1
hgs
parents:
diff changeset
    81
CConnMonAsyncStopDaemon* CConnMonAsyncStopDaemon::NewLC( CConnMonIAP* aIap )
9f263f780e41 201039_1
hgs
parents:
diff changeset
    82
    {
9f263f780e41 201039_1
hgs
parents:
diff changeset
    83
    CConnMonAsyncStopDaemon* self = new( ELeave ) CConnMonAsyncStopDaemon( aIap );
9f263f780e41 201039_1
hgs
parents:
diff changeset
    84
    CleanupStack::PushL( self );
9f263f780e41 201039_1
hgs
parents:
diff changeset
    85
    self->Construct();
9f263f780e41 201039_1
hgs
parents:
diff changeset
    86
    return self;
9f263f780e41 201039_1
hgs
parents:
diff changeset
    87
    }
9f263f780e41 201039_1
hgs
parents:
diff changeset
    88
9f263f780e41 201039_1
hgs
parents:
diff changeset
    89
CConnMonAsyncStopDaemon::~CConnMonAsyncStopDaemon()
9f263f780e41 201039_1
hgs
parents:
diff changeset
    90
    {
9f263f780e41 201039_1
hgs
parents:
diff changeset
    91
    LOGENTRFN("~CConnMonAsyncStopDaemon()")
9f263f780e41 201039_1
hgs
parents:
diff changeset
    92
    // Must not be active at this point. Can't be cancelled.
9f263f780e41 201039_1
hgs
parents:
diff changeset
    93
9f263f780e41 201039_1
hgs
parents:
diff changeset
    94
    delete iData;
9f263f780e41 201039_1
hgs
parents:
diff changeset
    95
    iData = NULL;
9f263f780e41 201039_1
hgs
parents:
diff changeset
    96
9f263f780e41 201039_1
hgs
parents:
diff changeset
    97
    LOGEXITFN("~CConnMonAsyncStopDaemon()")
9f263f780e41 201039_1
hgs
parents:
diff changeset
    98
    }
9f263f780e41 201039_1
hgs
parents:
diff changeset
    99
9f263f780e41 201039_1
hgs
parents:
diff changeset
   100
CConnMonAsyncStopDaemon::CConnMonAsyncStopDaemon( CConnMonIAP* aIap )
9f263f780e41 201039_1
hgs
parents:
diff changeset
   101
        :
9f263f780e41 201039_1
hgs
parents:
diff changeset
   102
        CActive( EConnMonPriorityHigh ),
9f263f780e41 201039_1
hgs
parents:
diff changeset
   103
        iIap( aIap ),
9f263f780e41 201039_1
hgs
parents:
diff changeset
   104
        iPsdFax( NULL ),
9f263f780e41 201039_1
hgs
parents:
diff changeset
   105
        iData( NULL ),
9f263f780e41 201039_1
hgs
parents:
diff changeset
   106
        iConnectionType( EConnMonStopTypeUnknown ),
9f263f780e41 201039_1
hgs
parents:
diff changeset
   107
        iConnectionId( 0 )
9f263f780e41 201039_1
hgs
parents:
diff changeset
   108
    {
9f263f780e41 201039_1
hgs
parents:
diff changeset
   109
    }
9f263f780e41 201039_1
hgs
parents:
diff changeset
   110
9f263f780e41 201039_1
hgs
parents:
diff changeset
   111
void CConnMonAsyncStopDaemon::Construct()
9f263f780e41 201039_1
hgs
parents:
diff changeset
   112
    {
9f263f780e41 201039_1
hgs
parents:
diff changeset
   113
    //LOGENTRFN("CConnMonAsyncStopDaemon::Construct()")
9f263f780e41 201039_1
hgs
parents:
diff changeset
   114
    CActiveScheduler::Add( this );
9f263f780e41 201039_1
hgs
parents:
diff changeset
   115
    //LOGEXITFN("CConnMonAsyncStopDaemon::Construct()")
9f263f780e41 201039_1
hgs
parents:
diff changeset
   116
    }
9f263f780e41 201039_1
hgs
parents:
diff changeset
   117
9f263f780e41 201039_1
hgs
parents:
diff changeset
   118
TInt CConnMonAsyncStopDaemon::Start( TUint aConnectionId, TUint32 aIapId, TUint32 aNetId )
9f263f780e41 201039_1
hgs
parents:
diff changeset
   119
    {
9f263f780e41 201039_1
hgs
parents:
diff changeset
   120
    LOGENTRFN("CConnMonAsyncStopDaemon::Start()")
9f263f780e41 201039_1
hgs
parents:
diff changeset
   121
    TInt err( KErrNone );
9f263f780e41 201039_1
hgs
parents:
diff changeset
   122
    iConnectionType = EConnMonStopTypeInternal;
9f263f780e41 201039_1
hgs
parents:
diff changeset
   123
    iConnectionId = aConnectionId;
9f263f780e41 201039_1
hgs
parents:
diff changeset
   124
9f263f780e41 201039_1
hgs
parents:
diff changeset
   125
    LOGIT3("Starting async stop daemon, id %d, iap id %d, net id %d", aConnectionId, aIapId, aNetId)
9f263f780e41 201039_1
hgs
parents:
diff changeset
   126
    iData = new TAsyncStopThreadData( aIapId, aNetId );
9f263f780e41 201039_1
hgs
parents:
diff changeset
   127
    if ( !iData )
9f263f780e41 201039_1
hgs
parents:
diff changeset
   128
        {
9f263f780e41 201039_1
hgs
parents:
diff changeset
   129
        err = KErrNoMemory;
9f263f780e41 201039_1
hgs
parents:
diff changeset
   130
        LOGEXITFN1("CConnMonAsyncStopDaemon::Start()", err)
9f263f780e41 201039_1
hgs
parents:
diff changeset
   131
        return err;
9f263f780e41 201039_1
hgs
parents:
diff changeset
   132
        }
9f263f780e41 201039_1
hgs
parents:
diff changeset
   133
9f263f780e41 201039_1
hgs
parents:
diff changeset
   134
    _LIT( KTempName, "connmonstop%d" );
9f263f780e41 201039_1
hgs
parents:
diff changeset
   135
    TBuf<KConnMonSmallBufferLen> name;
9f263f780e41 201039_1
hgs
parents:
diff changeset
   136
    name.Format( KTempName(), iConnectionId );
9f263f780e41 201039_1
hgs
parents:
diff changeset
   137
9f263f780e41 201039_1
hgs
parents:
diff changeset
   138
    RThread thread;
9f263f780e41 201039_1
hgs
parents:
diff changeset
   139
    err = thread.Create(
9f263f780e41 201039_1
hgs
parents:
diff changeset
   140
            name,
9f263f780e41 201039_1
hgs
parents:
diff changeset
   141
            ConnectionStopThreadFunction,
9f263f780e41 201039_1
hgs
parents:
diff changeset
   142
            KCmStopThreadStackSize,
9f263f780e41 201039_1
hgs
parents:
diff changeset
   143
            NULL,
9f263f780e41 201039_1
hgs
parents:
diff changeset
   144
            reinterpret_cast<TAny*>( iData ) );
9f263f780e41 201039_1
hgs
parents:
diff changeset
   145
    LOGIT1("CConnMonAsyncStopDaemon::Start(): Thread created <%d>", err)
9f263f780e41 201039_1
hgs
parents:
diff changeset
   146
9f263f780e41 201039_1
hgs
parents:
diff changeset
   147
    if ( !err )
9f263f780e41 201039_1
hgs
parents:
diff changeset
   148
        {
9f263f780e41 201039_1
hgs
parents:
diff changeset
   149
        thread.Logon( iStatus );
9f263f780e41 201039_1
hgs
parents:
diff changeset
   150
        SetActive();
9f263f780e41 201039_1
hgs
parents:
diff changeset
   151
        thread.Resume();
9f263f780e41 201039_1
hgs
parents:
diff changeset
   152
        }
9f263f780e41 201039_1
hgs
parents:
diff changeset
   153
9f263f780e41 201039_1
hgs
parents:
diff changeset
   154
    LOGEXITFN1("CConnMonAsyncStopDaemon::Start()", err)
9f263f780e41 201039_1
hgs
parents:
diff changeset
   155
    return err;
9f263f780e41 201039_1
hgs
parents:
diff changeset
   156
    }
9f263f780e41 201039_1
hgs
parents:
diff changeset
   157
9f263f780e41 201039_1
hgs
parents:
diff changeset
   158
TInt CConnMonAsyncStopDaemon::Start( const TUint aConnectionId, CPsdFax* aPsdFax )
9f263f780e41 201039_1
hgs
parents:
diff changeset
   159
    {
9f263f780e41 201039_1
hgs
parents:
diff changeset
   160
    LOGENTRFN("CConnMonAsyncStopDaemon::Start()")
9f263f780e41 201039_1
hgs
parents:
diff changeset
   161
    TInt err( KErrNone );
9f263f780e41 201039_1
hgs
parents:
diff changeset
   162
    iConnectionType = EConnMonStopTypeExternalPsd;
9f263f780e41 201039_1
hgs
parents:
diff changeset
   163
    iConnectionId = aConnectionId;
9f263f780e41 201039_1
hgs
parents:
diff changeset
   164
    iPsdFax = aPsdFax;
9f263f780e41 201039_1
hgs
parents:
diff changeset
   165
9f263f780e41 201039_1
hgs
parents:
diff changeset
   166
    err = iPsdFax->Stop( aConnectionId, iStatus );
9f263f780e41 201039_1
hgs
parents:
diff changeset
   167
    if ( !err )
9f263f780e41 201039_1
hgs
parents:
diff changeset
   168
        {
9f263f780e41 201039_1
hgs
parents:
diff changeset
   169
        SetActive();
9f263f780e41 201039_1
hgs
parents:
diff changeset
   170
        }
9f263f780e41 201039_1
hgs
parents:
diff changeset
   171
9f263f780e41 201039_1
hgs
parents:
diff changeset
   172
    LOGEXITFN1("CConnMonAsyncStopDaemon::Start()", err)
9f263f780e41 201039_1
hgs
parents:
diff changeset
   173
    return err;
9f263f780e41 201039_1
hgs
parents:
diff changeset
   174
    }
9f263f780e41 201039_1
hgs
parents:
diff changeset
   175
9f263f780e41 201039_1
hgs
parents:
diff changeset
   176
void CConnMonAsyncStopDaemon::DoCancel()
9f263f780e41 201039_1
hgs
parents:
diff changeset
   177
    {
9f263f780e41 201039_1
hgs
parents:
diff changeset
   178
    LOGENTRFN("CConnMonAsyncStopDaemon::DoCancel()")
9f263f780e41 201039_1
hgs
parents:
diff changeset
   179
    
9f263f780e41 201039_1
hgs
parents:
diff changeset
   180
    // The cancel process is synchronous from OS side, and can't be cancelled.
9f263f780e41 201039_1
hgs
parents:
diff changeset
   181
    // There could also be multiple clients waiting for the same connection stop process.
9f263f780e41 201039_1
hgs
parents:
diff changeset
   182
    
9f263f780e41 201039_1
hgs
parents:
diff changeset
   183
    LOGEXITFN("CConnMonAsyncStopDaemon::DoCancel()")
9f263f780e41 201039_1
hgs
parents:
diff changeset
   184
    }
9f263f780e41 201039_1
hgs
parents:
diff changeset
   185
9f263f780e41 201039_1
hgs
parents:
diff changeset
   186
// -----------------------------------------------------------------------------
9f263f780e41 201039_1
hgs
parents:
diff changeset
   187
// CConnMonAsyncStopDaemon::RunL
9f263f780e41 201039_1
hgs
parents:
diff changeset
   188
// When the separate thread closes the connection and finishes executing,
9f263f780e41 201039_1
hgs
parents:
diff changeset
   189
// logon-operation completes and this RunL is executed by active scheduler.
9f263f780e41 201039_1
hgs
parents:
diff changeset
   190
// Since this is a oneshot active object, the RunL will delete itself at the end.
9f263f780e41 201039_1
hgs
parents:
diff changeset
   191
// -----------------------------------------------------------------------------
9f263f780e41 201039_1
hgs
parents:
diff changeset
   192
//
9f263f780e41 201039_1
hgs
parents:
diff changeset
   193
void CConnMonAsyncStopDaemon::RunL()
9f263f780e41 201039_1
hgs
parents:
diff changeset
   194
    {
9f263f780e41 201039_1
hgs
parents:
diff changeset
   195
    LOGIT(".")
9f263f780e41 201039_1
hgs
parents:
diff changeset
   196
    LOGIT2("RunL: CConnMonAsyncStopDaemon, status %d, stop type %d", iStatus.Int(), iConnectionType)
9f263f780e41 201039_1
hgs
parents:
diff changeset
   197
9f263f780e41 201039_1
hgs
parents:
diff changeset
   198
    if ( iData )
9f263f780e41 201039_1
hgs
parents:
diff changeset
   199
        {
9f263f780e41 201039_1
hgs
parents:
diff changeset
   200
        LOGIT2("Thread steps done %d/3, err <%d>", iData->iStep, iData->iErrorCode)
9f263f780e41 201039_1
hgs
parents:
diff changeset
   201
        }
9f263f780e41 201039_1
hgs
parents:
diff changeset
   202
9f263f780e41 201039_1
hgs
parents:
diff changeset
   203
    iIap->CompleteAsyncStopReqs( iConnectionId, iStatus.Int() );
9f263f780e41 201039_1
hgs
parents:
diff changeset
   204
9f263f780e41 201039_1
hgs
parents:
diff changeset
   205
    switch ( iConnectionType )
9f263f780e41 201039_1
hgs
parents:
diff changeset
   206
        {
9f263f780e41 201039_1
hgs
parents:
diff changeset
   207
        case EConnMonStopTypeInternal:
9f263f780e41 201039_1
hgs
parents:
diff changeset
   208
            iIap->CleanupConnectionInfo( iConnectionId );
9f263f780e41 201039_1
hgs
parents:
diff changeset
   209
            break;
9f263f780e41 201039_1
hgs
parents:
diff changeset
   210
        case EConnMonStopTypeExternalPsd:
9f263f780e41 201039_1
hgs
parents:
diff changeset
   211
            iPsdFax->CleanupConnectionInfo( iConnectionId );
9f263f780e41 201039_1
hgs
parents:
diff changeset
   212
            break;
9f263f780e41 201039_1
hgs
parents:
diff changeset
   213
        default:
9f263f780e41 201039_1
hgs
parents:
diff changeset
   214
            // error
9f263f780e41 201039_1
hgs
parents:
diff changeset
   215
            break;
9f263f780e41 201039_1
hgs
parents:
diff changeset
   216
        }
9f263f780e41 201039_1
hgs
parents:
diff changeset
   217
9f263f780e41 201039_1
hgs
parents:
diff changeset
   218
    delete this;
9f263f780e41 201039_1
hgs
parents:
diff changeset
   219
    }
9f263f780e41 201039_1
hgs
parents:
diff changeset
   220
9f263f780e41 201039_1
hgs
parents:
diff changeset
   221
// End of file