telephonyprotocols/pdplayer/src/pdp_contention.cpp
author hgs
Tue, 14 Sep 2010 17:55:14 +0100
changeset 69 b982c3e940f3
permissions -rw-r--r--
201035_04
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
69
b982c3e940f3 201035_04
hgs
parents:
diff changeset
     1
// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
b982c3e940f3 201035_04
hgs
parents:
diff changeset
     2
// All rights reserved.
b982c3e940f3 201035_04
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
b982c3e940f3 201035_04
hgs
parents:
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
b982c3e940f3 201035_04
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
b982c3e940f3 201035_04
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
b982c3e940f3 201035_04
hgs
parents:
diff changeset
     7
//
b982c3e940f3 201035_04
hgs
parents:
diff changeset
     8
// Initial Contributors:
b982c3e940f3 201035_04
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    10
//
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    11
// Contributors:
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    12
//
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    13
// Description:
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    14
//
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    15
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    16
/**
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    17
 @file
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    18
 @internalComponent
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    19
*/
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    20
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    21
#include "OstTraceDefinitions.h"
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    22
#ifdef OST_TRACE_COMPILER_IN_USE
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    23
#include "pdp_contentionTraces.h"
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    24
#endif
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    25
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    26
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    27
#include <pdpmcpr.h>
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    28
#include <pdp_contention.h>
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    29
#include <mbmsengine.h>
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    30
#include <etelpckt.h>
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    31
#include <pcktcs.h>
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    32
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    33
CContextTypeChecker::CContextTypeChecker(RPacketService& aPacketService, MContextEventsObserver& aCallback):CActive(EPriorityStandard),
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    34
    iPacketService(aPacketService), iCallback(aCallback)
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    35
    {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    36
    CActiveScheduler::Add(this);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    37
    }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    38
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    39
CContextTypeChecker::~CContextTypeChecker()
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    40
    {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    41
    iContextName = NULL;
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    42
    }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    43
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    44
void CContextTypeChecker::Start(const TName* aContextName)
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    45
    {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    46
    iContextName = aContextName;
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    47
    iPacketService.EnumerateContextsInNif(iStatus, *iContextName, iCountInNif);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    48
    SetActive();
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    49
    }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    50
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    51
void CContextTypeChecker::RunL()
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    52
    {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    53
    User::LeaveIfError(iStatus.Int());
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    54
    if (iCountInNif == 1) // This is a primary context
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    55
        {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    56
        iCallback.PrimaryContextAddedL(iContextName);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    57
        }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    58
    else
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    59
        {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    60
        iCallback.SecondaryContextAdded(iContextName);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    61
        }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    62
    }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    63
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    64
void CContextTypeChecker::DoCancel()
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    65
    {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    66
    iPacketService.CancelAsyncRequest(EPacketEnumerateContextsInNif);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    67
    }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    68
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    69
TInt CContextTypeChecker::RunError(TInt aError)
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    70
    {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    71
    // Report an error
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    72
    iCallback.ContextTypeCheckingError(iContextName, aError);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    73
    return KErrNone; // Make ActiveScheduler happy
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    74
    }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    75
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    76
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    77
CPrimaryContextsMonitor::CPrimaryContextsMonitor(RPacketService& aPacketService, MContentionObserver& aCallback) : CActive(EPriorityStandard),
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    78
    iPacketService(aPacketService), iCallback(aCallback)
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    79
    {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    80
    CActiveScheduler::Add(this);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    81
    }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    82
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    83
CPrimaryContextsMonitor::~CPrimaryContextsMonitor()
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    84
    {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    85
    Cancel();
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    86
    iContextMonitors.ResetAndDestroy();
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    87
    delete iContextTypeChecker;
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    88
    iAddedContextsNames.ResetAndDestroy();
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    89
    }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    90
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    91
void CPrimaryContextsMonitor::StartL()
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    92
    {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    93
    iContextTypeChecker = new(ELeave) CContextTypeChecker(iPacketService, *this);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    94
    iState = EEnumeratingContexts;
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    95
    iPacketService.EnumerateNifs(iStatus, iInitialNifsCount);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    96
    SetActive();
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    97
    }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    98
b982c3e940f3 201035_04
hgs
parents:
diff changeset
    99
void CPrimaryContextsMonitor::PrimaryContextAddedL(const TName* aContextName)
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   100
    {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   101
    // Create new status monitor for this context
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   102
    StartContextStatusMonitoringL(*aContextName);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   103
    RemoveContextNameAndCheckNext(aContextName);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   104
    }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   105
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   106
void CPrimaryContextsMonitor::SecondaryContextAdded(const TName* aContextName)
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   107
    {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   108
    // This is not a primary context, just delete its name.
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   109
    RemoveContextNameAndCheckNext(aContextName);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   110
    }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   111
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   112
void CPrimaryContextsMonitor::RemoveContextNameAndCheckNext(const TName* aContextName)
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   113
    {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   114
    TInt nameIndex = iAddedContextsNames.Find(aContextName);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   115
    __ASSERT_DEBUG(nameIndex != KErrNotFound, User::Invariant());
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   116
    delete iAddedContextsNames[nameIndex];
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   117
    iAddedContextsNames.Remove(nameIndex);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   118
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   119
    if (iAddedContextsNames.Count() > 1)
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   120
        // Should be more than one here, coz we are waiting for new context added all the time,
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   121
        // so the last one item is always empty.
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   122
        {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   123
        iContextTypeChecker->Start(iAddedContextsNames[0]);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   124
        }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   125
    }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   126
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   127
void CPrimaryContextsMonitor::PrimaryContextDeleted(const CContextStatusMonitor* aContextStatusMonitor)
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   128
    {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   129
    if (aContextStatusMonitor->IsPassedThroughActiveState())
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   130
        {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   131
        iCallback.ContentionResolved();
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   132
        }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   133
    DeleteContextStatusMonitor(aContextStatusMonitor);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   134
    }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   135
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   136
void CPrimaryContextsMonitor::ContextTypeCheckingError(const TName* aContextName, TInt aError)
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   137
    {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   138
    RemoveContextNameAndCheckNext(aContextName);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   139
    ProcessError(aError);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   140
    }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   141
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   142
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   143
void CPrimaryContextsMonitor::ContextMonitoringError(const CContextStatusMonitor* aContextStatusMonitor, TInt aError)
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   144
    {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   145
    DeleteContextStatusMonitor(aContextStatusMonitor);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   146
    ProcessError(aError);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   147
    }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   148
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   149
void CPrimaryContextsMonitor::DeleteContextStatusMonitor(const CContextStatusMonitor* aContextStatusMonitor)
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   150
    {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   151
    TInt monitorIndex = iContextMonitors.Find(aContextStatusMonitor);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   152
    __ASSERT_DEBUG(monitorIndex != KErrNotFound, User::Invariant());
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   153
    delete iContextMonitors[monitorIndex];
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   154
    iContextMonitors.Remove(monitorIndex);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   155
    }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   156
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   157
void CPrimaryContextsMonitor::ProcessError(TInt aError)
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   158
    {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   159
    __ASSERT_DEBUG(aError != KErrNone, User::Invariant());
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   160
    OstTraceDef1(OST_TRACE_CATEGORY_DEBUG, TRACE_INTERNALS, CPRIMARYCONTEXTSMONITOR_PROCESSERROR_1, ("PDP context monitoring error: %d"), aError);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   161
    (void)aError;  //needed for debug builds 
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   162
    }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   163
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   164
void CPrimaryContextsMonitor::RunL()
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   165
    {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   166
    User::LeaveIfError(iStatus.Int());
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   167
    SwitchStateL();
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   168
    RPacketService::TNifInfoV2Pckg nifInfoV2Pckg(iCurrentNifInfo);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   169
    switch(iState)
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   170
        {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   171
        case EGettingInfo:
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   172
            StartContextStatusMonitoringL(iCurrentNifInfo.iContextName);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   173
            iPacketService.GetNifInfo(iStatus, iCurrentNifIndex, nifInfoV2Pckg);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   174
            ++iCurrentNifIndex;
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   175
            SetActive();
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   176
            break;
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   177
        case EListening:
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   178
            // All functions in RPacketService and RPacketContext,
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   179
            // that can be used to check if context is primary, are asynchronous.
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   180
            // We could not call them here, coz can miss some events from NotifyContextAdded
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   181
            // So subscribe to NotifyContextAdded as soon as possible and check context
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   182
            // type using CContextTypeChecker active object
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   183
            TName *contextName = new (ELeave) TName;
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   184
            CleanupStack::PushL(contextName);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   185
            iAddedContextsNames.AppendL(contextName);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   186
            CleanupStack::Pop(contextName);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   187
            // subscribe to NotifyContextAdded
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   188
            iPacketService.NotifyContextAdded(iStatus, *contextName);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   189
            SetActive();
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   190
            // if there are any items in iAddedContextsNames except that one that has been added above, i.e count > 1
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   191
            // starting asynchronous context type checking
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   192
            if (!iContextTypeChecker->IsActive() && iAddedContextsNames.Count()>1)
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   193
                {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   194
                iContextTypeChecker->Start(iAddedContextsNames[0]);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   195
                }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   196
            break;
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   197
        }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   198
    }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   199
void CPrimaryContextsMonitor::DoCancel()
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   200
    {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   201
    switch(iState)
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   202
        {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   203
        case EEnumeratingContexts:
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   204
            iPacketService.CancelAsyncRequest(EPacketEnumerateNifs);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   205
            break;
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   206
        case EGettingInfo:
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   207
            iPacketService.CancelAsyncRequest(EPacketGetNifInfo);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   208
            break;
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   209
        case EListening:
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   210
            iPacketService.CancelAsyncRequest(EPacketNotifyContextAdded);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   211
            break;
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   212
        }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   213
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   214
    }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   215
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   216
TInt CPrimaryContextsMonitor::RunError(TInt aError)
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   217
    {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   218
    // Process an error
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   219
    ProcessError(aError);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   220
    return KErrNone; // Make ActiveScheduler happy
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   221
    }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   222
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   223
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   224
void CPrimaryContextsMonitor::SwitchStateL()
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   225
    {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   226
    if (iState == EEnumeratingContexts)
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   227
        {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   228
        if (iInitialNifsCount > 0)
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   229
            {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   230
            iState = EGettingInfo;
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   231
            }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   232
        else
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   233
            {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   234
            iState = EListening;
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   235
            }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   236
        }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   237
    else if (iState == EGettingInfo && iCurrentNifIndex == iInitialNifsCount)
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   238
        {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   239
        StartContextStatusMonitoringL(iCurrentNifInfo.iContextName);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   240
        iState = EListening;
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   241
        }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   242
    }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   243
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   244
void CPrimaryContextsMonitor::StartContextStatusMonitoringL(const TName& aContextName)
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   245
    {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   246
    CContextStatusMonitor* newStatusMonitor = new (ELeave) CContextStatusMonitor(iPacketService, *this);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   247
    CleanupStack::PushL(newStatusMonitor);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   248
    iContextMonitors.AppendL(newStatusMonitor);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   249
    CleanupStack::Pop(newStatusMonitor);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   250
    newStatusMonitor->StartL(aContextName);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   251
    }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   252
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   253
CContextStatusMonitor::CContextStatusMonitor(RPacketService& aPacketService, MContextEventsObserver& aCallback):CActive(EPriorityStandard),
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   254
    iPacketService(aPacketService), iCallback(aCallback)
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   255
    {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   256
    CActiveScheduler::Add(this);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   257
    }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   258
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   259
CContextStatusMonitor::~CContextStatusMonitor()
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   260
    {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   261
    Cancel();
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   262
    iPacketContext.Close();
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   263
    }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   264
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   265
TBool CContextStatusMonitor::StartL(const TName& aContextName)
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   266
    {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   267
    iContextName.Copy(aContextName);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   268
    User::LeaveIfError(iPacketContext.OpenExistingContext(iPacketService, iContextName));
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   269
    User::LeaveIfError(iPacketContext.GetStatus(iContextStatus));
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   270
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   271
    if (iContextStatus == RPacketContext::EStatusDeleted)
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   272
        {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   273
        return EFalse;
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   274
        }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   275
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   276
    if (iContextStatus == RPacketContext::EStatusActive ||
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   277
        iContextStatus == RPacketContext::EStatusSuspended ||
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   278
        iContextStatus == RPacketContext::EStatusDeactivating)
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   279
        {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   280
        iWasActive = ETrue;
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   281
        }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   282
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   283
    iPacketContext.NotifyStatusChange(iStatus, iContextStatus);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   284
    SetActive();
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   285
    return ETrue;
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   286
    }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   287
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   288
void CContextStatusMonitor::RunL()
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   289
    {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   290
    User::LeaveIfError(iStatus.Int());
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   291
    if (iContextStatus == RPacketContext::EStatusActive)
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   292
        {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   293
        iWasActive = ETrue;
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   294
        }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   295
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   296
    if (iContextStatus == RPacketContext::EStatusDeleted)
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   297
        {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   298
        iPacketContext.CancelAsyncRequest(EPacketContextNotifyStatusChange);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   299
        iCallback.PrimaryContextDeleted(this);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   300
        }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   301
    else
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   302
        {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   303
        iPacketContext.NotifyStatusChange(iStatus, iContextStatus);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   304
        SetActive();
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   305
        }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   306
    }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   307
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   308
void CContextStatusMonitor::DoCancel()
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   309
    {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   310
    iPacketContext.CancelAsyncRequest(EPacketContextNotifyStatusChange);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   311
    }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   312
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   313
TInt CContextStatusMonitor::RunError(TInt aError)
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   314
    {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   315
    iCallback.ContextMonitoringError(this, aError);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   316
    return KErrNone;
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   317
    }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   318
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   319
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   320
CPdpContentionManager* CPdpContentionManager::NewL(const ESock::CTierManagerBase& aTierManager, RPacketService& aPacketService)
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   321
    {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   322
    CPdpContentionManager* self = new (ELeave) CPdpContentionManager(aTierManager);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   323
    CleanupStack::PushL(self);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   324
    self->ConstructL(aPacketService);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   325
    CleanupStack::Pop(self);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   326
    return self;
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   327
    }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   328
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   329
CPdpContentionManager::CPdpContentionManager(const ESock::CTierManagerBase& aTierManager):
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   330
CContentionManager(aTierManager)
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   331
    {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   332
    }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   333
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   334
CPdpContentionManager::~CPdpContentionManager()
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   335
    {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   336
    delete iPrimaryContextsMonitor;
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   337
    }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   338
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   339
void CPdpContentionManager::ConstructL(RPacketService& aPacketService)
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   340
    {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   341
    iPrimaryContextsMonitor = new (ELeave) CPrimaryContextsMonitor(aPacketService, *this);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   342
    }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   343
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   344
void CPdpContentionManager::StartMonitoringL()
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   345
    {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   346
    if (iPrimaryContextsMonitor)
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   347
        {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   348
        iPrimaryContextsMonitor->StartL();
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   349
        }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   350
    }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   351
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   352
void CPdpContentionManager::ContentionResolved(const TContentionRequestItem& aContentionRequest, TBool aResult)
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   353
    {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   354
    CPdpMetaConnectionProvider* pdpMcpr = static_cast<CPdpMetaConnectionProvider*>(aContentionRequest.iMcpr);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   355
    
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   356
    pdpMcpr->ContentionResolved(aContentionRequest.iPendingCprId, aResult);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   357
    }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   358
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   359
void CPdpContentionManager::ContentionOccured(ESock::CMetaConnectionProviderBase& aMcpr)
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   360
    {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   361
    CPdpMetaConnectionProvider& pdpMcpr = static_cast<CPdpMetaConnectionProvider&>(aMcpr);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   362
    
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   363
    pdpMcpr.ContentionOccured();
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   364
    }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   365
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   366
void CPdpContentionManager::ReportContentionAvailabilityStatus(ESock::CMetaConnectionProviderBase& aMcpr, const ESock::TAvailabilityStatus& aStatus) const
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   367
    {
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   368
    CPdpMetaConnectionProvider& pdpMcpr = static_cast<CPdpMetaConnectionProvider&>(aMcpr);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   369
    
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   370
    pdpMcpr.ReportContentionAvailabilityStatus(aStatus);
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   371
    }
b982c3e940f3 201035_04
hgs
parents:
diff changeset
   372