taskswitcher/client/s60/src/tstaskmonitor_p.cpp
author hgs
Mon, 18 Oct 2010 10:44:15 +0300
changeset 127 7b66bc3c6dc9
parent 116 305818acdca4
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 "tstaskmonitor_p.h"
hgs
parents:
diff changeset
    18
#include "tstaskmonitor.h"
hgs
parents:
diff changeset
    19
hgs
parents:
diff changeset
    20
#include <eikenv.h>
hgs
parents:
diff changeset
    21
#include <fbs.h>
hgs
parents:
diff changeset
    22
#include <s32mem.h>
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
#include <XQConversions>
hgs
parents:
diff changeset
    25
hgs
parents:
diff changeset
    26
#include "tstaskmonitorclient.h"
hgs
parents:
diff changeset
    27
#include "tstask.h"
127
hgs
parents: 116
diff changeset
    28
#include "tsentrykey.h"
hgs
parents: 116
diff changeset
    29
#include "tscliententry.h"
116
hgs
parents:
diff changeset
    30
#include "tstaskchangeinfo.h"
hgs
parents:
diff changeset
    31
#include "tsutils.h"
hgs
parents:
diff changeset
    32
#include "tstaskmonitorhistory.h"
hgs
parents:
diff changeset
    33
using TaskSwitcher::CleanupResetAndDestroyPushL;
hgs
parents:
diff changeset
    34
hgs
parents:
diff changeset
    35
TsTaskMonitorPrivate::TsTaskMonitorPrivate(TsTaskMonitor *q) : q_ptr(q), mClient(0), mWsSession(CEikonEnv::Static()->WsSession())
hgs
parents:
diff changeset
    36
{
hgs
parents:
diff changeset
    37
    QT_TRAP_THROWING(mClient = CTsTaskMonitorClient::NewL());
hgs
parents:
diff changeset
    38
    mClient->Subscribe(*this);
hgs
parents:
diff changeset
    39
}
hgs
parents:
diff changeset
    40
hgs
parents:
diff changeset
    41
TsTaskMonitorPrivate::~TsTaskMonitorPrivate()
hgs
parents:
diff changeset
    42
{
127
hgs
parents: 116
diff changeset
    43
    mUpdateSet.ResetAndDestroy();
116
hgs
parents:
diff changeset
    44
    mClient->CancelSubscribe();
hgs
parents:
diff changeset
    45
    delete mClient;
hgs
parents:
diff changeset
    46
}
hgs
parents:
diff changeset
    47
hgs
parents:
diff changeset
    48
hgs
parents:
diff changeset
    49
QList<TsTaskChange> TsTaskMonitorPrivate::changeList(bool fullList)
hgs
parents:
diff changeset
    50
{
hgs
parents:
diff changeset
    51
    QList<TsTaskChange> retVal;
127
hgs
parents: 116
diff changeset
    52
    QT_TRAP_THROWING(changeListL());
hgs
parents: 116
diff changeset
    53
    
hgs
parents: 116
diff changeset
    54
    QList< QSharedPointer<CTsClientEntry> > taskList;
hgs
parents: 116
diff changeset
    55
    QList<TsTaskMonitorHistory> newTaskHistory;
hgs
parents: 116
diff changeset
    56
    for (int offset(0); 0 < mUpdateSet.Count(); ++offset) {
hgs
parents: 116
diff changeset
    57
        QSharedPointer<CTsClientEntry> content(mUpdateSet[0]);
hgs
parents: 116
diff changeset
    58
        taskList.append(content);
hgs
parents: 116
diff changeset
    59
        newTaskHistory.append(TsTaskMonitorHistory(content, offset));
hgs
parents: 116
diff changeset
    60
        mUpdateSet.Remove(0);
hgs
parents: 116
diff changeset
    61
    }
hgs
parents: 116
diff changeset
    62
    if (fullList) {
hgs
parents: 116
diff changeset
    63
        mTaskHistory.clear();
hgs
parents: 116
diff changeset
    64
    }
hgs
parents: 116
diff changeset
    65
    QList<int> insertsList = findInserts(newTaskHistory);
hgs
parents: 116
diff changeset
    66
    QList<int> deletesList = findDeletes(newTaskHistory);
hgs
parents: 116
diff changeset
    67
    QList<TsTaskMonitorHistory> newMinusInserts;
hgs
parents: 116
diff changeset
    68
    if (insertsList.count() > 0 ) {
hgs
parents: 116
diff changeset
    69
        newMinusInserts = substractInsertsFromNew(insertsList, newTaskHistory);
hgs
parents: 116
diff changeset
    70
    } else {
hgs
parents: 116
diff changeset
    71
        newMinusInserts = newTaskHistory;
hgs
parents: 116
diff changeset
    72
    }
hgs
parents: 116
diff changeset
    73
    QList<TsTaskMonitorHistory> interimList;
hgs
parents: 116
diff changeset
    74
    if (deletesList.count() > 0 ) {
hgs
parents: 116
diff changeset
    75
        retVal.append(getDeletesChangeset(deletesList));
hgs
parents: 116
diff changeset
    76
        interimList = substractDeletesFromOld(deletesList);
hgs
parents: 116
diff changeset
    77
    } else {
hgs
parents: 116
diff changeset
    78
        interimList = mTaskHistory;
hgs
parents: 116
diff changeset
    79
    }
hgs
parents: 116
diff changeset
    80
    retVal.append(findMovesAndUpdates(newMinusInserts, taskList, interimList));
hgs
parents: 116
diff changeset
    81
    if (mTaskHistory.isEmpty()) {
hgs
parents: 116
diff changeset
    82
        retVal.append(TsTaskChange(TsTaskChangeInfo(), QSharedPointer<TsTask>()));
hgs
parents: 116
diff changeset
    83
    }
hgs
parents: 116
diff changeset
    84
    retVal.append(getInsertsChangeset(insertsList, taskList));
hgs
parents: 116
diff changeset
    85
    mTaskHistory = newTaskHistory;
116
hgs
parents:
diff changeset
    86
    return retVal;
hgs
parents:
diff changeset
    87
}
hgs
parents:
diff changeset
    88
127
hgs
parents: 116
diff changeset
    89
void TsTaskMonitorPrivate::changeListL()
116
hgs
parents:
diff changeset
    90
{
127
hgs
parents: 116
diff changeset
    91
    mUpdateSet.ResetAndDestroy();
hgs
parents: 116
diff changeset
    92
    HBufC8 *data = mClient->TasksContentLC();
hgs
parents: 116
diff changeset
    93
    if (data->Size() == 0) {
hgs
parents: 116
diff changeset
    94
        User::Leave(KErrCorrupt);
116
hgs
parents:
diff changeset
    95
    }
127
hgs
parents: 116
diff changeset
    96
    RDesReadStream dataStream;
hgs
parents: 116
diff changeset
    97
    CleanupClosePushL(dataStream);
hgs
parents: 116
diff changeset
    98
    dataStream.Open(*data);
hgs
parents: 116
diff changeset
    99
    const int count(dataStream.ReadInt32L());
hgs
parents: 116
diff changeset
   100
    for (int offset(0); offset < count; ++offset) {
hgs
parents: 116
diff changeset
   101
        CTsClientEntry* entry = CTsClientEntry::NewLC(dataStream);
hgs
parents: 116
diff changeset
   102
        mUpdateSet.AppendL(entry);
hgs
parents: 116
diff changeset
   103
        CleanupStack::Pop(entry);
116
hgs
parents:
diff changeset
   104
    }
127
hgs
parents: 116
diff changeset
   105
    CleanupStack::PopAndDestroy(&dataStream);
hgs
parents: 116
diff changeset
   106
    CleanupStack::PopAndDestroy(data);
116
hgs
parents:
diff changeset
   107
}
hgs
parents:
diff changeset
   108
hgs
parents:
diff changeset
   109
QDateTime TsTaskMonitorPrivate::dateTimeFromS60(const TTime &s60Time)
hgs
parents:
diff changeset
   110
{
hgs
parents:
diff changeset
   111
    TTime posixEpoch(_L("19700000:"));
hgs
parents:
diff changeset
   112
    TTimeIntervalSeconds secondsFrom;
hgs
parents:
diff changeset
   113
    TTimeIntervalMicroSeconds microSecondsFrom;
hgs
parents:
diff changeset
   114
    s60Time.SecondsFrom(posixEpoch, secondsFrom);
hgs
parents:
diff changeset
   115
    microSecondsFrom = s60Time.MicroSecondsFrom(posixEpoch);
hgs
parents:
diff changeset
   116
    QDateTime retVal = QDateTime::fromTime_t(secondsFrom.Int());
hgs
parents:
diff changeset
   117
    retVal = retVal.addMSecs((microSecondsFrom.Int64() % TInt64(1000000) ) / TInt64(1000));
hgs
parents:
diff changeset
   118
    return retVal;    
hgs
parents:
diff changeset
   119
}
hgs
parents:
diff changeset
   120
hgs
parents:
diff changeset
   121
int TsTaskMonitorPrivate::findItemIndex(
hgs
parents:
diff changeset
   122
                          const QList<TsTaskMonitorHistory> &historyList,
hgs
parents:
diff changeset
   123
                          const TsTaskMonitorHistory &item )
hgs
parents:
diff changeset
   124
{
hgs
parents:
diff changeset
   125
    for (int iter(0); iter < historyList.count(); iter++) {
127
hgs
parents: 116
diff changeset
   126
        if(historyList[iter] == item) {
116
hgs
parents:
diff changeset
   127
            return iter;
hgs
parents:
diff changeset
   128
        }
hgs
parents:
diff changeset
   129
    }
hgs
parents:
diff changeset
   130
    return -1;
hgs
parents:
diff changeset
   131
}
hgs
parents:
diff changeset
   132
hgs
parents:
diff changeset
   133
QList<int>  TsTaskMonitorPrivate::findInserts(
hgs
parents:
diff changeset
   134
                                 const QList<TsTaskMonitorHistory> &newHistory)
hgs
parents:
diff changeset
   135
{
hgs
parents:
diff changeset
   136
    QList<int> retVal = QList<int>();
hgs
parents:
diff changeset
   137
    for (int iter(0); iter < newHistory.count(); iter++) {
hgs
parents:
diff changeset
   138
        if (findItemIndex(mTaskHistory, newHistory[iter]) == -1) {
hgs
parents:
diff changeset
   139
            retVal.append(iter);
hgs
parents:
diff changeset
   140
        }
hgs
parents:
diff changeset
   141
    }
hgs
parents:
diff changeset
   142
    return retVal;
hgs
parents:
diff changeset
   143
}
hgs
parents:
diff changeset
   144
hgs
parents:
diff changeset
   145
QList<int> TsTaskMonitorPrivate::findDeletes(
hgs
parents:
diff changeset
   146
                                 const QList<TsTaskMonitorHistory> &newHistory)
hgs
parents:
diff changeset
   147
{
hgs
parents:
diff changeset
   148
    QList<int> retVal = QList<int>();
hgs
parents:
diff changeset
   149
    //iterate backwards to keep order during model operations
hgs
parents:
diff changeset
   150
    for (int iter(mTaskHistory.count() -1); iter >= 0 ; iter--) {
hgs
parents:
diff changeset
   151
        if (findItemIndex(newHistory, mTaskHistory[iter]) == -1) {
hgs
parents:
diff changeset
   152
            retVal.append(iter);
hgs
parents:
diff changeset
   153
        }
hgs
parents:
diff changeset
   154
    }
hgs
parents:
diff changeset
   155
    return retVal;    
hgs
parents:
diff changeset
   156
}
hgs
parents:
diff changeset
   157
hgs
parents:
diff changeset
   158
QList<TsTaskChange> TsTaskMonitorPrivate::getDeletesChangeset(
hgs
parents:
diff changeset
   159
                                                      const QList<int> &deleteList)
hgs
parents:
diff changeset
   160
{
hgs
parents:
diff changeset
   161
    QList<TsTaskChange> retVal;
hgs
parents:
diff changeset
   162
    foreach (int index, deleteList) {
hgs
parents:
diff changeset
   163
        TsTaskChangeInfo deleteChange(TsTaskChangeInfo::KInvalidOffset,
hgs
parents:
diff changeset
   164
                                                                   index);
hgs
parents:
diff changeset
   165
        retVal.append(TsTaskChange(deleteChange, QSharedPointer<TsTask>()));
hgs
parents:
diff changeset
   166
    }
hgs
parents:
diff changeset
   167
    return retVal;
hgs
parents:
diff changeset
   168
}
hgs
parents:
diff changeset
   169
hgs
parents:
diff changeset
   170
QList<TsTaskChange> TsTaskMonitorPrivate::getInsertsChangeset(const QList<int> &insertList,
127
hgs
parents: 116
diff changeset
   171
                                        const QList< QSharedPointer<CTsClientEntry> > &taskList)
116
hgs
parents:
diff changeset
   172
{
hgs
parents:
diff changeset
   173
    QList<TsTaskChange> retVal;
hgs
parents:
diff changeset
   174
    foreach (int index, insertList) {
hgs
parents:
diff changeset
   175
        TsTaskChangeInfo insertChange(index,
hgs
parents:
diff changeset
   176
                                 TsTaskChangeInfo::KInvalidOffset);
hgs
parents:
diff changeset
   177
        retVal.append(TsTaskChange(
hgs
parents:
diff changeset
   178
                            insertChange,
hgs
parents:
diff changeset
   179
                            QSharedPointer<TsTask>(new TsTask(taskList[index], *this))));
hgs
parents:
diff changeset
   180
    }
hgs
parents:
diff changeset
   181
    return retVal;
hgs
parents:
diff changeset
   182
}
hgs
parents:
diff changeset
   183
hgs
parents:
diff changeset
   184
QList<TsTaskMonitorHistory> TsTaskMonitorPrivate::substractInsertsFromNew(
hgs
parents:
diff changeset
   185
                                      const QList<int> &insertList,
hgs
parents:
diff changeset
   186
                                      const QList<TsTaskMonitorHistory> &newHistory )
hgs
parents:
diff changeset
   187
{
hgs
parents:
diff changeset
   188
    QList<TsTaskMonitorHistory> retVal(newHistory);
hgs
parents:
diff changeset
   189
    for ( int iter(insertList.count() - 1); iter >= 0 ; iter--) {
hgs
parents:
diff changeset
   190
        retVal.removeAt(insertList[iter]);
hgs
parents:
diff changeset
   191
    }
hgs
parents:
diff changeset
   192
    return retVal;
hgs
parents:
diff changeset
   193
}
hgs
parents:
diff changeset
   194
hgs
parents:
diff changeset
   195
QList<TsTaskMonitorHistory> TsTaskMonitorPrivate::substractDeletesFromOld(
hgs
parents:
diff changeset
   196
                                      const QList<int> &deleteList)
hgs
parents:
diff changeset
   197
{
hgs
parents:
diff changeset
   198
    QList<TsTaskMonitorHistory> retVal(mTaskHistory);  
hgs
parents:
diff changeset
   199
    for (int iter(0); iter < deleteList.count() ; iter++) {
hgs
parents:
diff changeset
   200
        retVal.removeAt(deleteList[iter]);
hgs
parents:
diff changeset
   201
    }
hgs
parents:
diff changeset
   202
    return retVal;
hgs
parents:
diff changeset
   203
}
hgs
parents:
diff changeset
   204
hgs
parents:
diff changeset
   205
QList<TsTaskChange> TsTaskMonitorPrivate::findMovesAndUpdates( 
hgs
parents:
diff changeset
   206
                                     const QList<TsTaskMonitorHistory> &newMinusInserts,
127
hgs
parents: 116
diff changeset
   207
                                     const QList< QSharedPointer<CTsClientEntry> > &taskList,
116
hgs
parents:
diff changeset
   208
                                     QList<TsTaskMonitorHistory> &workingList)
hgs
parents:
diff changeset
   209
{
hgs
parents:
diff changeset
   210
    QList<TsTaskChange> retVal;
hgs
parents:
diff changeset
   211
    for (int newPos(0); newPos < newMinusInserts.count(); newPos++) {
hgs
parents:
diff changeset
   212
        //case 1 item has moved
hgs
parents:
diff changeset
   213
        int previousPos = findItemIndex(workingList, newMinusInserts[newPos]);
hgs
parents:
diff changeset
   214
        if (newPos != previousPos) {
hgs
parents:
diff changeset
   215
            TsTaskChangeInfo moveChange(newPos, previousPos);
hgs
parents:
diff changeset
   216
            retVal.append(
hgs
parents:
diff changeset
   217
                TsTaskChange(moveChange, QSharedPointer<TsTask>()));
hgs
parents:
diff changeset
   218
            workingList.move(previousPos, newPos);
hgs
parents:
diff changeset
   219
        }
hgs
parents:
diff changeset
   220
        // case 2 item has changed
hgs
parents:
diff changeset
   221
        if (newMinusInserts[newPos].isUpdated(workingList[newPos])) {
hgs
parents:
diff changeset
   222
            TsTaskChangeInfo updateChange(newPos, newPos);
hgs
parents:
diff changeset
   223
            retVal.append( TsTaskChange(
hgs
parents:
diff changeset
   224
                              updateChange,
127
hgs
parents: 116
diff changeset
   225
                              QSharedPointer<TsTask>(new TsTask(taskList[newMinusInserts[newPos].offset()], *this)))); 
116
hgs
parents:
diff changeset
   226
        }
hgs
parents:
diff changeset
   227
    }
hgs
parents:
diff changeset
   228
    return retVal;
hgs
parents:
diff changeset
   229
}
hgs
parents:
diff changeset
   230
hgs
parents:
diff changeset
   231
void TsTaskMonitorPrivate::HandleRunningAppChange()
hgs
parents:
diff changeset
   232
{
hgs
parents:
diff changeset
   233
    emit q_ptr->taskListChanged();
hgs
parents:
diff changeset
   234
}
hgs
parents:
diff changeset
   235
127
hgs
parents: 116
diff changeset
   236
void TsTaskMonitorPrivate::openTask(const MTsEntry &entry)
116
hgs
parents:
diff changeset
   237
{
127
hgs
parents: 116
diff changeset
   238
    QT_TRAP_THROWING(
hgs
parents: 116
diff changeset
   239
    HBufC8 *dataPtr = keyLC(entry);
hgs
parents: 116
diff changeset
   240
    TPtr8 dataBuf(dataPtr->Des());
hgs
parents: 116
diff changeset
   241
    mClient->OpenTask(dataBuf);
hgs
parents: 116
diff changeset
   242
    CleanupStack::PopAndDestroy(dataPtr);
hgs
parents: 116
diff changeset
   243
    )
116
hgs
parents:
diff changeset
   244
}
hgs
parents:
diff changeset
   245
127
hgs
parents: 116
diff changeset
   246
void TsTaskMonitorPrivate::closeTask(const MTsEntry &entry)
hgs
parents: 116
diff changeset
   247
{
hgs
parents: 116
diff changeset
   248
    QT_TRAP_THROWING(
hgs
parents: 116
diff changeset
   249
    HBufC8 *dataPtr = keyLC(entry);
hgs
parents: 116
diff changeset
   250
    TPtr8 dataBuf(dataPtr->Des());
hgs
parents: 116
diff changeset
   251
    mClient->CloseTask(dataBuf);
hgs
parents: 116
diff changeset
   252
    CleanupStack::PopAndDestroy(dataPtr);
hgs
parents: 116
diff changeset
   253
    )
hgs
parents: 116
diff changeset
   254
}
hgs
parents: 116
diff changeset
   255
hgs
parents: 116
diff changeset
   256
HBufC8* TsTaskMonitorPrivate::keyLC(const MTsEntry &entry)
116
hgs
parents:
diff changeset
   257
{
127
hgs
parents: 116
diff changeset
   258
    HBufC8 *dataPtr = HBufC8::NewLC(TTsEntryKey::Size());
hgs
parents: 116
diff changeset
   259
    TPtr8 dataBuf(dataPtr->Des());
hgs
parents: 116
diff changeset
   260
    
hgs
parents: 116
diff changeset
   261
    RDesWriteStream dataStream;
hgs
parents: 116
diff changeset
   262
    CleanupClosePushL(dataStream);
hgs
parents: 116
diff changeset
   263
    dataStream.Open(dataBuf);
hgs
parents: 116
diff changeset
   264
    dataStream << entry.Key();
hgs
parents: 116
diff changeset
   265
    CleanupStack::PopAndDestroy(&dataStream);
hgs
parents: 116
diff changeset
   266
    
hgs
parents: 116
diff changeset
   267
    return dataPtr;
116
hgs
parents:
diff changeset
   268
}