mmlibs/mmfw/src/Plugin/StdSourceAndSink/Mmffile.cpp
author hgs
Tue, 02 Nov 2010 12:28:51 +0000
changeset 6 fe9d1bf55678
parent 0 b8ed18f6c07b
permissions -rw-r--r--
2010wk46_02
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     1
// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     2
// All rights reserved.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     7
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     8
// Initial Contributors:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    10
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    11
// Contributors:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    12
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    13
// Description:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    14
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    15
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    16
#include <f32file.h>
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    17
#include <e32std.h>
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    18
#include <mmf/server/mmfdatabuffer.h>
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    19
#include <mmf/common/mmfutilities.h>
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    20
#include <mmf/common/mmfcontroller.h>
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    21
#include <mmf/common/mmfpaniccodes.h>
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    22
#include <mmf/server/mmffile.h>
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    23
#include "MmffilePriv.h"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    24
#include "FileAccess.h"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    25
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    26
void Panic(TMMFFilePanicCode aPanicCode)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    27
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    28
	_LIT(KMMFFilePanicCategory, "MMFFile");
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    29
	User::Panic(KMMFFilePanicCategory, aPanicCode);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    30
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    31
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    32
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    33
 * Constructs a CTransferBufferCopy
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    34
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    35
 * @return CTransferBufferCopy*
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    36
 */
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    37
CTransferBufferCopy* CTransferBufferCopy::NewL(TInt aMaxLength)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    38
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    39
	CTransferBufferCopy* self = new (ELeave) CTransferBufferCopy(aMaxLength);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    40
	CleanupStack::PushL(self);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    41
	self->ConstructL();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    42
	CleanupStack::Pop(self);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    43
	return self;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    44
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    45
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    46
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    47
 * Second phase constructor for CTransferBufferCopy
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    48
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    49
 * @return void
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    50
 */
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    51
void CTransferBufferCopy::ConstructL()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    52
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    53
	iBuffer = static_cast<TUint8*>(User::AllocL(iMaxLength));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    54
	iBufferDes.Set(iBuffer,0,iMaxLength);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    55
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    56
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    57
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    58
Destructor.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    59
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    60
CMMFFile::~CMMFFile() 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    61
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    62
	delete iFile;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    63
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    64
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    65
	iHandle.Close();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    66
	iFsSession.Close();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    67
	delete iFileName;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    68
	delete iFileExt;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    69
	delete iFilePath;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    70
	delete iFileDrive;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    71
	delete iMmfFileEventHandler;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    72
	delete iCAFParameters;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    73
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    74
	// Get rid of everything in RArray's & close them.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    75
	iRequests.ResetAndDestroy();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    76
	iTransferBufferCopies.ResetAndDestroy();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    77
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    78
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    79
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    80
Protected constructor.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    81
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    82
The default implementation is empty.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    83
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    84
CMMFFile::CMMFFile() : CMMFClip( KUidMmfFileSource, KUidMmfFileSink ), iFileSize(-1)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    85
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    86
	iSinkNotStopped = EFalse;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    87
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    88
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    89
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    90
Constructs an CMMFFile MDataSource.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    91
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    92
@return A pointer to the new CMMFFile data source.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    93
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    94
MDataSource* CMMFFile::NewSourceL() 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    95
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    96
	CMMFFile* self = new (ELeave) CMMFFile ;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    97
	return STATIC_CAST( MDataSource*, self ) ;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    98
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    99
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   100
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   101
Constructs a CMMFFile MDataSink
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   102
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   103
@return A pointer to the new CMMFFile data sink.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   104
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   105
MDataSink* CMMFFile::NewSinkL()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   106
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   107
	CMMFFile* self = new (ELeave) CMMFFile ;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   108
	return STATIC_CAST( MDataSink*, self ) ;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   109
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   110
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   111
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   112
Perform source construction dependant on the source construction
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   113
initialisation data aInitData.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   114
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   115
@param  aInitData
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   116
        The TPckg<TMMFFileParams> descriptor package containing the file name and full path.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   117
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   118
void CMMFFile::ConstructSourceL(const TDesC8& aInitData ) 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   119
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   120
	ConstructL(aInitData, ESourceMode);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   121
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   122
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   123
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   124
Performs sink construction dependant on the sink construction
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   125
initialisation data aInitData.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   126
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   127
@param  aInitData
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   128
        The TPckg<TMMFFileParams> descriptor package containing the file name and full path.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   129
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   130
void CMMFFile::ConstructSinkL(const TDesC8& aInitData)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   131
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   132
	ConstructL(aInitData, ESinkMode);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   133
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   134
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   135
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   136
Protected constructor.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   137
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   138
Extracts the initialisation data provided by the calling functions: ConstructSourceL() and 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   139
ConstructSinkL(). Creates a file server session and sets up file name. If there is a file name and 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   140
it cannot be found this function leaves. If there is no file name the function leaves. Does not 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   141
attempt to open the file or check whether the file exists.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   142
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   143
If aInitData contains a TMMFFileHandleParams instead of TMMFFileParams, the source/sink is constructed from 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   144
the file handle provided by the caller
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   145
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   146
@param  aInitData
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   147
        Initialisation data packaged in a TMMFFileParams or in a TMMFFileHandleParams (File Handle)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   148
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   149
void CMMFFile::ConstructL(const TDesC8& aInitData,TMMFileMode aFileMode)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   150
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   151
	User::LeaveIfError(iFsSession.Connect());
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   152
#ifdef __IPC_V2_PRESENT__
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   153
	// on IPCv2 we auto attach
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   154
	User::LeaveIfError(iFsSession.ShareAuto());
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   155
#else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   156
	// on IPCv1 we use explicit - more efficient
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   157
	User::LeaveIfError(iFsSession.Share(RSessionBase::EExplicitAttach));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   158
#endif
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   159
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   160
	User::LeaveIfError(iFsSession.ShareProtected());
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   161
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   162
	HBufC* filename = NULL; 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   163
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   164
	iCAFParameters = new (ELeave) CCAFParameters;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   165
	TBool drmContent = EFalse;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   166
	RDesReadStream stream(aInitData);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   167
	CleanupClosePushL(stream);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   168
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   169
	TUid initUid = TUid::Uid(stream.ReadInt32L());
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   170
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   171
	if (initUid == KMMFileHandleSourceUid)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   172
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   173
		TPckgBuf<RFile*> fileptr;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   174
		stream.ReadL(fileptr);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   175
		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   176
		iHandle.Duplicate(*fileptr());
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   177
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   178
		TInt length = stream.ReadInt32L();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   179
		if (length>0)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   180
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   181
			iCAFParameters->iUniqueId = HBufC::NewL(length);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   182
			TPtr16 ptr = iCAFParameters->iUniqueId->Des();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   183
			stream.ReadL(ptr, length);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   184
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   185
		iFileHandle = ETrue;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   186
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   187
		filename = HBufC::NewMaxLC(KMaxFileName);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   188
		TPtr ptr = filename->Des();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   189
		User::LeaveIfError(iHandle.FullName(ptr));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   190
		drmContent = ETrue;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   191
		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   192
		iCAFParameters->iEnableUI = stream.ReadInt32L();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   193
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   194
		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   195
	else if (initUid == KMMFileSourceUid)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   196
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   197
		TInt length = stream.ReadInt32L();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   198
		filename = HBufC::NewMaxLC(length);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   199
		TPtr ptr = filename->Des();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   200
		stream.ReadL(ptr, length);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   201
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   202
		length = stream.ReadInt32L();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   203
		if (length>0)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   204
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   205
			iCAFParameters->iUniqueId = HBufC::NewMaxL(length);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   206
			ptr.Set(iCAFParameters->iUniqueId->Des());
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   207
			stream.ReadL(ptr, length);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   208
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   209
		drmContent = ETrue;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   210
		iCAFParameters->iEnableUI = stream.ReadInt32L();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   211
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   212
	else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   213
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   214
//		XXX If the UID is unknown we should reject, but  currently
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   215
//		code also used for older calls that just supply filename.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   216
//		User::Leave(KErrNotSupported);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   217
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   218
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   219
	if ((filename == NULL) && aInitData.Length() == sizeof(TMMFFileHandleParams))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   220
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   221
		TMMFFileHandleParams params;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   222
		TPckgC<TMMFFileHandleParams> config(params);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   223
		config.Set(aInitData);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   224
		params = config();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   225
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   226
		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   227
		if (params.iUid == KFileHandleUid)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   228
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   229
			User::LeaveIfError(iHandle.Duplicate(*params.iFile));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   230
			TInt pos = 0;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   231
			// make sure the duplicate handle is at the start of the file - the usage of the file handle really requires this
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   232
			User::LeaveIfError(iHandle.Seek(ESeekStart, pos));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   233
			iFileHandle = ETrue;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   234
			ASSERT(filename == NULL);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   235
			filename = HBufC::NewMaxLC(KMaxFileName);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   236
			TPtr ptr = filename->Des();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   237
			User::LeaveIfError(iHandle.FullName(ptr));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   238
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   239
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   240
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   241
	if (filename == NULL) // do old case as last resort
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   242
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   243
		TMMFFileParams params;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   244
		TPckgC<TMMFFileParams> config(params);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   245
		config.Set(aInitData);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   246
		params = config();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   247
		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   248
		filename = params.iPath.AllocLC();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   249
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   250
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   251
	ASSERT(filename != NULL);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   252
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   253
	TParse parser ;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   254
	User::LeaveIfError(parser.Set(*filename, NULL, NULL));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   255
	CleanupStack::PopAndDestroy(2, &stream); //filename, stream
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   256
	if ( !( parser.NamePresent() ) && !( parser.ExtPresent() ) )
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   257
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   258
		User::Leave( KErrBadName ) ;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   259
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   260
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   261
	iFullFileName.Copy( parser.FullName() ) ;	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   262
	iFileName = parser.Name().AllocL() ;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   263
	iFileExt = parser.Ext().AllocL() ;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   264
	iFilePath = parser.Path().AllocL() ;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   265
	iFileDrive = parser.Drive().AllocL() ;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   266
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   267
	// in order to simulate old behaviour we are not passing error out
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   268
	// but will try to create Content again during PrimeL()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   269
	if (drmContent && aFileMode==ESourceMode)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   270
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   271
		TInt contentError;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   272
		if (iFileHandle)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   273
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   274
			TRAP(contentError, 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   275
				iFile = CContentFile::NewL(iHandle, UniqueId(), iCAFParameters->iEnableUI);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   276
				);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   277
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   278
		else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   279
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   280
			// Open for read-only access
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   281
			TRAP(contentError,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   282
				iFile = CContentFile::NewL(iFsSession, iFullFileName, UniqueId(), EFileShareReadersOnly, iCAFParameters->iEnableUI);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   283
			);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   284
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   285
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   286
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   287
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   288
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   289
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   290
@deprecated - Replaced by CMMFFile::Data()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   291
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   292
Returns an RFile handle to the current file.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   293
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   294
If there is no current file, one is created. If the file exists then it is opened with read access 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   295
if it is read only, write access otherwise. If the file does not exist then it is opened with
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   296
write access.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   297
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   298
@leave KErrNotReady
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   299
       The file is not open.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   300
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   301
@return A handle to the current file.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   302
@see CMMFFile::Data()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   303
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   304
RFile& CMMFFile::FileL()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   305
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   306
	if (!iFile)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   307
		User::Leave(KErrNotReady);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   308
	if (iFileHandle)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   309
		return iHandle;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   310
	else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   311
		return iFile->FileL();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   312
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   313
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   314
/** 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   315
Returns the file name of the current file.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   316
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   317
Note: This will give the wrong answer if the file is renamed!
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   318
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   319
@return The FileName (without extension).
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   320
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   321
const TDesC& CMMFFile::FileName() const
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   322
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   323
	return *iFileName ;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   324
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   325
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   326
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   327
Returns the extension of the current file.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   328
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   329
Note: This will give the wrong answer if the file is renamed!
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   330
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   331
@return The File Extension.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   332
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   333
const TDesC& CMMFFile::Extension() const 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   334
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   335
	return *iFileExt ;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   336
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   337
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   338
/** 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   339
Returns the path of the current file.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   340
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   341
Note: This will give the wrong answer if the file is renamed!
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   342
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   343
@return The FilePath (without filename and extension)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   344
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   345
const TDesC& CMMFFile::FilePath() const 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   346
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   347
	return *iFilePath ;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   348
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   349
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   350
/** 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   351
Returns the drive on which the current file is located.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   352
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   353
Note: This will give the wrong answer if the file is renamed!
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   354
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   355
@return The FileDrive (drive letter only, without path, filename and extension).
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   356
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   357
const TDesC& CMMFFile::FileDrive() const 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   358
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   359
	return *iFileDrive ;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   360
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   361
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   362
/** 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   363
Returns the full name of the current file.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   364
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   365
Note: This will give the wrong answer if the file is renamed!
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   366
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   367
@return The file name (full filename including drive letter, without path, filename and extension).
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   368
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   369
const TFileName CMMFFile::FullName() const
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   370
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   371
	return iFullFileName;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   372
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   373
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   374
/** 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   375
Returns the uniqueID associated with this content. If no uniqueID has been provided, a null
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   376
descriptor will be provided
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   377
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   378
@return The UniqueID
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   379
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   380
const TDesC& CMMFFile::UniqueId() const
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   381
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   382
	if (iCAFParameters->iUniqueId)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   383
		return *(iCAFParameters->iUniqueId);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   384
	else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   385
		return KNullDesC;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   386
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   387
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   388
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   389
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   390
Deletes the file.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   391
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   392
Closes the currently open file, then deletes it. If the file source is accessing a file handle, 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   393
the file is truncated to 0 bytes instead.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   394
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   395
@return An error code indicating if the function call was successful. KErrNone on success, otherwise
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   396
        another of the system-wide error codes.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   397
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   398
TInt CMMFFile::Delete()				
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   399
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   400
	TInt result = KErrNone;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   401
	if (!iFileHandle)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   402
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   403
		delete iFile;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   404
		iFile = NULL;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   405
		iFileSize=-1;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   406
		iPosition=0;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   407
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   408
		result = iFsSession.Delete(iFullFileName);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   409
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   410
	else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   411
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   412
		iFileSize=-1;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   413
		iPosition=0;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   414
		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   415
		if (iFile)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   416
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   417
			result = iFile->SetSize(0);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   418
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   419
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   420
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   421
	return result;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   422
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   423
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   424
/** 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   425
Sets the file size.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   426
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   427
@param  aSize
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   428
        The size of the file.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   429
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   430
@return An error code indicating if the function call was successful. KErrNone on success, otherwise
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   431
        another of the system-wide error codes.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   432
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   433
TInt CMMFFile::SetSize(TInt aSize)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   434
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   435
	if ( !iFile )
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   436
		return KErrNotReady;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   437
	TInt err =  iFile->SetSize(aSize);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   438
	if(err == KErrNone)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   439
		iFileSize = aSize;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   440
	else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   441
		iFileSize = -1;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   442
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   443
	return err;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   444
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   445
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   446
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   447
Obtains a CTransferBufferCopy from iTransferBufferCopies that is
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   448
at least as big as that required.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   449
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   450
There is no need to put the pointer returned by this method onto the CleanupStack
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   451
as it will have already been placed into iTransferBufferCopies.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   452
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   453
@param  aMaxLength
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   454
        The size required.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   455
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   456
@return A pointer to a valid CTransferBufferCopy.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   457
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   458
CTransferBufferCopy* CMMFFile::ObtainCopyOfTransferBufferL(TInt aMaxLength)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   459
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   460
	//find a free transfer buffer copy of the right size
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   461
	TInt firstFree = -1;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   462
	CTransferBufferCopy* transBufCopyToUse = NULL;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   463
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   464
	for(TInt cnt=0; cnt < iTransferBufferCopies.Count(); cnt++)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   465
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   466
		if(!iTransferBufferCopies[cnt]->InUse())
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   467
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   468
			//record the first free entry, we may remove this
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   469
			//if entries in iTransferBufferCopies > KAcceptableTransferBufferCopiesSize
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   470
			if(firstFree == -1) 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   471
				firstFree = cnt;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   472
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   473
			if(iTransferBufferCopies[cnt]->MaxLength() >= aMaxLength)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   474
				{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   475
				transBufCopyToUse = iTransferBufferCopies[cnt];
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   476
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   477
				//Set the MaxLength. This will ensure that the copy acts the same as
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   478
				//the original Transfer buffer, eg. file server will throw KErrOverflow
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   479
				transBufCopyToUse->ReUse(aMaxLength);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   480
				break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   481
				}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   482
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   483
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   484
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   485
	//If we failed to find a suitable entry, we need to create a new one
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   486
	if(!transBufCopyToUse)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   487
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   488
		//Firstly, should we re-cycle an existing entry?
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   489
		//There must be entries in the array, a free entry must have been found,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   490
		//the size of the array must be beyond the water mark where we want to start
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   491
		//cycling free entries.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   492
		if((iTransferBufferCopies.Count() > 0) &&
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   493
			(firstFree != -1) &&
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   494
			(iTransferBufferCopies.Count() > KAcceptableTransferBufferCopiesSize))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   495
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   496
			delete iTransferBufferCopies[firstFree];
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   497
			iTransferBufferCopies.Remove(firstFree);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   498
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   499
			transBufCopyToUse = CTransferBufferCopy::NewL(aMaxLength);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   500
			CleanupStack::PushL(transBufCopyToUse);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   501
			User::LeaveIfError(iTransferBufferCopies.Insert(transBufCopyToUse,firstFree));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   502
				
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   503
			CleanupStack::Pop();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   504
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   505
		else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   506
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   507
#ifdef _DEBUG
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   508
			if(iTransferBufferCopies.Count() > KMaximumTransferBufferCopiesSize)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   509
				{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   510
				User::Panic(_L("iTransferBufferCopies grew too large in CMMFFile"),KErrTooBig);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   511
				}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   512
#endif
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   513
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   514
			transBufCopyToUse = CTransferBufferCopy::NewL(aMaxLength);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   515
			CleanupStack::PushL(transBufCopyToUse);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   516
			User::LeaveIfError(iTransferBufferCopies.Append(transBufCopyToUse));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   517
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   518
			CleanupStack::Pop();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   519
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   520
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   521
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   522
	return transBufCopyToUse;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   523
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   524
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   525
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   526
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   527
/** 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   528
Loads aBuffer from iFile.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   529
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   530
The file must already be open for reading. File read is asynchronous. CReadRequest is created to 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   531
respond to completion.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   532
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   533
@param  aBuffer
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   534
        The buffer to be filled from the file.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   535
@param  aConsumer
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   536
        The data sink consumer of the buffer.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   537
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   538
void CMMFFile::FillBufferL( CMMFBuffer* aBuffer, MDataSink* aConsumer, TMediaId /*aMediaId*/ )
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   539
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   540
	// Requires that iFile is open for read.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   541
	// Reads data from iFile into aBuffer
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   542
	if ((aConsumer == NULL) || (aBuffer == NULL))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   543
		User::Leave(KErrArgument);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   544
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   545
	if (!iFile || (iMmfFileEventHandler == NULL))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   546
		User::Leave(KErrNotReady);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   547
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   548
	if (CMMFBuffer::IsSupportedDataBuffer(aBuffer->Type()))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   549
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   550
		CTransferBufferCopy* transBufCopy = NULL;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   551
		CReadRequest* request = NULL;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   552
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   553
		TDes8& aBufferDes = STATIC_CAST( CMMFDataBuffer*, aBuffer )->Data();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   554
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   555
		TInt requestSize;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   556
		if(aBuffer->RequestSize())
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   557
			requestSize = aBuffer->RequestSize();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   558
		else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   559
			requestSize = aBufferDes.MaxLength();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   560
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   561
		//check whether buffer is safe to send to file server
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   562
		//if not, eg for a transfer buffer, then it needs to be copied
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   563
		if (!CMMFBuffer::IsFileServerSafe(aBuffer->Type()))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   564
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   565
			//NB: failure in this method will NOT cause transBufCopy to leak as it will be 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   566
			//inserted into iTransferBufferCopies by ObtainCopyOfTransferBufferL.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   567
			transBufCopy = ObtainCopyOfTransferBufferL(aBufferDes.MaxLength());
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   568
			request = new(ELeave) CReadRequest(STATIC_CAST(TAny*, aConsumer), aBuffer, transBufCopy, iPosition, Size(), iMmfFileEventHandler);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   569
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   570
		else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   571
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   572
			request = new(ELeave) CReadRequest(STATIC_CAST(TAny*, aConsumer), aBuffer, iPosition, Size(), iMmfFileEventHandler);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   573
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   574
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   575
		CleanupStack::PushL( request );
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   576
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   577
		StoreRequestL(request); // transfers ownership
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   578
		CleanupStack::Pop() ; // request
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   579
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   580
		iFile->Read(request->BufferDes(), requestSize, request->iStatus);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   581
		iPosition += requestSize;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   582
		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   583
		if (iPosition >= iFileSize)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   584
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   585
			aBuffer->SetLastBuffer(ETrue);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   586
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   587
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   588
		request->SetActive();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   589
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   590
	else // if (CMMFBuffer::IsSupportedDataBuffer(aBuffer->Type()))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   591
		User::Leave( KErrNotSupported ) ;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   592
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   593
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   594
/** 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   595
Empties aBuffer into iFile. The file must be already open for writing.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   596
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   597
@param  aBuffer
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   598
        The buffer to be written to the file.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   599
@param  aSupplier
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   600
        The data source supplier of the buffer.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   601
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   602
void CMMFFile::EmptyBufferL( CMMFBuffer* aBuffer, MDataSource* aSupplier, TMediaId /*aMediaId*/ )
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   603
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   604
	// Requires that iFile is open for write.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   605
	// Writes data from iFile into aBuffer
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   606
	if ((aSupplier == NULL) || (aBuffer == NULL))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   607
		User::Leave(KErrArgument);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   608
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   609
	if (!iFile || (iMmfFileEventHandler == NULL))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   610
		User::Leave(KErrNotReady);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   611
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   612
	CTransferBufferCopy* transBufCopy = NULL;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   613
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   614
	if (CMMFBuffer::IsSupportedDataBuffer(aBuffer->Type()))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   615
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   616
		CWriteRequest* request = NULL;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   617
		TDes8& aBufferDes = STATIC_CAST( CMMFDataBuffer*, aBuffer )->Data();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   618
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   619
		//check whether buffer is safe to send to file server
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   620
		//if not, eg for a transfer buffer, then it needs to be copied
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   621
		if (!CMMFBuffer::IsFileServerSafe(aBuffer->Type()))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   622
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   623
			//Obtain a normal buffer to send to the file server
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   624
			//NB: failure in this method will NOT cause transBufCopy to leak as it will be 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   625
			//inserted into iTransferBufferCopies by ObtainCopyOfTransferBufferL.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   626
			transBufCopy = ObtainCopyOfTransferBufferL(aBufferDes.MaxLength());
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   627
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   628
			//Copy the data into the buffer we will send to the file server
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   629
			transBufCopy->Des().Copy(aBufferDes);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   630
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   631
			request = new(ELeave) CWriteRequest(STATIC_CAST(TAny*, aSupplier), aBuffer, transBufCopy, iMmfFileEventHandler);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   632
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   633
		else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   634
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   635
			request = new(ELeave) CWriteRequest(STATIC_CAST(TAny*, aSupplier), aBuffer, iMmfFileEventHandler);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   636
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   637
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   638
		CleanupStack::PushL( request );
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   639
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   640
		StoreRequestL(request);  // transfers ownership
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   641
		CleanupStack::Pop(); // request
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   642
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   643
		iFile->Write(request->BufferDes(), request->BufferDes().Length(), request->iStatus);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   644
		request->SetActive();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   645
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   646
	else  // if (CMMFBuffer::IsSupportedDataBuffer(aBuffer->Type()))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   647
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   648
		User::Leave( KErrNotSupported ) ;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   649
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   650
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   651
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   652
/** 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   653
Loads aLength number of bytes into aBuffer from specified point in iFile.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   654
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   655
@param  aLength
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   656
        The number of bytes to be read into buffer.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   657
@param  aBuffer
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   658
        The buffer to be filled from the file.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   659
@param  aPosition
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   660
        The offset into the file at which to start reading.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   661
@param  aConsumer
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   662
        The data sink consumer of the buffer.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   663
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   664
void CMMFFile::ReadBufferL(TInt aLength, CMMFBuffer* aBuffer, TInt aPosition, MDataSink* aConsumer)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   665
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   666
	// Requires that iFile is open for read.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   667
	// Reads data from iFile into aBuffer
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   668
	if ((aLength < 0) || (aPosition<0) || (aConsumer == NULL) || (aBuffer == NULL))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   669
		User::Leave(KErrArgument);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   670
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   671
	if (!iFile || (iMmfFileEventHandler == NULL))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   672
		User::Leave(KErrNotReady);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   673
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   674
	CTransferBufferCopy* transBufCopy = NULL;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   675
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   676
	if (CMMFBuffer::IsSupportedDataBuffer(aBuffer->Type()))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   677
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   678
		CReadRequest* request = NULL;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   679
		TDes8& aBufferDes = STATIC_CAST( CMMFDataBuffer*, aBuffer )->Data();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   680
		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   681
		//check whether buffer is safe to send to file server
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   682
		//if not, eg for a transfer buffer, then it needs to be copied
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   683
		if (!CMMFBuffer::IsFileServerSafe(aBuffer->Type()))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   684
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   685
			//Obtain a normal buffer to send to the file server
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   686
			//NB: failure in this method will NOT cause transBufCopy to leak as it will be 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   687
			//inserted into iTransferBufferCopies by ObtainCopyOfTransferBufferL.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   688
			transBufCopy = ObtainCopyOfTransferBufferL(aBufferDes.MaxLength());
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   689
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   690
			request = new(ELeave) CReadRequest(STATIC_CAST(TAny*, aConsumer), aBuffer, transBufCopy, aPosition, Size(), iMmfFileEventHandler);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   691
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   692
		else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   693
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   694
			request = new(ELeave) CReadRequest(STATIC_CAST(TAny*, aConsumer), aBuffer, aPosition, Size(), iMmfFileEventHandler);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   695
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   696
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   697
		CleanupStack::PushL( request );
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   698
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   699
		StoreRequestL(request) ;  //transfers ownership
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   700
		CleanupStack::Pop() ; //request
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   701
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   702
		TInt err = iFile->Read(aPosition, request->BufferDes(), aLength, request->iStatus);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   703
		if (err == KErrCANotSupported)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   704
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   705
			err = KErrNone;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   706
			if (aPosition != iPosition)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   707
				{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   708
				err = iFile->Seek(ESeekStart, aPosition);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   709
				}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   710
			if (err==KErrNone)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   711
				{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   712
				iFile->Read(request->BufferDes(), aLength, request->iStatus);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   713
				}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   714
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   715
		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   716
		if (err != KErrNone)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   717
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   718
			TRequestStatus* status = &request->iStatus;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   719
			User::RequestComplete(status, err);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   720
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   721
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   722
		iPosition = aPosition + aLength;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   723
		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   724
		if (iPosition >= iFileSize)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   725
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   726
			aBuffer->SetLastBuffer(ETrue);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   727
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   728
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   729
		request->SetActive();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   730
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   731
	else // if (CMMFBuffer::IsSupportedDataBuffer(aBuffer->Type()))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   732
		User::Leave( KErrNotSupported ) ;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   733
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   734
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   735
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   736
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   737
Loads aBuffer from specified point in iFile.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   738
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   739
The file must already be open for reading.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   740
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   741
@param  aBuffer
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   742
        The buffer to be filled from the file.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   743
@param  aPosition
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   744
        The offset into file at which to start reading.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   745
@param  aConsumer
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   746
        The data sink consumer of the buffer.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   747
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   748
void CMMFFile::ReadBufferL(CMMFBuffer* aBuffer, TInt aPosition, MDataSink* aConsumer)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   749
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   750
	// Requires that iFile is open for read.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   751
	// Reads data from iFile into aBuffer
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   752
	if ((aPosition<0) || (aConsumer == NULL) || (aBuffer == NULL))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   753
		User::Leave(KErrArgument);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   754
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   755
	if (CMMFBuffer::IsSupportedDataBuffer(aBuffer->Type()))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   756
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   757
		TInt requestSize;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   758
		if(aBuffer->RequestSize())
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   759
			requestSize = aBuffer->RequestSize();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   760
		else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   761
			requestSize = STATIC_CAST( CMMFDataBuffer*, aBuffer )->Data().MaxLength();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   762
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   763
		ReadBufferL(requestSize, aBuffer, aPosition, aConsumer);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   764
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   765
	else // if (CMMFBuffer::IsSupportedDataBuffer(aBuffer->Type()))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   766
		User::Leave(KErrNotSupported);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   767
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   768
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   769
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   770
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   771
Loads aBuffer from specified point in iFile.  Note that this is a synchronous read.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   772
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   773
@param  aBuffer
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   774
        The buffer to be filled from the file.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   775
@param  aPosition
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   776
        The offset into file at which to start reading.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   777
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   778
void CMMFFile::ReadBufferL( CMMFBuffer* aBuffer, TInt aPosition)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   779
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   780
	// Requires that iFile is open for read.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   781
	// Reads data from iFile into aBuffer
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   782
	if ((aPosition<0) || (aBuffer == NULL))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   783
		User::Leave(KErrArgument);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   784
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   785
	if (!iFile)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   786
		User::Leave(KErrNotReady);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   787
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   788
	if (CMMFBuffer::IsSupportedDataBuffer(aBuffer->Type()))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   789
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   790
		TDes8& aBufferDes = STATIC_CAST( CMMFDataBuffer*, aBuffer )->Data();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   791
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   792
		TInt requestSize;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   793
		if(aBuffer->RequestSize())
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   794
			requestSize = aBuffer->RequestSize();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   795
		else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   796
			requestSize = aBufferDes.MaxLength();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   797
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   798
		//check whether buffer is safe to send to file server
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   799
		//if not, eg for a transfer buffer, then it needs to be copied
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   800
		if (!CMMFBuffer::IsFileServerSafe(aBuffer->Type()))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   801
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   802
			//NB: failure in this method will NOT cause transBufCopy to leak as it will be 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   803
			//inserted into iTransferBufferCopies by ObtainCopyOfTransferBufferL.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   804
			CTransferBufferCopy* transBufCopy = ObtainCopyOfTransferBufferL(aBufferDes.MaxLength());
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   805
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   806
			User::LeaveIfError(iFile->Seek(ESeekStart, aPosition));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   807
			User::LeaveIfError(iFile->Read(transBufCopy->Des(), requestSize));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   808
			aBufferDes.Copy(transBufCopy->Des().Left(aBufferDes.MaxLength()));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   809
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   810
		else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   811
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   812
			User::LeaveIfError(iFile->Seek(ESeekStart, aPosition));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   813
			User::LeaveIfError(iFile->Read(aBufferDes, requestSize));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   814
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   815
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   816
		iPosition = aPosition + aBufferDes.Length();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   817
		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   818
		//check if the buffer is the last buffer and if so set the last buffer flag on the CMMFDataBuffer
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   819
		//NB: setting last buffer is the done by the formatter, but this is a hang over to account for 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   820
		//existing formatters that may fail if this is removed.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   821
		if (iPosition >= Size())
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   822
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   823
			aBuffer->SetLastBuffer(ETrue);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   824
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   825
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   826
	else  // if (CMMFBuffer::IsSupportedDataBuffer(aBuffer->Type()))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   827
		User::Leave(KErrNotSupported); 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   828
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   829
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   830
/** 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   831
Empties aLength bytes from aBuffer into iFile at specified location.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   832
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   833
@param  aLength
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   834
        The number of bytes to be emptied from buffer.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   835
@param  aBuffer
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   836
        The data buffer containing bytes to be written.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   837
@param  aPosition
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   838
        The offset into file at which to start writing.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   839
@param  aSupplier
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   840
        The data source to be notified when the write has been completed.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   841
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   842
@leave  KErrNotReady 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   843
        SinkPrimeL() and SinkThreadLogon() have not been called.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   844
@leave  KErrArgument 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   845
        aLength<0 or aPosition<0 or aSupplier is NULL.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   846
@leave  KErrNotSupported 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   847
        aBuffer is not a supported CMMFDataBuffer
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   848
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   849
void CMMFFile::WriteBufferL(TInt aLength, CMMFBuffer* aBuffer, TInt aPosition, MDataSource* aSupplier)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   850
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   851
	if ((aLength<0) || (aPosition<0) || (aSupplier == NULL) || (aBuffer == NULL))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   852
		User::Leave(KErrArgument);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   853
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   854
	if (!iFile || (iMmfFileEventHandler == NULL))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   855
		User::Leave(KErrNotReady);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   856
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   857
	if (CMMFBuffer::IsSupportedDataBuffer(aBuffer->Type()))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   858
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   859
		CWriteRequest* request = NULL;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   860
		TDes8& aBufferDes = STATIC_CAST( CMMFDataBuffer*, aBuffer )->Data();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   861
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   862
		//check whether buffer is safe to send to file server
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   863
		//if not, eg for a transfer buffer, then it needs to be copied
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   864
		if (!CMMFBuffer::IsFileServerSafe(aBuffer->Type()))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   865
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   866
			//NB: failure in this method will NOT cause transBufCopy to leak as it will be 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   867
			//inserted into iTransferBufferCopies by ObtainCopyOfTransferBufferL.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   868
			CTransferBufferCopy* transBufCopy = ObtainCopyOfTransferBufferL(aBufferDes.MaxLength());
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   869
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   870
			transBufCopy->Des().Copy(aBufferDes);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   871
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   872
			request = new(ELeave) CWriteRequest(STATIC_CAST(TAny*, aSupplier), aBuffer, transBufCopy, iMmfFileEventHandler);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   873
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   874
		else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   875
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   876
			request = new(ELeave) CWriteRequest(STATIC_CAST(TAny*, aSupplier), aBuffer, iMmfFileEventHandler);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   877
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   878
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   879
		CleanupStack::PushL( request );
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   880
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   881
		StoreRequestL(request);  // transfers ownership
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   882
		CleanupStack::Pop(); // request
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   883
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   884
		User::LeaveIfError(iFile->Seek(ESeekStart, aPosition));		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   885
		iFile->Write(request->BufferDes(), aLength, request->iStatus);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   886
		iFileSize = -1; //reset cached size
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   887
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   888
		request->SetActive();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   889
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   890
	else // if (!CMMFBuffer::IsFileServerSafe(aBuffer->Type()))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   891
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   892
		//write bitmap to file
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   893
		User::Leave(KErrNotSupported);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   894
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   895
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   896
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   897
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   898
Empties aBuffer into iFile at the specified location.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   899
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   900
@param  aBuffer
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   901
        The data buffer containing bytes to be written.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   902
@param  aPosition
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   903
        The offset into file at which to start writing.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   904
@param  aSupplier
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   905
        The data source to be notified when the write has been completed.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   906
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   907
@leave  KErrNotReady 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   908
        SinkPrimeL() and SinkThreadLogon() have not been called.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   909
@leave  KErrArgument 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   910
        aSupplier is NULL.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   911
@leave  KErrNotSupported 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   912
        The aBuffer is not of type KMMFDataBuffer.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   913
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   914
void CMMFFile::WriteBufferL( CMMFBuffer* aBuffer, TInt aPosition, MDataSource* aSupplier)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   915
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   916
	// Requires that iFile is open for write.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   917
	// Writes data from iFile into aBuffer
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   918
	if ((aPosition<0) || (aSupplier == NULL) || (aBuffer == NULL))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   919
		User::Leave(KErrArgument);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   920
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   921
	if (CMMFBuffer::IsSupportedDataBuffer(aBuffer->Type()))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   922
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   923
		TUint requestSize = STATIC_CAST( CMMFDataBuffer*, aBuffer )->Data().Length();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   924
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   925
		WriteBufferL(requestSize, aBuffer, aPosition, aSupplier);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   926
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   927
	else  // if (CMMFBuffer::IsSupportedDataBuffer(aBuffer->Type()))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   928
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   929
		//write bitmap to file
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   930
		User::Leave( KErrNotSupported ) ;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   931
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   932
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   933
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   934
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   935
Empties aBuffer into iFile at specified location.  Note that this is a synchronous write.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   936
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   937
@param  aBuffer
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   938
        The data buffer containing bytes to be written.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   939
@param  aPosition
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   940
        The offset into file at which to start writing.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   941
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   942
@return The error code from RFile.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   943
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   944
void CMMFFile::WriteBufferL( CMMFBuffer* aBuffer, TInt aPosition ) 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   945
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   946
	if ((aPosition<0) || (aBuffer == NULL))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   947
		User::Leave(KErrArgument);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   948
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   949
	if (!iFile)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   950
		User::Leave(KErrNotReady);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   951
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   952
	TInt err(KErrNone) ;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   953
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   954
	//check whether buffer is safe to send to file server
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   955
	//if not, eg for a transfer buffer, then it needs to be copied
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   956
	if ((!CMMFBuffer::IsFileServerSafe(aBuffer->Type()))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   957
		&& (CMMFBuffer::IsSupportedDataBuffer(aBuffer->Type())))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   958
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   959
		TDes8& aBufferDes = STATIC_CAST( CMMFDataBuffer*, aBuffer )->Data();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   960
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   961
		//NB: failure in this method will NOT cause transBufCopy to leak as it will be 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   962
		//inserted into iTransferBufferCopies by ObtainCopyOfTransferBufferL.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   963
		CTransferBufferCopy* transBufCopy = ObtainCopyOfTransferBufferL(aBufferDes.MaxLength());
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   964
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   965
		transBufCopy->Des().Copy(aBufferDes);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   966
		err = iFile->Seek(ESeekStart, aPosition);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   967
		if (err==KErrNone)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   968
			err = iFile->Write(transBufCopy->Des(),transBufCopy->Des().Length()); 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   969
		iFileSize = -1; //reset cached size
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   970
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   971
	else if (CMMFBuffer::IsSupportedDataBuffer(aBuffer->Type()))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   972
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   973
		TDes8& aBufferDes = STATIC_CAST( CMMFDataBuffer*, aBuffer )->Data();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   974
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   975
		err = iFile->Seek(ESeekStart, aPosition);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   976
		if (err==KErrNone)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   977
			err = iFile->Write(aBufferDes, aBufferDes.Length()); 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   978
		iFileSize = -1; //reset cached size
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   979
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   980
	else // if (CMMFBuffer::IsSupportedDataBuffer(aBuffer->Type()))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   981
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   982
		User::Leave(KErrNotSupported);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   983
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   984
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   985
	User::LeaveIfError(err);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   986
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   987
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   988
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   989
Gets the number of free bytes in the device's file system.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   990
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   991
@return The number of free bytes.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   992
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   993
TInt64 CMMFFile::BytesFree()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   994
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   995
	TInt driveNumber = KDefaultDrive;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   996
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   997
	if (FileDrive().Length() > 0)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   998
 		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   999
 		TChar driveLetter = FileDrive()[0];
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1000
 		RFs::CharToDrive(driveLetter, driveNumber);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1001
 		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1002
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1003
	TVolumeInfo volInfo;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1004
	if (iFsSession.Volume(volInfo, driveNumber) == KErrNone)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1005
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1006
		return volInfo.iFree;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1007
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1008
	return TInt64(0);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1009
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1010
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1011
/** 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1012
Returns the size of the file in bytes.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1013
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1014
Note: This is not the maximum length.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1015
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1016
@return The size of the file in bytes.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1017
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1018
TInt CMMFFile::Size()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1019
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1020
	TInt size = 0;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1021
	TInt err = KErrNone;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1022
	TBool fileOpened = EFalse;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1023
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1024
	if(iFileSize != -1)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1025
		return iFileSize;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1026
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1027
	if (!iFile)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1028
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1029
		// Open the file. We only need read access, so SourcePrimeL will open the file with read flag
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1030
		TRAP(err, SourcePrimeL());
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1031
		if (iFile)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1032
			fileOpened = ETrue;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1033
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1034
	if (err == KErrNone)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1035
	    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1036
	    __ASSERT_DEBUG(iFile != NULL,Panic(EMMFFileHandleNULL));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1037
		err = iFile->Size(size);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1038
	    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1039
	if (err)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1040
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1041
		size = 0;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1042
		iFileSize = -1; //reset cached size
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1043
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1044
	else 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1045
		iFileSize = size; //cache the filesize
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1046
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1047
	if (fileOpened)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1048
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1049
		__ASSERT_DEBUG(iFile != NULL,Panic(EMMFFileHandleNULL));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1050
		delete iFile;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1051
		iFile = NULL;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1052
		iFileSize = -1;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1053
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1054
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1055
	return size;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1056
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1057
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1058
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1059
Source thread logon.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1060
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1061
Shares fsSession between threads
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1062
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1063
@param  aEventHandler
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1064
        This is an MAsyncEventHandler to handle asynchronous events that occur during the
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1065
        transfer of multimedia data.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1066
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1067
@return An error code indicating if the function call was successful. KErrNone on success, otherwise
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1068
        another of the system-wide error codes.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1069
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1070
TInt CMMFFile::SourceThreadLogon(MAsyncEventHandler& aEventHandler)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1071
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1072
	iEventHandler = &aEventHandler;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1073
	if(!iMmfFileEventHandler)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1074
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1075
		iMmfFileEventHandler = new CMMFFileAsyncEventHandler(this);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1076
		if(!iMmfFileEventHandler)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1077
			return KErrNoMemory;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1078
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1079
#ifdef __IPC_V2_PRESENT__
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1080
	return KErrNone; // nothing to do
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1081
#else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1082
	return iFsSession.Attach();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1083
#endif // __HIDE_IPC_V1__
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1084
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1085
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1086
/** 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1087
Logs off source thread.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1088
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1089
void CMMFFile::SourceThreadLogoff()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1090
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1091
	delete iMmfFileEventHandler;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1092
	iMmfFileEventHandler = NULL;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1093
	iEventHandler = NULL;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1094
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1095
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1096
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1097
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1098
Sink thread logon.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1099
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1100
Shares fsSession between threads.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1101
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1102
@param  aEventHandler
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1103
        This is an MAsyncEventHandler to handle asynchronous events that occur during the
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1104
        transfer of multimedia data.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1105
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1106
@return An error code indicating if the function call was successful. KErrNone on success, otherwise
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1107
        another of the system-wide error codes.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1108
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1109
TInt CMMFFile::SinkThreadLogon(MAsyncEventHandler& aEventHandler)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1110
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1111
	iEventHandler = &aEventHandler;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1112
	if(!iMmfFileEventHandler)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1113
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1114
		iMmfFileEventHandler = new CMMFFileAsyncEventHandler(this);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1115
		if(!iMmfFileEventHandler)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1116
			return KErrNoMemory;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1117
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1118
#ifdef __IPC_V2_PRESENT__
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1119
	return KErrNone;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1120
#else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1121
	return iFsSession.Attach();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1122
#endif // __HIDE_IPC_V1__
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1123
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1124
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1125
/** 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1126
Sink thread log off.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1127
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1128
void CMMFFile::SinkThreadLogoff() 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1129
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1130
	delete iMmfFileEventHandler;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1131
	iMmfFileEventHandler = NULL;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1132
	iEventHandler = NULL;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1133
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1134
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1135
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1136
Stores a request in an array.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1137
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1138
CReadWriteRequests are stored in the array iRequests.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1139
This function takes ownership and places the request in the array.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1140
It also checks the array for completed requests and removes them.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1141
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1142
@param  aRequest
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1143
        The request to store.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1144
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1145
void CMMFFile::StoreRequestL( CReadWriteRequest* aRequest )
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1146
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1147
	// add aRequest to iRequests
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1148
	User::LeaveIfError( iRequests.Append( aRequest ) ) ;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1149
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1150
	// Clear out any completed requests
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1151
	for ( TInt ii = 0 ; ii < iRequests.Count() ; ii++ )
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1152
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1153
		if (iRequests[ii]->Completed())
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1154
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1155
			CReadWriteRequest* request = iRequests[ii];
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1156
			delete request;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1157
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1158
			iRequests.Remove(ii);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1159
			ii--;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1160
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1161
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1162
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1163
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1164
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1165
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1166
Cancels outstanding requests.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1167
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1168
CReadWriteRequests are stored in the array iRequests.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1169
This function cancels any outstanding requests and removes them
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1170
from iRequests.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1171
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1172
void CMMFFile::CancelRequests()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1173
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1174
	// Clear out any completed requests
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1175
	for ( TInt ii = 0 ; ii < iRequests.Count() ; ii++ )
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1176
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1177
		CReadWriteRequest* request = iRequests[ii];
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1178
		if(!request->Processing())
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1179
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1180
			delete request;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1181
			iRequests.Remove(ii);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1182
			ii--;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1183
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1184
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1185
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1186
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1187
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1188
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1189
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1190
Returns the data type as a fourCC code of CMMFFile as a data source.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1191
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1192
@return The data type fourCC code.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1193
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1194
TFourCC CMMFFile::SourceDataTypeCode(TMediaId /*aMediaId*/) 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1195
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1196
	return  iSourceFourCC ;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1197
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1198
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1199
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1200
Returns the data type as a fourCC code of CMMFFile as a data sink.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1201
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1202
@return The data type fourCC code
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1203
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1204
TFourCC CMMFFile::SinkDataTypeCode(TMediaId /*aMediaId*/) 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1205
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1206
	return  iSinkFourCC ;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1207
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1208
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1209
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1210
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1211
CMMFFile as a source is always passive so this function is not supported.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1212
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1213
@param  aBuffer
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1214
        The emptied buffer.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1215
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1216
void CMMFFile::BufferEmptiedL(CMMFBuffer* /* aBuffer */)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1217
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1218
	Panic(EMMFFilePanicBufferEmptiedLNotSupported);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1219
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1220
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1221
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1222
Tests whether a source buffer can be created.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1223
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1224
@return	A boolean indicating if if CMMFFile can create its own buffer. EFalse if CMMFFile cannot 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1225
        create it's own buffer.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1226
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1227
TBool CMMFFile::CanCreateSourceBuffer()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1228
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1229
	return EFalse ;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1230
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1231
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1232
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1233
Creates a source buffer.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1234
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1235
@param  aMediaId
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1236
        The Media ID.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1237
@param  aReference
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1238
        A boolean indicating if MDataSource owns the buffer. ETrue if it does, EFalse if the caller
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1239
        owns the buffer.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1240
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1241
@return	NULL as a CMMFFile cannot create it's own buffer
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1242
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1243
CMMFBuffer* CMMFFile::CreateSourceBufferL( TMediaId /*aMediaId*/ , TBool& /*aReference*/)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1244
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1245
	User::Leave(KErrNotSupported);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1246
	return NULL ;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1247
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1248
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1249
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1250
CMMFFile as a sink is always passive so this function is not supported.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1251
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1252
@param  aBuffer
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1253
        The buffer.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1254
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1255
void CMMFFile::BufferFilledL(CMMFBuffer* /* aBuffer */)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1256
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1257
	Panic(EMMFFilePanicBufferFilledLNotSupported);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1258
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1259
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1260
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1261
Tests whether a sink buffer can be created.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1262
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1263
@return	A boolean indicating if the sink buffer can be created. EFalse if CMMFFile cannot create 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1264
        it's own buffer
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1265
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1266
TBool CMMFFile::CanCreateSinkBuffer() 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1267
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1268
	return EFalse ;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1269
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1270
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1271
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1272
Creates a sink buffer.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1273
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1274
@param  aMediaId
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1275
        The Media ID.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1276
@param  aReference 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1277
        A boolean indicating if MDataSource owns the buffer. ETrue if MDataSource owns the buffer,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1278
        EFalse if the caller owns the buffer.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1279
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1280
@return	NULL as a CMMFFile cannot create it's own buffer
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1281
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1282
CMMFBuffer* CMMFFile::CreateSinkBufferL(TMediaId /*aMediaId*/ , TBool& /*aReference*/) 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1283
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1284
	User::Leave(KErrNotSupported);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1285
	return NULL ;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1286
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1287
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1288
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1289
Primes the source.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1290
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1291
When used as a source, the file prime opens the file as read only.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1292
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1293
void CMMFFile::SourcePrimeL()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1294
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1295
	// don't reopen file if already open
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1296
	if (!iFile)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1297
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1298
		if (iFileHandle)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1299
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1300
			iFile = CContentFile::NewL(iHandle, UniqueId(), iCAFParameters->iEnableUI);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1301
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1302
		else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1303
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1304
			// Open for read-only access
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1305
			iFile = CContentFile::NewL(iFsSession, iFullFileName, UniqueId(), EFileShareReadersOnly, iCAFParameters->iEnableUI);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1306
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1307
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1308
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1309
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1310
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1311
Primes the sink.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1312
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1313
When used as a sink, the file prime opens the file for read/write access.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1314
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1315
void CMMFFile::SinkPrimeL() 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1316
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1317
	// don't reopen file if already open
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1318
	if (!iFile)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1319
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1320
		if (iFileHandle)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1321
			iFile = CF32File::NewL(iHandle);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1322
		else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1323
			iFile = CF32File::NewL(iFsSession, iFullFileName, EFileRead | EFileWrite);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1324
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1325
		iSinkNotStopped = ETrue;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1326
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1327
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1328
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1329
Stops the file source. When stopping close the file. If the source is a file handle, the position is reset, but the 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1330
file handle remains open.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1331
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1332
void CMMFFile::SourceStopL()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1333
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1334
	TInt pos = 0;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1335
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1336
	CancelRequests();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1337
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1338
	// It is possible the file could have disappeared at this point (MMC/SD Card)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1339
	//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1340
	if (!iFile)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1341
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1342
		iPosition=pos;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1343
		return;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1344
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1345
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1346
	if (!iFileHandle && !iFile->IsProtected())
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1347
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1348
		delete iFile;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1349
		iFile = NULL;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1350
		iFileSize = -1;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1351
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1352
	else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1353
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1354
		User::LeaveIfError(iFile->Seek(ESeekStart, pos));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1355
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1356
	iPosition=pos;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1357
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1358
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1359
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1360
Stops the file sink. 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1361
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1362
When stopping close the file. When the file sink is a file handle, the position is reset, but the file handle
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1363
remains open
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1364
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1365
void CMMFFile::SinkStopL()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1366
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1367
	iFileSize = -1;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1368
	iPosition=0;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1369
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1370
	CancelRequests();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1371
	iSinkNotStopped = EFalse;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1372
	if (!iFileHandle)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1373
		{		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1374
		delete iFile;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1375
		iFile = NULL;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1376
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1377
	else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1378
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1379
		TInt pos = 0;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1380
		User::LeaveIfError(iFile->Seek(ESeekStart, pos));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1381
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1382
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1383
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1384
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1385
Pauses the file source
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1386
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1387
void CMMFFile::SourcePauseL()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1388
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1389
	CancelRequests();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1390
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1391
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1392
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1393
Returns a boolean indicating if the sink has been stopped.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1394
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1395
@return A boolean indicating if the sink has stopped.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1396
 */
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1397
TBool CMMFFile::SinkStopped()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1398
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1399
	if(iSinkNotStopped == EFalse)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1400
		return ETrue;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1401
	else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1402
		return EFalse;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1403
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1404
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1405
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1406
Evaluates a given intent against the rights associated with the file.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1407
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1408
The rights are not updated by this function call.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1409
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1410
@param  aIntent
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1411
        The intent to evaluate.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1412
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1413
@return An error code indicating if the function call was successful. KErrNone on success, otherwise
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1414
        another of the system-wide error codes.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1415
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1416
TInt CMMFFile::EvaluateIntent(ContentAccess::TIntent aIntent) const
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1417
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1418
	if (iFile==NULL)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1419
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1420
		return KErrNotReady;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1421
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1422
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1423
	return iFile->EvaluateIntent(aIntent);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1424
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1425
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1426
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1427
Evaluates and executes a given intent against the rights associated with the file.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1428
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1429
The rights object is updated after calling this function.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1430
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1431
@param  aIntent
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1432
        The intent to evaluate.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1433
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1434
@return An error code indicating if the function call was successful. KErrNone on success, otherwise
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1435
        another of the system-wide error codes.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1436
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1437
TInt CMMFFile::ExecuteIntent(ContentAccess::TIntent aIntent)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1438
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1439
	if (iFile==NULL)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1440
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1441
		return KErrNotReady;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1442
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1443
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1444
	return iFile->ExecuteIntent(aIntent);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1445
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1446
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1447
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1448
Returns whether the file is protected.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1449
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1450
@return A boolean indicating if the file is protected. ETrue if the file is protected.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1451
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1452
TBool CMMFFile::IsProtectedL() const
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1453
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1454
	if (iFile==NULL)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1455
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1456
		User::Leave(KErrNotReady);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1457
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1458
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1459
	return iFile->IsProtected();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1460
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1461
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1462
TInt CMMFFile::SetAgentProperty(ContentAccess::TAgentProperty aProperty, TInt aValue)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1463
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1464
	if (iFile==NULL)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1465
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1466
		return KErrNotReady;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1467
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1468
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1469
	return iFile->SetAgentProperty(aProperty, aValue);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1470
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1471
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1472
/*
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1473
 *	Returns the data member of CMMFDataBuffer or CMMFTransferBuffer (as TPtr8)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1474
 *  
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1475
 */
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1476
TDes8& CReadWriteRequest::BufferDes()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1477
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1478
	if(iTransferBufferCopy)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1479
		return iTransferBufferCopy->Des();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1480
	else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1481
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1482
		//reset iBufferDes in case iBuffer has changed...
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1483
		iBufferDes = &(STATIC_CAST(CMMFDataBuffer*, iBuffer)->Data());
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1484
		return *iBufferDes;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1485
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1486
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1487
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1488
const TDesC8& CReadWriteRequest::BufferDesC()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1489
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1490
	if(iTransferBufferCopy)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1491
		return iTransferBufferCopy->Des();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1492
	else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1493
		return BufferDes();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1494
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1495
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1496
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1497
/*
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1498
 *	Destructor.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1499
 */
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1500
CReadWriteRequest::~CReadWriteRequest() 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1501
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1502
	Cancel();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1503
	if(iTransferBufferCopy)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1504
		iTransferBufferCopy->SetInUse(EFalse);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1505
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1506
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1507
/*
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1508
 *	Allows owning class access to SetActive()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1509
 */
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1510
void CReadWriteRequest::SetActive() 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1511
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1512
	CActive::SetActive() ;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1513
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1514
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1515
/*
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1516
 *  For the moment at least...    Canceled requests may be deleted
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1517
 */
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1518
void CReadWriteRequest::DoCancel() 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1519
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1520
	iState = ECompleted;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1521
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1522
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1523
/*
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1524
 *	Called when errors in RunL force Leave.  For the moment just mark the request deletable
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1525
 */
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1526
TInt CReadWriteRequest::RunError( TInt aError ) 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1527
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1528
	//RunL can leave.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1529
	iState = ECompleted;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1530
	iError = aError; //keep this error internally for now
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1531
	return KErrNone ;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1532
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1533
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1534
/*
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1535
 *	On completion of read request call back to the MDataSink
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1536
 */
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1537
void CReadRequest::RunL() 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1538
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1539
	// This prevents the request from deletion during the execution of RunL
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1540
	iState = EProcessing;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1541
	if (iStatus != KErrNone)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1542
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1543
		TMMFEvent event(KMMFErrorCategoryControllerGeneralError, iStatus.Int());
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1544
		iEventHandler->SendEventToClient(event);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1545
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1546
	else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1547
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1548
		//Copy the data from the normal buffer into the Transfer buffer
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1549
		if(iTransferBufferCopy)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1550
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1551
			//must specify the size here as the dest may be smaller than the source.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1552
			TDes8& destDesc = STATIC_CAST(CMMFDataBuffer*, iBuffer)->Data();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1553
			destDesc.Copy(iTransferBufferCopy->Des().Left(destDesc.MaxLength()));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1554
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1555
			iTransferBufferCopy->SetInUse(EFalse);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1556
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1557
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1558
		// removed checking EOF from here, it should be checked in CMMFFile
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1559
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1560
		REINTERPRET_CAST(MDataSink*, iSinkOrSource)->BufferFilledL(iBuffer) ; // callback to MDataSource/Sink
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1561
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1562
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1563
	iState = ECompleted;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1564
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1565
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1566
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1567
/* 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1568
 *  On completion of write request call back to the MDataSource
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1569
 */
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1570
void CWriteRequest::RunL() 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1571
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1572
	iState = EProcessing;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1573
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1574
	if(iTransferBufferCopy)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1575
		iTransferBufferCopy->SetInUse(EFalse);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1576
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1577
	if (iStatus != KErrNone)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1578
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1579
		TMMFEvent event(KMMFErrorCategoryControllerGeneralError, iStatus.Int());
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1580
		iEventHandler->SendEventToClient(event);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1581
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1582
	else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1583
		REINTERPRET_CAST(MDataSource*, iSinkOrSource)->BufferEmptiedL(iBuffer) ; // callback to MDataSource/Sink
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1584
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1585
	iState = ECompleted;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1586
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1587
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1588
CMMFFile::CMMFFileAsyncEventHandler::CMMFFileAsyncEventHandler(CMMFFile* aParent)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1589
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1590
	iParent = aParent;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1591
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1592
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1593
CMMFFile::CMMFFileAsyncEventHandler::~CMMFFileAsyncEventHandler()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1594
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1595
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1596
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1597
TInt CMMFFile::CMMFFileAsyncEventHandler::SendEventToClient(const TMMFEvent& aEvent)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1598
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1599
	if(aEvent.iErrorCode == KErrNotReady)//i.e. MMC removed while recording
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1600
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1601
		TRAPD(err, iParent->SinkStopL() );
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1602
		if (err != KErrNone)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1603
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1604
			return err;	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1605
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1606
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1607
	return iParent->iEventHandler->SendEventToClient(aEvent);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1608
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1609
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1610
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1611
Returns access to internal CData property
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1612
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1613
@param aData
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1614
       On return, set to the internal CData property used to access file for reading.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1615
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1616
Returns:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1617
  * KErrNotReady if the file is not open/data object has not been created. 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1618
  * KErrNotSupported if not supported (e.g. on data sink)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1619
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1620
@return Standard error code
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1621
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1622
TInt CMMFFile::Data(ContentAccess::CData*& aData)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1623
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1624
	if (!iFile)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1625
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1626
		return KErrNotReady;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1627
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1628
	else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1629
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1630
		return iFile->Data(aData);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1631
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1632
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
  1633