taskswitcher/server/src/tsstorage.cpp
author hgs
Mon, 13 Sep 2010 13:26:33 +0300
changeset 116 305818acdca4
child 119 50e220be30d1
permissions -rw-r--r--
201036
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
116
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
#include <tstaskmonitorglobals.h>
hgs
parents:
diff changeset
    18
#include "tsstorage.h"
hgs
parents:
diff changeset
    19
#include "tsmodelitemkeymsg.h"
hgs
parents:
diff changeset
    20
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    21
/**
hgs
parents:
diff changeset
    22
 * Two phase construction. Create and initialize storage instance.
hgs
parents:
diff changeset
    23
 * @param aDataProviders - list of data providers
hgs
parents:
diff changeset
    24
 * @return storage instane
hgs
parents:
diff changeset
    25
 */
hgs
parents:
diff changeset
    26
CTsStorage* CTsStorage::NewL(const TArray<MTsModel*> &aDataProviders)
hgs
parents:
diff changeset
    27
    {
hgs
parents:
diff changeset
    28
    CTsStorage* self = new(ELeave) CTsStorage();
hgs
parents:
diff changeset
    29
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
    30
    self->ConstructL( aDataProviders );
hgs
parents:
diff changeset
    31
    CleanupStack::Pop( self );
hgs
parents:
diff changeset
    32
    return self;
hgs
parents:
diff changeset
    33
    }
hgs
parents:
diff changeset
    34
hgs
parents:
diff changeset
    35
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    36
/**
hgs
parents:
diff changeset
    37
 * Destructor. Function cancel subscribtion for data change notyfications
hgs
parents:
diff changeset
    38
 */
hgs
parents:
diff changeset
    39
CTsStorage::~CTsStorage()
hgs
parents:
diff changeset
    40
    {
hgs
parents:
diff changeset
    41
    for( TInt iter(0); iter < iDataProviders.Count(); ++iter )
hgs
parents:
diff changeset
    42
        {
hgs
parents:
diff changeset
    43
        iDataProviders[iter]->SetObserver( 0 );
hgs
parents:
diff changeset
    44
        }
hgs
parents:
diff changeset
    45
    iData.Close();
hgs
parents:
diff changeset
    46
    }
hgs
parents:
diff changeset
    47
hgs
parents:
diff changeset
    48
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    49
/**
hgs
parents:
diff changeset
    50
 * First phase construction.
hgs
parents:
diff changeset
    51
 */
hgs
parents:
diff changeset
    52
CTsStorage::CTsStorage()
hgs
parents:
diff changeset
    53
    {
hgs
parents:
diff changeset
    54
    //No implementation required
hgs
parents:
diff changeset
    55
    }
hgs
parents:
diff changeset
    56
hgs
parents:
diff changeset
    57
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    58
/**
hgs
parents:
diff changeset
    59
 * Second phase construction. Function make subscribtion for data changes notifications
hgs
parents:
diff changeset
    60
 * @param aDataProviders - list of data providers
hgs
parents:
diff changeset
    61
 */
hgs
parents:
diff changeset
    62
void CTsStorage::ConstructL( const TArray<MTsModel*> &aDataProviders )
hgs
parents:
diff changeset
    63
    {
hgs
parents:
diff changeset
    64
    for (TInt iter(0); iter < aDataProviders.Count(); ++iter)
hgs
parents:
diff changeset
    65
        {
hgs
parents:
diff changeset
    66
        iDataProviders.AppendL( aDataProviders[iter] );
hgs
parents:
diff changeset
    67
        aDataProviders[iter]->SetObserver( this );
hgs
parents:
diff changeset
    68
        }
hgs
parents:
diff changeset
    69
    }
hgs
parents:
diff changeset
    70
hgs
parents:
diff changeset
    71
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    72
/**
hgs
parents:
diff changeset
    73
 * Interface implementation
hgs
parents:
diff changeset
    74
 * @see MTsDataObserver::DataChanged()
hgs
parents:
diff changeset
    75
 */
hgs
parents:
diff changeset
    76
void CTsStorage::DataChanged()
hgs
parents:
diff changeset
    77
    {
hgs
parents:
diff changeset
    78
    ResetModel();
hgs
parents:
diff changeset
    79
    }
hgs
parents:
diff changeset
    80
hgs
parents:
diff changeset
    81
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    82
TBool CTsStorage::IsSupported( TInt aFunction ) const
hgs
parents:
diff changeset
    83
    {
hgs
parents:
diff changeset
    84
    return ( OpenTaskMessage == aFunction || CloseTaskMessage == aFunction );
hgs
parents:
diff changeset
    85
    }
hgs
parents:
diff changeset
    86
hgs
parents:
diff changeset
    87
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    88
void CTsStorage::HandleDataL( TInt aFunction, RReadStream& aDataStream )
hgs
parents:
diff changeset
    89
    {
hgs
parents:
diff changeset
    90
    if( !IsSupported(aFunction) ) 
hgs
parents:
diff changeset
    91
        {
hgs
parents:
diff changeset
    92
        User::Leave( KErrCorrupt );
hgs
parents:
diff changeset
    93
        }
hgs
parents:
diff changeset
    94
    CTsModelItemKeyMsg* msg = CTsModelItemKeyMsg::NewLC( aDataStream );
hgs
parents:
diff changeset
    95
    OpenTaskMessage == aFunction ? LaunchL( msg->Key() ) : CloseL( msg->Key() );
hgs
parents:
diff changeset
    96
    CleanupStack::PopAndDestroy( msg );
hgs
parents:
diff changeset
    97
    }
hgs
parents:
diff changeset
    98
hgs
parents:
diff changeset
    99
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   100
/**
hgs
parents:
diff changeset
   101
 * Interface implementation
hgs
parents:
diff changeset
   102
 * @see MTsModelObserver::dataChanged(MTsModel &)
hgs
parents:
diff changeset
   103
 */
hgs
parents:
diff changeset
   104
void CTsStorage::DataChanged(MTsModel &/*model*/)
hgs
parents:
diff changeset
   105
    {
hgs
parents:
diff changeset
   106
    ResetModel();
hgs
parents:
diff changeset
   107
    }
hgs
parents:
diff changeset
   108
hgs
parents:
diff changeset
   109
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   110
/**
hgs
parents:
diff changeset
   111
 * Interface implementation
hgs
parents:
diff changeset
   112
 * @see MTsModel::count()
hgs
parents:
diff changeset
   113
 */
hgs
parents:
diff changeset
   114
TInt CTsStorage::Count() const
hgs
parents:
diff changeset
   115
    {
hgs
parents:
diff changeset
   116
    return iData.Count();
hgs
parents:
diff changeset
   117
    }
hgs
parents:
diff changeset
   118
hgs
parents:
diff changeset
   119
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   120
/**
hgs
parents:
diff changeset
   121
 * Interface implementation
hgs
parents:
diff changeset
   122
 * @see MTsModel::SetObserver(MTsModelObserver *)
hgs
parents:
diff changeset
   123
 */
hgs
parents:
diff changeset
   124
void CTsStorage::SetObserver( MTsModelObserver* aObserver ) 
hgs
parents:
diff changeset
   125
    {
hgs
parents:
diff changeset
   126
    iDataObserver = aObserver;
hgs
parents:
diff changeset
   127
    }
hgs
parents:
diff changeset
   128
hgs
parents:
diff changeset
   129
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   130
/**
hgs
parents:
diff changeset
   131
 * Interface implementation
hgs
parents:
diff changeset
   132
 * @see MTsModel::DisplayNameL(TInt)
hgs
parents:
diff changeset
   133
 */
hgs
parents:
diff changeset
   134
const TDesC& CTsStorage::DisplayNameL( TInt aOffset ) const 
hgs
parents:
diff changeset
   135
    {
hgs
parents:
diff changeset
   136
    return iData[aOffset].DisplayNameL();
hgs
parents:
diff changeset
   137
    }
hgs
parents:
diff changeset
   138
hgs
parents:
diff changeset
   139
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   140
/**
hgs
parents:
diff changeset
   141
 * Interface implementation
hgs
parents:
diff changeset
   142
 * @see MTsModel::IconHandleL(TInt)
hgs
parents:
diff changeset
   143
 */
hgs
parents:
diff changeset
   144
TInt CTsStorage::IconHandleL( TInt aOffset ) const 
hgs
parents:
diff changeset
   145
    {
hgs
parents:
diff changeset
   146
    return iData[aOffset].IconHandleL();
hgs
parents:
diff changeset
   147
    }
hgs
parents:
diff changeset
   148
hgs
parents:
diff changeset
   149
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   150
/**
hgs
parents:
diff changeset
   151
 * Interface implementation
hgs
parents:
diff changeset
   152
 * @see MTsModel::TimestampL(TInt)
hgs
parents:
diff changeset
   153
 */
hgs
parents:
diff changeset
   154
TTime CTsStorage::TimestampL( TInt aOffset ) const 
hgs
parents:
diff changeset
   155
    {
hgs
parents:
diff changeset
   156
    return iData[aOffset].TimestampL();
hgs
parents:
diff changeset
   157
    }
hgs
parents:
diff changeset
   158
hgs
parents:
diff changeset
   159
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   160
/**
hgs
parents:
diff changeset
   161
 * Interface implementation
hgs
parents:
diff changeset
   162
 * @see MTsModel::TimestampUpdateL(TInt)
hgs
parents:
diff changeset
   163
 */
hgs
parents:
diff changeset
   164
TTime CTsStorage::TimestampUpdateL( TInt offset ) const 
hgs
parents:
diff changeset
   165
{
hgs
parents:
diff changeset
   166
    return iData[offset].TimestampUpdateL();
hgs
parents:
diff changeset
   167
}
hgs
parents:
diff changeset
   168
hgs
parents:
diff changeset
   169
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   170
/**
hgs
parents:
diff changeset
   171
 * Interface implementation
hgs
parents:
diff changeset
   172
 * @see MTsModel::KeyL(TInt)
hgs
parents:
diff changeset
   173
 */
hgs
parents:
diff changeset
   174
TTsModelItemKey CTsStorage::KeyL( TInt aoffset ) const 
hgs
parents:
diff changeset
   175
    {
hgs
parents:
diff changeset
   176
    return iData[aoffset].KeyL();
hgs
parents:
diff changeset
   177
    }
hgs
parents:
diff changeset
   178
hgs
parents:
diff changeset
   179
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   180
/**
hgs
parents:
diff changeset
   181
 * Interface implementation
hgs
parents:
diff changeset
   182
 * @see MTsModel::IsActiveL(TInt)
hgs
parents:
diff changeset
   183
 */
hgs
parents:
diff changeset
   184
TBool CTsStorage::IsActiveL( TInt aOffset ) const 
hgs
parents:
diff changeset
   185
    {
hgs
parents:
diff changeset
   186
    return iData[aOffset].IsActiveL();
hgs
parents:
diff changeset
   187
    }
hgs
parents:
diff changeset
   188
hgs
parents:
diff changeset
   189
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   190
/**
hgs
parents:
diff changeset
   191
 * Interface implementation
hgs
parents:
diff changeset
   192
 * @see MTsModel::IsClosableL(TInt)
hgs
parents:
diff changeset
   193
 */
hgs
parents:
diff changeset
   194
TBool CTsStorage::IsClosableL( TInt aOffset ) const 
hgs
parents:
diff changeset
   195
    {
hgs
parents:
diff changeset
   196
    return iData[aOffset].IsClosableL();
hgs
parents:
diff changeset
   197
    }
hgs
parents:
diff changeset
   198
hgs
parents:
diff changeset
   199
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   200
/**
hgs
parents:
diff changeset
   201
 * Interface implementation
hgs
parents:
diff changeset
   202
 * @see MTsModel::CloseL(TTsModelItemKey)
hgs
parents:
diff changeset
   203
 */
hgs
parents:
diff changeset
   204
TBool CTsStorage::CloseL( TTsModelItemKey aKey ) const 
hgs
parents:
diff changeset
   205
    {
hgs
parents:
diff changeset
   206
    return FindL(aKey).CloseL();
hgs
parents:
diff changeset
   207
    }
hgs
parents:
diff changeset
   208
hgs
parents:
diff changeset
   209
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   210
/**
hgs
parents:
diff changeset
   211
 * Interface implementation
hgs
parents:
diff changeset
   212
 * @see MTsModel::launchL(TTsModelItemKey)
hgs
parents:
diff changeset
   213
 */
hgs
parents:
diff changeset
   214
TBool CTsStorage::LaunchL(TTsModelItemKey aKey) const 
hgs
parents:
diff changeset
   215
    {
hgs
parents:
diff changeset
   216
    return FindL(aKey).LaunchL(); 
hgs
parents:
diff changeset
   217
    }
hgs
parents:
diff changeset
   218
hgs
parents:
diff changeset
   219
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   220
TTsModelItem CTsStorage::FindL( TTsModelItemKey aKey ) const
hgs
parents:
diff changeset
   221
    {
hgs
parents:
diff changeset
   222
    for( TInt offset(0); offset < iData.Count(); ++offset ) 
hgs
parents:
diff changeset
   223
        {
hgs
parents:
diff changeset
   224
        if( iData[offset].KeyL() == aKey )
hgs
parents:
diff changeset
   225
            {
hgs
parents:
diff changeset
   226
            return iData[offset];
hgs
parents:
diff changeset
   227
            }
hgs
parents:
diff changeset
   228
        }
hgs
parents:
diff changeset
   229
    User::Leave(KErrNotFound);
hgs
parents:
diff changeset
   230
    return ItemL(0);//just avoid compilation warnings
hgs
parents:
diff changeset
   231
    }
hgs
parents:
diff changeset
   232
hgs
parents:
diff changeset
   233
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   234
/**
hgs
parents:
diff changeset
   235
 * Retrieve shallow copy of data from known data providers and sort entries
hgs
parents:
diff changeset
   236
 */
hgs
parents:
diff changeset
   237
TInt CTsStorage::ResetModel()
hgs
parents:
diff changeset
   238
    {
hgs
parents:
diff changeset
   239
    TRAPD(errNo, ResetModelL());
hgs
parents:
diff changeset
   240
    return errNo;
hgs
parents:
diff changeset
   241
    }
hgs
parents:
diff changeset
   242
hgs
parents:
diff changeset
   243
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   244
/**
hgs
parents:
diff changeset
   245
 * Retrieve shallow copy of data from known data providers and sort entries
hgs
parents:
diff changeset
   246
 */
hgs
parents:
diff changeset
   247
void CTsStorage::ResetModelL() 
hgs
parents:
diff changeset
   248
    {
hgs
parents:
diff changeset
   249
    iData.Reset();
hgs
parents:
diff changeset
   250
    for(TInt iter(0); iter < iDataProviders.Count(); ++iter )
hgs
parents:
diff changeset
   251
        {
hgs
parents:
diff changeset
   252
        PullDataL(*(iDataProviders[iter]));
hgs
parents:
diff changeset
   253
        }
hgs
parents:
diff changeset
   254
    ReorderDataL();
hgs
parents:
diff changeset
   255
    if (0 != iDataObserver)
hgs
parents:
diff changeset
   256
        {
hgs
parents:
diff changeset
   257
        iDataObserver->DataChanged(*this);
hgs
parents:
diff changeset
   258
        }
hgs
parents:
diff changeset
   259
    }
hgs
parents:
diff changeset
   260
hgs
parents:
diff changeset
   261
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   262
/**
hgs
parents:
diff changeset
   263
 * Retrieve shallow copy of data from source model
hgs
parents:
diff changeset
   264
 * @param aSrc - source model 
hgs
parents:
diff changeset
   265
 */
hgs
parents:
diff changeset
   266
void CTsStorage::PullDataL( const MTsModel& aSrc )
hgs
parents:
diff changeset
   267
    {
hgs
parents:
diff changeset
   268
    for( TInt iter(0); iter < aSrc.Count(); ++iter )
hgs
parents:
diff changeset
   269
        {
hgs
parents:
diff changeset
   270
        iData.AppendL(aSrc.ItemL(iter));
hgs
parents:
diff changeset
   271
        }
hgs
parents:
diff changeset
   272
    }
hgs
parents:
diff changeset
   273
hgs
parents:
diff changeset
   274
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   275
/**
hgs
parents:
diff changeset
   276
 * Sort internal data model 
hgs
parents:
diff changeset
   277
 */
hgs
parents:
diff changeset
   278
void CTsStorage::ReorderDataL()
hgs
parents:
diff changeset
   279
    {
hgs
parents:
diff changeset
   280
    for( TInt prev(0); prev < iData.Count(); ++prev ) 
hgs
parents:
diff changeset
   281
        {
hgs
parents:
diff changeset
   282
        for( TInt next(prev + 1); next < iData.Count(); ++next )
hgs
parents:
diff changeset
   283
            {
hgs
parents:
diff changeset
   284
            const TTsModelItem prevItem(iData[prev]), nextItem(iData[next]);
hgs
parents:
diff changeset
   285
            if( prevItem.TimestampL() < nextItem.TimestampL() )
hgs
parents:
diff changeset
   286
                {
hgs
parents:
diff changeset
   287
                iData.Remove(prev);
hgs
parents:
diff changeset
   288
                iData.InsertL(nextItem, prev);
hgs
parents:
diff changeset
   289
                
hgs
parents:
diff changeset
   290
                iData.Remove(next);
hgs
parents:
diff changeset
   291
                iData.InsertL(prevItem, next);
hgs
parents:
diff changeset
   292
                }
hgs
parents:
diff changeset
   293
            }
hgs
parents:
diff changeset
   294
        }
hgs
parents:
diff changeset
   295
    }