activityfw/activitydatabase/hsactivitydbserver/src/afstoragesynctask.cpp
author hgs
Fri, 11 Jun 2010 16:13:51 +0300
changeset 98 d2f833ab7940
permissions -rw-r--r--
201023
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
98
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 <s32mem.h>
hgs
parents:
diff changeset
    18
#include <hash.h>
hgs
parents:
diff changeset
    19
#include <fbs.h>
hgs
parents:
diff changeset
    20
#include <bautils.h>
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
#include "afstoragesynctask.h"
hgs
parents:
diff changeset
    23
#include "activitycmd.h"
hgs
parents:
diff changeset
    24
#include "afentry.h"
hgs
parents:
diff changeset
    25
const TInt KMaxPathLength = 256;
hgs
parents:
diff changeset
    26
hgs
parents:
diff changeset
    27
_LIT(KUnsupportedStorageSyncTask, "Unsupported sync storage task");
hgs
parents:
diff changeset
    28
hgs
parents:
diff changeset
    29
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    30
/**
hgs
parents:
diff changeset
    31
 * Handle synchronous data storage requests
hgs
parents:
diff changeset
    32
 * @param dataStorage - data storage
hgs
parents:
diff changeset
    33
 * @param msg - request message
hgs
parents:
diff changeset
    34
 */
hgs
parents:
diff changeset
    35
void AfStorageSyncTask::ExecuteL(MAfTaskStorage& observers,
hgs
parents:
diff changeset
    36
                                 CAfStorage& dataStorage, 
hgs
parents:
diff changeset
    37
                                 const RMessage2& msg)
hgs
parents:
diff changeset
    38
{
hgs
parents:
diff changeset
    39
    switch (msg.Function()) {
hgs
parents:
diff changeset
    40
    case AddActivity: 
hgs
parents:
diff changeset
    41
        AddActivityL(dataStorage, msg);
hgs
parents:
diff changeset
    42
        break;
hgs
parents:
diff changeset
    43
    case UpdateActivity:
hgs
parents:
diff changeset
    44
        UpdateActivityL(dataStorage, msg);
hgs
parents:
diff changeset
    45
        break;
hgs
parents:
diff changeset
    46
    case RemoveActivity:
hgs
parents:
diff changeset
    47
        DeleteActivityL(dataStorage, msg);
hgs
parents:
diff changeset
    48
        break;
hgs
parents:
diff changeset
    49
    case RemoveApplicationActivities:
hgs
parents:
diff changeset
    50
        DeleteApplicationActivitiesL(dataStorage, msg);
hgs
parents:
diff changeset
    51
        break;
hgs
parents:
diff changeset
    52
    default:
hgs
parents:
diff changeset
    53
        //this code shouldn't be called. fatal error: means wrong session implementation 
hgs
parents:
diff changeset
    54
        User::Panic(KUnsupportedStorageSyncTask, KErrGeneral);
hgs
parents:
diff changeset
    55
    };
hgs
parents:
diff changeset
    56
    msg.Complete(KErrNone);
hgs
parents:
diff changeset
    57
    NotifyChangeL(observers, msg);
hgs
parents:
diff changeset
    58
}
hgs
parents:
diff changeset
    59
hgs
parents:
diff changeset
    60
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    61
/**
hgs
parents:
diff changeset
    62
 * Handle adding new activity.
hgs
parents:
diff changeset
    63
 * @param dataStorage - data storage
hgs
parents:
diff changeset
    64
 * @param msg - request message
hgs
parents:
diff changeset
    65
 */
hgs
parents:
diff changeset
    66
void AfStorageSyncTask::AddActivityL(CAfStorage& dataStorage, 
hgs
parents:
diff changeset
    67
                                     const RMessage2& msg)
hgs
parents:
diff changeset
    68
{
hgs
parents:
diff changeset
    69
    //Read message and bitmap handle
hgs
parents:
diff changeset
    70
    TPckgBuf<TInt> bitmapHdl(0);
hgs
parents:
diff changeset
    71
    CAfEntry *entry = CAfEntry::NewLC();
hgs
parents:
diff changeset
    72
    ReadEntryL(*entry, msg);
hgs
parents:
diff changeset
    73
    msg.ReadL(1, bitmapHdl);
hgs
parents:
diff changeset
    74
    
hgs
parents:
diff changeset
    75
    RBuf thumbnailPath;
hgs
parents:
diff changeset
    76
    CleanupClosePushL(thumbnailPath);
hgs
parents:
diff changeset
    77
    ThumbnailPathL(thumbnailPath, 
hgs
parents:
diff changeset
    78
                   dataStorage.Fs(), 
hgs
parents:
diff changeset
    79
                   entry->ApplicationId(), 
hgs
parents:
diff changeset
    80
                   entry->ActivityId());
hgs
parents:
diff changeset
    81
    CreateThumbnailL(thumbnailPath, bitmapHdl());
hgs
parents:
diff changeset
    82
    entry->SetImageSrcL(thumbnailPath);
hgs
parents:
diff changeset
    83
    dataStorage.AddActivityL(*entry);
hgs
parents:
diff changeset
    84
    CleanupStack::PopAndDestroy(&thumbnailPath);
hgs
parents:
diff changeset
    85
    
hgs
parents:
diff changeset
    86
    CleanupStack::PopAndDestroy(entry);
hgs
parents:
diff changeset
    87
}
hgs
parents:
diff changeset
    88
hgs
parents:
diff changeset
    89
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    90
/**
hgs
parents:
diff changeset
    91
 * Handle updating existing activiy
hgs
parents:
diff changeset
    92
 * @param dataStorage - data storage
hgs
parents:
diff changeset
    93
 * @param msg - request message
hgs
parents:
diff changeset
    94
 */
hgs
parents:
diff changeset
    95
void AfStorageSyncTask::UpdateActivityL(CAfStorage& dataStorage, 
hgs
parents:
diff changeset
    96
                                        const RMessage2& msg)
hgs
parents:
diff changeset
    97
{
hgs
parents:
diff changeset
    98
    TPckgBuf<TInt> bitmapHdl(0);
hgs
parents:
diff changeset
    99
    CAfEntry *entry = CAfEntry::NewLC();
hgs
parents:
diff changeset
   100
    ReadEntryL(*entry, msg);
hgs
parents:
diff changeset
   101
    msg.ReadL(1, bitmapHdl);
hgs
parents:
diff changeset
   102
        
hgs
parents:
diff changeset
   103
    RBuf thumbnailPath;
hgs
parents:
diff changeset
   104
    CleanupClosePushL(thumbnailPath);
hgs
parents:
diff changeset
   105
    ThumbnailPathL(thumbnailPath, 
hgs
parents:
diff changeset
   106
                   dataStorage.Fs(), 
hgs
parents:
diff changeset
   107
                   entry->ApplicationId(), 
hgs
parents:
diff changeset
   108
                   entry->ActivityId());
hgs
parents:
diff changeset
   109
    CreateThumbnailL(thumbnailPath, bitmapHdl());
hgs
parents:
diff changeset
   110
    entry->SetImageSrcL(thumbnailPath);
hgs
parents:
diff changeset
   111
    dataStorage.UpdateActivityL(*entry);
hgs
parents:
diff changeset
   112
    CleanupStack::PopAndDestroy(&thumbnailPath);
hgs
parents:
diff changeset
   113
    CleanupStack::PopAndDestroy(entry);
hgs
parents:
diff changeset
   114
}
hgs
parents:
diff changeset
   115
hgs
parents:
diff changeset
   116
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   117
/**
hgs
parents:
diff changeset
   118
 * Handle removing activity.
hgs
parents:
diff changeset
   119
 * @param dataStorage - data storage
hgs
parents:
diff changeset
   120
 * @param msg - request message
hgs
parents:
diff changeset
   121
 */
hgs
parents:
diff changeset
   122
void AfStorageSyncTask::DeleteActivityL(CAfStorage& dataStorage, 
hgs
parents:
diff changeset
   123
                                        const RMessage2& msg)
hgs
parents:
diff changeset
   124
{
hgs
parents:
diff changeset
   125
    CAfEntry *entry = CAfEntry::NewLC();
hgs
parents:
diff changeset
   126
    ReadEntryL(*entry, msg);
hgs
parents:
diff changeset
   127
    dataStorage.DeleteActivityL(*entry);
hgs
parents:
diff changeset
   128
    CleanupStack::PopAndDestroy(entry);
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
 * Handle removing all application activities.
hgs
parents:
diff changeset
   134
 * @param dataStorage - data storage
hgs
parents:
diff changeset
   135
 * @param msg - request message
hgs
parents:
diff changeset
   136
 */
hgs
parents:
diff changeset
   137
void AfStorageSyncTask::DeleteApplicationActivitiesL(CAfStorage& dataStorage, 
hgs
parents:
diff changeset
   138
                                                     const RMessage2& msg)
hgs
parents:
diff changeset
   139
{
hgs
parents:
diff changeset
   140
    CAfEntry *entry = CAfEntry::NewLC();
hgs
parents:
diff changeset
   141
    ReadEntryL(*entry, msg);
hgs
parents:
diff changeset
   142
    dataStorage.DeleteActivitiesL(*entry);
hgs
parents:
diff changeset
   143
    CleanupStack::PopAndDestroy(entry);
hgs
parents:
diff changeset
   144
}
hgs
parents:
diff changeset
   145
hgs
parents:
diff changeset
   146
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   147
//
hgs
parents:
diff changeset
   148
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   149
//
hgs
parents:
diff changeset
   150
void AfStorageSyncTask::NotifyChangeL(MAfTaskStorage& observers,
hgs
parents:
diff changeset
   151
                                      const RMessage2& msg)
hgs
parents:
diff changeset
   152
{
hgs
parents:
diff changeset
   153
    const RPointerArray<CAfTask> &table(observers.StorageData());
hgs
parents:
diff changeset
   154
    for (TInt iter(table.Count() - 1); 0 <= iter; --iter) {
hgs
parents:
diff changeset
   155
        table[iter]->BroadcastReceivedL(msg);
hgs
parents:
diff changeset
   156
    }
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
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   162
//
hgs
parents:
diff changeset
   163
void AfStorageSyncTask::ReadEntryL(CAfEntry& entry, const RMessage2& msg)
hgs
parents:
diff changeset
   164
{
hgs
parents:
diff changeset
   165
    RBuf8 serializedEntry;
hgs
parents:
diff changeset
   166
    CleanupClosePushL(serializedEntry);
hgs
parents:
diff changeset
   167
    serializedEntry.CreateL(msg.GetDesLengthL(0));
hgs
parents:
diff changeset
   168
    msg.ReadL(0, serializedEntry);
hgs
parents:
diff changeset
   169
    RDesReadStream reader(serializedEntry);
hgs
parents:
diff changeset
   170
    CleanupClosePushL(reader);
hgs
parents:
diff changeset
   171
    
hgs
parents:
diff changeset
   172
    reader >> entry;
hgs
parents:
diff changeset
   173
    
hgs
parents:
diff changeset
   174
    CleanupStack::PopAndDestroy(&reader);
hgs
parents:
diff changeset
   175
    CleanupStack::PopAndDestroy(&serializedEntry);
hgs
parents:
diff changeset
   176
}
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
//
hgs
parents:
diff changeset
   182
void AfStorageSyncTask::CreateThumbnailL(const TDesC &path, TInt hdl)
hgs
parents:
diff changeset
   183
{
hgs
parents:
diff changeset
   184
    if (0 >= hdl) {
hgs
parents:
diff changeset
   185
        User::Leave(KErrCorrupt);
hgs
parents:
diff changeset
   186
    }
hgs
parents:
diff changeset
   187
    CFbsBitmap *bitmap = new (ELeave) CFbsBitmap;
hgs
parents:
diff changeset
   188
    CleanupStack::PushL(bitmap);
hgs
parents:
diff changeset
   189
    User::LeaveIfError(bitmap->Duplicate(hdl));
hgs
parents:
diff changeset
   190
    User::LeaveIfError(bitmap->Save(path));
hgs
parents:
diff changeset
   191
    CleanupStack::PopAndDestroy(bitmap);
hgs
parents:
diff changeset
   192
}
hgs
parents:
diff changeset
   193
hgs
parents:
diff changeset
   194
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   195
//
hgs
parents:
diff changeset
   196
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   197
//
hgs
parents:
diff changeset
   198
void AfStorageSyncTask::ThumbnailPathL(RBuf &dst, 
hgs
parents:
diff changeset
   199
                                       RFs& fileSystem, 
hgs
parents:
diff changeset
   200
                                       TInt uid, 
hgs
parents:
diff changeset
   201
                                       const TDesC &activityName)
hgs
parents:
diff changeset
   202
{
hgs
parents:
diff changeset
   203
    _LIT(KUidFormat, "%+08x\\");
hgs
parents:
diff changeset
   204
    _LIT(KExtFormat, ".mbm");
hgs
parents:
diff changeset
   205
    //Generate activity hash
hgs
parents:
diff changeset
   206
    RBuf8 buff8;
hgs
parents:
diff changeset
   207
    CleanupClosePushL(buff8);
hgs
parents:
diff changeset
   208
    buff8.CreateL(activityName.Length());
hgs
parents:
diff changeset
   209
    buff8.Copy(activityName);
hgs
parents:
diff changeset
   210
    HBufC8 *activityHash = Md5HexDigestL(buff8);
hgs
parents:
diff changeset
   211
    CleanupStack::PopAndDestroy(&buff8);
hgs
parents:
diff changeset
   212
    CleanupStack::PushL(activityHash);
hgs
parents:
diff changeset
   213
    
hgs
parents:
diff changeset
   214
    //Get private path
hgs
parents:
diff changeset
   215
    RBuf privatePath;
hgs
parents:
diff changeset
   216
    CleanupClosePushL(privatePath);
hgs
parents:
diff changeset
   217
    privatePath.CreateL(KMaxPathLength);
hgs
parents:
diff changeset
   218
    User::LeaveIfError(fileSystem.PrivatePath(privatePath));
hgs
parents:
diff changeset
   219
    
hgs
parents:
diff changeset
   220
    //Format activity path
hgs
parents:
diff changeset
   221
    privatePath.AppendFormat( KUidFormat, uid);
hgs
parents:
diff changeset
   222
    
hgs
parents:
diff changeset
   223
    const TInt requiredSize(privatePath.Length() + 
hgs
parents:
diff changeset
   224
                            activityHash->Length() + 
hgs
parents:
diff changeset
   225
                            KExtFormat().Length());
hgs
parents:
diff changeset
   226
    CAfEntry::ReallocL(dst, requiredSize);
hgs
parents:
diff changeset
   227
    
hgs
parents:
diff changeset
   228
    //Copy path
hgs
parents:
diff changeset
   229
    dst.Copy(privatePath);
hgs
parents:
diff changeset
   230
    privatePath.Copy(*activityHash);//reuse already allocated buffer to convert 8 -> 16
hgs
parents:
diff changeset
   231
    dst.Append(privatePath);
hgs
parents:
diff changeset
   232
    dst.Append(KExtFormat());
hgs
parents:
diff changeset
   233
    
hgs
parents:
diff changeset
   234
    CleanupStack::PopAndDestroy(&privatePath);
hgs
parents:
diff changeset
   235
    CleanupStack::PopAndDestroy(activityHash);
hgs
parents:
diff changeset
   236
    
hgs
parents:
diff changeset
   237
    BaflUtils::EnsurePathExistsL(fileSystem, dst);
hgs
parents:
diff changeset
   238
}
hgs
parents:
diff changeset
   239
hgs
parents:
diff changeset
   240
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   241
//
hgs
parents:
diff changeset
   242
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   243
//
hgs
parents:
diff changeset
   244
HBufC8* AfStorageSyncTask::Md5HexDigestL(const TDes8 &string)
hgs
parents:
diff changeset
   245
{
hgs
parents:
diff changeset
   246
    _LIT8(KMd5HexFormat, "%+02x");
hgs
parents:
diff changeset
   247
    CMD5* md5 = CMD5::NewL();
hgs
parents:
diff changeset
   248
    CleanupStack::PushL(md5);
hgs
parents:
diff changeset
   249
    
hgs
parents:
diff changeset
   250
    TPtrC8 hashedSig(md5->Hash(string));
hgs
parents:
diff changeset
   251
    
hgs
parents:
diff changeset
   252
    HBufC8* buf = HBufC8::NewL(hashedSig.Length() * 2);
hgs
parents:
diff changeset
   253
    TPtr8 bufPtr = buf->Des();
hgs
parents:
diff changeset
   254
    
hgs
parents:
diff changeset
   255
    for(TInt i(0); i< hashedSig.Length(); ++i) {
hgs
parents:
diff changeset
   256
        bufPtr.AppendFormat(KMd5HexFormat,hashedSig[i]);
hgs
parents:
diff changeset
   257
    }
hgs
parents:
diff changeset
   258
    CleanupStack::PopAndDestroy(md5);
hgs
parents:
diff changeset
   259
    return buf;
hgs
parents:
diff changeset
   260
}