messagingfw/msgsrvnstore/server/src/MCLENTRY.CPP
author hgs
Wed, 03 Nov 2010 22:41:46 +0530
changeset 62 db3f5fa34ec7
permissions -rw-r--r--
201044_02
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
62
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
     1
// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
     2
// All rights reserved.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
     7
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
     8
// Initial Contributors:
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    10
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    11
// Contributors:
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    12
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    13
// Description:
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    14
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    15
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    16
#ifdef _DEBUG
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    17
#undef _NO_SESSION_LOGGING_
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    18
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    19
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    20
#include <s32std.h>
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    21
#include <txtrich.h>
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    22
#include "MSVIDS.H"
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    23
#include "MSVUIDS.H"
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    24
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    25
#include "MSVAPI.H"
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    26
#include "MSVCOP.H"
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    27
#include "MCLENTRY.H"
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    28
#include "MSVPANIC.H"
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    29
#include "MSVUTILS.H"
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    30
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    31
#include <mmsvstoremanager.h>
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    32
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    33
const TInt KMsvClientEntryArrayGranuality=8;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    34
const TInt KMsvEntryObserverArrayGranuality=4;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    35
const TInt KMsvMtmListGranularity=8;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    36
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    37
//**********************************
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    38
// CMsvClientEntry
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    39
//**********************************
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    40
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    41
// static 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    42
CMsvClientEntry* CMsvClientEntry::NewLC(const TMsvEntry& aEntry, TMsvClientEntryType aType)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    43
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    44
	CMsvClientEntry* self = new(ELeave) CMsvClientEntry(aEntry, aType);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    45
	CleanupStack::PushL(self);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    46
	self->ConstructL();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    47
	return self;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    48
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    49
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    50
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    51
CMsvClientEntry::CMsvClientEntry(const TMsvEntry& aEntry, TMsvClientEntryType aType)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    52
:iEntry(aEntry), iType(aType)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    53
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    54
	__DECLARE_NAME(_S("CMsvClientEntry"));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    55
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    56
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    57
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    58
CMsvClientEntry::~CMsvClientEntry()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    59
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    60
	delete iDescription;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    61
	delete iDetails;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    62
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    63
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    64
void CMsvClientEntry::ConstructL()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    65
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    66
	iDescription = HBufC::NewL(iEntry.iDescription.Length());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    67
	iDescription->Des().Copy(iEntry.iDescription);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    68
	iEntry.iDescription.Set(iDescription->Des());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    69
	iDetails = HBufC::NewL(iEntry.iDetails.Length());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    70
	iDetails->Des().Copy(iEntry.iDetails);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    71
	iEntry.iDetails.Set(iDetails->Des());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    72
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    73
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    74
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    75
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    76
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    77
//**********************************
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    78
// CMsvEntry
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    79
//**********************************
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    80
#if (defined SYMBIAN_MSGS_ENHANCED_REMOVABLE_MEDIA_SUPPORT)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    81
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    82
EXPORT_C CMsvEntry* CMsvEntry::NewL(CMsvSession& aMsvSession, TMsvId aMsvId, const TMsvSelectionOrdering& aOrdering, TBool aChildrenOfAvailableDrives)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    83
/** Creates a new CMsvEntry for the specified entry ID. 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    84
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    85
Note that this function does not create a new entry, but simply a new object 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    86
to access an existing entry. To create a new entry, use CreateL().
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    87
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    88
@param aMsvSession The client’s Message Server session 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    89
@param aMsvId ID of the entry to access 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    90
@param aSortType  The initial sort order of children of the entry, for example, 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    91
when returned by ChildrenL(). The order can be changed later by SetSortTypeL().
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    92
@param aChildrenOfAvailableDrives Indicates whether children from all available drives are 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    93
to be fetched during construction of this entry. However, a value of true is valid only
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    94
if aMsvId is one of the standard folders, i.e. Inbox, Outbox, Drafts, Sent or Deleted.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    95
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    96
@return If the function succeeds, this is a pointer to a newly allocated and initialised object. 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    97
@leave KErrNotFound The requested entry does not exist.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    98
@leave KErrNoMemory A memory allocation failed.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    99
@leave KErrArgument aChildrenOfAvailableDrives is set to true and the requested entry is not 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   100
one of the standard folders, i.e. Inbox, Outbox, Drafts, Sent or Deleted.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   101
*/
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   102
    {
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   103
    CMsvEntry* self = new(ELeave) CMsvEntry(aMsvSession, aOrdering, aChildrenOfAvailableDrives);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   104
    CleanupStack::PushL(self);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   105
    self->ConstructL(aMsvId);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   106
    CleanupStack::Pop();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   107
    return self;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   108
    }
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   109
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   110
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   111
CMsvEntry::CMsvEntry(CMsvSession& aMsvSession, const TMsvSelectionOrdering& aOrdering, TBool aChildrenOfAvailableDrives)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   112
:iState(EValid), iMsvSession(aMsvSession), iOrdering(aOrdering), iChildrenOfAvailableDrives(aChildrenOfAvailableDrives)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   113
    {
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   114
    __DECLARE_NAME(_S("CMsvEntry"));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   115
    }
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   116
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   117
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   118
EXPORT_C void CMsvEntry::SetStandardFolderEntryL(TMsvId aId)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   119
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   120
// Changes the context to another entry
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   121
// If the function leaves, the context is unchanged
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   122
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   123
/** Sets the context to the specified entry while also fetching
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   124
children from all available drives. This function can be used to
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   125
set the context to only the standard folders i.e. Inbox, Outbox,
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   126
Drafts, Sent or Deleted.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   127
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   128
If the function leaves, the context is unchanged.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   129
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   130
@param aId ID of the message entry which is to become the new context 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   131
@leave KErrNotFound aId could not be found in the index.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   132
@leave KErrArgument aId is not one of the standard folders, i.e. Inbox,
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   133
Outbox, Drafts, Sent or Deleted folders.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   134
*/
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   135
    {
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   136
    __ASSERT_ALWAYS(iStore==NULL, PanicServer(EMsvStoreLeftOpen));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   137
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   138
    if (aId==iEntryPtr->Id() && iState==EValid)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   139
        return;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   140
    
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   141
    SetEntryNoCheckL(aId, ETrue);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   142
    }
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   143
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   144
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   145
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   146
#endif           // #if (defined SYMBIAN_MSGS_ENHANCED_REMOVABLE_MEDIA_SUPPORT)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   147
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   148
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   149
EXPORT_C CMsvEntry* CMsvEntry::NewL(CMsvSession& aMsvSession, TMsvId aMsvId, const TMsvSelectionOrdering& aOrdering)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   150
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   151
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   152
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   153
/** Creates a new CMsvEntry for the specified entry ID. 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   154
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   155
Note that this function does not create a new entry, but simply a new object 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   156
to access an existing entry. To create a new entry, use CreateL().
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   157
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   158
@param aMsvSession The client’s Message Server session 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   159
@param aMsvId ID of the entry to access 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   160
@param aSortType  The initial sort order of children of the entry, for example, 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   161
when returned by ChildrenL(). The order can be changed later by SetSortTypeL(). 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   162
@return If the function succeeds, this is a pointer to a newly allocated and initialised object. 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   163
@leave KErrNotFound The requested entry does not exist 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   164
@leave KErrNoMemory A memory allocation failed 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   165
*/
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   166
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   167
	CMsvEntry* self = new(ELeave) CMsvEntry(aMsvSession, aOrdering);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   168
	CleanupStack::PushL(self);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   169
	self->ConstructL(aMsvId);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   170
	CleanupStack::Pop();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   171
	return self;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   172
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   173
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   174
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   175
CMsvEntry::CMsvEntry(CMsvSession& aMsvSession, const TMsvSelectionOrdering& aOrdering)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   176
:iState(EValid), iMsvSession(aMsvSession), iOrdering(aOrdering)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   177
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   178
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   179
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   180
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   181
	__DECLARE_NAME(_S("CMsvEntry"));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   182
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   183
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   184
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   185
EXPORT_C CMsvEntry::~CMsvEntry()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   186
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   187
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   188
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   189
/** Destructor. 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   190
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   191
This cleans up the object. CMsvEntry objects must be deleted by client applications 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   192
when they are no longer required. Note that deleting a CMsvEntry object does 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   193
not delete the context, simply the immediate means of accessing it. */
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   194
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   195
	__ASSERT_ALWAYS(iStore==NULL, PanicServer(EMsvStoreLeftOpenOnDestruction2));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   196
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   197
	if (iOberserverAdded)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   198
		iMsvSession.RemoveObserver(*this);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   199
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   200
	if (iEntries)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   201
		iEntries->ResetAndDestroy();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   202
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   203
	delete iEntries;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   204
	delete iSortedChildren;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   205
	delete iObservers;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   206
	delete iMtmList;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   207
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   208
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   209
void CMsvEntry::ConstructL(TMsvId aId)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   210
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   211
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   212
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   213
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   214
#if (defined SYMBIAN_MSGS_ENHANCED_REMOVABLE_MEDIA_SUPPORT)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   215
    if(iChildrenOfAvailableDrives && !MsvUtils::IsStandardId(aId))
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   216
        {
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   217
        User::Leave(KErrArgument);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   218
        }
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   219
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   220
	iEntries = new (ELeave) CArrayPtrFlat<CMsvClientEntry>(KMsvClientEntryArrayGranuality);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   221
	iMtmList = new(ELeave) CArrayFixFlat<TUid>(KMsvMtmListGranularity);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   222
	iSortedChildren = CMsvEntryArray::NewL(*iMtmList);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   223
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   224
	// get the required entry from the server
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   225
	CMsvClientEntry* cEntry = DoGetEntryLC(aId, iOwningService);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   226
	cEntry->SetType(EMsvClientContext);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   227
	iEntries->AppendL(cEntry);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   228
	CleanupStack::Pop(); // cEntry
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   229
	iEntryPtr = &iEntries->At(0)->Entry();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   230
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   231
	// get the children
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   232
	DoGetChildrenL();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   233
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   234
	// Get the notification sequence number
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   235
	iNotifySequence = iMsvSession.Session().NotifySequenceL();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   236
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   237
	// get the event notifications from the server
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   238
	iMsvSession.AddObserverL(*this);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   239
	iOberserverAdded=ETrue;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   240
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   241
#ifndef _NO_SESSION_LOGGING_
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   242
	Log(_L("Constructed CMsvEntry on entry %x"), aId); 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   243
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   244
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   245
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   246
#ifndef _NO_SESSION_LOGGING_
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   247
void CMsvEntry::Log(TRefByValue<const TDesC> aFmt, ...)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   248
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   249
	VA_LIST list;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   250
	VA_START(list, aFmt);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   251
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   252
	// Generate the text
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   253
	TBuf<256> buf;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   254
	buf.FormatList(aFmt, list);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   255
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   256
	// Write to file
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   257
	_LIT(KFormatFile, "CMsvEntry %x: %S");
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   258
	iMsvSession.iLog.WriteFormat(KFormatFile, this, &buf);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   259
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   260
	// Write to serial
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   261
#ifndef _NO_SESSION_LOGGING_SERIAL_
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   262
	_LIT(KFormatSerial, "MSGS: CMsvEntry %x: %S");
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   263
	RDebug::Print(KFormatSerial, this, &buf);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   264
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   265
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   266
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   267
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   268
CMsvClientEntry* CMsvEntry::DoGetEntryLC(TMsvId aId, TMsvId& aOwningService)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   269
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   270
// Gets the entry data from the server and create a CMsvClientEntry around it
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   271
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   272
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   273
	TMsvEntry tEntry;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   274
	User::LeaveIfError(iMsvSession.Session().GetEntry(aId, aOwningService, tEntry));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   275
	if (tEntry.iType==KUidMsvRootEntry)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   276
		aOwningService=aId;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   277
	return CMsvClientEntry::NewLC(tEntry, EMsvClientNull);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   278
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   279
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   280
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   281
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   282
void CMsvEntry::DoGetChildrenL()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   283
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   284
// Gets the children of the context and places them in the entries array
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   285
// The sorted children pointer array is implicited sorted, as the entries are retrieved
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   286
// from the server with the current sort order
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   287
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   288
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   289
	__ASSERT_DEBUG(iEntries->Count()==1, PanicServer(EMsvChildEntriesExist1));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   290
	__ASSERT_DEBUG(iSortedChildren->Count()==0, PanicServer(EMsvChildEntriesExist2));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   291
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   292
	// get the children from the server - using only the visible flag
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   293
	TMsvSelectionOrdering order(KMsvNoGrouping, EMsvSortByNone, iOrdering.ShowInvisibleEntries());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   294
#if (defined SYMBIAN_MSGS_ENHANCED_REMOVABLE_MEDIA_SUPPORT)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   295
    // If child entries from all drives in the device are to be fetched.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   296
    if(iChildrenOfAvailableDrives)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   297
        {
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   298
		User::LeaveIfError(iMsvSession.Session().GetChildrenAll(iEntryPtr->Id(), *iEntries, order));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   299
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   300
	else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   301
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   302
        {
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   303
        User::LeaveIfError(iMsvSession.Session().GetChildren(iEntryPtr->Id(), *iEntries, order));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   304
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   305
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   306
	// add the children to the sorted pointer list - current context is the first entry
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   307
	TInt totalCount=iEntries->Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   308
	for (TInt count=1; count<totalCount; count++)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   309
		iSortedChildren->AppendL(&iEntries->At(count)->Entry());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   310
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   311
	// sort the children
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   312
	iSortedChildren->SortL(iOrdering);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   313
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   314
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   315
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   316
EXPORT_C void CMsvEntry::SetEntryL(TMsvId aId)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   317
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   318
// Changes the context to another entry
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   319
// If the function leaves, the context is unchanged
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   320
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   321
/** Sets the context to the specified entry. 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   322
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   323
If the function leaves, the context is unchanged.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   324
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   325
@param aId ID of the message entry which is to become the new context 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   326
@leave KErrNotFound aId could not be found in the index */
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   327
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   328
	__ASSERT_ALWAYS(iStore==NULL, PanicServer(EMsvStoreLeftOpen));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   329
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   330
	if (aId==iEntryPtr->Id() && iState==EValid)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   331
		return;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   332
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   333
 	SetEntryNoCheckL(aId);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   334
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   335
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   336
#if (defined SYMBIAN_MSGS_ENHANCED_REMOVABLE_MEDIA_SUPPORT)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   337
EXPORT_C void CMsvEntry::SetEntryNoCheckL(TMsvId aId, TBool aChildrenOfAvailableDrives /* DEFAULT=EFalse*/)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   338
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   339
// Changes the context to another entry
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   340
// If the function leaves, the context is unchanged
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   341
// The function does not check for when the context is already on
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   342
// the given TMsvId.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   343
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   344
/** Sets the context to the specified entry.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   345
Children from all available drives will be fetched depending on the value of
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   346
aChildrenOfAvailableDrives.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   347
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   348
If the function leaves, the context is unchanged.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   349
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   350
@internalTechnology
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   351
@param aId ID of the message entry which is to become the new context
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   352
@param aChildrenOfAvailableDrives Indicates whether children from all available drives are to
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   353
be fetched during construction of this entry. However, a value of true is valid only
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   354
if aMsvId is one among TMsvId's of Inbox, Outbox, Drafts, Sent or Deleted folders.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   355
@leave KErrNotFound aMsvId could not be found in the index 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   356
@leave KErrArgument aChildrenOfAvailableDrives is set to true and the requested entry is not
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   357
one of the standard folders, i.e. Inbox, Outbox, Drafts, Sent or Deleted. */
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   358
    {
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   359
    __ASSERT_ALWAYS(iStore==NULL, PanicServer(EMsvStoreLeftOpen));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   360
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   361
    if(aChildrenOfAvailableDrives && !MsvUtils::IsStandardId(aId))
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   362
        {
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   363
        User::Leave(KErrArgument);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   364
        }
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   365
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   366
    // create new entry array
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   367
    CArrayPtrFlat<CMsvClientEntry>* newEntries = new (ELeave) CArrayPtrFlat<CMsvClientEntry>(KMsvClientEntryArrayGranuality);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   368
    CleanupStack::PushL(newEntries);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   369
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   370
    // get the new context and place in array
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   371
    TMsvId newOwningService;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   372
    CMsvClientEntry* cEntry = DoGetEntryLC(aId, newOwningService);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   373
    cEntry->SetType(EMsvClientContext);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   374
    newEntries->AppendL(cEntry);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   375
    // create new children array
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   376
    CMsvEntryArray* newSortedChildren = CMsvEntryArray::NewL(*iMtmList);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   377
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   378
    // keep the old arrays
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   379
    CArrayPtrFlat<CMsvClientEntry>* oldEntries = iEntries;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   380
    CMsvEntryArray* oldSortedChildren = iSortedChildren;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   381
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   382
    TBool oldFlag = iChildrenOfAvailableDrives;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   383
    iChildrenOfAvailableDrives = aChildrenOfAvailableDrives;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   384
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   385
    // use new arrays
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   386
    CleanupStack::Pop(2); // cEntry, newEntries
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   387
    iEntries = newEntries;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   388
    iSortedChildren = newSortedChildren;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   389
    iEntryPtr = &iEntries->At(0)->Entry();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   390
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   391
    // get the children and sort accordingly
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   392
    TRAPD(leave, DoGetChildrenL(); iNotifySequence = iMsvSession.Session().NotifySequenceL());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   393
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   394
    if (leave)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   395
        {
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   396
#ifndef _NO_SESSION_LOGGING_
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   397
        Log(_L("Failed to SetEntryL to %x with %d"), aId, leave); 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   398
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   399
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   400
        // reset the old context
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   401
        iChildrenOfAvailableDrives = oldFlag;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   402
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   403
        iEntries = oldEntries;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   404
        iSortedChildren = oldSortedChildren;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   405
        iEntryPtr = &iEntries->At(0)->Entry();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   406
        // cleanup
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   407
        newEntries->ResetAndDestroy();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   408
        delete newEntries;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   409
        delete newSortedChildren;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   410
        // propogate leave
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   411
        User::Leave(leave);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   412
        }
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   413
    else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   414
        {
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   415
#ifndef _NO_SESSION_LOGGING_
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   416
        Log(_L("SetEntryL to %x, sequence %d"), aId, iNotifySequence); 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   417
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   418
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   419
        // set the new owning service
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   420
        iOwningService = newOwningService;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   421
        // delete the old context
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   422
        oldEntries->ResetAndDestroy();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   423
        delete oldEntries;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   424
        delete oldSortedChildren;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   425
        // make sure the state is marked as valid
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   426
        iState = EValid;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   427
        }
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   428
    }
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   429
#else   //#define SYMBIAN_MSGS_ENHANCED_REMOVABLE_MEDIA_SUPPORT
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   430
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   431
EXPORT_C void CMsvEntry::SetEntryNoCheckL(TMsvId aId)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   432
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   433
// Changes the context to another entry
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   434
// If the function leaves, the context is unchanged
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   435
// The function does not check for when the context is already on
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   436
// the given TMsvId.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   437
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   438
/** Sets the context to the specified entry. 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   439
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   440
If the function leaves, the context is unchanged.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   441
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   442
@internalTechnology
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   443
@param aId ID of the message entry which is to become the new context 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   444
@leave KErrNotFound aMsvId could not be found in the index */
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   445
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   446
	__ASSERT_ALWAYS(iStore==NULL, PanicServer(EMsvStoreLeftOpen));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   447
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   448
	// create new entry array
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   449
	CArrayPtrFlat<CMsvClientEntry>* newEntries = new (ELeave) CArrayPtrFlat<CMsvClientEntry>(KMsvClientEntryArrayGranuality);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   450
	CleanupStack::PushL(newEntries);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   451
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   452
	// get the new context and place in array
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   453
	TMsvId newOwningService;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   454
	CMsvClientEntry* cEntry = DoGetEntryLC(aId, newOwningService);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   455
	cEntry->SetType(EMsvClientContext);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   456
	newEntries->AppendL(cEntry);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   457
	// create new children array
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   458
	CMsvEntryArray* newSortedChildren = CMsvEntryArray::NewL(*iMtmList);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   459
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   460
	// keep the old arrays
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   461
	CArrayPtrFlat<CMsvClientEntry>* oldEntries = iEntries;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   462
	CMsvEntryArray* oldSortedChildren = iSortedChildren;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   463
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   464
	// use new arrays
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   465
	CleanupStack::Pop(2); // cEntry, newEntries
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   466
	iEntries = newEntries;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   467
	iSortedChildren = newSortedChildren;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   468
	iEntryPtr = &iEntries->At(0)->Entry();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   469
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   470
	// get the children and sort accordingly
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   471
	TRAPD(leave, DoGetChildrenL(); iNotifySequence = iMsvSession.Session().NotifySequenceL());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   472
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   473
	if (leave)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   474
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   475
#ifndef _NO_SESSION_LOGGING_
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   476
		Log(_L("Failed to SetEntryL to %x with %d"), aId, leave); 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   477
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   478
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   479
		// reset the old context
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   480
		iEntries = oldEntries;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   481
		iSortedChildren = oldSortedChildren;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   482
		iEntryPtr = &iEntries->At(0)->Entry();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   483
		// cleanup
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   484
		newEntries->ResetAndDestroy();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   485
		delete newEntries;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   486
		delete newSortedChildren;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   487
		// propogate leave
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   488
		User::Leave(leave);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   489
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   490
	else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   491
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   492
#ifndef _NO_SESSION_LOGGING_
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   493
		Log(_L("SetEntryL to %x, sequence %d"), aId, iNotifySequence); 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   494
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   495
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   496
		// set the new owning service
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   497
		iOwningService = newOwningService;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   498
		// delete the old context
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   499
		oldEntries->ResetAndDestroy();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   500
		delete oldEntries;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   501
		delete oldSortedChildren;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   502
		// make sure the state is marked as valid
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   503
		iState = EValid;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   504
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   505
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   506
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   507
/**
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   508
Creates a new child entry owned by the context asynchronously.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   509
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   510
Note that all session observers are notified when a new entry is created with 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   511
an EMsvEntriesCreated event (see TMsvSessionEvent). CMsvEntry objects are 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   512
such session observers themselves. When the object receives such a session 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   513
notification, it calls all registered entry observers with a TMsvEntryEvent 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   514
event EMsvNewChildren, passing in the ID of the new child.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   515
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   516
If aEntry is not a service entry, then the context must not be set to the root entry and iServiceId field must be defined .
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   517
If aEntry is a service entry, then the context must be set to the root entry.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   518
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   519
The returned CMsvOperation object completes when creation is complete.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   520
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   521
@param	aEntry
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   522
Index entry value for the new entry 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   523
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   524
@param	aStatus
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   525
The request status to be completed when the operation has finished 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   526
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   527
@leave	KErrArgument aEntry is invalid 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   528
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   529
@return 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   530
The operation object controlling the create command. 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   531
*/
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   532
EXPORT_C CMsvOperation* CMsvEntry::CreateL(const TMsvEntry& aEntry, TRequestStatus& aStatus)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   533
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   534
	return CreateL(aEntry, RProcess().SecureId(), aStatus);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   535
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   536
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   537
/**
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   538
Creates a new child entry owned by the context asynchronously. Sets the owner of 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   539
the created entry to process specified by the supplied ID.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   540
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   541
Note that all session observers are notified when a new entry is created with 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   542
an EMsvEntriesCreated event (see TMsvSessionEvent). CMsvEntry objects are 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   543
such session observers themselves. When the object receives such a session 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   544
notification, it calls all registered entry observers with a TMsvEntryEvent 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   545
event EMsvNewChildren, passing in the ID of the new child.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   546
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   547
If aEntry is not a service entry, then the context must not be set to the root entry and iServiceId field must be defined .
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   548
If aEntry is a service entry, then the context must be set to the root entry.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   549
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   550
The returned CMsvOperation object completes when creation is complete.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   551
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   552
@param	aEntry
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   553
Index entry value for the new entry 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   554
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   555
@param	aOwnerId
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   556
The ID of process that owns the created entry.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   557
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   558
@param	aStatus
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   559
The request status to be completed when the operation has finished 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   560
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   561
@leave 	KErrArgument aEntry is invalid 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   562
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   563
@return 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   564
The operation object controlling the create command. 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   565
*/
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   566
EXPORT_C CMsvOperation* CMsvEntry::CreateL(const TMsvEntry& aEntry, TSecureId aOwnerId, TRequestStatus& aStatus)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   567
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   568
#ifndef _NO_SESSION_LOGGING_
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   569
	Log(_L("Asynchronous CreateL")); 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   570
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   571
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   572
	__ASSERT_DEBUG(iState==EValid || iState==EInvalidDeletedContext || iState==EInvalidChangingContext, PanicServer(EMsvEntryStateUndetermined));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   573
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   574
	TMsvEntry entry=aEntry;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   575
	entry.SetParent(iEntryPtr->Id());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   576
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   577
	__ASSERT_DEBUG(MsvUtils::ValidEntry(entry, ETrue), PanicServer(EMsvCreatingInvalidEntry));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   578
	if (!MsvUtils::ValidEntry(entry, ETrue))
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   579
		User::Leave(KErrArgument);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   580
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   581
	CMsvEntryOperation* operation = CMsvEntryOperation::NewL(iMsvSession, aStatus);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   582
	CleanupStack::PushL(operation);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   583
	User::LeaveIfError(iMsvSession.Session().OperationMtmL(iEntryPtr->Id(), operation->iMtm, operation->iService));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   584
	iMsvSession.Session().CreateEntryL(entry, operation->Id(), aOwnerId, operation->iStatus);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   585
	operation->Start();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   586
	CleanupStack::Pop(); // operation
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   587
	return operation;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   588
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   589
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   590
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   591
/** 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   592
Creates a new child entry owned by the context synchronously. 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   593
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   594
Note that all session observers are notified when a new entry is created with 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   595
an EMsvEntriesCreated event (see TMsvSessionEvent). CMsvEntry objects are 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   596
such session observers themselves. When the object receives such a session 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   597
notification, it calls all registered entry observers with a TMsvEntryEvent 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   598
event EMsvNewChildren, passing in the ID of the new child.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   599
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   600
If aEntry is not a service entry, then the context must not be set to the root entry and iServiceId field must be defined .
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   601
If aEntry is a service entry, then the context must be set to the root entry.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   602
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   603
This function can only be used on local entries.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   604
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   605
@param	aEntry
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   606
Index entry value for the new entry 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   607
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   608
@leave	KErrArgument aEntry is invalid
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   609
*/
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   610
EXPORT_C void CMsvEntry::CreateL(TMsvEntry& aEntry)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   611
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   612
	CreateL(aEntry, RProcess().SecureId());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   613
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   614
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   615
/** 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   616
Creates a new child entry owned by the context synchronously. Sets the owner of 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   617
the created entry to process specified by the supplied ID. 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   618
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   619
Note that all session observers are notified when a new entry is created with 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   620
an EMsvEntriesCreated event (see TMsvSessionEvent). CMsvEntry objects are 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   621
such session observers themselves. When the object receives such a session 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   622
notification, it calls all registered entry observers with a TMsvEntryEvent 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   623
event EMsvNewChildren, passing in the ID of the new child.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   624
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   625
If aEntry is not a service entry, then the context must not be set to the root entry and iServiceId field must be defined .
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   626
If aEntry is a service entry, then the context must be set to the root entry.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   627
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   628
This function can only be used on local entries.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   629
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   630
@param	aEntry
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   631
Index entry value for the new entry
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   632
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   633
@param	aOwnerId
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   634
The ID of process that owns the created entry.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   635
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   636
@leave	KErrArgument aEntry is invalid
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   637
*/
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   638
EXPORT_C void CMsvEntry::CreateL(TMsvEntry& aEntry, TSecureId aOwnerId)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   639
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   640
#ifndef _NO_SESSION_LOGGING_
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   641
	Log(_L("Synchronous CreateL")); 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   642
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   643
	__ASSERT_ALWAYS(iOwningService == KMsvLocalServiceIndexEntryId || iOwningService == KMsvRootIndexEntryId, PanicServer(EMsvNotLocalService));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   644
	__ASSERT_DEBUG(iState==EValid || iState==EInvalidDeletedContext || iState==EInvalidChangingContext, PanicServer(EMsvEntryStateUndetermined));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   645
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   646
	TMsvEntry entry=aEntry;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   647
	entry.SetParent(iEntryPtr->Id());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   648
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   649
	__ASSERT_DEBUG(MsvUtils::ValidEntry(entry, ETrue), PanicServer(EMsvCreatingInvalidEntry));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   650
	if (!MsvUtils::ValidEntry(entry, ETrue))
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   651
		User::Leave(KErrArgument);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   652
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   653
	CMsvEntryArray* newSortedChildren = NULL;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   654
	CMsvClientEntry* cEntry = NULL;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   655
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   656
	TBool addEntry = entry.Visible() || iOrdering.ShowInvisibleEntries();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   657
	if (addEntry)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   658
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   659
		// Create what may be the new child entry if nothing goes wrong
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   660
		cEntry = CMsvClientEntry::NewLC(entry, EMsvClientChild);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   661
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   662
		// Reserve space for the new entry for later
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   663
		iEntries->SetReserveL(iEntries->Count() + 1);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   664
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   665
		newSortedChildren = CMsvEntryArray::NewLC(*iMtmList);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   666
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   667
		// add the children to the sorted pointer list - current context is the first entry
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   668
		TInt totalCount=iEntries->Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   669
		for (TInt count=1; count<totalCount; count++)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   670
			newSortedChildren->AppendL(&iEntries->At(count)->Entry());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   671
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   672
		// We've created a new sorted child list now so we won't leave later
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   673
		newSortedChildren->AppendL(&cEntry->Entry());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   674
		newSortedChildren->SortL(iOrdering);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   675
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   676
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   677
	TInt id = iMsvSession.OperationId();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   678
	iMsvSession.Session().CreateEntryL(entry, id, aOwnerId);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   679
	iMsvSession.CheckDrive();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   680
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   681
    TPckgBuf<TMsvLocalOperationProgress> progressPack;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   682
	User::LeaveIfError(iMsvSession.Session().OperationCompletion(id, progressPack));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   683
	User::LeaveIfError(progressPack().iError);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   684
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   685
	// Can't leave after here
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   686
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   687
	if (addEntry)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   688
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   689
		CleanupStack::Pop(); // newSortedChildren
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   690
		delete iSortedChildren;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   691
		iSortedChildren = newSortedChildren;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   692
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   693
		CleanupStack::Pop(); // cEntry
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   694
		iEntries->AppendL(cEntry); // Will not leave because we've reserved space earlier
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   695
		cEntry->SetId(progressPack().iId);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   696
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   697
		TMsvEntry* ptr = CONST_CAST(TMsvEntry*, iEntryPtr);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   698
		ptr->SetOwner(ETrue);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   699
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   700
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   701
	aEntry.SetParent(iEntryPtr->Id());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   702
	aEntry.SetId(progressPack().iId);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   703
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   704
	// If the entry is a service its service Id is the same as its Id
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   705
	// Otherwise it must be a local entry
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   706
	// We don't allow synchronous creation of remote entries
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   707
	TMsvId serviceId = aEntry.Id();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   708
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   709
	aEntry.iServiceId = (aEntry.iType == KUidMsvServiceEntry) ? serviceId : KMsvLocalServiceIndexEntryId;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   710
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   711
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   712
/** 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   713
Sets the context's index entry to the specified values. The returned CMsvOperation 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   714
object completes when the change is complete.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   715
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   716
It is important to note that the state of the context is undefined until the 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   717
observer of the entry has been informed that the entry has been changed, or 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   718
the operation is completed with an error. If the function leaves, the context 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   719
is unchanged.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   720
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   721
@param	aEntry 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   722
The new index entry values for the context
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   723
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   724
@param	aStatus 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   725
The request status to be completed when the operation has finished 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   726
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   727
@leave KErrAccessDenied The entry is locked by another client 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   728
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   729
@leave KErrArgument aEntry is invalid or the ID specified in aEntry is not 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   730
the same as the context ID 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   731
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   732
@leave KErrNoMemory The operation could not be created or passed to the server 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   733
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   734
@return
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   735
An operation object controlling the change command
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   736
*/
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   737
EXPORT_C CMsvOperation* CMsvEntry::ChangeL(const TMsvEntry& aEntry, TRequestStatus& aStatus)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   738
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   739
	return ChangeL(aEntry, RProcess().SecureId(), aStatus);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   740
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   741
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   742
/** 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   743
Sets the context's index entry to the specified values. The returned CMsvOperation 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   744
object completes when the change is complete. Sets the owner of the changed entry 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   745
to process specified by the supplied ID. 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   746
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   747
It is important to note that the state of the context is undefined until the 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   748
observer of the entry has been informed that the entry has been changed, or 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   749
the operation is completed with an error. If the function leaves, the context 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   750
is unchanged.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   751
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   752
@param	aEntry 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   753
The new index entry values for the context
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   754
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   755
@param	aOwnerId
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   756
The ID of process that owns the changed entry.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   757
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   758
@param	aStatus 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   759
The request status to be completed when the operation has finished 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   760
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   761
@leave KErrAccessDenied The entry is locked by another client 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   762
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   763
@leave KErrArgument aEntry is invalid or the ID specified in aEntry is not 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   764
the same as the context ID 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   765
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   766
@leave KErrNoMemory The operation could not be created or passed to the server 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   767
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   768
@return
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   769
An operation object controlling the change command
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   770
*/
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   771
EXPORT_C CMsvOperation* CMsvEntry::ChangeL(const TMsvEntry& aEntry, TSecureId aOwnerId, TRequestStatus& aStatus)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   772
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   773
#ifndef _NO_SESSION_LOGGING_
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   774
	Log(_L("Asynchronous ChangeL to %x"), aEntry.Id()); 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   775
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   776
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   777
	__ASSERT_DEBUG(iState==EValid || iState==EInvalidDeletedContext, PanicServer(EMsvEntryAlreadyChangingContext));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   778
	__ASSERT_DEBUG(aEntry.Id()==iEntryPtr->Id(), PanicServer(EMsvChangingEntryNotContext));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   779
	__ASSERT_DEBUG(MsvUtils::ValidEntry(aEntry), PanicServer(EMsvChangingToInvalidEntry));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   780
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   781
	// can only change the current context
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   782
	if (aEntry.Id()!=iEntryPtr->Id() || aEntry.Parent()!=iEntryPtr->Parent() || !MsvUtils::ValidEntry(aEntry))
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   783
		User::Leave(KErrArgument);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   784
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   785
	// cannot change standard folders
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   786
	if (iEntryPtr->StandardFolder())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   787
		User::Leave(KErrAccessDenied);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   788
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   789
	// create the operation
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   790
	CMsvEntryOperation* operation = CMsvEntryOperation::NewL(iMsvSession, aStatus);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   791
	CleanupStack::PushL(operation);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   792
	if (iEntryPtr->iType==KUidMsvServiceEntry)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   793
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   794
		operation->iMtm = KUidMsvLocalServiceMtm;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   795
		operation->iService = KMsvLocalServiceIndexEntryId;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   796
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   797
	else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   798
		User::LeaveIfError(iMsvSession.Session().OperationMtmL(iEntryPtr->Id(), operation->iMtm, operation->iService));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   799
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   800
	// check that no other entries are type EMsvClientChangedContext
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   801
	TInt count=iEntries->Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   802
	while (count--)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   803
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   804
		if (iEntries->At(count)->Type() == EMsvClientChangedContext)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   805
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   806
			delete iEntries->At(count);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   807
			iEntries->Delete(count);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   808
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   809
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   810
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   811
	// create local copy of entry
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   812
	TMsvEntry entry=aEntry;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   813
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   814
	// check the hidden flags are correct
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   815
	entry.SetOwner(iEntryPtr->Owner());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   816
	entry.SetDeleted(iEntryPtr->Deleted());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   817
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   818
	// store the new context for after the operation has completed
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   819
	CMsvClientEntry* cEntry = CMsvClientEntry::NewLC(entry, EMsvClientChangedContext);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   820
	if (iEntries->Count()==1)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   821
		iEntries->AppendL(cEntry);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   822
	else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   823
		iEntries->InsertL(1, cEntry);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   824
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   825
	// start the change operation
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   826
	TRAPD(leave, iMsvSession.Session().ChangeEntryL(entry, operation->Id(), aOwnerId, operation->iStatus)); 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   827
	if (leave)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   828
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   829
		iEntries->Delete(1);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   830
		CleanupStack::PopAndDestroy(); // operation	& cEntry
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   831
		User::Leave(leave);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   832
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   833
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   834
	operation->Start();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   835
	iState = EInvalidChangingContext;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   836
	CleanupStack::Pop(2); // operation and cEntry
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   837
	return operation;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   838
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   839
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   840
/** 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   841
Sets the context's index entry to the specified values. The function is performed 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   842
synchronously.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   843
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   844
This function can only be used on local entries.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   845
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   846
@param	aEntry 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   847
The new index entry values for the context 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   848
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   849
@leave KErrAccessDenied The entry is locked by another client 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   850
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   851
@leave KErrArgument aEntry is invalid or the ID specified in aEntry is not 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   852
the same as the context ID 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   853
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   854
@leave KErrNoMemory The operation could not be created or passed to the server
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   855
*/
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   856
EXPORT_C void CMsvEntry::ChangeL(const TMsvEntry& aEntry)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   857
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   858
	ChangeL(aEntry, RProcess().SecureId());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   859
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   860
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   861
/** 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   862
Sets the context's index entry to the specified values. The function is performed 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   863
synchronously. Sets the owner of the changed entry to process specified by the 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   864
supplied ID. 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   865
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   866
This function can only be used on local entries.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   867
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   868
@param	aEntry 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   869
The new index entry values for the context 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   870
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   871
@param	aOwnerId
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   872
The ID of process that owns the changed entry.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   873
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   874
@leave KErrAccessDenied The entry is locked by another client 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   875
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   876
@leave KErrArgument aEntry is invalid or the ID specified in aEntry is not 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   877
the same as the context ID 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   878
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   879
@leave KErrNoMemory The operation could not be created or passed to the server
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   880
*/
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   881
EXPORT_C void CMsvEntry::ChangeL(const TMsvEntry& aEntry, TSecureId aOwnerId)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   882
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   883
#ifndef _NO_SESSION_LOGGING_
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   884
	Log(_L("Synchronous ChangeL to %x"), aEntry.Id()); 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   885
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   886
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   887
	__ASSERT_DEBUG(iState==EValid || iState==EInvalidDeletedContext, PanicServer(EMsvEntryAlreadyChangingContext));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   888
	__ASSERT_DEBUG(aEntry.Id()==iEntryPtr->Id(), PanicServer(EMsvChangingEntryNotContext));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   889
	__ASSERT_DEBUG(MsvUtils::ValidEntry(aEntry), PanicServer(EMsvChangingToInvalidEntry));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   890
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   891
	// can only change the current context
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   892
	if (aEntry.Id()!=iEntryPtr->Id() || aEntry.Parent()!=iEntryPtr->Parent() || !MsvUtils::ValidEntry(aEntry))
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   893
		User::Leave(KErrArgument);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   894
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   895
	// cannot change standard folders
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   896
	if (iEntryPtr->StandardFolder())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   897
		User::Leave(KErrAccessDenied);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   898
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   899
	// create local copy of entry
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   900
	TMsvEntry entry=aEntry;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   901
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   902
	// check the hidden flags are correct
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   903
	entry.SetOwner(iEntryPtr->Owner());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   904
	entry.SetDeleted(iEntryPtr->Deleted());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   905
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   906
	// store the new context for after the operation has completed
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   907
	CMsvClientEntry* cEntry = CMsvClientEntry::NewLC(entry, EMsvClientContext);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   908
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   909
	TInt id = iMsvSession.OperationId();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   910
	iMsvSession.Session().ChangeEntryL(aEntry, id, aOwnerId); 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   911
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   912
    TPckgBuf<TMsvLocalOperationProgress> progressPack;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   913
	User::LeaveIfError(iMsvSession.Session().OperationCompletion(id, progressPack));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   914
	User::LeaveIfError(progressPack().iError);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   915
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   916
	// Cannot leave after this
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   917
	delete iEntries->At(0);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   918
	CleanupStack::Pop(); // cEntry
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   919
	iEntries->At(0) = cEntry;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   920
	iEntryPtr = &iEntries->At(0)->Entry();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   921
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   922
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   923
/** 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   924
Update a selection of children to read or Unread asynchronously of the context. 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   925
The returned CMsvOperation object .
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   926
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   927
@param	aSelection 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   928
The selectio of entry values for the context
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   929
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   930
@param	aMark 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   931
True : Update selection to UnRead .
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   932
False: Update selection to Read . 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   933
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   934
@param aStatus The request status to be completed when the operation has finished .
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   935
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   936
@leave KErrAccessDenied The entry is locked by another client 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   937
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   938
@return
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   939
An operation object controlling the change command
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   940
*/
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   941
EXPORT_C CMsvOperation* CMsvEntry::ChangeL(const CMsvEntrySelection& aSelection,TBool aMark, TRequestStatus& aStatus)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   942
     {
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   943
#ifndef _NO_SESSION_LOGGING_
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   944
    Log(_L("Asynchronous ChangeL with selection of %d entries"), aSelection.Count()); 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   945
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   946
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   947
    __ASSERT_DEBUG(aSelection.Count(), PanicServer(EMsvEmptySelection));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   948
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   949
#if defined(_DEBUG)    
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   950
     
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   951
      TInt aCount = aSelection.Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   952
      while (aCount--)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   953
          {
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   954
          TMsvEntry aEntry;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   955
          TMsvId aService;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   956
          if (iMsvSession.Session().GetEntry(aSelection.At(aCount), aService, aEntry)==KErrNone)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   957
              {
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   958
              __ASSERT_DEBUG(iState==EValid || iState==EInvalidDeletedContext, PanicServer(EMsvEntryAlreadyChangingContext));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   959
              __ASSERT_DEBUG(MsvUtils::ValidEntry(aEntry), PanicServer(EMsvChangingToInvalidEntry));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   960
             
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   961
              // can only change the current context
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   962
              if (!MsvUtils::ValidEntry(aEntry))
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   963
                  User::Leave(KErrArgument);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   964
              }
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   965
           }
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   966
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   967
      // cannot change standard folders
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   968
      if (iEntryPtr->StandardFolder())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   969
          User::Leave(KErrAccessDenied);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   970
  
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   971
      //// create the operation
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   972
      CMsvEntryOperation* operation = CMsvEntryOperation::NewL(iMsvSession, aStatus);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   973
      CleanupStack::PushL(operation);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   974
      User::LeaveIfError(iMsvSession.Session().OperationMtmL(aSelection.At(0), operation->iMtm, operation->iService)); 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   975
   
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   976
      // start the change operation
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   977
	  iMsvSession.Session().ChangeEntriesL(aSelection, aMark, operation->Id(), RProcess().SecureId(), operation->iStatus);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   978
     
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   979
      operation->Start();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   980
      iState = EInvalidChangingContext;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   981
      CleanupStack::Pop(1); // operation 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   982
      return operation; 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   983
      }
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   984
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   985
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   986
EXPORT_C CMsvOperation* CMsvEntry::DeleteL(TMsvId aId, TRequestStatus& aStatus)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   987
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   988
// Deletes a child of the context
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   989
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   990
	/** Deletes a child entry of the context asynchronously.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   991
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   992
	The delete works recursively through all the descendants. If a child or any 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   993
	descendant is locked by another client or any store or file is open, then 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   994
	that child will not be deleted. Any files and stores associated with the entry 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   995
	are deleted.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   996
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   997
	The returned CMsvOperation object completes when deletion is complete.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   998
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   999
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1000
	@param aId ID of entry to be deleted 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1001
	@param aStatus The request status to be completed when the operation has finished 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1002
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1003
	@leave KErrNotFound The specified entry was not a child of the context 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1004
	@leave KErrNotSupported If deleting entries from non-current drive
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1005
	@return The operation object controlling the deletion command */
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1006
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1007
#ifndef _NO_SESSION_LOGGING_
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1008
	Log(_L("Asynchronous DeleteL, entry %x"), aId); 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1009
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1010
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1011
	__ASSERT_DEBUG(iState==EValid || iState==EInvalidDeletedContext || iState==EInvalidChangingContext, PanicServer(EMsvEntryStateUndetermined));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1012
	CMsvEntrySelection* selection = new (ELeave) CMsvEntrySelection;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1013
	CleanupStack::PushL(selection);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1014
	selection->AppendL(aId);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1015
	CMsvOperation* operation = DoDeleteL(*selection, aStatus);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1016
	CleanupStack::PopAndDestroy(); // selection
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1017
	return operation;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1018
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1019
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1020
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1021
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1022
EXPORT_C CMsvOperation* CMsvEntry::DeleteL(const CMsvEntrySelection& aSelection, TRequestStatus& aStatus)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1023
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1024
// Deletes a selection containing children of the context
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1025
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1026
/** Deletes child entries of the context asynchronously. 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1027
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1028
The delete works recursively through all the descendants. If a child or any 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1029
descendant is locked by another client or any store or file is open, then 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1030
that child will not be deleted. Any files and stores associated with the entries 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1031
are deleted.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1032
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1033
The returned CMsvOperation object completes when deletion is complete.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1034
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1035
@param aSelection List of ID of the entries to be deleted 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1036
@param aStatus The request status to be completed when the operation has finished 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1037
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1038
@leave KErrNotFound A specified entry was not a child of the context 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1039
@leave KErrNotSupported If deleting entries from non-current drive
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1040
@return The operation object controlling the deletion command */
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1041
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1042
#ifndef _NO_SESSION_LOGGING_
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1043
	Log(_L("Asynchronous DeleteL with selection of %d entries"), aSelection.Count()); 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1044
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1045
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1046
	__ASSERT_DEBUG(iState==EValid || iState==EInvalidDeletedContext || iState==EInvalidChangingContext, PanicServer(EMsvEntryStateUndetermined));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1047
	return DoDeleteL(aSelection, aStatus);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1048
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1049
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1050
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1051
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1052
CMsvOperation* CMsvEntry::DoDeleteL(const CMsvEntrySelection& aSelection, TRequestStatus& aStatus)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1053
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1054
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1055
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1056
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1057
	__ASSERT_DEBUG(aSelection.Count(), PanicServer(EMsvEmptySelection));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1058
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1059
	if (!AreChildren(aSelection))
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1060
		User::Leave(KErrNotFound);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1061
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1062
	CMsvEntryOperation* operation = CMsvEntryOperation::NewL(iMsvSession, aStatus);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1063
	CleanupStack::PushL(operation);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1064
	if (iEntryPtr->iType==KUidMsvRootEntry)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1065
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1066
		// we must be deleting services - so it is a local operation
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1067
		operation->iMtm = KUidMsvLocalServiceMtm;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1068
		operation->iService = KMsvLocalServiceIndexEntryId;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1069
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1070
	else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1071
		User::LeaveIfError(iMsvSession.Session().OperationMtmL(aSelection.At(0), operation->iMtm, operation->iService));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1072
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1073
#if defined(_DEBUG)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1074
	// check other entries in selection are consistent and are not read only
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1075
	TInt dCount = aSelection.Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1076
	while (dCount--)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1077
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1078
		if (iEntryPtr->iType!=KUidMsvRootEntry)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1079
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1080
				TMsvId service;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1081
				TUid mtm;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1082
				TInt error = iMsvSession.Session().OperationMtmL(aSelection.At(dCount), mtm, service);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1083
				__ASSERT_DEBUG(error==KErrNone || error==KErrNotFound, PanicServer(EMsvNonConsistentDeleteSelection));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1084
				__ASSERT_DEBUG(mtm==operation->iMtm, PanicServer(EMsvNonConsistentDeleteSelection));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1085
				__ASSERT_DEBUG(service==operation->iService, PanicServer(EMsvNonConsistentDeleteSelection));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1086
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1087
		TMsvEntry dEntry;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1088
		TMsvId dService;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1089
		if (iMsvSession.Session().GetEntry(aSelection.At(dCount), dService, dEntry)==KErrNone)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1090
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1091
			__ASSERT_DEBUG(dService==iOwningService || (iEntryPtr->iType==KUidMsvServiceEntry && dService==iEntryPtr->Id()) || (iEntryPtr->iType==KUidMsvRootEntry && dService==aSelection.At(dCount)), PanicServer(EMsvDeletingEntryDifferentOwningService));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1092
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1093
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1094
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1095
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1096
	iMsvSession.Session().DeleteEntriesL(aSelection, operation->Id(), operation->iStatus);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1097
	operation->Start();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1098
	CleanupStack::Pop(); // operation
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1099
	return operation;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1100
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1101
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1102
EXPORT_C void CMsvEntry::DeleteL(TMsvId aId)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1103
/** Deletes a child entry of the context synchronously. 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1104
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1105
The delete works recursively through all the descendants. If a child or any descendant is locked by another 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1106
client or any store or file is open, then that child will not be deleted. Any files and stores associated 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1107
with the entry are deleted.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1108
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1109
This function can only be used on local entries.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1110
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1111
@param aId ID of entry to be deleted
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1112
@leave KErrNotFound The specified entry was not a child of the context
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1113
@leave KErrNotSupported If deleting entries from non-current drive
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1114
*/
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1115
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1116
#ifndef _NO_SESSION_LOGGING_
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1117
	Log(_L("Synchronous DeleteL, entry %x"), aId); 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1118
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1119
	__ASSERT_ALWAYS(iOwningService == KMsvLocalServiceIndexEntryId || iOwningService == KMsvRootIndexEntryId, PanicServer(EMsvNotLocalService)); // Root as well?
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1120
	__ASSERT_DEBUG(iState==EValid || iState==EInvalidDeletedContext || iState==EInvalidChangingContext, PanicServer(EMsvEntryStateUndetermined));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1121
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1122
	User::LeaveIfError(CMsvEntry::DeleteOneL(aId));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1123
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1124
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1125
EXPORT_C void CMsvEntry::DeleteL(const CMsvEntrySelection& aSelection, TMsvLocalOperationProgress& aProgress)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1126
/** Deletes child entries of the context synchronously. 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1127
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1128
The delete works recursively through all the descendants. If a child or any 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1129
descendant is locked by another client or any store or file is open, then 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1130
that child will not be deleted. Any files and stores associated with the entries 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1131
are deleted.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1132
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1133
@param aSelection List of ID of the entries to be deleted 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1134
@param aProgress Progress information for the delete operation
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1135
@leave KErrNotFound A specified entry was not a child of the context 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1136
@leave KErrNotSupported If deleting entries from non-current drive */
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1137
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1138
#ifndef _NO_SESSION_LOGGING_
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1139
	Log(_L("Synchronous DeleteL with selection of %d entries"), aSelection.Count()); 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1140
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1141
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1142
	__ASSERT_ALWAYS(iOwningService == KMsvLocalServiceIndexEntryId || iOwningService == KMsvRootIndexEntryId, PanicServer(EMsvNotLocalService)); // Root as well?
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1143
	__ASSERT_DEBUG(iState==EValid || iState==EInvalidDeletedContext || iState==EInvalidChangingContext, PanicServer(EMsvEntryStateUndetermined));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1144
	__ASSERT_DEBUG(aSelection.Count(), PanicServer(EMsvEmptySelection));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1145
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1146
	if (!AreChildren(aSelection))
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1147
		User::Leave(KErrNotFound);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1148
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1149
	aProgress.iTotalNumberOfEntries=aSelection.Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1150
	aProgress.iNumberCompleted=0;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1151
	aProgress.iNumberRemaining=aProgress.iTotalNumberOfEntries;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1152
	aProgress.iError=KErrNone;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1153
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1154
	TInt count=aProgress.iTotalNumberOfEntries;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1155
	while(count--)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1156
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1157
		aProgress.iId=aSelection.At(count);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1158
		TInt err=DeleteOneL(aProgress.iId);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1159
		aProgress.iNumberRemaining--;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1160
		if(err==KErrNone)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1161
			aProgress.iNumberCompleted++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1162
		else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1163
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1164
			aProgress.iError=err;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1165
			aProgress.iNumberFailed++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1166
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1167
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1168
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1169
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1170
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1171
TInt CMsvEntry::DeleteOneL(TMsvId aMsvId)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1172
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1173
	CMsvEntrySelection* selection = new(ELeave)CMsvEntrySelection;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1174
	CleanupStack::PushL(selection);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1175
	selection->AppendL(aMsvId);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1176
	TInt opid = iMsvSession.OperationId();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1177
	iMsvSession.Session().DeleteEntriesL(*selection, opid);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1178
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1179
	TMsvLocalOperationProgress progress;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1180
	TPckg<TMsvLocalOperationProgress> progressPack(progress);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1181
    User::LeaveIfError(iMsvSession.Session().OperationCompletion(opid, progressPack));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1182
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1183
	if(progress.iError==KErrNone)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1184
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1185
		TMsvId id = selection->At(0);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1186
		TInt ii = iSortedChildren->Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1187
		while (ii--)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1188
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1189
			if (iSortedChildren->At(ii)->Id() == id)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1190
				{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1191
				iSortedChildren->Delete(ii);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1192
				break;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1193
				}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1194
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1195
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1196
		ii = iEntries->Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1197
		while (ii--)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1198
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1199
			if (iEntries->At(ii)->Entry().Id() == id)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1200
				{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1201
				delete iEntries->At(ii);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1202
				iEntries->Delete(ii);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1203
				break;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1204
				}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1205
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1206
		// Reset the owner flag
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1207
		if (Count() == 0)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1208
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1209
			TMsvEntry* ptr = CONST_CAST(TMsvEntry*, iEntryPtr);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1210
			ptr->SetOwner(EFalse);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1211
			}		
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1212
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1213
	CleanupStack::PopAndDestroy(selection);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1214
	return(progress.iError);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1215
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1216
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1217
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1218
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1219
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1220
EXPORT_C CMsvEntrySelection* CMsvEntry::ChildrenL() const
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1221
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1222
// Gets a selection containing the children of the context
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1223
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1224
/** Gets a selection containing the IDs of all the context children. If the entry 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1225
has no children, the selection is empty.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1226
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1227
The calling function is responsible for the deletion of the returned CMsvEntrySelection. 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1228
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1229
@leave KErrNoMemory Not enough memory to create the selection 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1230
@return A selection containing the ID of all children of the context */
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1231
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1232
	__ASSERT_DEBUG(iState==EValid || iState==EInvalidDeletedContext || iState==EInvalidChangingContext, PanicServer(EMsvEntryStateUndetermined));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1233
	CMsvEntrySelection* selection = new (ELeave) CMsvEntrySelection;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1234
	CleanupStack::PushL(selection);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1235
	TInt totalCount=iSortedChildren->Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1236
	for (TInt count=0; count<totalCount; count++)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1237
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1238
		selection->AppendL(iSortedChildren->At(count)->Id());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1239
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1240
	CleanupStack::Pop(); // selection
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1241
	return selection;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1242
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1243
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1244
EXPORT_C CMsvEntrySelection* CMsvEntry::ChildrenWithServiceL(TMsvId aServiceId) const
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1245
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1246
// Gets a selection containing the children of the context which use the service
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1247
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1248
/** Gets a selection containing the IDs of all the context children filtered by message service.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1249
i.e. the index entry's iServiceId field equals aId.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1250
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1251
If the entry has no such children, the selection is empty.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1252
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1253
The calling function is responsible for the deletion of the returned CMsvEntrySelection.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1254
@return	List of IDs of all children of the context meeting the criterion		
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1255
@param aServiceId Service by which to filter
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1256
@leave KErrNoMemory Not enough memory to create the selection 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1257
*/
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1258
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1259
	__ASSERT_DEBUG(iState==EValid || iState==EInvalidDeletedContext || iState==EInvalidChangingContext, PanicServer(EMsvEntryStateUndetermined));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1260
	CMsvEntrySelection* selection = new (ELeave) CMsvEntrySelection;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1261
	CleanupStack::PushL(selection);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1262
	TInt totalCount=iSortedChildren->Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1263
	for (TInt count=0; count<totalCount; count++)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1264
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1265
		if (iSortedChildren->At(count)->iServiceId==aServiceId)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1266
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1267
			selection->AppendL(iSortedChildren->At(count)->Id());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1268
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1269
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1270
	CleanupStack::Pop(); // selection
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1271
	return selection;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1272
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1273
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1274
EXPORT_C CMsvEntrySelection* CMsvEntry::ChildrenWithMtmL(TUid aMtm) const
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1275
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1276
// Gets a selection containing the children of the context which use the same MTM
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1277
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1278
/** Gets a selection containing the IDs of all the context children filtered by 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1279
MTM type. i.e. the index entry's iMtm field equals aMtm.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1280
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1281
If the entry has no such children, the selection is empty.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1282
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1283
The calling function is responsible for the deletion of the returned CMsvEntrySelection. 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1284
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1285
@param aMtm MTM type by which to filter 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1286
@leave KErrNoMemory Not enough memory to create the selection 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1287
@return A selection containing the ID of all children of the context meeting 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1288
the criterion */
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1289
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1290
	__ASSERT_DEBUG(iState==EValid || iState==EInvalidDeletedContext || iState==EInvalidChangingContext, PanicServer(EMsvEntryStateUndetermined));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1291
	CMsvEntrySelection* selection = new (ELeave) CMsvEntrySelection;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1292
	CleanupStack::PushL(selection);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1293
	TInt totalCount=iSortedChildren->Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1294
	for (TInt count=0; count<totalCount; count++)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1295
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1296
		if (iSortedChildren->At(count)->iMtm==aMtm)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1297
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1298
			selection->AppendL(iSortedChildren->At(count)->Id());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1299
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1300
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1301
	CleanupStack::Pop(); // selection
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1302
	return selection;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1303
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1304
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1305
EXPORT_C CMsvEntrySelection* CMsvEntry::ChildrenWithTypeL(TUid aType) const
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1306
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1307
// Gets a selection containing the children of the context which are the same type
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1308
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1309
/** Gets a selection containing the IDs of all the context children filtered by 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1310
entry type. i.e. is the entry a folder, a message, etc.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1311
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1312
If the entry has no such children, the selection is empty.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1313
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1314
The calling function is responsible for the deletion of the returned CMsvEntrySelection. 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1315
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1316
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1317
@param aType Entry type by which to filter. 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1318
@leave KErrNoMemory Not enough memory to create the selection 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1319
@return A selection containing the ID of all children of the context meeting 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1320
the criterion */
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1321
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1322
	__ASSERT_DEBUG(iState==EValid || iState==EInvalidDeletedContext || iState==EInvalidChangingContext, PanicServer(EMsvEntryStateUndetermined));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1323
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1324
	CMsvEntrySelection* selection = new (ELeave) CMsvEntrySelection;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1325
	CleanupStack::PushL(selection);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1326
	TInt totalCount=iSortedChildren->Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1327
	for (TInt count=0; count<totalCount; count++)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1328
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1329
		if (iSortedChildren->At(count)->iType==aType)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1330
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1331
			selection->AppendL(iSortedChildren->At(count)->Id());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1332
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1333
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1334
	CleanupStack::Pop(); // selection
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1335
	return selection;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1336
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1337
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1338
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1339
#if (defined SYMBIAN_MSGS_ENHANCED_REMOVABLE_MEDIA_SUPPORT)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1340
/**
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1341
 * ChildrenOfAvailableDrivesL()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1342
 *
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1343
 * @param None.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1344
 * @return CMsvEntrySelection List of child ids from all available drives.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1345
 * @leave KErrArgument If the function is used for a TMsvId other than that 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1346
 * of standard folders, i.e. Inbox, Outbox, Drafts, Sent or Deleted.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1347
 * @leave KErrNoMemory Not enough memory to create the selection.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1348
 * 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1349
 * Gets a selection containing the child Id's from all drives currently present
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1350
 * in the server preferred drive list.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1351
 * The function must be used only if the context is set to one of the standard folders,
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1352
 * i.e. Inbox, Outbox, Drafts, Sent or Deleted.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1353
 * 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1354
 * The calling function is responsible for the deletion of the returned CMsvEntrySelection.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1355
 *
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1356
 @publishedAll
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1357
 @released
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1358
 */ 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1359
EXPORT_C CMsvEntrySelection* CMsvEntry::ChildrenOfAvailableDrivesL() const
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1360
    {
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1361
    __ASSERT_DEBUG(iState==EValid || iState==EInvalidDeletedContext || iState==EInvalidChangingContext, PanicServer(EMsvEntryStateUndetermined));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1362
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1363
    if(!iChildrenOfAvailableDrives)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1364
        {
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1365
		User::Leave(KErrArgument);		
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1366
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1367
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1368
    CMsvEntrySelection* selection = new (ELeave) CMsvEntrySelection;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1369
	CleanupStack::PushL(selection);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1370
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1371
    TInt totalCount = iSortedChildren->Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1372
	for (TInt count=0; count<totalCount; count++)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1373
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1374
		selection->AppendL(iSortedChildren->At(count)->Id());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1375
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1376
	CleanupStack::Pop(); // selection
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1377
	return selection;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1378
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1379
#endif			// #if (defined SYMBIAN_MSGS_ENHANCED_REMOVABLE_MEDIA_SUPPORT)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1380
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1381
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1382
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1383
EXPORT_C const TMsvEntry& CMsvEntry::operator[](TInt aIndex) const
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1384
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1385
// Returns the data for a child, zero index with the current sort order
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1386
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1387
/** Gets the index entry of the child at the position specified by the array index. 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1388
The child entries of the context can be considered as a zero-based array, 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1389
with entries sorted according to the current sort order. 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1390
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1391
Note:
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1392
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1393
The function panics with E32USER-CBase 21 if aIndex was out of range.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1394
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1395
@param aIndex Array index 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1396
@return Index entry for the specified child. Valid for in-range values of aIndex. */
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1397
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1398
	__ASSERT_DEBUG(iState==EValid || iState==EInvalidDeletedContext || iState==EInvalidChangingContext, PanicServer(EMsvEntryStateUndetermined));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1399
	return *iSortedChildren->At(aIndex);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1400
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1401
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1402
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1403
EXPORT_C CMsvEntry* CMsvEntry::ChildEntryL(TMsvId aId) const
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1404
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1405
// Returns a new entry with the child as the context
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1406
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1407
/** Gets a new CMsvEntry object with its context set to the child entry ID. aMsvId 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1408
must specify a child of the current context.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1409
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1410
The CMsvEntry object must be deleted by the client application when it is 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1411
no longer required. 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1412
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1413
@param aId ID of a child entry 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1414
@leave KErrNotFound aMsvId does not specify a child of the context 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1415
@return CMsvEntry object with its context set to child entry */
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1416
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1417
	__ASSERT_DEBUG(iState==EValid || iState==EInvalidDeletedContext || iState==EInvalidChangingContext, PanicServer(EMsvEntryStateUndetermined));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1418
	if (!IsAChild(aId))
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1419
		User::Leave(KErrNotFound);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1420
	return CMsvEntry::NewL(iMsvSession, aId, iOrdering);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1421
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1422
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1423
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1424
EXPORT_C const TMsvEntry& CMsvEntry::ChildDataL(TMsvId aId) const
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1425
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1426
// Returns the data for a child with the aId
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1427
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1428
/** Gets the index entry of context's child with the specified ID.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1429
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1430
@param aId ID of the child 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1431
@leave KErrNotFound No child exists with that ID 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1432
@return Index entry for the specified child. Valid for in-range values of aIndex. */
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1433
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1434
	__ASSERT_DEBUG(iState==EValid || iState==EInvalidDeletedContext || iState==EInvalidChangingContext, PanicServer(EMsvEntryStateUndetermined));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1435
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1436
	TInt count=iSortedChildren->Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1437
	while (count--)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1438
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1439
		if (iSortedChildren->At(count)->Id()==aId)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1440
			break;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1441
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1442
	User::LeaveIfError(count); // will be -1 (KErrNotFound)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1443
	return *iSortedChildren->At(count);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1444
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1445
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1446
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1447
EXPORT_C CMsvStore* CMsvEntry::ReadStoreL()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1448
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1449
// Return store for the current context which is opened for read only
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1450
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1451
/** Obtains the message store for the current context with read-only access. 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1452
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1453
Multiple clients can read from a store simultaneously. If another client is already 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1454
writing to the store, the function leaves with KErrAccessDenied. 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1455
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1456
The returned CMsvStore must be deleted when it is no longer required. 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1457
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1458
@leave KErrNoMemory Not enough memory to open store 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1459
@leave KErrAccessDenied Another client is currently writing to the store 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1460
@leave KErrNotFound There is no store associated with this entry 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1461
@return Context's message store open for read-only access */
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1462
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1463
#ifndef _NO_SESSION_LOGGING_
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1464
	Log(_L("ReadStoreL for entry %x"), iEntryPtr->Id()); 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1465
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1466
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1467
	__ASSERT_ALWAYS(iStore==NULL, PanicServer(EMsvStoreAlreadyOpen));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1468
	__ASSERT_DEBUG(iState==EValid || iState==EInvalidDeletedContext || iState==EInvalidChangingContext, PanicServer(EMsvEntryStateUndetermined));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1469
	User::LeaveIfError(iMsvSession.Session().ReadStore(iEntryPtr->Id()));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1470
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1471
	// open the store
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1472
	TInt err =0;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1473
#if (defined SYMBIAN_MESSAGESTORE_HEADER_BODY_USING_SQLDB)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1474
		TRAP(err, iStore = CMsvStore::OpenForReadL(*this, iMsvSession.FileSession(), iMsvSession.StoreManager(), iEntryPtr->Id(), this->Entry().iMtm));	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1475
#else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1476
		TRAP(err, iStore = CMsvStore::OpenForReadL(*this, iMsvSession.FileSession(), iMsvSession.StoreManager(), iEntryPtr->Id()));			
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1477
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1478
	if (err != KErrNone)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1479
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1480
		iMsvSession.Session().DecStoreReaderCount(iEntryPtr->Id()); // error ignored
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1481
		User::Leave(err);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1482
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1483
	return iStore;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1484
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1485
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1486
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1487
EXPORT_C CMsvStore* CMsvEntry::EditStoreL()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1488
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1489
// Return store for the current context which can be writen to
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1490
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1491
/** Gets the message store for the current context with read-write access. 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1492
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1493
Only one client can edit a message store at one time. If another client is 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1494
already writing to the store, KErrAccessDenied is returned. Other clients 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1495
can be reading the store. 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1496
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1497
If the message store does not exist when EditStore() is called, a new message 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1498
store is created. 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1499
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1500
The returned CMsvStore must be deleted when it is no longer required. 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1501
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1502
@leave KErrAccessDenied Store is locked by another process or the entry is 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1503
read only 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1504
@leave KErrNoMemory Not enough memory to open the store 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1505
@return Context's message store open for read-write access */
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1506
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1507
#ifndef _NO_SESSION_LOGGING_
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1508
	Log(_L("EditStoreL for entry %x"), iEntryPtr->Id()); 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1509
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1510
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1511
	__ASSERT_ALWAYS(iStore==NULL, PanicServer(EMsvStoreAlreadyOpen));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1512
	__ASSERT_DEBUG(iState==EValid || iState==EInvalidDeletedContext || iState==EInvalidChangingContext, PanicServer(EMsvEntryStateUndetermined));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1513
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1514
	if (iEntryPtr->ReadOnly())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1515
		User::Leave(KErrAccessDenied);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1516
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1517
	User::LeaveIfError(iMsvSession.Session().LockStore(iEntryPtr->Id()));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1518
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1519
	// open the store
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1520
	TInt error = 0;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1521
#if (defined SYMBIAN_MESSAGESTORE_HEADER_BODY_USING_SQLDB)	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1522
		TRAP(error,  iStore = CMsvStore::OpenForWriteL(*this, iMsvSession.FileSession(), iMsvSession.StoreManager(), iEntryPtr->Id(), this->Entry().iMtm));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1523
#else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1524
		TRAP(error,  iStore = CMsvStore::OpenForWriteL(*this, iMsvSession.FileSession(), iMsvSession.StoreManager(), iEntryPtr->Id()));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1525
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1526
	if (error)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1527
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1528
		iMsvSession.Session().ReleaseStore(iEntryPtr->Id()); // error ignored
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1529
		User::Leave(error);		
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1530
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1531
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1532
	return iStore;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1533
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1534
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1535
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1536
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1537
void CMsvEntry::HandleStoreEvent(MMsvStoreObserver::TMsvStoreEvent aEvent, TMsvId /*aId*/)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1538
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1539
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1540
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1541
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1542
	switch (aEvent)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1543
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1544
		case EMsvEditStoreClosed:
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1545
			iMsvSession.Session().ReleaseStore(iEntryPtr->Id()); // error ignored
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1546
			iStore=NULL;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1547
			break;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1548
		case EMsvReadStoreClosed:
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1549
			iMsvSession.Session().DecStoreReaderCount(iEntryPtr->Id()); // error ignored
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1550
			iStore=NULL;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1551
			break;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1552
		default:
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1553
			__ASSERT_DEBUG(EFalse, PanicServer(EMsvUnknownStoreEvent3));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1554
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1555
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1556
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1557
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1558
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1559
EXPORT_C CMsvOperation* CMsvEntry::MoveL(TMsvId aMsvId, TMsvId aTargetId, TRequestStatus& aStatus)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1560
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1561
// Move a single child to another parent
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1562
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1563
/** Moves, asynchronously, a child of the context to become an entry owned by the target entry. 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1564
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1565
All descendants will be moved as well. Any files and stores associated with 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1566
the entry are also moved.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1567
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1568
The returned CMsvOperation object completes when moving is complete.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1569
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1570
@param aMsvId The ID of the entry to be moved 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1571
@param aTargetId The ID of the entry to own the moved entries 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1572
@param aStatus The request status to be completed when the operation has finished 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1573
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1574
@leave KErrNoMemory The operation could not be created or passed to the server 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1575
@leave KErrNotFound An entry was not a child of the context 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1576
@return The operation object controlling the move command. */
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1577
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1578
#ifndef _NO_SESSION_LOGGING_
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1579
	Log(_L("Asynchronous MoveL %x to %x"), aMsvId, aTargetId); 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1580
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1581
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1582
	CMsvEntrySelection* selection = new (ELeave) CMsvEntrySelection;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1583
	CleanupStack::PushL(selection);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1584
	selection->AppendL(aMsvId);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1585
	CMsvOperation* operation = MoveL(*selection, aTargetId, aStatus);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1586
	CleanupStack::PopAndDestroy(); // selection
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1587
	return operation;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1588
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1589
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1590
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1591
TInt CMsvEntry::MoveOneL(TMsvId aMsvId, TMsvId aTargetId)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1592
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1593
	CMsvEntrySelection* selection = new(ELeave)CMsvEntrySelection;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1594
	CleanupStack::PushL(selection);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1595
	selection->AppendL(aMsvId);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1596
	TInt opid = iMsvSession.OperationId();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1597
	iMsvSession.Session().MoveEntriesL(*selection, aTargetId, opid);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1598
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1599
	TMsvLocalOperationProgress progress;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1600
	TPckg<TMsvLocalOperationProgress> progressPack(progress);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1601
    User::LeaveIfError(iMsvSession.Session().OperationCompletion(opid, progressPack));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1602
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1603
	if(progress.iError==KErrNone)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1604
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1605
		TMsvId id = selection->At(0);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1606
		TInt ii = iSortedChildren->Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1607
		while (ii--)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1608
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1609
			if (iSortedChildren->At(ii)->Id() == id)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1610
				{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1611
				iSortedChildren->Delete(ii);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1612
				break;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1613
				}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1614
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1615
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1616
		ii = iEntries->Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1617
		while (ii--)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1618
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1619
			if (iEntries->At(ii)->Entry().Id() == id)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1620
				{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1621
				delete iEntries->At(ii);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1622
				iEntries->Delete(ii);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1623
				break;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1624
				}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1625
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1626
		// Reset the owner flag
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1627
		if (Count() == 0)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1628
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1629
			TMsvEntry* ptr = CONST_CAST(TMsvEntry*, iEntryPtr);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1630
			ptr->SetOwner(EFalse);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1631
			}		
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1632
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1633
	CleanupStack::PopAndDestroy(selection);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1634
	return(progress.iError);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1635
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1636
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1637
/** Moves, synchronously, a child of the context to become an entry owned by the target entry. 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1638
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1639
All descendants will be moved as well. Any files and stores associated with 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1640
the entry are also moved.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1641
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1642
@param aMsvId The ID of the entry to be moved 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1643
@param aTargetId The ID of the entry to own the moved entries 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1644
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1645
@leave KErrNoMemory 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1646
@leave KErrNotFound An entry was not a child of the context 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1647
*/
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1648
EXPORT_C void CMsvEntry::MoveL(TMsvId aMsvId, TMsvId aTargetId)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1649
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1650
// Move a single child to another parent
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1651
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1652
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1653
	__ASSERT_ALWAYS(iOwningService == KMsvLocalServiceIndexEntryId || iOwningService == KMsvRootIndexEntryId, PanicServer(EMsvNotLocalService)); // Root as well?
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1654
	__ASSERT_DEBUG(iState==EValid || iState==EInvalidDeletedContext || iState==EInvalidChangingContext, PanicServer(EMsvEntryStateUndetermined));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1655
	__ASSERT_DEBUG(aTargetId!=iEntryPtr->Id(), PanicServer(EMsvMovingEntryToSameParent));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1656
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1657
#ifndef _NO_SESSION_LOGGING_
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1658
	Log(_L("Synchronous MoveL %x to %x"), aMsvId, aTargetId); 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1659
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1660
	User::LeaveIfError(MoveOneL(aMsvId,aTargetId));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1661
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1662
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1663
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1664
/** Moves, synchronously, children of the context to become entries owned by the target entry. 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1665
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1666
All descendants will be moved as well. Any files and stores associated with 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1667
the entries are also moved.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1668
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1669
@param aSelection List of IDs of the entries to be moved 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1670
@param aTargetId The ID of the entry to own the moved entires 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1671
@param aProgress On return, records the outcome of the move 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1672
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1673
@leave KErrNoMemory 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1674
@leave KErrNotFound An entry was not a child of the context 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1675
*/
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1676
EXPORT_C void CMsvEntry::MoveL(const CMsvEntrySelection& aSelection, TMsvId aTargetId, TMsvLocalOperationProgress& aProgress)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1677
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1678
// Move a selection of children to another parent
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1679
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1680
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1681
	__ASSERT_ALWAYS(iOwningService == KMsvLocalServiceIndexEntryId || iOwningService == KMsvRootIndexEntryId, PanicServer(EMsvNotLocalService)); // Root as well?
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1682
	__ASSERT_DEBUG(iState==EValid || iState==EInvalidDeletedContext || iState==EInvalidChangingContext, PanicServer(EMsvEntryStateUndetermined));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1683
	__ASSERT_DEBUG(aTargetId!=iEntryPtr->Id(), PanicServer(EMsvMovingEntryToSameParent));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1684
	__ASSERT_DEBUG(aSelection.Count(), PanicServer(EMsvEmptySelection));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1685
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1686
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1687
#ifndef _NO_SESSION_LOGGING_
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1688
	Log(_L("Synchronous MoveL with selection of %d entries to %x"), aSelection.Count(),aTargetId); 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1689
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1690
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1691
	aProgress.iTotalNumberOfEntries=aSelection.Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1692
	aProgress.iNumberCompleted=0;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1693
	aProgress.iNumberRemaining=aProgress.iTotalNumberOfEntries;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1694
	aProgress.iError=KErrNone;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1695
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1696
	TInt count=aProgress.iTotalNumberOfEntries;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1697
	while(count--)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1698
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1699
		aProgress.iId=aSelection.At(count);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1700
		TInt err=MoveOneL(aProgress.iId,aTargetId);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1701
		aProgress.iNumberRemaining--;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1702
		if(err==KErrNone)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1703
			aProgress.iNumberCompleted++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1704
		else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1705
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1706
			aProgress.iError=err;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1707
			aProgress.iNumberFailed++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1708
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1709
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1710
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1711
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1712
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1713
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1714
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1715
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1716
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1717
EXPORT_C CMsvOperation* CMsvEntry::MoveL(const CMsvEntrySelection& aSelection, TMsvId aTargetId, TRequestStatus& aStatus)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1718
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1719
// Move a selection of children to another parent
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1720
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1721
/** Moves, asynchronously, children of the context to become entries owned by the target entry. 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1722
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1723
All descendants will be moved as well. Any files and stores associated with 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1724
the entries are also moved.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1725
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1726
The returned CMsvOperation object completes when moving is complete.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1727
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1728
@param aSelection List of IDs of the entries to be moved 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1729
@param aTargetId The ID of the entry to own the moved entires 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1730
@param aStatus The request status to be completed when the operation has finished 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1731
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1732
@leave KErrNoMemory The operation could not be created or passed to the server 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1733
@leave KErrNotFound An entry was not a child of the context 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1734
@return The operation object controlling the move command. */
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1735
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1736
#ifndef _NO_SESSION_LOGGING_
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1737
	Log(_L("Asynchronous MoveL of selection of %d entries to %x"), aSelection.Count(), aTargetId); 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1738
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1739
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1740
	__ASSERT_DEBUG(aTargetId!=iEntryPtr->Id(), PanicServer(EMsvMovingEntryToSameParent));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1741
	__ASSERT_DEBUG(iState==EValid || iState==EInvalidDeletedContext || iState==EInvalidChangingContext, PanicServer(EMsvEntryStateUndetermined));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1742
	if (!AreChildren(aSelection))
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1743
		User::Leave(KErrNotFound);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1744
	CMsvEntryOperation* operation = CMsvEntryOperation::NewL(iMsvSession, aStatus);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1745
	CleanupStack::PushL(operation);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1746
	User::LeaveIfError(iMsvSession.Session().OperationMtmL(aSelection.At(0), aTargetId, operation->iMtm, operation->iService));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1747
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1748
#if defined(_DEBUG)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1749
	// check other entries in selection are consistent and are not read only
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1750
	TInt dCount = aSelection.Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1751
	while (dCount--)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1752
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1753
		TMsvId service;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1754
		TUid mtm;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1755
		TInt error = iMsvSession.Session().OperationMtmL(aSelection.At(dCount), aTargetId, mtm, service);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1756
		__ASSERT_DEBUG(error==KErrNone || error==KErrNotFound, PanicServer(EMsvMulitpleMtmsForMoveCommand));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1757
		__ASSERT_DEBUG(mtm==operation->iMtm, PanicServer(EMsvMulitpleMtmsForMoveCommand));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1758
		__ASSERT_DEBUG(service==operation->iService, PanicServer(EMsvMulitpleMtmsForMoveCommand));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1759
		TMsvEntry dEntry;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1760
		TMsvId dService;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1761
		if (iMsvSession.Session().GetEntry(aSelection.At(dCount), dService, dEntry)==KErrNone)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1762
			__ASSERT_DEBUG(dService==iOwningService || (iEntryPtr->iType==KUidMsvServiceEntry && dService==iEntryPtr->Id()) || (iEntryPtr->iType==KUidMsvRootEntry && service==aSelection.At(dCount)), PanicServer(EMsvMovingEntryDifferentOwningService));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1763
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1764
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1765
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1766
	iMsvSession.Session().MoveEntriesL(aSelection, aTargetId, operation->Id(), operation->iStatus);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1767
	operation->Start();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1768
	CleanupStack::Pop(); // operation
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1769
	return operation;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1770
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1771
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1772
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1773
EXPORT_C CMsvOperation* CMsvEntry::CopyL(const CMsvEntrySelection& aSelection, TMsvId aTargetId, TRequestStatus& aStatus)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1774
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1775
// Copy a selection ocf children to another parent
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1776
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1777
/** Creates, asynchronously. copies of children of the context as new entries owned by the specified 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1778
target ID.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1779
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1780
All descendants will be copied as well. Any files and stores associated with 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1781
the entries are also copied.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1782
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1783
The returned CMsvOperation object completes when copying is complete.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1784
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1785
@param aSelection List of IDs of the entries to be copied 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1786
@param aTargetId The ID of the entry to own the copies 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1787
@param aStatus The request status to be completed when the operation has finished 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1788
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1789
@leave KErrNoMemory The operation could not be created or passed to the server 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1790
@leave KErrNotFound An entry was not a child of the context 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1791
@return The operation object controlling the copy command. */
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1792
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1793
#ifndef _NO_SESSION_LOGGING_
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1794
	Log(_L("Asynchronous CopyL of selection of %d entries to %x"), aSelection.Count(), aTargetId); 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1795
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1796
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1797
	__ASSERT_DEBUG(iState==EValid || iState==EInvalidDeletedContext || iState==EInvalidChangingContext, PanicServer(EMsvEntryStateUndetermined));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1798
	if (!AreChildren(aSelection))
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1799
		User::Leave(KErrNotFound);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1800
	CMsvEntryOperation* operation = CMsvEntryOperation::NewL(iMsvSession, aStatus);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1801
	CleanupStack::PushL(operation);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1802
	User::LeaveIfError(iMsvSession.Session().OperationMtmL(aSelection.At(0), aTargetId, operation->iMtm, operation->iService)); 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1803
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1804
#if defined(_DEBUG)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1805
	// check other entries in selection are consistent 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1806
	TInt dCount = aSelection.Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1807
	while (dCount--)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1808
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1809
		TMsvId service;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1810
		TUid mtm;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1811
		TInt error = iMsvSession.Session().OperationMtmL(aSelection.At(dCount), aTargetId, mtm, service);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1812
		__ASSERT_DEBUG(error==KErrNone || error==KErrNotFound, PanicServer(EMsvMulitpleMtmsForCopyCommand));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1813
		__ASSERT_DEBUG(mtm==operation->iMtm, PanicServer(EMsvMulitpleMtmsForCopyCommand));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1814
		__ASSERT_DEBUG(service==operation->iService, PanicServer(EMsvMulitpleMtmsForCopyCommand));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1815
		TMsvEntry dEntry;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1816
		TMsvId dService;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1817
		if (iMsvSession.Session().GetEntry(aSelection.At(dCount), dService, dEntry)==KErrNone)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1818
			__ASSERT_DEBUG(dService==iOwningService || (iEntryPtr->iType==KUidMsvServiceEntry && dService==iEntryPtr->Id()) || (iEntryPtr->iType==KUidMsvRootEntry && service==aSelection.At(dCount)), PanicServer(EMsvCopyingEntryDifferentOwningService));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1819
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1820
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1821
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1822
	iMsvSession.Session().CopyEntriesL(aSelection, aTargetId, operation->Id(), operation->iStatus);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1823
	operation->Start();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1824
	CleanupStack::Pop(); // operation
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1825
	return operation;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1826
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1827
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1828
EXPORT_C CMsvOperation* CMsvEntry::CopyL(TMsvId aMsvId, TMsvId aTargetId, TRequestStatus& aStatus)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1829
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1830
// Copy a single entry to another parent
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1831
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1832
/** Creates, asynchronously, a copy of a child of the context as a new entry owned by the specified 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1833
target ID.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1834
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1835
All descendants will be copied as well. Any files and stores associated with 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1836
the entry are also copied.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1837
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1838
The returned CMsvOperation object completes when copying is complete.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1839
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1840
@param aMsvId The ID of the entry to be copied 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1841
@param aTargetId The ID of the entry to own the copy 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1842
@param aStatus The request status to be completed when the operation has finished 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1843
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1844
@leave KErrNoMemory The operation could not be created or passed to the server 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1845
@leave KErrNotFound An entry was not a child of the context 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1846
@return The operation object controlling the copy command. */
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1847
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1848
#ifndef _NO_SESSION_LOGGING_
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1849
	Log(_L("Asynchronous CopyL of entry %x to %x"), aMsvId, aTargetId); 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1850
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1851
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1852
	CMsvEntrySelection* selection = new (ELeave) CMsvEntrySelection;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1853
	CleanupStack::PushL(selection);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1854
	selection->AppendL(aMsvId);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1855
	CMsvOperation* operation = CopyL(*selection, aTargetId, aStatus);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1856
	CleanupStack::PopAndDestroy(); // selection
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1857
	return operation;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1858
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1859
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1860
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1861
TInt CMsvEntry::CopyOneL(TMsvId aMsvId, TMsvId aTargetId)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1862
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1863
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1864
	CMsvEntryArray* newSortedChildren = NULL;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1865
	CMsvClientEntry *toadd=NULL;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1866
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1867
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1868
	if(aTargetId==iEntryPtr->Id())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1869
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1870
		const TMsvEntry &entry=ChildDataL(aMsvId);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1871
		if (entry.Visible() || iOrdering.ShowInvisibleEntries())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1872
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1873
			// Create what may be the new child entry if nothing goes wrong
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1874
			toadd = CMsvClientEntry::NewLC(entry, EMsvClientChild);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1875
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1876
			// Reserve space for the new entry for later
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1877
			iEntries->SetReserveL(iEntries->Count() + 1);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1878
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1879
			newSortedChildren = CMsvEntryArray::NewLC(*iMtmList);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1880
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1881
			// add the children to the sorted pointer list - current context is the first entry
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1882
			TInt totalCount=iEntries->Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1883
			for (TInt count=1; count<totalCount; count++)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1884
				newSortedChildren->AppendL(&iEntries->At(count)->Entry());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1885
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1886
			// We've created a new sorted child list now so we won't leave later
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1887
			newSortedChildren->AppendL(&toadd->Entry());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1888
			newSortedChildren->SortL(iOrdering);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1889
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1890
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1891
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1892
	CMsvEntrySelection* selection = new(ELeave)CMsvEntrySelection;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1893
	CleanupStack::PushL(selection);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1894
	selection->AppendL(aMsvId);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1895
	TInt opid = iMsvSession.OperationId();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1896
	iMsvSession.Session().CopyEntriesL(*selection, aTargetId, opid);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1897
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1898
	TMsvLocalOperationProgress progress;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1899
	TPckg<TMsvLocalOperationProgress> progressPack(progress);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1900
    User::LeaveIfError(iMsvSession.Session().OperationCompletion(opid, progressPack));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1901
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1902
	CleanupStack::PopAndDestroy(selection);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1903
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1904
	// can't leave after this point
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1905
	if(newSortedChildren!=NULL) CleanupStack::Pop(newSortedChildren);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1906
	if(toadd!=NULL) CleanupStack::Pop(toadd);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1907
	if(newSortedChildren!=NULL && progress.iError==KErrNone)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1908
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1909
		delete iSortedChildren;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1910
		iSortedChildren=newSortedChildren;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1911
		newSortedChildren=NULL;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1912
		toadd->SetId(progress.iId);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1913
		// Will not leave because we've reserved space earlier
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1914
		iEntries->AppendL(toadd);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1915
		toadd=NULL;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1916
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1917
	delete newSortedChildren;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1918
	delete toadd;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1919
	return(progress.iError);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1920
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1921
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1922
EXPORT_C void CMsvEntry::CopyL(TMsvId aMsvId, TMsvId aTargetId)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1923
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1924
// Copy a single child to another parent (or duplicate)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1925
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1926
/** Creates, synchronously, a copy of a child of the context as a new entry owned by the specified target ID.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1927
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1928
@param aMsvId The ID of the entry to be copied
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1929
@param aTargetId The ID of the entry to own the copy
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1930
*/
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1931
	{	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1932
	__ASSERT_ALWAYS(iOwningService == KMsvLocalServiceIndexEntryId || iOwningService == KMsvRootIndexEntryId, PanicServer(EMsvNotLocalService)); // Root as well?
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1933
	__ASSERT_DEBUG(iState==EValid || iState==EInvalidDeletedContext || iState==EInvalidChangingContext, PanicServer(EMsvEntryStateUndetermined));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1934
#ifndef _NO_SESSION_LOGGING_
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1935
	Log(_L("Synchronous CopyL %x to %x"), aMsvId, aTargetId); 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1936
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1937
	User::LeaveIfError(CopyOneL(aMsvId,aTargetId));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1938
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1939
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1940
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1941
/** Creates, synchronously. copies of children of the context as new entries owned by the specified 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1942
target ID.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1943
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1944
All descendants will be copied as well. Any files and stores associated with 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1945
the entries are also copied.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1946
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1947
@param aSelection List of IDs of the entries to be copied 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1948
@param aTargetId The ID of the entry to own the copies 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1949
@param aProgress On return, records the outcome of the copy 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1950
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1951
@leave KErrNoMemory 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1952
@leave KErrNotFound An entry was not a child of the context 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1953
*/
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1954
EXPORT_C void CMsvEntry::CopyL(const CMsvEntrySelection& aSelection, TMsvId aTargetId, TMsvLocalOperationProgress& aProgress)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1955
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1956
// Copy a selection to another parent (or duplicate)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1957
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1958
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1959
	__ASSERT_ALWAYS(iOwningService == KMsvLocalServiceIndexEntryId || iOwningService == KMsvRootIndexEntryId, PanicServer(EMsvNotLocalService)); // Root as well?
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1960
	__ASSERT_DEBUG(iState==EValid || iState==EInvalidDeletedContext || iState==EInvalidChangingContext, PanicServer(EMsvEntryStateUndetermined));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1961
	__ASSERT_DEBUG(aSelection.Count(), PanicServer(EMsvEmptySelection));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1962
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1963
#ifndef _NO_SESSION_LOGGING_
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1964
	Log(_L("Synchronous CopyL with selection of %d entries to %x"), aSelection.Count(),aTargetId); 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1965
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1966
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1967
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1968
	aProgress.iTotalNumberOfEntries=aSelection.Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1969
	aProgress.iNumberCompleted=0;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1970
	aProgress.iNumberRemaining=aProgress.iTotalNumberOfEntries;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1971
	aProgress.iError=KErrNone;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1972
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1973
	TInt count=aProgress.iTotalNumberOfEntries;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1974
	while(count--)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1975
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1976
		aProgress.iId=aSelection.At(count);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1977
		TInt err=CopyOneL(aProgress.iId,aTargetId);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1978
		aProgress.iNumberRemaining--;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1979
		if(err==KErrNone)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1980
			aProgress.iNumberCompleted++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1981
		else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1982
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1983
			aProgress.iError=err;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1984
			aProgress.iNumberFailed++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1985
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1986
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1987
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1988
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1989
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1990
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1991
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1992
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1993
EXPORT_C void CMsvEntry::AddObserverL(MMsvEntryObserver& aObserver)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1994
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1995
// Adds an observer to this entry
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1996
// If the function leaves, the observer was not appended
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1997
// 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1998
/** Registers an observer for the object. 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1999
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2000
CMsvEntry objects can call back observer objects that implement the MMsvEntryObserver 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2001
interface when certain events occur. Any number of observers can be registered.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2002
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2003
Observers are called primarily when the context changes state or contents. 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2004
For details, see MMsvEntryObserver::TMsvEntryEvent.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2005
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2006
@param aObserver The observer to be registered for events 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2007
@leave KErrNoMemory Not enough memory to register the observer */
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2008
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2009
	if (iObservers==NULL)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2010
		iObservers=new(ELeave) CArrayPtrFlat<MMsvEntryObserver> (KMsvEntryObserverArrayGranuality);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2011
	iObservers->AppendL(&aObserver);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2012
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2013
#ifndef _NO_SESSION_LOGGING_
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2014
	Log(_L("Observer %d added"), iObservers->Count()); 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2015
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2016
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2017
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2018
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2019
EXPORT_C void CMsvEntry::RemoveObserver(MMsvEntryObserver& aObserver)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2020
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2021
// Removes an observer of the entry
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2022
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2023
/** Unregisters an observer previously registered with AddObserverL(). 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2024
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2025
@param aObserver A reference to an observer to be unregistered for events */
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2026
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2027
	__ASSERT_DEBUG(iObservers, PanicServer(EMsvEntryUnknownObserver));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2028
	if (iObservers)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2029
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2030
		TInt count=iObservers->Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2031
		while (count--)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2032
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2033
			if (iObservers->At(count)==&aObserver)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2034
				{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2035
#ifndef _NO_SESSION_LOGGING_
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2036
				Log(_L("Observer %d removed"), count + 1); 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2037
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2038
				iObservers->Delete(count);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2039
				if (iObservers->Count()==0)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2040
					{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2041
					delete iObservers;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2042
					iObservers=NULL;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2043
					}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2044
				return;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2045
				}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2046
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2047
		__ASSERT_DEBUG(count>=0, PanicServer(EMsvEntryUnknownObserver));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2048
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2049
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2050
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2051
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2052
void CMsvEntry::NotifyAllObserversL(MMsvEntryObserver::TMsvEntryEvent aEvent, TAny* aArg1, TAny* aArg2, TAny* aArg3)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2053
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2054
// Notifies all observers of the event affecting the context
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2055
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2056
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2057
	if (iObservers==NULL)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2058
		return;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2059
	TInt count=iObservers->Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2060
	while (count--)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2061
		iObservers->At(count)->HandleEntryEventL(aEvent,aArg1,aArg2,aArg3);	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2062
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2063
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2064
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2065
void CMsvEntry::HandleSessionEventL(TMsvSessionEvent aEvent, TAny* aArg1, TAny* aArg2, TAny* aArg3)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2066
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2067
// Is informed of all the session events
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2068
// This are filtered to find the events relating to the context
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2069
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2070
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2071
	// Check the notification sequence and ignore if neccessary
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2072
	if (iNotifySequence >= iMsvSession.iNotifySequence)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2073
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2074
#ifndef _NO_SESSION_LOGGING_
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2075
		Log(_L("Ignoring notification, %d >= %d"), iNotifySequence, iMsvSession.iNotifySequence); 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2076
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2077
		return;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2078
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2079
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2080
	switch (aEvent)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2081
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2082
		case EMsvEntriesChanged:
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2083
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2084
			CMsvEntrySelection* selection = (CMsvEntrySelection*) aArg1;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2085
			if (iEntryPtr->Id() == selection->At(0))
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2086
				ContextChangedL(MMsvEntryObserver::EMsvEntryChanged);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2087
			else if (iEntryPtr->Id()==*(TMsvId*) aArg2)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2088
				ChildrenChangedL(*selection);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2089
			break;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2090
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2091
		case EMsvEntriesCreated:
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2092
			if (*(TMsvId*) aArg2==iEntryPtr->Id())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2093
				NewChildrenL(*(CMsvEntrySelection*) aArg1);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2094
			else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2095
				CheckNewGrandchildrenL(*(TMsvId*) aArg2);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2096
			break;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2097
		case EMsvEntriesDeleted:
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2098
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2099
			CMsvEntrySelection* selection = (CMsvEntrySelection*) aArg1;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2100
			if (*(TMsvId*) aArg2==iEntryPtr->Id())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2101
				DeletedChildrenL(*selection);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2102
			else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2103
				{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2104
				// check if we have been deleted
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2105
				TInt index=selection->Find(iEntryPtr->Id());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2106
				if (index!=KErrNotFound)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2107
					{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2108
					iState = EInvalidDeletedContext;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2109
					NotifyAllObserversL(MMsvEntryObserver::EMsvEntryDeleted, NULL, NULL, NULL);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2110
					}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2111
				else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2112
					CheckDeletedGrandchildrenL(*(TMsvId*) aArg2);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2113
				}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2114
			break;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2115
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2116
		case EMsvEntriesMoved:
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2117
			if (*(TMsvId*) aArg3==iEntryPtr->Parent())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2118
				CheckIfContextMovedL(*(CMsvEntrySelection*) aArg1);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2119
			if (*(TMsvId*) aArg2==iEntryPtr->Id())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2120
				NewChildrenL(*(CMsvEntrySelection*) aArg1);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2121
			else if (*(TMsvId*) aArg3==iEntryPtr->Id())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2122
				DeletedChildrenL(*(CMsvEntrySelection*) aArg1);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2123
			else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2124
				{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2125
				CheckNewGrandchildrenL(*(TMsvId*) aArg2);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2126
				CheckDeletedGrandchildrenL(*(TMsvId*) aArg3);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2127
				}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2128
			break;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2129
		case EMsvMediaChanged:
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2130
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2131
			TRAPD(error, HandleMediaChangeL());			
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2132
			if (error)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2133
				{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2134
				// An error occurred or this is a non standard entry
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2135
				// in which case the media has changed so this entry is not accessible
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2136
				// Just mark the entry as invalid - there is nothing else we can do!
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2137
				iState = EInvalidOldContext;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2138
				NotifyAllObserversL(MMsvEntryObserver::EMsvContextInvalid, (TAny*)&error, NULL, NULL);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2139
				}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2140
			break;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2141
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2142
#if (defined SYMBIAN_MSGS_ENHANCED_REMOVABLE_MEDIA_SUPPORT)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2143
		case EMsvRefreshMessageView:
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2144
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2145
			// A drive/disk has been added/removed.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2146
			if(iEntryPtr->StandardFolder())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2147
				{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2148
				SetEntryNoCheckL(iEntryPtr->Id(), iChildrenOfAvailableDrives);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2149
				}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2150
			break;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2151
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2152
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2153
		default:
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2154
			break;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2155
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2156
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2157
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2158
void CMsvEntry::HandleMediaChangeL()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2159
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2160
	// If this is not a standard entry there is nothing we can do
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2161
	if (!iEntryPtr->StandardFolder())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2162
		User::Leave(KMsvMediaChanged);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2163
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2164
	// This is a standard folder so it will exist on all media
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2165
	// Refresh the entry and child list - if this fails mark the entry as invalid
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2166
	// Otherwise the context will be told that everything has changed
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2167
	CMsvEntrySelection* oldChildren = new(ELeave)CMsvEntrySelection;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2168
	CleanupStack::PushL(oldChildren);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2169
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2170
	// Get list of old children
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2171
	TInt count = iSortedChildren->Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2172
	while(count--)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2173
		oldChildren->AppendL(iSortedChildren->At(count)->Id());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2174
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2175
	// Refresh the context
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2176
	iState = EInvalidOldContext;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2177
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2178
#if (defined SYMBIAN_MSGS_ENHANCED_REMOVABLE_MEDIA_SUPPORT)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2179
	if(iChildrenOfAvailableDrives)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2180
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2181
		SetStandardFolderEntryL(iEntryPtr->Id());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2182
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2183
	else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2184
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2185
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2186
		SetEntryL(iEntryPtr->Id());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2187
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2188
	CMsvEntrySelection* newChildren = new(ELeave)CMsvEntrySelection;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2189
	CleanupStack::PushL(newChildren);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2190
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2191
	// Get list of new children
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2192
	count = iSortedChildren->Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2193
	while(count--)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2194
		newChildren->AppendL(iSortedChildren->At(count)->Id());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2195
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2196
	// Tell the context about the children that have effectively been deleted and created
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2197
	if (oldChildren->Count())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2198
		NotifyAllObserversL(MMsvEntryObserver::EMsvDeletedChildren, (TAny*)oldChildren, NULL, NULL);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2199
	if (newChildren->Count())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2200
		NotifyAllObserversL(MMsvEntryObserver::EMsvNewChildren, (TAny*)newChildren, NULL, NULL);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2201
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2202
	// Tell the context that it might have changed
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2203
	NotifyAllObserversL(MMsvEntryObserver::EMsvEntryChanged, NULL, NULL, NULL);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2204
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2205
	CleanupStack::PopAndDestroy(2); // newChildren, oldChildren
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2206
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2207
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2208
void CMsvEntry::CheckIfContextMovedL(const CMsvEntrySelection& aSelection)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2209
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2210
// Some of the contexts parents children have moved, have to check if the context was one of them
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2211
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2212
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2213
	TInt index=aSelection.Find(iEntryPtr->Id());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2214
	if (index!=KErrNotFound)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2215
		ContextChangedL(MMsvEntryObserver::EMsvEntryMoved);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2216
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2217
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2218
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2219
void CMsvEntry::ContextChangedL(MMsvEntryObserver::TMsvEntryEvent aEvent)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2220
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2221
// The context has ben changed, spo we need to get the enw version
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2222
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2223
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2224
#ifndef _NO_SESSION_LOGGING_
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2225
	Log(_L("Context changed")); 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2226
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2227
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2228
	if (iEntries->Count()>1 && iEntries->At(1)->Type()==EMsvClientChangedContext)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2229
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2230
		// we changed the entry, so get the new conext from the entry list
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2231
		// delete the old entry context (the new one is at position 1)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2232
		delete iEntries->At(0);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2233
		iEntries->Delete(0);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2234
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2235
	else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2236
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2237
		// someone else changed the context, so we have to update
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2238
		CMsvClientEntry* cEntry=NULL;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2239
		TMsvId owningService=KMsvNullIndexEntryId;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2240
		TRAPD(error, {cEntry = DoGetEntryLC(iEntryPtr->Id(), owningService); CleanupStack::Pop();});
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2241
		if (error==KErrNone)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2242
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2243
			if(iEntries->Count() != 0)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2244
				{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2245
				delete iEntries->At(0);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2246
				iEntries->At(0) = cEntry;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2247
				}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2248
			else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2249
				{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2250
				iEntries->AppendL(cEntry); 	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2251
				}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2252
			iOwningService = owningService;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2253
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2254
		else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2255
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2256
			iState = EInvalidOldContext;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2257
			NotifyAllObserversL(MMsvEntryObserver::EMsvContextInvalid, (TAny*)&error, NULL, NULL);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2258
			return;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2259
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2260
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2261
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2262
	iEntries->At(0)->SetType(EMsvClientContext);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2263
	iEntryPtr = &iEntries->At(0)->Entry();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2264
	iState = EValid;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2265
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2266
	// notify all observers
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2267
	NotifyAllObserversL(aEvent, NULL, NULL, NULL);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2268
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2269
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2270
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2271
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2272
void CMsvEntry::NewChildrenL(const CMsvEntrySelection& aSelection)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2273
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2274
// New children have been created
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2275
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2276
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2277
#ifndef _NO_SESSION_LOGGING_
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2278
	Log(_L("New children")); 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2279
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2280
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2281
	CMsvEntrySelection* newChildren = DoGetNewChildrenL(aSelection);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2282
	CleanupStack::PushL(newChildren);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2283
	if (newChildren->Count())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2284
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2285
		TMsvEntry* ptr = CONST_CAST(TMsvEntry*, iEntryPtr);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2286
		ptr->SetOwner(ETrue);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2287
		NotifyAllObserversL(MMsvEntryObserver::EMsvNewChildren, (TAny*)newChildren, NULL, NULL);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2288
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2289
	CleanupStack::PopAndDestroy(); // newChildren
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2290
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2291
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2292
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2293
CMsvEntrySelection* CMsvEntry::DoGetNewChildrenL(const CMsvEntrySelection& aSelection)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2294
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2295
// New children have been created
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2296
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2297
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2298
	CMsvEntrySelection* newChildren = aSelection.CopyLC();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2299
	TInt count=aSelection.Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2300
	while (count--)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2301
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2302
		// check if we already have this child
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2303
		if (IsAChild(aSelection.At(count)))
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2304
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2305
			newChildren->Delete(count);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2306
			continue;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2307
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2308
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2309
		// get the new child data and add to to the list
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2310
		TMsvEntry tEntry;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2311
		TMsvId service;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2312
		TInt error=iMsvSession.Session().GetEntry(aSelection.At(count), service, tEntry);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2313
		if(error!=KErrNotFound) User::LeaveIfError(error);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2314
		
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2315
		if (error == KErrNone && (tEntry.Visible() || iOrdering.ShowInvisibleEntries()))
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2316
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2317
			__ASSERT_DEBUG(service==iOwningService || (iEntryPtr->iType==KUidMsvServiceEntry && service==iEntryPtr->Id()) || (iEntryPtr->iType==KUidMsvRootEntry && service==(aSelection.At(count))), PanicServer(EMsvNewChildDifferentOwningService));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2318
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2319
			CMsvClientEntry* cEntry = CMsvClientEntry::NewLC(tEntry, EMsvClientNull);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2320
			cEntry->SetType(EMsvClientChild);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2321
			iEntries->AppendL(cEntry);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2322
			CleanupStack::Pop(); // cEntry
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2323
			// resort the children
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2324
			iSortedChildren->AppendL(&cEntry->Entry());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2325
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2326
		else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2327
			newChildren->Delete(count);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2328
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2329
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2330
	if (newChildren->Count())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2331
		iSortedChildren->SortL(iOrdering);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2332
	CleanupStack::Pop(); // newChildren
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2333
	return newChildren;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2334
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2335
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2336
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2337
void CMsvEntry::CheckNewGrandchildrenL(TMsvId aId)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2338
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2339
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2340
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2341
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2342
	TInt count=iEntries->Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2343
	while (count--)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2344
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2345
		if (iEntries->At(count)->Entry().Id()==aId && !iEntries->At(count)->Entry().Owner())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2346
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2347
			iEntries->At(count)->SetOwnerFlag(ETrue);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2348
			NotifyChildChangedL(aId);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2349
			break;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2350
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2351
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2352
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2353
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2354
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2355
void CMsvEntry::CheckDeletedGrandchildrenL(TMsvId aId)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2356
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2357
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2358
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2359
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2360
	TInt count=iEntries->Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2361
	while (count--)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2362
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2363
		if (iEntries->At(count)->Entry().Id()==aId)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2364
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2365
			TMsvEntry entry;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2366
			TMsvId service;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2367
			TInt error = iMsvSession.Session().GetEntry(aId, service, entry);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2368
			__ASSERT_DEBUG(error || service==iOwningService || (iEntryPtr->iType==KUidMsvServiceEntry && service==iEntryPtr->Id()) || (iEntryPtr->iType==KUidMsvRootEntry && service==aId), PanicServer(EMsvDeletedGrandChildDifferentOwningService));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2369
			if (error)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2370
				NotifyAllObserversL(MMsvEntryObserver::EMsvChildrenInvalid, (TAny*)&error, NULL, NULL);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2371
			else if (!entry.Owner())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2372
				{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2373
				iEntries->At(count)->SetOwnerFlag(EFalse);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2374
				NotifyChildChangedL(aId);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2375
				}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2376
			break;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2377
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2378
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2379
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2380
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2381
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2382
void CMsvEntry::NotifyChildChangedL(TMsvId aId)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2383
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2384
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2385
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2386
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2387
	CMsvEntrySelection* selection = DoMakeSelectionL(aId);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2388
	CleanupStack::PushL(selection);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2389
	NotifyAllObserversL(MMsvEntryObserver::EMsvChildrenChanged, (TAny*)selection, NULL, NULL);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2390
	CleanupStack::PopAndDestroy(); // selection
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2391
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2392
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2393
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2394
CMsvEntrySelection* CMsvEntry::DoMakeSelectionL(TMsvId aId)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2395
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2396
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2397
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2398
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2399
	CMsvEntrySelection* selection = new (ELeave) CMsvEntrySelection;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2400
	CleanupStack::PushL(selection);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2401
	selection->AppendL(aId);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2402
	CleanupStack::Pop(); // selection
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2403
	return selection;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2404
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2405
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2406
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2407
void CMsvEntry::ChildrenChangedL(const CMsvEntrySelection& aSelection)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2408
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2409
// Children have been changed
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2410
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2411
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2412
#ifndef _NO_SESSION_LOGGING_
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2413
	Log(_L("Children changed")); 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2414
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2415
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2416
	CMsvEntrySelection* changedChildren = new(ELeave) CMsvEntrySelection;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2417
	CleanupStack::PushL(changedChildren);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2418
	CMsvEntrySelection* newChildren = new(ELeave) CMsvEntrySelection;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2419
	CleanupStack::PushL(newChildren);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2420
	CMsvEntrySelection* deletedChildren = new(ELeave) CMsvEntrySelection;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2421
	CleanupStack::PushL(deletedChildren);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2422
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2423
	TInt count=aSelection.Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2424
	while (count--)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2425
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2426
		// get the changed child data
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2427
		TMsvId id = aSelection.At(count);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2428
		TMsvEntry tEntry;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2429
		TMsvId service;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2430
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2431
		// find the child in the sorted list
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2432
		TInt pos=iSortedChildren->Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2433
		while (pos--)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2434
			if (iSortedChildren->At(pos)->Id()==id)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2435
				break;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2436
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2437
		TInt error = iMsvSession.Session().GetEntry(id, service, tEntry);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2438
		if (error == KErrNotFound)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2439
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2440
			if (pos >= 0)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2441
				{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2442
				// The child has been deleted by the server
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2443
				DeleteChild(pos);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2444
				deletedChildren->AppendL(id);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2445
				}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2446
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2447
		else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2448
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2449
			User::LeaveIfError(error);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2450
			__ASSERT_DEBUG(service==iOwningService || (iEntryPtr->iType==KUidMsvServiceEntry && service==iEntryPtr->Id()) || (iEntryPtr->iType==KUidMsvRootEntry && service==id), PanicServer(EMsvChangedChildHasDifferentOwningService));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2451
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2452
			if ( pos!=KErrNotFound  )
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2453
				{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2454
				// replace it, if showing all children or its was and still is visible
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2455
				if (iOrdering.ShowInvisibleEntries() || tEntry.Visible())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2456
					{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2457
					ReplaceChildL(pos, tEntry);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2458
					changedChildren->AppendL(id);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2459
					continue;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2460
					}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2461
				}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2462
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2463
			if ( pos==KErrNotFound )
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2464
				{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2465
				if (tEntry.Visible())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2466
					{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2467
					// the child has just been made visible so add it to our sorted list
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2468
					CMsvClientEntry* cEntry = CMsvClientEntry::NewLC(tEntry, EMsvClientChild);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2469
					iEntries->AppendL(cEntry);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2470
					CleanupStack::Pop(); // cEntry
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2471
					iSortedChildren->AppendL(&cEntry->Entry());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2472
					newChildren->AppendL(id);		
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2473
					}				
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2474
				}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2475
			else if (!tEntry.Visible())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2476
				{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2477
				DeleteChild(pos);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2478
				deletedChildren->AppendL(id);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2479
				}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2480
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2481
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2482
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2483
	// resort the children
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2484
	if (changedChildren->Count() || newChildren->Count() || deletedChildren->Count())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2485
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2486
		iSortedChildren->SortL(iOrdering);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2487
		// notify the observers
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2488
		if (changedChildren->Count())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2489
			NotifyAllObserversL(MMsvEntryObserver::EMsvChildrenChanged, (TAny*)changedChildren, NULL, NULL);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2490
		if (newChildren->Count())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2491
			NotifyAllObserversL(MMsvEntryObserver::EMsvNewChildren, (TAny*)newChildren, NULL, NULL);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2492
		if (deletedChildren->Count())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2493
			NotifyAllObserversL(MMsvEntryObserver::EMsvDeletedChildren, (TAny*)deletedChildren, NULL, NULL);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2494
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2495
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2496
	CleanupStack::PopAndDestroy(3); // changedChildren, newChildren, deletedChildren
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2497
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2498
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2499
void CMsvEntry::DeleteChild(TInt aPosition)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2500
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2501
	TMsvId id = iSortedChildren->At(aPosition)->Id();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2502
	iSortedChildren->Delete(aPosition);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2503
	TInt ii=iEntries->Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2504
	while (ii--)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2505
		if (iEntries->At(ii)->Entry().Id()==id)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2506
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2507
			__ASSERT_DEBUG(iEntries->At(ii)->Type()==EMsvClientChild, PanicServer(EMsvNonChildDeleted));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2508
			delete iEntries->At(ii);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2509
			iEntries->Delete(ii);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2510
			break;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2511
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2512
	__ASSERT_DEBUG(ii!=KErrNotFound, PanicServer(EMsvChangedChildNotFound1));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2513
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2514
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2515
void CMsvEntry::ReplaceChildL(TInt aPosition, const TMsvEntry& aEntry)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2516
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2517
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2518
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2519
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2520
	CMsvClientEntry* cEntry = CMsvClientEntry::NewLC(aEntry, EMsvClientChild);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2521
			
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2522
	TInt ii=iEntries->Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2523
	while (ii--)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2524
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2525
		if (iEntries->At(ii)->Entry().Id()==aEntry.Id())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2526
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2527
			__ASSERT_DEBUG(iEntries->At(ii)->Type()==EMsvClientChild, PanicServer(EMsvNonChildDeleted));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2528
			delete iEntries->At(ii);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2529
			iEntries->At(ii) = cEntry;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2530
			iSortedChildren->At(aPosition) = &cEntry->Entry();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2531
			break;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2532
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2533
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2534
	__ASSERT_DEBUG(ii!=KErrNotFound, PanicServer(EMsvChangedChildNotFound1));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2535
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2536
	CleanupStack::Pop(); // cEntry
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2537
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2538
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2539
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2540
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2541
void CMsvEntry::DeletedChildrenL(const CMsvEntrySelection& aSelection)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2542
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2543
// Some of the children have been deleted
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2544
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2545
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2546
#ifndef _NO_SESSION_LOGGING_
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2547
	Log(_L("Deleted children")); 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2548
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2549
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2550
	CMsvEntrySelection* deletedChildren = aSelection.CopyL();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2551
	CleanupStack::PushL(deletedChildren);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2552
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2553
	TInt count=aSelection.Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2554
	while (count--)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2555
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2556
		TMsvId id = aSelection.At(count);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2557
		TInt ii=iSortedChildren->Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2558
		while (ii--)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2559
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2560
			if (iSortedChildren->At(ii)->Id()==id)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2561
				{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2562
				iSortedChildren->Delete(ii);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2563
				break;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2564
				}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2565
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2566
		if (ii==KErrNotFound)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2567
			deletedChildren->Delete(count);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2568
		else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2569
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2570
			ii=iEntries->Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2571
			while (ii--)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2572
				{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2573
				if (iEntries->At(ii)->Entry().Id()==id)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2574
					{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2575
					__ASSERT_DEBUG(iEntries->At(ii)->Type()==EMsvClientChild, PanicServer(EMsvNonChildDeleted));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2576
					delete iEntries->At(ii);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2577
					iEntries->Delete(ii);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2578
					break;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2579
					}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2580
				__ASSERT_DEBUG(ii!=KErrNotFound, PanicServer(EMsvDeletedChildNotInMainList));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2581
				}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2582
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2583
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2584
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2585
	// notify all observers
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2586
	if (deletedChildren->Count())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2587
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2588
		// reset the owner flag
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2589
		if (Count()==0)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2590
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2591
			TMsvEntry* ptr = CONST_CAST(TMsvEntry*, iEntryPtr);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2592
			ptr->SetOwner(EFalse);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2593
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2594
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2595
		NotifyAllObserversL(MMsvEntryObserver::EMsvDeletedChildren, (TAny*)deletedChildren, NULL, NULL);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2596
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2597
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2598
	CleanupStack::PopAndDestroy(); // deletedChildren
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2599
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2600
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2601
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2602
CMsvEntryArray* CMsvEntry::GetNewSortedListL(const TMsvSelectionOrdering& aOrdering, const CArrayFix<TUid>& aMtmList)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2603
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2604
// Gets a new sorted list for new order and mtm list
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2605
// The entries should have the correct visiblity
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2606
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2607
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2608
	CMsvEntryArray* newSortedChildren = CMsvEntryArray::NewLC(aMtmList);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2609
	if (iSortedChildren->Count())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2610
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2611
//		newSortedChildren->InsertL(0, &iSortedChildren->At(0), iSortedChildren->Count());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2612
//		newSortedChildren->SortL(aOrdering);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2613
		TInt count=1;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2614
		if (iEntries->At(count)->Type()!=EMsvClientChild)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2615
			count++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2616
		TInt totalCount=iEntries->Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2617
		for (; count<totalCount; count++)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2618
			newSortedChildren->AppendL(&iEntries->At(count)->Entry());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2619
		newSortedChildren->SortL(aOrdering);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2620
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2621
	CleanupStack::Pop(); // newSortedChildren
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2622
	return newSortedChildren;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2623
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2624
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2625
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2626
EXPORT_C void CMsvEntry::SetSortTypeL(const TMsvSelectionOrdering& aOrdering)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2627
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2628
// Sets the sort type
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2629
// If this leaves the sort type has not been changed
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2630
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2631
/** Sets the sort order that is used when listing children, for example with ChildrenL().
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2632
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2633
If the function leaves, the sort order is unchanged.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2634
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2635
@param aOrdering Sort order to use 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2636
@leave KErrNoMemory Insufficient memory to resort the entries */
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2637
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2638
	__ASSERT_DEBUG(iState==EValid || iState==EInvalidDeletedContext || iState==EInvalidChangingContext, PanicServer(EMsvEntryStateUndetermined));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2639
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2640
#ifndef _NO_SESSION_LOGGING_
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2641
		Log(_L("Sort order changed, sorting %x, invisible %d"), aOrdering.Sorting(), aOrdering.ShowInvisibleEntries()); 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2642
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2643
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2644
	if (aOrdering.ShowInvisibleEntries()==iOrdering.ShowInvisibleEntries())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2645
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2646
		// just resort the current list of children
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2647
		CMsvEntryArray* newSortedChildren = GetNewSortedListL(aOrdering, *iMtmList);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2648
		delete iSortedChildren;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2649
		iSortedChildren = newSortedChildren;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2650
		iOrdering = aOrdering;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2651
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2652
	else if (!aOrdering.ShowInvisibleEntries())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2653
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2654
		// resort the current list
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2655
		CMsvEntryArray* newSortedChildren = GetNewSortedListL(aOrdering, *iMtmList);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2656
		delete iSortedChildren;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2657
		iSortedChildren = newSortedChildren;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2658
		iOrdering = aOrdering;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2659
		// remove the invisible entries from sort list
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2660
		TInt count = iSortedChildren->Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2661
		while (count--)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2662
			if (!iSortedChildren->At(count)->Visible())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2663
				iSortedChildren->Delete(count);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2664
		// remove the invisible children from main list
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2665
		count = iEntries->Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2666
		while (count-->=1)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2667
			if (!iEntries->At(count)->Entry().Visible())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2668
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2669
			delete iEntries->At(count);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2670
			iEntries->Delete(count);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2671
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2672
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2673
	else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2674
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2675
		// keep old variable
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2676
		CArrayPtrFlat<CMsvClientEntry>* oldEntries = iEntries;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2677
		iEntries=NULL;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2678
		CMsvEntryArray* oldSortedChildren = iSortedChildren;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2679
		iSortedChildren=NULL;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2680
		TMsvSelectionOrdering oldOrder = iOrdering;	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2681
		
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2682
		iOrdering = aOrdering;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2683
		TRAPD(leave, DoSortTypeL(oldEntries->At(0)));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2684
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2685
		if (leave)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2686
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2687
			// we left, the function may have created a new iEntries,
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2688
			// if iEntries has been created we need to delete all the elements
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2689
			// except the first one, that is used in the old list
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2690
			// then delete iEntries, and put back the old one.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2691
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2692
			if(iEntries!=NULL)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2693
				{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2694
				if(iEntries->Count()!=0) 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2695
					iEntries->Delete(0);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2696
				iEntries->ResetAndDestroy();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2697
				delete iEntries;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2698
				}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2699
			iEntries = oldEntries;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2700
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2701
			// iSortedChildren doesn't own the children so just delete the new one.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2702
			// and put the old one back.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2703
			delete iSortedChildren;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2704
			iSortedChildren = oldSortedChildren;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2705
			iOrdering = oldOrder;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2706
			User::Leave(leave);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2707
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2708
		else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2709
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2710
			oldEntries->Delete(0); // the object is used in new list
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2711
			oldEntries->ResetAndDestroy();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2712
			delete oldEntries;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2713
			delete oldSortedChildren;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2714
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2715
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2716
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2717
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2718
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2719
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2720
void CMsvEntry::DoSortTypeL(CMsvClientEntry* aContext)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2721
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2722
// 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2723
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2724
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2725
	iEntries = new(ELeave) CArrayPtrFlat<CMsvClientEntry>(KMsvClientEntryArrayGranuality);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2726
	iEntries->AppendL(aContext);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2727
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2728
	iSortedChildren = CMsvEntryArray::NewL(*iMtmList);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2729
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2730
	DoGetChildrenL();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2731
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2732
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2733
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2734
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2735
EXPORT_C void CMsvEntry::SetMtmListL(const CArrayFix<TUid>& aMtmList)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2736
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2737
// Sets the mtm list
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2738
// If this leaves the mtm list has not been changed
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2739
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2740
/** Sets the MTM order to the specified sort order. When children of an entry are 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2741
sorted, entries belonging to the same MTM type can be grouped together. 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2742
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2743
MTM grouping can be switched on or off through setting the appropriate TMsvSelectionOrdering 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2744
value by SetSortTypeL(). 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2745
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2746
If the function leaves, the sort order is unchanged.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2747
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2748
@param aMtmList The order of MTMs to use for sorting 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2749
@leave KErrNoMemory Insufficient memory to resort the entries */
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2750
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2751
	__ASSERT_DEBUG(iState==EValid || iState==EInvalidDeletedContext || iState==EInvalidChangingContext, PanicServer(EMsvEntryStateUndetermined));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2752
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2753
	// create new mtm list
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2754
	CArrayFixFlat<TUid>* mtmList = new(ELeave)CArrayFixFlat<TUid>(KMsvMtmListGranularity);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2755
	CleanupStack::PushL(mtmList);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2756
	mtmList->InsertL(0, &aMtmList.At(0), aMtmList.Count());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2757
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2758
	// create new sorted children list
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2759
	CMsvEntryArray* newSortedChildren = GetNewSortedListL(iOrdering, *mtmList);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2760
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2761
	// install the new sorted children array
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2762
	delete iSortedChildren;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2763
	delete iMtmList;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2764
	iSortedChildren = newSortedChildren;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2765
	iMtmList = mtmList;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2766
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2767
	CleanupStack::Pop(); // mtmList
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2768
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2769
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2770
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2771
TBool CMsvEntry::IsAChild(TMsvId aId) const
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2772
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2773
// Returns true if the entry is a child
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2774
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2775
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2776
	TInt count=iSortedChildren->Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2777
	while (count--)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2778
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2779
		if (iSortedChildren->At(count)->Id()==aId)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2780
			return ETrue;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2781
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2782
	return EFalse;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2783
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2784
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2785
TBool CMsvEntry::AreChildren(const CMsvEntrySelection& aSelection) const
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2786
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2787
// Returns true if all the entries are children
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2788
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2789
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2790
	TInt count = aSelection.Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2791
	if(!count)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2792
	    {
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2793
        return EFalse;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2794
	    }
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2795
	else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2796
	    {
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2797
        while (count--)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2798
            {
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2799
            if (!IsAChild(aSelection.At(count)))
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2800
                {
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2801
                return EFalse;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2802
                }
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2803
            }
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2804
	    }
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2805
	return ETrue;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2806
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2807
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2808
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2809
EXPORT_C TBool CMsvEntry::HasStoreL() const
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2810
/** Checks if the context has an associated message store.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2811
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2812
@return ETrue: entry has a message store EFalse: entry does not have a message 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2813
store */
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2814
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2815
#if (defined SYMBIAN_MESSAGESTORE_HEADER_BODY_USING_SQLDB)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2816
	if(iMsvSession.StoreManager().DoesAnyStoreExists(iEntryPtr->Id(), this->Entry().iMtm))
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2817
		return ETrue;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2818
	else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2819
		return iMsvSession.StoreManager().FileStoreExistsL(iEntryPtr->Id());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2820
#else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2821
	return iMsvSession.StoreManager().FileStoreExistsL(iEntryPtr->Id());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2822
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2823
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2824
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2825
/** Sets or clears multiple fields in a selection of children of the context.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2826
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2827
Fields to change are specified using a bitmask of TMsvAttribute values. Possible 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2828
fields that can be changed using this function are the PC synchronisation, Visibility, 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2829
Pending Deletion, Read, In-preparation, Connected, and New flags. 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2830
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2831
@param aSelection The entries to change
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2832
@param aSetAttributes A bitmask of the fields to set
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2833
@param aClearAttributes A bitmask of the fields to clear
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2834
@leave KErrNotFound An entry was not a child of the context
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2835
@see CMsvSession::ChangeAttributesL() 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2836
*/
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2837
EXPORT_C void CMsvEntry::ChangeAttributesL(const CMsvEntrySelection& aSelection, TUint aSetAttributes, TUint aClearAttributes)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2838
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2839
#ifndef _NO_SESSION_LOGGING_
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2840
	Log(_L("ChangeAttributesL")); 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2841
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2842
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2843
	__ASSERT_DEBUG(iState==EValid || iState==EInvalidDeletedContext || iState==EInvalidChangingContext, PanicServer(EMsvEntryStateUndetermined));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2844
	__ASSERT_DEBUG(aSelection.Count(), PanicServer(EMsvEmptySelection));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2845
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2846
	if (!AreChildren(aSelection))
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2847
		User::Leave(KErrNotFound);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2848
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2849
	iMsvSession.Session().ChangeAttributesL(aSelection, aSetAttributes, aClearAttributes);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2850
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  2851