messagingfw/msgsrvnstore/server/src/MSVLOCAL.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
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    17
#include <e32std.h>
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    18
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    19
#include "MSVSTD.H"
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    20
#include "MSVSTORE.H"
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    21
#include "MSVIDS.H"
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    22
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    23
#include "MSVENTRY.H"
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    24
#include "MSVSERV.H"
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    25
#include "MSVLOPS.H"
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    26
#include "MSVMOVE.H"
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    27
#include "MSVCOPY.H"
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    28
#include "MSVDELET.H"
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    29
#include "MSVPANIC.H"
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    30
#include <tmsvsystemprogress.h>
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    31
#include "msvindexadapter.h"
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    32
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    33
//**********************************
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    34
// CMsvLocalOperation
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    35
//**********************************
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    36
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    37
CMsvLocalOperation::CMsvLocalOperation(const RMessage2& aMessage, TMsvOp aId, CMsvServer& aMsvServer)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    38
: CMsvServerOperation(aMessage, aId, KUidMsvLocalServiceMtm, KMsvLocalServiceIndexEntryId, -1), iMsvServer(aMsvServer)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    39
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    40
	__DECLARE_NAME(_S("CMsvLocalOperation"));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    41
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    42
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    43
const TDesC8& CMsvLocalOperation::Progress()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    44
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    45
	return iProgress;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    46
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    47
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    48
/**
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    49
Obtain the local progress information
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    50
@param aOutSysProg The TMsvSystemProgress structure to be populated
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    51
@return system wide error code
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    52
*/
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    53
TInt CMsvLocalOperation::SystemProgress(TMsvSystemProgress& aSysProgress)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    54
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    55
	aSysProgress.iErrorCode = iProgress().iError;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    56
	aSysProgress.iId = iProgress().iId;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    57
	return KErrNone;	// This method will not fail
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    58
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    59
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    60
//**********************************
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    61
// CMsvLocalCopyOperation
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    62
//**********************************
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    63
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    64
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    65
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    66
CMsvLocalCopyOperation::CMsvLocalCopyOperation(const RMessage2& aMessage, TMsvOp aId, CMsvEntrySelection* aSelection, TMsvId aTarget, CMsvServer& aMsvServer)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    67
: CMsvLocalOperation(aMessage, aId, aMsvServer), iOrigEntries(aSelection), iTarget(aTarget)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    68
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    69
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    70
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    71
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    72
	__DECLARE_NAME(_S("CMsvLocalCopyOperation"));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    73
	// set up the progress
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    74
	iProgress().iType = TMsvLocalOperationProgress::ELocalCopy;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    75
	iProgress().iTotalNumberOfEntries = iOrigEntries->Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    76
	iProgress().iNumberRemaining = iProgress().iTotalNumberOfEntries;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    77
	CActiveScheduler::Add(this);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    78
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    79
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    80
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    81
CMsvLocalCopyOperation::~CMsvLocalCopyOperation()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    82
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    83
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    84
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    85
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    86
	Cancel();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    87
	delete iOrigEntries;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    88
	delete iNewEntries;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    89
	delete iCopy;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    90
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    91
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    92
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    93
void CMsvLocalCopyOperation::DoCancel()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    94
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    95
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    96
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    97
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    98
	iCopy->Cancel();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    99
	iProgress().iError = KErrCancel;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   100
	Completed();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   101
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   102
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   103
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   104
void CMsvLocalCopyOperation::RunL()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   105
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   106
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   107
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   108
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   109
	// sort out descendent copying
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   110
	if (iDescendentCopying && iDescendentId == KMsvNullIndexEntryId)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   111
		iDescendentId = iCopy->NewEntryId();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   112
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   113
	// record details of the previous move
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   114
	iProgress().iNumberRemaining--;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   115
	if (iStatus!=KErrNone)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   116
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   117
		iProgress().iNumberFailed++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   118
		iProgress().iError=iStatus.Int();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   119
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   120
	else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   121
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   122
		iNewEntries->AppendL(iCopy->NewEntryId()); // will not fail, as space has been reserved
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   123
		iProgress().iNumberCompleted++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   124
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   125
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   126
	if (iIndex < iOrigEntries->Count())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   127
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   128
		// start the next move
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   129
		TInt error =  CopyNextEntry();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   130
		if (error==KErrNone)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   131
			return; // doing another move
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   132
		__ASSERT_DEBUG(iProgress().iNumberRemaining==0, PanicServer(EMsvCopyingOperationInvariant));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   133
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   134
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   135
	// complete the operation
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   136
	Completed();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   137
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   138
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   139
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   140
void CMsvLocalCopyOperation::StartL()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   141
//
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
	iNewEntries = new(ELeave) CMsvEntrySelection;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   146
	iCopy = CMsvCopy::NewL(iMsvServer);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   147
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   148
	iIndex = 0;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   149
	iNewEntries->SetReserveL(iOrigEntries->Count());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   150
	iDescendentId = KMsvNullIndexEntryId;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   151
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   152
	// check for copying into a descedent
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   153
	TInt count = iOrigEntries->Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   154
	while (count--)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   155
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   156
		TMsvId id = iOrigEntries->At(count);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   157
		iDescendentCopying = (id==iTarget);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   158
		if (!iDescendentCopying)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   159
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   160
			iMsvServer.IndexAdapter().IsADescendent(id, iTarget, iDescendentCopying); // error ignored
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   161
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   162
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   163
		if (iDescendentCopying)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   164
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   165
			// has to be done first
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   166
			iOrigEntries->Delete(count);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   167
			iOrigEntries->InsertL(0, id);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   168
			break;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   169
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   170
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   171
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   172
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   173
	TInt error = CopyNextEntry();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   174
	if (error==KErrNone)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   175
		SetState(EMsvOperationRunning);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   176
	else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   177
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   178
		iProgress().iNumberFailed = iProgress().iTotalNumberOfEntries;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   179
		iProgress().iNumberRemaining = 0;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   180
		iProgress().iError=error;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   181
		Completed();
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
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   186
TInt CMsvLocalCopyOperation::CopyNextEntry()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   187
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   188
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   189
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   190
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   191
	FOREVER
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   192
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   193
		TRAPD(error, iCopy->StartL(iOrigEntries->At(iIndex++), iTarget, iStatus, iDescendentCopying));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   194
		if (error)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   195
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   196
			iProgress().iNumberRemaining--;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   197
			iProgress().iNumberFailed++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   198
			iProgress().iError=error;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   199
			if (iIndex==iOrigEntries->Count())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   200
				return error;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   201
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   202
		else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   203
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   204
			SetActive();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   205
			break;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   206
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   207
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   208
	return KErrNone;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   209
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   210
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   211
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   212
void CMsvLocalCopyOperation::Completed()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   213
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   214
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   215
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   216
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   217
	SetState(EMsvOperationCompleted);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   218
	if (iNewEntries->Count())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   219
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   220
		iProgress().iId = iNewEntries->At(0);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   221
		iMsvServer.NotifyChanged(EMsvEntriesCreated, *iNewEntries, iTarget);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   222
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   223
	iMessage.Complete(KErrNone);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   224
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   225
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   226
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   227
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   228
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   229
//**********************************
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   230
// CMsvLocalMoveOperation
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   231
//**********************************
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   232
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   233
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   234
CMsvLocalMoveOperation::CMsvLocalMoveOperation(const RMessage2& aMessage, TMsvOp aId, CMsvEntrySelection* aSelection, TMsvId aTarget, CMsvServer& aMsvServer)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   235
: CMsvLocalOperation(aMessage, aId, aMsvServer), iTarget(aTarget), iParent(KMsvNullIndexEntryId), iOrigEntries(aSelection)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   236
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   237
	__DECLARE_NAME(_S("CMsvLocalMoveOperation"));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   238
	// set up the progress
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   239
	iProgress().iType = TMsvLocalOperationProgress::ELocalMove;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   240
	iProgress().iTotalNumberOfEntries = iOrigEntries->Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   241
	iProgress().iNumberRemaining = iProgress().iTotalNumberOfEntries;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   242
	CActiveScheduler::Add(this);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   243
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   244
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   245
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   246
CMsvLocalMoveOperation::~CMsvLocalMoveOperation()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   247
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   248
	Cancel();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   249
	delete iOrigEntries;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   250
	delete iMove;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   251
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   252
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   253
void CMsvLocalMoveOperation::DoCancel()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   254
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   255
	iMove->Cancel();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   256
	iOrigEntries->Delete(0,iNextEntry);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   257
	iProgress().iError = KErrCancel;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   258
	Completed();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   259
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   260
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   261
void CMsvLocalMoveOperation::RunL()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   262
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   263
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   264
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   265
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   266
	// record details of the previous move
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   267
	iProgress().iNumberRemaining--;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   268
	if (iStatus!=KErrNone)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   269
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   270
		iProgress().iNumberFailed++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   271
		iProgress().iError=iStatus.Int();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   272
		iOrigEntries->Delete(iNextEntry);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   273
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   274
	else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   275
		iProgress().iNumberCompleted++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   276
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   277
	TInt error=KErrNone;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   278
	if (iNextEntry) // will be zero when completed
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   279
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   280
		// start the next move
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   281
		error =  MoveNextEntry();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   282
		if (error==KErrNone)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   283
			return; // doing another move
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   284
		__ASSERT_DEBUG(iProgress().iNumberRemaining==0, PanicServer(EMsvMovingOperationInvariant));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   285
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   286
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   287
	// complete the operation
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   288
	Completed();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   289
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   290
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   291
void CMsvLocalMoveOperation::Completed()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   292
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   293
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   294
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   295
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   296
	SetState(EMsvOperationCompleted);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   297
	if (iOrigEntries->Count())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   298
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   299
		iProgress().iId = iOrigEntries->At(0);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   300
		iMsvServer.NotifyChanged(EMsvEntriesMoved, *iOrigEntries, iTarget, iParent);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   301
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   302
	iMessage.Complete(KErrNone);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   303
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   304
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   305
void CMsvLocalMoveOperation::StartFailed(TInt aError)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   306
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   307
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   308
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   309
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   310
	iProgress().iNumberFailed = iProgress().iTotalNumberOfEntries;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   311
	iProgress().iNumberRemaining = 0;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   312
	iProgress().iError=aError;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   313
	iOrigEntries->Reset();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   314
	Completed();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   315
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   316
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   317
void CMsvLocalMoveOperation::StartL()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   318
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   319
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   320
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   321
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   322
	// check if the target exists
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   323
	TMsvEntry* entry;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   324
	TInt err = KErrNone;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   325
	err = iMsvServer.IndexAdapter().GetEntry(iTarget, entry);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   326
	if (err !=KErrNone)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   327
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   328
		StartFailed(KErrPathNotFound);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   329
		return;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   330
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   331
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   332
	// find the current parent
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   333
	TInt count=iOrigEntries->Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   334
	while (count--)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   335
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   336
		TInt error = KErrNone;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   337
		error = iMsvServer.IndexAdapter().GetEntry(iOrigEntries->At(count), entry);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   338
		if (error ==KErrNone)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   339
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   340
			iParent=entry->Parent();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   341
			break;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   342
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   343
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   344
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   345
	// nothing to copy
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   346
	if (count==KErrNotFound)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   347
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   348
		StartFailed(count);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   349
		return;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   350
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   351
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   352
#if defined(_DEBUG)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   353
	// check all the entries are local
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   354
	TInt dCount=iOrigEntries->Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   355
	while (dCount--)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   356
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   357
		TInt dSourceLocal;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   358
		TInt dError = KErrNone;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   359
		dError = iMsvServer.IndexAdapter().IsLocal(iOrigEntries->At(count), dSourceLocal);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   360
		__ASSERT_DEBUG(dError!=KErrNone || dSourceLocal,   PanicServer(EMsvMovingLocalEntryIsRemote));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   361
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   362
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   363
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   364
	// start the copying
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   365
	iMove = CMsvMove::NewL(iMsvServer);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   366
	iNextEntry=iOrigEntries->Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   367
	TInt error = MoveNextEntry();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   368
	if (error==KErrNone)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   369
		SetState(EMsvOperationRunning);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   370
	else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   371
		StartFailed(error);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   372
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   373
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   374
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   375
TInt CMsvLocalMoveOperation::MoveNextEntry()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   376
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   377
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   378
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   379
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   380
	TInt error=KErrGeneral;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   381
	while (error!=KErrNone && iNextEntry)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   382
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   383
		iMove->Reset();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   384
		error=KErrNone;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   385
		TRAP(error, iMove->StartL(iOrigEntries->At(--iNextEntry), iTarget, iStatus));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   386
		if (error)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   387
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   388
			iProgress().iNumberRemaining--;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   389
			iProgress().iNumberFailed++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   390
			iProgress().iError=error;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   391
			iOrigEntries->Delete(iNextEntry);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   392
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   393
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   394
	if (error==KErrNone)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   395
		SetActive();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   396
	return error;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   397
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   398
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   399
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   400
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   401
//**********************************
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   402
// CMsvLocalDeleteOperation
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   403
//**********************************
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   404
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   405
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   406
CMsvLocalDeleteOperation::CMsvLocalDeleteOperation(const RMessage2& aMessage, TMsvOp aId, CMsvEntrySelection* aSelection, CMsvServer& aMsvServer)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   407
: CMsvLocalOperation(aMessage, aId, aMsvServer), iSelection(aSelection)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   408
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   409
	__DECLARE_NAME(_S("CMsvLocalDeleteOperation"));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   410
	// set up the progress
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   411
	iProgress().iType = TMsvLocalOperationProgress::ELocalDelete;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   412
	iProgress().iTotalNumberOfEntries = iSelection->Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   413
	iProgress().iNumberRemaining = iProgress().iTotalNumberOfEntries;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   414
	CActiveScheduler::Add(this);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   415
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   416
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   417
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   418
CMsvLocalDeleteOperation::~CMsvLocalDeleteOperation()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   419
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   420
	Cancel();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   421
	delete iSelection;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   422
	delete iDeletedEntries;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   423
	delete iMovedEntries;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   424
	delete iDelete;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   425
	delete iWorkSelection1;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   426
	delete iWorkSelection2;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   427
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   428
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   429
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   430
void CMsvLocalDeleteOperation::DoCancel()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   431
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   432
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   433
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   434
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   435
	iDelete->Cancel();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   436
	iProgress().iError = KErrCancel;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   437
	Completed();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   438
	// if the last entry was removed, update the notification selections
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   439
	TRAP_IGNORE(PartialCompletionNotificationL());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   440
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   441
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   442
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   443
void CMsvLocalDeleteOperation::PartialCompletionNotificationL()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   444
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   445
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   446
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   447
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   448
	TMsvId id=iSelection->At(iIndex-1);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   449
	TBool entryExists = EFalse;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   450
	entryExists = iMsvServer.IndexAdapter().EntryExists(id);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   451
	if (!entryExists)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   452
		id = iParent;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   453
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   454
	if (iWorkSelection1->Count())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   455
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   456
		iDeletedEntries->Reset();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   457
		iDeletedEntries->AppendL(iWorkSelection1->Back(0), iWorkSelection1->Count());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   458
		iMsvServer.NotifyChanged(EMsvEntriesDeleted, *iDeletedEntries, id);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   459
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   460
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   461
	if (iWorkSelection2->Count())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   462
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   463
		iDeletedEntries->Reset();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   464
		iMovedEntries->AppendL(iWorkSelection2->Back(0), iWorkSelection2->Count());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   465
		iMsvServer.NotifyChanged(EMsvEntriesMoved, *iMovedEntries, KMsvDeletedEntryFolderEntryId, id);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   466
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   467
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   468
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   469
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   470
void CMsvLocalDeleteOperation::RunL()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   471
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   472
// Attempts the next delete
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   473
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   474
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   475
	TRAPD(leave, DoRunL());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   476
	if (leave)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   477
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   478
		// probably OOM so complete the operation
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   479
		iProgress().iError = leave;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   480
		Completed();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   481
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   482
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   483
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   484
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   485
void CMsvLocalDeleteOperation::DoRunL()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   486
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   487
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   488
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   489
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   490
	// record the result of the last delete
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   491
	iProgress().iNumberRemaining--;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   492
	if (iStatus.Int()==KErrNone)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   493
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   494
		iProgress().iNumberCompleted++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   495
		iDeletedEntries->AppendL(iWorkSelection1->Back(0), iWorkSelection1->Count());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   496
		iMovedEntries->AppendL(iWorkSelection2->Back(0), iWorkSelection2->Count());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   497
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   498
	else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   499
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   500
		iProgress().iNumberFailed++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   501
		if (iProgress().iError==KErrNone)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   502
			iProgress().iError = iStatus.Int();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   503
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   504
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   505
	// start thje next delete or complete the operation
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   506
	if (iProgress().iNumberRemaining)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   507
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   508
		iWorkSelection1->Reset();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   509
		iWorkSelection2->Reset();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   510
		iDelete->StartL(iSelection->At(iIndex++), *iWorkSelection1, *iWorkSelection2, iStatus);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   511
		SetActive();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   512
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   513
	else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   514
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   515
		__ASSERT_DEBUG(iIndex==iSelection->Count(), PanicServer(EMsvLocalDeletionMisCount));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   516
		Completed();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   517
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   518
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   519
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   520
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   521
void CMsvLocalDeleteOperation::Completed()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   522
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   523
// The operation has completed
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   524
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   525
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   526
/**
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   527
Added code to commit transaction for bulk deletion.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   528
*/
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   529
	TRAP_IGNORE(iMsvServer.IndexAdapter().GetDbAdapter()->CommitTransactionL());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   530
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   531
	// notify server of any deletions or moves to the deleted folder
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   532
	if (iDeletedEntries->Count())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   533
		iMsvServer.NotifyChanged(EMsvEntriesDeleted, *iDeletedEntries, iParent);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   534
	if (iMovedEntries->Count())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   535
		iMsvServer.NotifyChanged(EMsvEntriesMoved, *iMovedEntries, KMsvDeletedEntryFolderEntryId, iParent);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   536
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   537
	// complete the request
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   538
	SetState(EMsvOperationCompleted);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   539
	iMessage.Complete(KErrNone);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   540
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   541
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   542
void CMsvLocalDeleteOperation::StartL()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   543
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   544
	// reserve space so we don't manage to delete the entries but run
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   545
	// out of memory when trying to report the fact.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   546
	iDeletedEntries = new(ELeave)CMsvEntrySelection;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   547
	iDeletedEntries->SetReserveL(iSelection->Count());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   548
	iMovedEntries = new(ELeave)CMsvEntrySelection;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   549
	iMovedEntries->SetReserveL(iSelection->Count());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   550
	iWorkSelection1 = new(ELeave)CMsvEntrySelection;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   551
	iWorkSelection2 = new(ELeave)CMsvEntrySelection;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   552
	iDelete = CMsvDelete::NewL(iMsvServer);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   553
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   554
	// find the parent
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   555
	TInt count=iSelection->Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   556
	while (count--)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   557
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   558
		TMsvEntry* entry;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   559
		TInt error = KErrNone;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   560
		error = iMsvServer.IndexAdapter().GetEntry(iSelection->At(count),entry);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   561
		if (error)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   562
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   563
			iSelection->Delete(count);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   564
			iProgress().iNumberRemaining--;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   565
			iProgress().iNumberCompleted++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   566
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   567
		else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   568
			iParent = entry->Parent();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   569
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   570
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   571
	if (iSelection->Count())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   572
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   573
		// start deleting the first entry
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   574
		iDelete->StartL(iSelection->At(iIndex++), *iWorkSelection1, *iWorkSelection2, iStatus);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   575
		SetActive();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   576
		SetState(EMsvOperationRunning);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   577
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   578
	else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   579
		Completed();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   580
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   581
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   582
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   583
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   584
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   585
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   586
//**********************************
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   587
// CMsvLocalChangeOperation
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
CMsvLocalChangeOperation::CMsvLocalChangeOperation(const RMessage2& aMessage, TMsvOp aId, const TMsvEntry& aEntry, CMsvServer& aMsvServer)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   592
: CMsvLocalOperation(aMessage, aId, aMsvServer), iEntry(aEntry)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   593
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   594
	__DECLARE_NAME(_S("CMsvLocalChangeOperation"));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   595
	// set up the progress
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   596
	iProgress().iType = TMsvLocalOperationProgress::ELocalChanged;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   597
	iProgress().iTotalNumberOfEntries = 1;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   598
	iProgress().iId = iEntry.Id();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   599
	CActiveScheduler::Add(this);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   600
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   601
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   602
CMsvLocalChangeOperation::~CMsvLocalChangeOperation()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   603
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   604
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   605
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   606
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   607
	Cancel();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   608
	delete iDelete;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   609
	delete iWorkSelection1;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   610
	delete iWorkSelection2;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   611
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   612
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   613
void CMsvLocalChangeOperation::DoCancel()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   614
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   615
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   616
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   617
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   618
	__ASSERT_DEBUG(iDelete!=NULL, PanicServer(EMsvChangeEntryBadState));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   619
	iDelete->Cancel();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   620
	iProgress().iError = KErrCancel;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   621
	Completed();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   622
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   623
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   624
void CMsvLocalChangeOperation::RunL()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   625
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   626
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   627
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   628
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   629
	if (iStatus.Int()==KErrNone)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   630
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   631
		iProgress().iNumberCompleted++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   632
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   633
	else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   634
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   635
		iProgress().iNumberFailed++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   636
		iProgress().iError = iStatus.Int();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   637
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   638
	Completed();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   639
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   640
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   641
void CMsvLocalChangeOperation::StartL(TSecureId aOwnerId, TBool aForcedUpdate)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   642
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   643
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   644
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   645
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   646
	iId = iEntry.Id();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   647
	iParent = iEntry.Parent();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   648
	// check if this is actually a deletion
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   649
	if (iEntry.Deleted() && iEntry.PcSyncCount()==0)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   650
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   651
		iDelete = CMsvDelete::NewL(iMsvServer);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   652
		iWorkSelection1 = new(ELeave)CMsvEntrySelection;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   653
		iWorkSelection2 = new(ELeave)CMsvEntrySelection;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   654
		iDelete->StartL(iEntry.Id(), *iWorkSelection1, *iWorkSelection2, iStatus, ETrue);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   655
		SetActive();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   656
		return;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   657
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   658
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   659
	// otherwise just changing it
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   660
	TInt error = KErrNone;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   661
	error = iMsvServer.IndexAdapter().LockEntry(iId);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   662
	if (error==KErrNone)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   663
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   664
		error = iMsvServer.ChangeEntry(iEntry, aOwnerId, aForcedUpdate);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   665
		iMsvServer.IndexAdapter().ReleaseEntry(iId); // error ignored
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   666
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   667
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   668
	if (error==KErrNone)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   669
		iProgress().iNumberCompleted++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   670
	else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   671
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   672
		iProgress().iNumberFailed++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   673
		iProgress().iError = error;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   674
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   675
	Completed();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   676
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   677
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   678
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   679
void CMsvLocalChangeOperation::Completed()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   680
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   681
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   682
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   683
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   684
	if (iProgress().iError==KErrNone)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   685
		iMsvServer.NotifyChanged(iDelete==NULL ? EMsvEntriesChanged : EMsvEntriesDeleted, iId, iParent);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   686
	SetState(EMsvOperationCompleted);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   687
	iMessage.Complete(KErrNone);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   688
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   689
//**********************************
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   690
// CMsvLocalChangeEntriesOperation
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   691
//**********************************
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   692
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   693
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   694
CMsvLocalChangeEntriesOperation::CMsvLocalChangeEntriesOperation(const RMessage2& aMessage, TMsvOp aId, CMsvEntrySelection* aSelection, CMsvServer& aMsvServer, TInt aMark)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   695
: CMsvLocalOperation(aMessage, aId, aMsvServer), iSelection(aSelection), iMark(aMark)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   696
    {
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   697
    __DECLARE_NAME(_S("CMsvLocalChangeEntriesOperation"));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   698
    // set up the progress
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   699
    iProgress().iType = TMsvLocalOperationProgress::ELocalChanged;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   700
    iProgress().iTotalNumberOfEntries = iSelection->Count();;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   701
    iProgress().iNumberRemaining = iProgress().iTotalNumberOfEntries;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   702
    CActiveScheduler::Add(this);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   703
    }
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   704
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   705
CMsvLocalChangeEntriesOperation::~CMsvLocalChangeEntriesOperation()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   706
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   707
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   708
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   709
    {
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   710
    Cancel();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   711
    delete iSelection;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   712
    delete iDelete;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   713
    delete iWorkSelection1;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   714
    delete iWorkSelection2;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   715
    }
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   716
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   717
void CMsvLocalChangeEntriesOperation::DoCancel()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   718
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   719
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   720
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   721
    {
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   722
    __ASSERT_DEBUG(iDelete!=NULL, PanicServer(EMsvChangeEntryBadState));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   723
    iDelete->Cancel(); 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   724
    iProgress().iError = KErrCancel;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   725
    Completed();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   726
    }
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   727
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   728
void CMsvLocalChangeEntriesOperation::RunL()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   729
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   730
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   731
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   732
    {
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   733
    if (iStatus.Int()==KErrNone)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   734
        {
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   735
        iProgress().iNumberCompleted++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   736
        }
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   737
    else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   738
        {
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   739
        iProgress().iNumberFailed++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   740
        iProgress().iError = iStatus.Int();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   741
        }
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   742
    
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   743
    Completed();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   744
    }
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   745
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   746
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   747
void CMsvLocalChangeEntriesOperation::StartL(TSecureId aOwnerId, TBool aForcedUpdate)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   748
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   749
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   750
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   751
    {
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   752
    TMsvEntry* entry1;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   753
 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   754
    TInt count = iSelection->Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   755
    while (count--)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   756
        {
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   757
        iMsvServer.IndexAdapter().GetEntry(iSelection->At(count),entry1);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   758
        iId = entry1->Id();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   759
        iParent = entry1->Parent();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   760
        // check if this is actually a deletion
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   761
        if (entry1->Deleted() && entry1->PcSyncCount()==0)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   762
            {
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   763
             iDelete = CMsvDelete::NewL(iMsvServer);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   764
             iWorkSelection1 = new(ELeave)CMsvEntrySelection;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   765
             iWorkSelection2 = new(ELeave)CMsvEntrySelection;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   766
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   767
            iDelete->StartL(entry1->Id(), *iWorkSelection1, *iWorkSelection2, iStatus, ETrue);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   768
            SetActive();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   769
            return;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   770
            }
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   771
        }
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   772
  
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   773
    TInt error  = KErrNone;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   774
    TMsvEntry* entry;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   775
    count = iSelection->Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   776
    while (count--)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   777
        {
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   778
        error = iMsvServer.IndexAdapter().GetEntry(iSelection->At(count),entry);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   779
        if (error==KErrNone)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   780
            {
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   781
            error = iMsvServer.IndexAdapter().LockEntry(iSelection->At(count));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   782
            error = iMsvServer.ChangeEntry(*entry, aOwnerId, aForcedUpdate);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   783
            error = iMsvServer.IndexAdapter().ReleaseEntry(iSelection->At(count)); // error ignored
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   784
            }
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   785
         }
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   786
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   787
    if (error==KErrNone)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   788
        iProgress().iNumberCompleted++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   789
    else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   790
        {
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   791
        iProgress().iNumberFailed++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   792
        iProgress().iError = error;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   793
        }
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   794
    Completed();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   795
    }
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   796
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   797
void CMsvLocalChangeEntriesOperation::Completed()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   798
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   799
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   800
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   801
    {
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   802
    
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   803
    if (iProgress().iError==KErrNone)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   804
        iMsvServer.NotifyChanged(iDelete==NULL ? EMsvEntriesChanged : EMsvEntriesDeleted, iId, iParent);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   805
    SetState(EMsvOperationCompleted);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   806
    iMessage.Complete(KErrNone);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   807
     }
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
// CMsvLocalCreateOperation
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   812
//**********************************
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   813
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   814
CMsvLocalCreateOperation::CMsvLocalCreateOperation(const RMessage2& aMessage, TMsvOp aId, const TMsvEntry& aEntry, CMsvServer& aMsvServer)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   815
: CMsvLocalOperation(aMessage, aId, aMsvServer), iEntry(aEntry)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   816
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   817
	__DECLARE_NAME(_S("CMsvLocalCreateOperation"));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   818
	// set up the progress
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   819
	iProgress().iType = TMsvLocalOperationProgress::ELocalNew;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   820
	iProgress().iTotalNumberOfEntries = 1;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   821
	CActiveScheduler::Add(this);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   822
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   823
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   824
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   825
CMsvLocalCreateOperation::~CMsvLocalCreateOperation()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   826
	{}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   827
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   828
void CMsvLocalCreateOperation::DoCancel()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   829
	{}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   830
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   831
void CMsvLocalCreateOperation::RunL()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   832
	{}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   833
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   834
void CMsvLocalCreateOperation::Start(TSecureId aOwnerId)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   835
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   836
	TMsvEntry entry = iEntry;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   837
	TInt error = iMsvServer.AddEntry(entry, aOwnerId, ETrue);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   838
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   839
	if (error)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   840
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   841
		iProgress().iNumberFailed++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   842
		iProgress().iError = error;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   843
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   844
	else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   845
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   846
		iProgress().iNumberCompleted++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   847
		iProgress().iId = entry.Id();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   848
		iMsvServer.NotifyChanged(EMsvEntriesCreated, entry.Id(), entry.Parent());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   849
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   850
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   851
	SetState(EMsvOperationCompleted);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   852
	iMessage.Complete(KErrNone);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   853
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   854
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   855
//**********************************
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   856
// CMsvChangeDriveOperation
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   857
//**********************************
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   858
CMsvChangeDriveOperation::CMsvChangeDriveOperation(const RMessage2& aMessage, TMsvOp aId, TInt aDrive, CMsvServer& aServer)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   859
: CMsvServerOperation(aMessage, aId, KUidMsvLocalServiceMtm, KMsvLocalServiceIndexEntryId, -1), iDrive(aDrive), iServer(aServer)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   860
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   861
	CActiveScheduler::Add(this);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   862
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   863
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   864
CMsvChangeDriveOperation::~CMsvChangeDriveOperation()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   865
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   866
	Cancel();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   867
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   868
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   869
const TDesC8& CMsvChangeDriveOperation::Progress()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   870
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   871
	if (iServer.NewContext())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   872
		iProgress() = iServer.NewContext()->Progress();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   873
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   874
	return iProgress;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   875
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   876
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   877
void CMsvChangeDriveOperation::DoCancel()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   878
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   879
	if (iServer.NewContext())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   880
		iServer.NewContext()->Cancel();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   881
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   882
	iProgress().iError = KErrCancel;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   883
	Completed();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   884
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   885
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   886
void CMsvChangeDriveOperation::RunL()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   887
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   888
	Completed();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   889
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   890
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   891
void CMsvChangeDriveOperation::Completed()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   892
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   893
	// Get progress
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   894
	if (iServer.NewContext())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   895
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   896
		iProgress() = iServer.NewContext()->Progress();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   897
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   898
		// If an error occurs we have to delete the new context
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   899
		iServer.DeleteNewContext();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   900
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   901
	else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   902
		iProgress() = iServer.Context().Progress();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   903
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   904
	SetState(EMsvOperationCompleted);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   905
	iMessage.Complete(KErrNone);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   906
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   907
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   908
TInt CMsvChangeDriveOperation::Start()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   909
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   910
	TInt error = iServer.ChangeDrive(iDrive, &iStatus);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   911
	if (!error)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   912
		SetActive();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   913
	return error;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   914
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   915