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