taskswitcher/server/src/tsstorage.cpp
author hgs
Mon, 20 Sep 2010 10:22:22 +0300
changeset 119 50e220be30d1
parent 116 305818acdca4
child 127 7b66bc3c6dc9
permissions -rw-r--r--
201037
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"
119
hgs
parents: 116
diff changeset
    20
hgs
parents: 116
diff changeset
    21
const TInt KTsDataLimit(10);
116
hgs
parents:
diff changeset
    22
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    23
/**
hgs
parents:
diff changeset
    24
 * Two phase construction. Create and initialize storage instance.
hgs
parents:
diff changeset
    25
 * @param aDataProviders - list of data providers
hgs
parents:
diff changeset
    26
 * @return storage instane
hgs
parents:
diff changeset
    27
 */
hgs
parents:
diff changeset
    28
CTsStorage* CTsStorage::NewL(const TArray<MTsModel*> &aDataProviders)
hgs
parents:
diff changeset
    29
    {
hgs
parents:
diff changeset
    30
    CTsStorage* self = new(ELeave) CTsStorage();
hgs
parents:
diff changeset
    31
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
    32
    self->ConstructL( aDataProviders );
hgs
parents:
diff changeset
    33
    CleanupStack::Pop( self );
hgs
parents:
diff changeset
    34
    return self;
hgs
parents:
diff changeset
    35
    }
hgs
parents:
diff changeset
    36
hgs
parents:
diff changeset
    37
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    38
/**
hgs
parents:
diff changeset
    39
 * Destructor. Function cancel subscribtion for data change notyfications
hgs
parents:
diff changeset
    40
 */
hgs
parents:
diff changeset
    41
CTsStorage::~CTsStorage()
hgs
parents:
diff changeset
    42
    {
hgs
parents:
diff changeset
    43
    for( TInt iter(0); iter < iDataProviders.Count(); ++iter )
hgs
parents:
diff changeset
    44
        {
hgs
parents:
diff changeset
    45
        iDataProviders[iter]->SetObserver( 0 );
hgs
parents:
diff changeset
    46
        }
hgs
parents:
diff changeset
    47
    iData.Close();
hgs
parents:
diff changeset
    48
    }
hgs
parents:
diff changeset
    49
hgs
parents:
diff changeset
    50
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    51
/**
hgs
parents:
diff changeset
    52
 * First phase construction.
hgs
parents:
diff changeset
    53
 */
hgs
parents:
diff changeset
    54
CTsStorage::CTsStorage()
hgs
parents:
diff changeset
    55
    {
hgs
parents:
diff changeset
    56
    //No implementation required
hgs
parents:
diff changeset
    57
    }
hgs
parents:
diff changeset
    58
hgs
parents:
diff changeset
    59
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    60
/**
hgs
parents:
diff changeset
    61
 * Second phase construction. Function make subscribtion for data changes notifications
hgs
parents:
diff changeset
    62
 * @param aDataProviders - list of data providers
hgs
parents:
diff changeset
    63
 */
hgs
parents:
diff changeset
    64
void CTsStorage::ConstructL( const TArray<MTsModel*> &aDataProviders )
hgs
parents:
diff changeset
    65
    {
hgs
parents:
diff changeset
    66
    for (TInt iter(0); iter < aDataProviders.Count(); ++iter)
hgs
parents:
diff changeset
    67
        {
hgs
parents:
diff changeset
    68
        iDataProviders.AppendL( aDataProviders[iter] );
hgs
parents:
diff changeset
    69
        aDataProviders[iter]->SetObserver( this );
hgs
parents:
diff changeset
    70
        }
hgs
parents:
diff changeset
    71
    }
hgs
parents:
diff changeset
    72
hgs
parents:
diff changeset
    73
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    74
/**
hgs
parents:
diff changeset
    75
 * Interface implementation
hgs
parents:
diff changeset
    76
 * @see MTsDataObserver::DataChanged()
hgs
parents:
diff changeset
    77
 */
hgs
parents:
diff changeset
    78
void CTsStorage::DataChanged()
hgs
parents:
diff changeset
    79
    {
hgs
parents:
diff changeset
    80
    ResetModel();
hgs
parents:
diff changeset
    81
    }
hgs
parents:
diff changeset
    82
hgs
parents:
diff changeset
    83
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    84
TBool CTsStorage::IsSupported( TInt aFunction ) const
hgs
parents:
diff changeset
    85
    {
hgs
parents:
diff changeset
    86
    return ( OpenTaskMessage == aFunction || CloseTaskMessage == aFunction );
hgs
parents:
diff changeset
    87
    }
hgs
parents:
diff changeset
    88
hgs
parents:
diff changeset
    89
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    90
void CTsStorage::HandleDataL( TInt aFunction, RReadStream& aDataStream )
hgs
parents:
diff changeset
    91
    {
hgs
parents:
diff changeset
    92
    if( !IsSupported(aFunction) ) 
hgs
parents:
diff changeset
    93
        {
hgs
parents:
diff changeset
    94
        User::Leave( KErrCorrupt );
hgs
parents:
diff changeset
    95
        }
hgs
parents:
diff changeset
    96
    CTsModelItemKeyMsg* msg = CTsModelItemKeyMsg::NewLC( aDataStream );
hgs
parents:
diff changeset
    97
    OpenTaskMessage == aFunction ? LaunchL( msg->Key() ) : CloseL( msg->Key() );
hgs
parents:
diff changeset
    98
    CleanupStack::PopAndDestroy( msg );
hgs
parents:
diff changeset
    99
    }
hgs
parents:
diff changeset
   100
hgs
parents:
diff changeset
   101
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   102
/**
hgs
parents:
diff changeset
   103
 * Interface implementation
hgs
parents:
diff changeset
   104
 * @see MTsModelObserver::dataChanged(MTsModel &)
hgs
parents:
diff changeset
   105
 */
hgs
parents:
diff changeset
   106
void CTsStorage::DataChanged(MTsModel &/*model*/)
hgs
parents:
diff changeset
   107
    {
hgs
parents:
diff changeset
   108
    ResetModel();
hgs
parents:
diff changeset
   109
    }
hgs
parents:
diff changeset
   110
hgs
parents:
diff changeset
   111
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   112
/**
hgs
parents:
diff changeset
   113
 * Interface implementation
hgs
parents:
diff changeset
   114
 * @see MTsModel::count()
hgs
parents:
diff changeset
   115
 */
hgs
parents:
diff changeset
   116
TInt CTsStorage::Count() const
hgs
parents:
diff changeset
   117
    {
hgs
parents:
diff changeset
   118
    return iData.Count();
hgs
parents:
diff changeset
   119
    }
hgs
parents:
diff changeset
   120
hgs
parents:
diff changeset
   121
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   122
/**
hgs
parents:
diff changeset
   123
 * Interface implementation
hgs
parents:
diff changeset
   124
 * @see MTsModel::SetObserver(MTsModelObserver *)
hgs
parents:
diff changeset
   125
 */
hgs
parents:
diff changeset
   126
void CTsStorage::SetObserver( MTsModelObserver* aObserver ) 
hgs
parents:
diff changeset
   127
    {
hgs
parents:
diff changeset
   128
    iDataObserver = aObserver;
hgs
parents:
diff changeset
   129
    }
hgs
parents:
diff changeset
   130
hgs
parents:
diff changeset
   131
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   132
/**
hgs
parents:
diff changeset
   133
 * Interface implementation
hgs
parents:
diff changeset
   134
 * @see MTsModel::DisplayNameL(TInt)
hgs
parents:
diff changeset
   135
 */
hgs
parents:
diff changeset
   136
const TDesC& CTsStorage::DisplayNameL( TInt aOffset ) const 
hgs
parents:
diff changeset
   137
    {
hgs
parents:
diff changeset
   138
    return iData[aOffset].DisplayNameL();
hgs
parents:
diff changeset
   139
    }
hgs
parents:
diff changeset
   140
hgs
parents:
diff changeset
   141
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   142
/**
hgs
parents:
diff changeset
   143
 * Interface implementation
hgs
parents:
diff changeset
   144
 * @see MTsModel::IconHandleL(TInt)
hgs
parents:
diff changeset
   145
 */
hgs
parents:
diff changeset
   146
TInt CTsStorage::IconHandleL( TInt aOffset ) const 
hgs
parents:
diff changeset
   147
    {
hgs
parents:
diff changeset
   148
    return iData[aOffset].IconHandleL();
hgs
parents:
diff changeset
   149
    }
hgs
parents:
diff changeset
   150
hgs
parents:
diff changeset
   151
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   152
/**
hgs
parents:
diff changeset
   153
 * Interface implementation
hgs
parents:
diff changeset
   154
 * @see MTsModel::TimestampL(TInt)
hgs
parents:
diff changeset
   155
 */
hgs
parents:
diff changeset
   156
TTime CTsStorage::TimestampL( TInt aOffset ) const 
hgs
parents:
diff changeset
   157
    {
hgs
parents:
diff changeset
   158
    return iData[aOffset].TimestampL();
hgs
parents:
diff changeset
   159
    }
hgs
parents:
diff changeset
   160
hgs
parents:
diff changeset
   161
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   162
/**
hgs
parents:
diff changeset
   163
 * Interface implementation
hgs
parents:
diff changeset
   164
 * @see MTsModel::TimestampUpdateL(TInt)
hgs
parents:
diff changeset
   165
 */
hgs
parents:
diff changeset
   166
TTime CTsStorage::TimestampUpdateL( TInt offset ) const 
hgs
parents:
diff changeset
   167
{
hgs
parents:
diff changeset
   168
    return iData[offset].TimestampUpdateL();
hgs
parents:
diff changeset
   169
}
hgs
parents:
diff changeset
   170
hgs
parents:
diff changeset
   171
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   172
/**
hgs
parents:
diff changeset
   173
 * Interface implementation
hgs
parents:
diff changeset
   174
 * @see MTsModel::KeyL(TInt)
hgs
parents:
diff changeset
   175
 */
hgs
parents:
diff changeset
   176
TTsModelItemKey CTsStorage::KeyL( TInt aoffset ) const 
hgs
parents:
diff changeset
   177
    {
hgs
parents:
diff changeset
   178
    return iData[aoffset].KeyL();
hgs
parents:
diff changeset
   179
    }
hgs
parents:
diff changeset
   180
hgs
parents:
diff changeset
   181
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   182
/**
hgs
parents:
diff changeset
   183
 * Interface implementation
hgs
parents:
diff changeset
   184
 * @see MTsModel::IsActiveL(TInt)
hgs
parents:
diff changeset
   185
 */
hgs
parents:
diff changeset
   186
TBool CTsStorage::IsActiveL( TInt aOffset ) const 
hgs
parents:
diff changeset
   187
    {
hgs
parents:
diff changeset
   188
    return iData[aOffset].IsActiveL();
hgs
parents:
diff changeset
   189
    }
hgs
parents:
diff changeset
   190
hgs
parents:
diff changeset
   191
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   192
/**
hgs
parents:
diff changeset
   193
 * Interface implementation
hgs
parents:
diff changeset
   194
 * @see MTsModel::IsClosableL(TInt)
hgs
parents:
diff changeset
   195
 */
hgs
parents:
diff changeset
   196
TBool CTsStorage::IsClosableL( TInt aOffset ) const 
hgs
parents:
diff changeset
   197
    {
hgs
parents:
diff changeset
   198
    return iData[aOffset].IsClosableL();
hgs
parents:
diff changeset
   199
    }
hgs
parents:
diff changeset
   200
hgs
parents:
diff changeset
   201
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   202
/**
hgs
parents:
diff changeset
   203
 * Interface implementation
119
hgs
parents: 116
diff changeset
   204
 * @see MTsModel::IsMandatoryL(TInt) const
hgs
parents: 116
diff changeset
   205
 */
hgs
parents: 116
diff changeset
   206
TBool CTsStorage::IsMandatoryL( TInt aOffset ) const
hgs
parents: 116
diff changeset
   207
    {
hgs
parents: 116
diff changeset
   208
    return iData[aOffset].IsMandatoryL();
hgs
parents: 116
diff changeset
   209
    }
hgs
parents: 116
diff changeset
   210
hgs
parents: 116
diff changeset
   211
// -----------------------------------------------------------------------------
hgs
parents: 116
diff changeset
   212
/**
hgs
parents: 116
diff changeset
   213
 * Interface implementation
116
hgs
parents:
diff changeset
   214
 * @see MTsModel::CloseL(TTsModelItemKey)
hgs
parents:
diff changeset
   215
 */
hgs
parents:
diff changeset
   216
TBool CTsStorage::CloseL( TTsModelItemKey aKey ) const 
hgs
parents:
diff changeset
   217
    {
hgs
parents:
diff changeset
   218
    return FindL(aKey).CloseL();
hgs
parents:
diff changeset
   219
    }
hgs
parents:
diff changeset
   220
hgs
parents:
diff changeset
   221
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   222
/**
hgs
parents:
diff changeset
   223
 * Interface implementation
hgs
parents:
diff changeset
   224
 * @see MTsModel::launchL(TTsModelItemKey)
hgs
parents:
diff changeset
   225
 */
hgs
parents:
diff changeset
   226
TBool CTsStorage::LaunchL(TTsModelItemKey aKey) const 
hgs
parents:
diff changeset
   227
    {
hgs
parents:
diff changeset
   228
    return FindL(aKey).LaunchL(); 
hgs
parents:
diff changeset
   229
    }
hgs
parents:
diff changeset
   230
hgs
parents:
diff changeset
   231
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   232
TTsModelItem CTsStorage::FindL( TTsModelItemKey aKey ) const
hgs
parents:
diff changeset
   233
    {
hgs
parents:
diff changeset
   234
    for( TInt offset(0); offset < iData.Count(); ++offset ) 
hgs
parents:
diff changeset
   235
        {
hgs
parents:
diff changeset
   236
        if( iData[offset].KeyL() == aKey )
hgs
parents:
diff changeset
   237
            {
hgs
parents:
diff changeset
   238
            return iData[offset];
hgs
parents:
diff changeset
   239
            }
hgs
parents:
diff changeset
   240
        }
hgs
parents:
diff changeset
   241
    User::Leave(KErrNotFound);
hgs
parents:
diff changeset
   242
    return ItemL(0);//just avoid compilation warnings
hgs
parents:
diff changeset
   243
    }
hgs
parents:
diff changeset
   244
hgs
parents:
diff changeset
   245
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   246
/**
hgs
parents:
diff changeset
   247
 * Retrieve shallow copy of data from known data providers and sort entries
hgs
parents:
diff changeset
   248
 */
hgs
parents:
diff changeset
   249
TInt CTsStorage::ResetModel()
hgs
parents:
diff changeset
   250
    {
hgs
parents:
diff changeset
   251
    TRAPD(errNo, ResetModelL());
hgs
parents:
diff changeset
   252
    return errNo;
hgs
parents:
diff changeset
   253
    }
hgs
parents:
diff changeset
   254
hgs
parents:
diff changeset
   255
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   256
/**
hgs
parents:
diff changeset
   257
 * Retrieve shallow copy of data from known data providers and sort entries
hgs
parents:
diff changeset
   258
 */
hgs
parents:
diff changeset
   259
void CTsStorage::ResetModelL() 
hgs
parents:
diff changeset
   260
    {
hgs
parents:
diff changeset
   261
    iData.Reset();
hgs
parents:
diff changeset
   262
    for(TInt iter(0); iter < iDataProviders.Count(); ++iter )
hgs
parents:
diff changeset
   263
        {
hgs
parents:
diff changeset
   264
        PullDataL(*(iDataProviders[iter]));
hgs
parents:
diff changeset
   265
        }
hgs
parents:
diff changeset
   266
    ReorderDataL();
hgs
parents:
diff changeset
   267
    if (0 != iDataObserver)
hgs
parents:
diff changeset
   268
        {
hgs
parents:
diff changeset
   269
        iDataObserver->DataChanged(*this);
hgs
parents:
diff changeset
   270
        }
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
 * Retrieve shallow copy of data from source model
hgs
parents:
diff changeset
   276
 * @param aSrc - source model 
hgs
parents:
diff changeset
   277
 */
hgs
parents:
diff changeset
   278
void CTsStorage::PullDataL( const MTsModel& aSrc )
hgs
parents:
diff changeset
   279
    {
hgs
parents:
diff changeset
   280
    for( TInt iter(0); iter < aSrc.Count(); ++iter )
hgs
parents:
diff changeset
   281
        {
hgs
parents:
diff changeset
   282
        iData.AppendL(aSrc.ItemL(iter));
hgs
parents:
diff changeset
   283
        }
hgs
parents:
diff changeset
   284
    }
hgs
parents:
diff changeset
   285
hgs
parents:
diff changeset
   286
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   287
/**
hgs
parents:
diff changeset
   288
 * Sort internal data model 
hgs
parents:
diff changeset
   289
 */
hgs
parents:
diff changeset
   290
void CTsStorage::ReorderDataL()
hgs
parents:
diff changeset
   291
    {
hgs
parents:
diff changeset
   292
    for( TInt prev(0); prev < iData.Count(); ++prev ) 
hgs
parents:
diff changeset
   293
        {
hgs
parents:
diff changeset
   294
        for( TInt next(prev + 1); next < iData.Count(); ++next )
hgs
parents:
diff changeset
   295
            {
hgs
parents:
diff changeset
   296
            const TTsModelItem prevItem(iData[prev]), nextItem(iData[next]);
119
hgs
parents: 116
diff changeset
   297
            if( ( !prevItem.IsMandatoryL() && nextItem.IsMandatoryL() ) ||
hgs
parents: 116
diff changeset
   298
                ( prevItem.TimestampL() < nextItem.TimestampL() && prevItem.IsMandatoryL() == nextItem.IsMandatoryL() ) )
116
hgs
parents:
diff changeset
   299
                {
hgs
parents:
diff changeset
   300
                iData.Remove(prev);
hgs
parents:
diff changeset
   301
                iData.InsertL(nextItem, prev);
hgs
parents:
diff changeset
   302
                
hgs
parents:
diff changeset
   303
                iData.Remove(next);
hgs
parents:
diff changeset
   304
                iData.InsertL(prevItem, next);
hgs
parents:
diff changeset
   305
                }
hgs
parents:
diff changeset
   306
            }
hgs
parents:
diff changeset
   307
        }
119
hgs
parents: 116
diff changeset
   308
    TrimDataL();
116
hgs
parents:
diff changeset
   309
    }
119
hgs
parents: 116
diff changeset
   310
hgs
parents: 116
diff changeset
   311
// -----------------------------------------------------------------------------
hgs
parents: 116
diff changeset
   312
void CTsStorage::TrimDataL()
hgs
parents: 116
diff changeset
   313
    {
hgs
parents: 116
diff changeset
   314
    const TInt lastItemOffset(iData.Count() -1);
hgs
parents: 116
diff changeset
   315
    if(KTsDataLimit <= lastItemOffset && !iData[lastItemOffset].IsMandatoryL())
hgs
parents: 116
diff changeset
   316
        {
hgs
parents: 116
diff changeset
   317
        iData.Remove(lastItemOffset);
hgs
parents: 116
diff changeset
   318
        TrimDataL();
hgs
parents: 116
diff changeset
   319
        }
hgs
parents: 116
diff changeset
   320
    }