taskswitcher/server/src/tsstorage.cpp
author hgs
Mon, 18 Oct 2010 10:44:15 +0300
changeset 127 7b66bc3c6dc9
parent 119 50e220be30d1
permissions -rw-r--r--
201041
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 );
127
hgs
parents: 119
diff changeset
    97
    OpenTaskMessage == aFunction ? Launch( msg->Key() ) : Close( msg->Key() );
116
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
 */
127
hgs
parents: 119
diff changeset
   136
const TDesC& CTsStorage::DisplayName( TInt aOffset ) const 
116
hgs
parents:
diff changeset
   137
    {
127
hgs
parents: 119
diff changeset
   138
    return iData[aOffset].DisplayName();
116
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
 */
127
hgs
parents: 119
diff changeset
   146
TInt CTsStorage::IconHandle( TInt aOffset ) const 
116
hgs
parents:
diff changeset
   147
    {
127
hgs
parents: 119
diff changeset
   148
    return iData[aOffset].IconHandle();
116
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
 */
127
hgs
parents: 119
diff changeset
   156
TTime CTsStorage::Timestamp( TInt aOffset ) const 
116
hgs
parents:
diff changeset
   157
    {
127
hgs
parents: 119
diff changeset
   158
    return iData[aOffset].Timestamp();
116
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
 */
127
hgs
parents: 119
diff changeset
   166
TTime CTsStorage::TimestampUpdate( TInt offset ) const 
116
hgs
parents:
diff changeset
   167
{
127
hgs
parents: 119
diff changeset
   168
    return iData[offset].TimestampUpdate();
116
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
127
hgs
parents: 119
diff changeset
   174
 * @see MTsModel::Key(TInt)
116
hgs
parents:
diff changeset
   175
 */
127
hgs
parents: 119
diff changeset
   176
TTsEntryKey CTsStorage::Key( TInt aoffset ) const 
116
hgs
parents:
diff changeset
   177
    {
127
hgs
parents: 119
diff changeset
   178
    return iData[aoffset].Key();
116
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
127
hgs
parents: 119
diff changeset
   184
 * @see MTsModel::IsActive(TInt)
116
hgs
parents:
diff changeset
   185
 */
127
hgs
parents: 119
diff changeset
   186
TBool CTsStorage::IsActive( TInt aOffset ) const 
116
hgs
parents:
diff changeset
   187
    {
127
hgs
parents: 119
diff changeset
   188
    return iData[aOffset].IsActive();
116
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
 */
127
hgs
parents: 119
diff changeset
   196
TBool CTsStorage::IsClosable( TInt aOffset ) const 
116
hgs
parents:
diff changeset
   197
    {
127
hgs
parents: 119
diff changeset
   198
    return iData[aOffset].IsClosable();
116
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
 */
127
hgs
parents: 119
diff changeset
   206
TBool CTsStorage::IsMandatory( TInt aOffset ) const
119
hgs
parents: 116
diff changeset
   207
    {
127
hgs
parents: 119
diff changeset
   208
    return iData[aOffset].IsMandatory();
119
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
127
hgs
parents: 119
diff changeset
   214
 * @see MTsModel::Close(TTsModelItemKey)
116
hgs
parents:
diff changeset
   215
 */
127
hgs
parents: 119
diff changeset
   216
TBool CTsStorage::Close( TTsEntryKey aKey ) const 
116
hgs
parents:
diff changeset
   217
    {
127
hgs
parents: 119
diff changeset
   218
    TBool retVal(EFalse);
hgs
parents: 119
diff changeset
   219
    TRAP_IGNORE(retVal = FindL(aKey).Close())
hgs
parents: 119
diff changeset
   220
    return retVal;
116
hgs
parents:
diff changeset
   221
    }
hgs
parents:
diff changeset
   222
hgs
parents:
diff changeset
   223
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   224
/**
hgs
parents:
diff changeset
   225
 * Interface implementation
127
hgs
parents: 119
diff changeset
   226
 * @see MTsModel::Launch(TTsModelItemKey)
116
hgs
parents:
diff changeset
   227
 */
127
hgs
parents: 119
diff changeset
   228
TBool CTsStorage::Launch(TTsEntryKey aKey) const 
116
hgs
parents:
diff changeset
   229
    {
127
hgs
parents: 119
diff changeset
   230
    TBool retVal(EFalse);
hgs
parents: 119
diff changeset
   231
    TRAP_IGNORE(retVal = FindL(aKey).Launch())
hgs
parents: 119
diff changeset
   232
    return retVal;
116
hgs
parents:
diff changeset
   233
    }
hgs
parents:
diff changeset
   234
hgs
parents:
diff changeset
   235
// -----------------------------------------------------------------------------
127
hgs
parents: 119
diff changeset
   236
TTsModelItem CTsStorage::FindL( TTsEntryKey aKey ) const
116
hgs
parents:
diff changeset
   237
    {
hgs
parents:
diff changeset
   238
    for( TInt offset(0); offset < iData.Count(); ++offset ) 
hgs
parents:
diff changeset
   239
        {
127
hgs
parents: 119
diff changeset
   240
        if( iData[offset].Key() == aKey )
116
hgs
parents:
diff changeset
   241
            {
hgs
parents:
diff changeset
   242
            return iData[offset];
hgs
parents:
diff changeset
   243
            }
hgs
parents:
diff changeset
   244
        }
hgs
parents:
diff changeset
   245
    User::Leave(KErrNotFound);
hgs
parents:
diff changeset
   246
    return ItemL(0);//just avoid compilation warnings
hgs
parents:
diff changeset
   247
    }
hgs
parents:
diff changeset
   248
hgs
parents:
diff changeset
   249
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   250
/**
hgs
parents:
diff changeset
   251
 * Retrieve shallow copy of data from known data providers and sort entries
hgs
parents:
diff changeset
   252
 */
hgs
parents:
diff changeset
   253
TInt CTsStorage::ResetModel()
hgs
parents:
diff changeset
   254
    {
hgs
parents:
diff changeset
   255
    TRAPD(errNo, ResetModelL());
hgs
parents:
diff changeset
   256
    return errNo;
hgs
parents:
diff changeset
   257
    }
hgs
parents:
diff changeset
   258
hgs
parents:
diff changeset
   259
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   260
/**
hgs
parents:
diff changeset
   261
 * Retrieve shallow copy of data from known data providers and sort entries
hgs
parents:
diff changeset
   262
 */
hgs
parents:
diff changeset
   263
void CTsStorage::ResetModelL() 
hgs
parents:
diff changeset
   264
    {
hgs
parents:
diff changeset
   265
    iData.Reset();
hgs
parents:
diff changeset
   266
    for(TInt iter(0); iter < iDataProviders.Count(); ++iter )
hgs
parents:
diff changeset
   267
        {
hgs
parents:
diff changeset
   268
        PullDataL(*(iDataProviders[iter]));
hgs
parents:
diff changeset
   269
        }
hgs
parents:
diff changeset
   270
    ReorderDataL();
hgs
parents:
diff changeset
   271
    if (0 != iDataObserver)
hgs
parents:
diff changeset
   272
        {
hgs
parents:
diff changeset
   273
        iDataObserver->DataChanged(*this);
hgs
parents:
diff changeset
   274
        }
hgs
parents:
diff changeset
   275
    }
hgs
parents:
diff changeset
   276
hgs
parents:
diff changeset
   277
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   278
/**
hgs
parents:
diff changeset
   279
 * Retrieve shallow copy of data from source model
hgs
parents:
diff changeset
   280
 * @param aSrc - source model 
hgs
parents:
diff changeset
   281
 */
hgs
parents:
diff changeset
   282
void CTsStorage::PullDataL( const MTsModel& aSrc )
hgs
parents:
diff changeset
   283
    {
hgs
parents:
diff changeset
   284
    for( TInt iter(0); iter < aSrc.Count(); ++iter )
hgs
parents:
diff changeset
   285
        {
hgs
parents:
diff changeset
   286
        iData.AppendL(aSrc.ItemL(iter));
hgs
parents:
diff changeset
   287
        }
hgs
parents:
diff changeset
   288
    }
hgs
parents:
diff changeset
   289
hgs
parents:
diff changeset
   290
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   291
/**
hgs
parents:
diff changeset
   292
 * Sort internal data model 
hgs
parents:
diff changeset
   293
 */
hgs
parents:
diff changeset
   294
void CTsStorage::ReorderDataL()
hgs
parents:
diff changeset
   295
    {
hgs
parents:
diff changeset
   296
    for( TInt prev(0); prev < iData.Count(); ++prev ) 
hgs
parents:
diff changeset
   297
        {
hgs
parents:
diff changeset
   298
        for( TInt next(prev + 1); next < iData.Count(); ++next )
hgs
parents:
diff changeset
   299
            {
hgs
parents:
diff changeset
   300
            const TTsModelItem prevItem(iData[prev]), nextItem(iData[next]);
127
hgs
parents: 119
diff changeset
   301
            if( ( !prevItem.IsMandatory() && nextItem.IsMandatory() ) ||
hgs
parents: 119
diff changeset
   302
                ( prevItem.Timestamp() < nextItem.Timestamp() && prevItem.IsMandatory() == nextItem.IsMandatory() ) )
116
hgs
parents:
diff changeset
   303
                {
hgs
parents:
diff changeset
   304
                iData.Remove(prev);
hgs
parents:
diff changeset
   305
                iData.InsertL(nextItem, prev);
hgs
parents:
diff changeset
   306
                
hgs
parents:
diff changeset
   307
                iData.Remove(next);
hgs
parents:
diff changeset
   308
                iData.InsertL(prevItem, next);
hgs
parents:
diff changeset
   309
                }
hgs
parents:
diff changeset
   310
            }
hgs
parents:
diff changeset
   311
        }
119
hgs
parents: 116
diff changeset
   312
    TrimDataL();
116
hgs
parents:
diff changeset
   313
    }
119
hgs
parents: 116
diff changeset
   314
hgs
parents: 116
diff changeset
   315
// -----------------------------------------------------------------------------
hgs
parents: 116
diff changeset
   316
void CTsStorage::TrimDataL()
hgs
parents: 116
diff changeset
   317
    {
hgs
parents: 116
diff changeset
   318
    const TInt lastItemOffset(iData.Count() -1);
127
hgs
parents: 119
diff changeset
   319
    if(KTsDataLimit <= lastItemOffset && !iData[lastItemOffset].IsMandatory())
119
hgs
parents: 116
diff changeset
   320
        {
hgs
parents: 116
diff changeset
   321
        iData.Remove(lastItemOffset);
hgs
parents: 116
diff changeset
   322
        TrimDataL();
hgs
parents: 116
diff changeset
   323
        }
hgs
parents: 116
diff changeset
   324
    }