os/kernelhwsrv/userlibandfileserver/fileserver/sfsrv/cl_notification.cpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     2
// All rights reserved.
sl@0
     3
// This component and the accompanying materials are made available
sl@0
     4
// under the terms of the License "Eclipse Public License v1.0"
sl@0
     5
// which accompanies this distribution, and is available
sl@0
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     7
//
sl@0
     8
// Initial Contributors:
sl@0
     9
// Nokia Corporation - initial contribution.
sl@0
    10
//
sl@0
    11
// Contributors:
sl@0
    12
//
sl@0
    13
// Description:
sl@0
    14
// f32\sfsrv\cl_notification.cpp
sl@0
    15
// 
sl@0
    16
//
sl@0
    17
#include "cl_std.h"
sl@0
    18
#include "cl_notification.h"
sl@0
    19
sl@0
    20
#ifdef SYMBIAN_F32_ENHANCED_CHANGE_NOTIFICATION
sl@0
    21
/*
sl@0
    22
 * The order of the data in the buffer is:
sl@0
    23
 * Word1   : NotificationSize (2 bytes) , PathSize (2 bytes)
sl@0
    24
 * Word2   : NewNameSize (2 bytes) , NotificationType (2 bytes)
sl@0
    25
 * Word3   : UID - NOT YET SUPPORTED
sl@0
    26
 * Word(s) : Path (TText8) , [Any sub-class members]
sl@0
    27
 * 
sl@0
    28
 * The notification size should be located at *this
sl@0
    29
 */ 
sl@0
    30
TInt TFsNotification::NotificationSize() const
sl@0
    31
	{
sl@0
    32
	TInt word1 = *(TInt*)this;
sl@0
    33
	return (word1 >> 16);
sl@0
    34
	}
sl@0
    35
 
sl@0
    36
/*
sl@0
    37
 * The order of the data in the buffer is:
sl@0
    38
 * Word1   : NotificationSize (2 bytes) , PathSize (2 bytes)
sl@0
    39
 * Word2   : NewNameSize (2 bytes) , NotificationType (2 bytes)
sl@0
    40
 * Word3   : UID - NOT YET SUPPORTED
sl@0
    41
 * Word(s) : Path (TText8) , [Any sub-class members]
sl@0
    42
 * 
sl@0
    43
 * The notification type should be located at:
sl@0
    44
 * 	*this + sizeof(NotificationSize) + sizeof(PathSize) + sizeof(NewNameSize)
sl@0
    45
 */ 
sl@0
    46
EXPORT_C TFsNotification::TFsNotificationType TFsNotification::NotificationType() const
sl@0
    47
	{
sl@0
    48
	TUint* word2 = PtrAdd((TUint*)this, sizeof(TUint));
sl@0
    49
	TFsNotificationType ret = (TFsNotificationType)(*word2 & 0x0000FFFF);
sl@0
    50
	//Check it is a valid type
sl@0
    51
	__ASSERT_DEBUG(!((TInt)ret & ~KNotificationValidFiltersMask) || (ret == EOverflow), Panic(ENotificationPanic));
sl@0
    52
	return ret; //Returns the lower 2 bytes of Word2
sl@0
    53
	}
sl@0
    54
sl@0
    55
/*
sl@0
    56
 * The order of the data in the buffer is:
sl@0
    57
 * Word1   : NotificationSize (2 bytes) , PathSize (2 bytes)
sl@0
    58
 * Word2   : NewNameSize (2 bytes) , NotificationType (2 bytes)
sl@0
    59
 * Word3   : UID - NOT YET SUPPORTED
sl@0
    60
 * Word(s) : Path (TText8) , [Any sub-class members]
sl@0
    61
 * 
sl@0
    62
 * The path size should be located at *this + sizeof(NotificationSize)
sl@0
    63
 */ 
sl@0
    64
TInt TFsNotification::PathSize() const
sl@0
    65
	{
sl@0
    66
	//Notification of type EOverflow does not have a path associated with it
sl@0
    67
	__ASSERT_DEBUG(NotificationType() != EOverflow,Panic(ENotificationPanic));
sl@0
    68
	TUint ret = (*(TUint*)this & 0x0000FFFF); //Returns the lower 2 bytes of Word1
sl@0
    69
	return (TInt)ret;
sl@0
    70
	}
sl@0
    71
sl@0
    72
/*
sl@0
    73
 * The order of the data in the buffer is:
sl@0
    74
 * Word1   : NotificationSize (2 bytes) , PathSize (2 bytes)
sl@0
    75
 * Word2   : NewNameSize (2 bytes) , NotificationType (2 bytes)
sl@0
    76
 * Word3   : UID - NOT YET SUPPORTED
sl@0
    77
 * Word(s) : Path (TText8) , [Any sub-class members]
sl@0
    78
 * 
sl@0
    79
 * The path should be located at: *this + KNotificationHeaderSize
sl@0
    80
 */
sl@0
    81
EXPORT_C TInt TFsNotification::Path(TPtrC& aPath) const
sl@0
    82
	{
sl@0
    83
	//Notification of type EOverflow does not have a path associated with it
sl@0
    84
	if(NotificationType() == EOverflow)
sl@0
    85
		return KErrNotSupported;
sl@0
    86
sl@0
    87
	TUint16* pathPtr = PtrAdd((TUint16*)this, KNotificationHeaderSize);
sl@0
    88
	aPath.Set(pathPtr,PathSize()/2);
sl@0
    89
	return KErrNone;
sl@0
    90
	}
sl@0
    91
sl@0
    92
/*
sl@0
    93
 * The order of the data in the buffer is:
sl@0
    94
 * Word1   : NotificationSize (2 bytes) , PathSize (2 bytes)
sl@0
    95
 * Word2   : NewNameSize (2 bytes) , NotificationType (2 bytes)
sl@0
    96
 * Word3   : UID - NOT YET SUPPORTED
sl@0
    97
 * Word(s) : Path (TText8) , [Any sub-class members]
sl@0
    98
 * 
sl@0
    99
 * The new name size should be located at: *this + sizeof(NotificationSize) + sizeof(PathSize)
sl@0
   100
 */ 
sl@0
   101
TInt TFsNotification::NewNameSize() const
sl@0
   102
	{
sl@0
   103
	//The only notifications containing a new name are ERename, EVolumeName and EDriveName
sl@0
   104
	__ASSERT_DEBUG((NotificationType() == ERename ||
sl@0
   105
					NotificationType() == EVolumeName ||
sl@0
   106
					NotificationType() == EDriveName),Panic(ENotificationPanic));
sl@0
   107
	TInt* word2 = PtrAdd((TInt*)this, sizeof(TInt));
sl@0
   108
	return ((*word2) >> 16);
sl@0
   109
	}
sl@0
   110
sl@0
   111
/*
sl@0
   112
 * The order of the data in the buffer is:
sl@0
   113
 * Word1   : NotificationSize (2 bytes) , PathSize (2 bytes)
sl@0
   114
 * Word2   : NewNameSize (2 bytes) , NotificationType (2 bytes)
sl@0
   115
 * Word3   : UID - NOT YET SUPPORTED
sl@0
   116
 * Word(s) : Path (TText8) , [Any sub-class members]
sl@0
   117
 * 
sl@0
   118
 * The new name should be located at: *this + KNotificationHeaderSize + Align4(PathSize)
sl@0
   119
 */
sl@0
   120
EXPORT_C TInt TFsNotification::NewName(TPtrC& aNewName) const
sl@0
   121
	{
sl@0
   122
	//Only ERename, EVolumeName and EDriveName have second paths
sl@0
   123
	//Notification of type EOverflow does not have a path associated with it
sl@0
   124
	TFsNotificationType notificationType = NotificationType();
sl@0
   125
	if((notificationType != ERename &&
sl@0
   126
		notificationType != EVolumeName &&
sl@0
   127
		notificationType != EDriveName) ||
sl@0
   128
		notificationType == EOverflow)
sl@0
   129
		{
sl@0
   130
		return KErrNotSupported;
sl@0
   131
		}
sl@0
   132
sl@0
   133
	TUint16* pathPtr = PtrAdd((TUint16*)this, KNotificationHeaderSize + Align4(PathSize()));
sl@0
   134
	aNewName.Set(pathPtr,NewNameSize()/2);
sl@0
   135
	return KErrNone;
sl@0
   136
	}
sl@0
   137
sl@0
   138
/*
sl@0
   139
 * The order of the data in the buffer is:
sl@0
   140
 * Word1   : NotificationSize (2 bytes) , PathSize (2 bytes)
sl@0
   141
 * Word2   : NewNameSize (2 bytes) , NotificationType (2 bytes)
sl@0
   142
 * Word3   : UID - NOT YET SUPPORTED
sl@0
   143
 * Word(s) : Path (TText8) , [Any sub-class members]
sl@0
   144
 * 
sl@0
   145
 * The attribute should be located at: *this + KNotificationHeaderSize + Align4(PathSize)
sl@0
   146
 */
sl@0
   147
EXPORT_C TInt TFsNotification::Attributes(TUint& aSetAtt, TUint& aClearAtt) const
sl@0
   148
	{
sl@0
   149
	if(NotificationType() != EAttribute)
sl@0
   150
		return KErrNotSupported;
sl@0
   151
sl@0
   152
	TUint* clearAttptr = PtrAdd((TUint*)this, KNotificationHeaderSize + Align4(PathSize()));
sl@0
   153
	aClearAtt = *clearAttptr;
sl@0
   154
	aSetAtt = *PtrAdd((TUint*)clearAttptr, sizeof(TUint));
sl@0
   155
	return KErrNone;
sl@0
   156
	}
sl@0
   157
sl@0
   158
/*
sl@0
   159
 * The order of the data in the buffer is:
sl@0
   160
 * Word1   : NotificationSize (2 bytes) , PathSize (2 bytes)
sl@0
   161
 * Word2   : NewNameSize (2 bytes) , NotificationType (2 bytes)
sl@0
   162
 * Word3   : UID - NOT YET SUPPORTED
sl@0
   163
 * Word(s) : Path (TText8) , [Any sub-class members]
sl@0
   164
 * 
sl@0
   165
 * The size should be located at: *this + KNotificationHeaderSize + Align4(PathSize)
sl@0
   166
 */
sl@0
   167
EXPORT_C TInt TFsNotification::FileSize(TInt64& aSize) const
sl@0
   168
	{
sl@0
   169
	if(NotificationType() != EFileChange)
sl@0
   170
		return KErrNotSupported;
sl@0
   171
sl@0
   172
	aSize = *PtrAdd((TInt64*)this, KNotificationHeaderSize + Align4(PathSize()));
sl@0
   173
	return KErrNone;
sl@0
   174
	}
sl@0
   175
sl@0
   176
/*
sl@0
   177
 * The order of the data in the buffer is:
sl@0
   178
 * Word1   : NotificationSize (2 bytes) , PathSize (2 bytes)
sl@0
   179
 * Word2   : NewNameSize (2 bytes) , NotificationType (2 bytes)
sl@0
   180
 * Word3   : UID
sl@0
   181
 * Word(s) : Path (TText8) , [Any sub-class members]
sl@0
   182
sl@0
   183
EXPORT_C TInt TFsNotification::DriveNumber(TInt& aDriveNumber) const
sl@0
   184
	{
sl@0
   185
	TPtrC path(NULL,0);
sl@0
   186
	TInt r = Path(path);
sl@0
   187
	if(r == KErrNone)
sl@0
   188
		{
sl@0
   189
		if(path.Length() >= 2 && ((TChar)path[1]==(TChar)':'))
sl@0
   190
			{
sl@0
   191
			r = RFs::CharToDrive(path[0],aDriveNumber);
sl@0
   192
			}
sl@0
   193
		}
sl@0
   194
	return r;
sl@0
   195
	}
sl@0
   196
	*/
sl@0
   197
sl@0
   198
/*
sl@0
   199
 * The order of the data in the buffer is:
sl@0
   200
 * Word1   : NotificationSize (2 bytes) , PathSize (2 bytes)
sl@0
   201
 * Word2   : NewNameSize (2 bytes) , NotificationType (2 bytes)
sl@0
   202
 * Word3   : UID
sl@0
   203
 * Word(s) : Path (TText8) , [Any sub-class members]
sl@0
   204
sl@0
   205
EXPORT_C TInt TFsNotification::UID(TUid& aUID) const
sl@0
   206
    {
sl@0
   207
    TUint* word3 = PtrAdd((TUint*)this, sizeof(TUint)*2);
sl@0
   208
    aUID.iUid = *word3;
sl@0
   209
    return KErrNone; 
sl@0
   210
    }
sl@0
   211
	*/
sl@0
   212
sl@0
   213
sl@0
   214
CFsNotificationList* CFsNotificationList::NewL(TInt aBufferSize)
sl@0
   215
	{
sl@0
   216
	CFsNotificationList* self = new(ELeave) CFsNotificationList;
sl@0
   217
	CleanupStack::PushL(self);
sl@0
   218
	self->iBuf = HBufC8::NewL(aBufferSize);
sl@0
   219
	self->iBufferPtr.Set((TUint8*)self->iBuf->Ptr(),0,self->iBuf->Des().MaxSize());
sl@0
   220
	CleanupStack::Pop(self);
sl@0
   221
	return self;
sl@0
   222
	}
sl@0
   223
sl@0
   224
CFsNotificationList::CFsNotificationList()
sl@0
   225
: iTailPckg(iTail), iBufferPtr(NULL,0)
sl@0
   226
	{
sl@0
   227
	}
sl@0
   228
sl@0
   229
CFsNotificationList::~CFsNotificationList()
sl@0
   230
	{
sl@0
   231
	delete iBuf;
sl@0
   232
	}
sl@0
   233
sl@0
   234
TInt CFsNotificationList::BufferSize() const 
sl@0
   235
	{
sl@0
   236
	return iBuf->Size();
sl@0
   237
	}
sl@0
   238
sl@0
   239
const TFsNotification * CFsNotificationList::NextNotification()
sl@0
   240
	{
sl@0
   241
	TFsNotification* notification;
sl@0
   242
sl@0
   243
	if(iHead == iTail)
sl@0
   244
		{
sl@0
   245
		return NULL;
sl@0
   246
		}
sl@0
   247
	TUint* startptr = (TUint*)iBuf->Ptr();
sl@0
   248
	TUint* nptr = PtrAdd(startptr, iHead);
sl@0
   249
	TInt bufferSize = iBuf->Des().MaxSize();
sl@0
   250
	TUint* endOfBuffer = PtrAdd(startptr, bufferSize);
sl@0
   251
sl@0
   252
	if(*nptr == KNotificationBufferFiller || nptr == endOfBuffer)
sl@0
   253
		{
sl@0
   254
		iHead = 0;
sl@0
   255
		notification = (TFsNotification*)startptr;
sl@0
   256
		}
sl@0
   257
	else
sl@0
   258
		{
sl@0
   259
		notification = (TFsNotification*)nptr;
sl@0
   260
		}
sl@0
   261
	iHead += notification->NotificationSize();
sl@0
   262
	if(iHead  == bufferSize)
sl@0
   263
		iHead = 0;
sl@0
   264
	
sl@0
   265
	return notification;
sl@0
   266
	}
sl@0
   267
sl@0
   268
sl@0
   269
EXPORT_C CFsNotify* CFsNotify::NewL(RFs& aFs, TInt aBufferSize)
sl@0
   270
	{
sl@0
   271
	CFsNotify* self=new(ELeave) CFsNotify;
sl@0
   272
	CleanupStack::PushL(self);
sl@0
   273
sl@0
   274
	//Making sure buffer size is at least minimally large and not too big
sl@0
   275
	if(aBufferSize > (KMaxTInt/2))
sl@0
   276
		{
sl@0
   277
		User::Leave(KErrArgument);
sl@0
   278
		}
sl@0
   279
	else if(aBufferSize < KMinNotificationBufferSize)
sl@0
   280
		{
sl@0
   281
		aBufferSize = KMinNotificationBufferSize;
sl@0
   282
		}
sl@0
   283
	
sl@0
   284
	self->ConstructL(aFs, Align4(aBufferSize));
sl@0
   285
	CleanupStack::Pop(self);
sl@0
   286
	return self;
sl@0
   287
	}
sl@0
   288
sl@0
   289
void CFsNotify::ConstructL(RFs& aFs,TInt aBufferSize)
sl@0
   290
	{
sl@0
   291
	iBody = new(ELeave) CFsNotifyBody();
sl@0
   292
	iBody->iBuffer = CFsNotificationList::NewL(aBufferSize);
sl@0
   293
	User::LeaveIfError(iBody->iFsNotify.Open(aFs,iBody->iBuffer,iBody->iBufferStatus));
sl@0
   294
	}
sl@0
   295
sl@0
   296
CFsNotify::CFsNotify()
sl@0
   297
	{
sl@0
   298
	}
sl@0
   299
sl@0
   300
EXPORT_C CFsNotify::~CFsNotify()
sl@0
   301
	{
sl@0
   302
	if(iBody)
sl@0
   303
		{
sl@0
   304
		if(iBody->iBuffer)
sl@0
   305
			{
sl@0
   306
			iBody->iBuffer->iTail = 0;
sl@0
   307
			iBody->iBuffer->iHead = 0;
sl@0
   308
			iBody->iFsNotify.Close();
sl@0
   309
			delete iBody->iBuffer;
sl@0
   310
			}
sl@0
   311
		}
sl@0
   312
	delete iBody;
sl@0
   313
	}
sl@0
   314
sl@0
   315
CFsNotifyBody::CFsNotifyBody()
sl@0
   316
	{
sl@0
   317
	}
sl@0
   318
sl@0
   319
CFsNotifyBody::~CFsNotifyBody()
sl@0
   320
	{
sl@0
   321
	}
sl@0
   322
sl@0
   323
EXPORT_C TInt CFsNotify::AddNotification(TUint aNotificationType, const TDesC& aPath, const TDesC& aFilename)
sl@0
   324
	{
sl@0
   325
	if(aNotificationType == 0 || (aPath.Length() <= 0 && aFilename.Length() <= 0))
sl@0
   326
		return KErrArgument;
sl@0
   327
sl@0
   328
	return iBody->iFsNotify.AddNotification(aNotificationType, aPath, aFilename);
sl@0
   329
	}
sl@0
   330
sl@0
   331
//Removes notification request, does not close session
sl@0
   332
EXPORT_C TInt CFsNotify::RemoveNotifications()
sl@0
   333
	{
sl@0
   334
	return iBody->iFsNotify.RemoveNotifications();
sl@0
   335
	}
sl@0
   336
sl@0
   337
EXPORT_C TInt CFsNotify::RequestNotifications(TRequestStatus& aStatus)
sl@0
   338
	{
sl@0
   339
	if(aStatus == KRequestPending || ((iBody->iClientStatus != NULL) && (*iBody->iClientStatus == KRequestPending)))
sl@0
   340
		return KErrInUse;
sl@0
   341
	
sl@0
   342
	iBody->iClientStatus = &aStatus;
sl@0
   343
	//Read the new notifications which will start at tail.
sl@0
   344
	//(Also this forbids user access outside permitted range)
sl@0
   345
	iBody->iBuffer->iHead = iBody->iBuffer->iTail; 
sl@0
   346
	iBody->iFsNotify.RequestNotifications(aStatus, iBody->iBuffer->iTailPckg);
sl@0
   347
	return KErrNone;
sl@0
   348
	}
sl@0
   349
sl@0
   350
//Cancels notification request, does not close session
sl@0
   351
EXPORT_C TInt CFsNotify::CancelNotifications(TRequestStatus& aStatus)
sl@0
   352
	{
sl@0
   353
	if(aStatus != KRequestPending || &aStatus != iBody->iClientStatus)
sl@0
   354
		return KErrInUse;
sl@0
   355
	
sl@0
   356
	TInt r = iBody->iFsNotify.CancelNotifications();
sl@0
   357
	aStatus = !KRequestPending;
sl@0
   358
	iBody->iBuffer->iHead = 0;
sl@0
   359
	iBody->iBuffer->iTail = 0;
sl@0
   360
	return r;
sl@0
   361
	}
sl@0
   362
sl@0
   363
EXPORT_C const TFsNotification *  CFsNotify::NextNotification()
sl@0
   364
	{
sl@0
   365
	return iBody->iBuffer->NextNotification();
sl@0
   366
	}
sl@0
   367
sl@0
   368
sl@0
   369
TInt RFsNotify::Open(RFs& aFs, CFsNotificationList* aBuffer, TRequestStatus& aBufferStatus)
sl@0
   370
	{
sl@0
   371
	if(aBuffer == NULL || aBuffer->iBuf == NULL || &aFs == NULL || &aBufferStatus==NULL)
sl@0
   372
		return KErrArgument;
sl@0
   373
	
sl@0
   374
	TInt err = CreateSubSession(aFs,EFsNotificationOpen);
sl@0
   375
	if (err == KErrNone)
sl@0
   376
		{
sl@0
   377
		aBufferStatus = KRequestPending;
sl@0
   378
		//memclr((TUint8*)aBuffer->iBuf->Ptr(),aBuffer->iBuf->Des().MaxSize());
sl@0
   379
		SendReceive(EFsNotificationBuffer, TIpcArgs(&aBuffer->iBufferPtr,aBuffer->iBuf->Des().MaxSize()), aBufferStatus);
sl@0
   380
		}
sl@0
   381
	return err;
sl@0
   382
	}
sl@0
   383
sl@0
   384
void RFsNotify::Close()
sl@0
   385
	{
sl@0
   386
	CloseSubSession(EFsNotificationSubClose);
sl@0
   387
	}
sl@0
   388
sl@0
   389
/*
sl@0
   390
[Re]Issues notification request
sl@0
   391
Updates buffer, if supplied.
sl@0
   392
sl@0
   393
@return - last readable index of buffer.
sl@0
   394
*/
sl@0
   395
void RFsNotify::RequestNotifications(TRequestStatus& aStatus, TPckg<TInt>& aTailPckg)
sl@0
   396
	{
sl@0
   397
	aStatus = KRequestPending;
sl@0
   398
	SendReceive(EFsNotificationRequest,TIpcArgs(&aTailPckg),aStatus);
sl@0
   399
	}
sl@0
   400
sl@0
   401
TInt RFsNotify::CancelNotifications()
sl@0
   402
	{
sl@0
   403
	//there can only be one outstanding notification request at a time
sl@0
   404
	return (SendReceive(EFsNotificationCancel));
sl@0
   405
	}
sl@0
   406
sl@0
   407
//Adds notification filter
sl@0
   408
TInt RFsNotify::AddNotification(TUint aNotificationType, const TDesC& aPath, const TDesC& aFilename)
sl@0
   409
	{
sl@0
   410
	if(aNotificationType == 0 || (aPath.Length() <= 0 && aFilename.Length() <= 0))
sl@0
   411
		return KErrArgument;
sl@0
   412
	
sl@0
   413
	return (SendReceive(EFsNotificationAdd,TIpcArgs(aNotificationType,&aPath,&aFilename)));
sl@0
   414
	}
sl@0
   415
sl@0
   416
//Removes request, does not close session
sl@0
   417
TInt RFsNotify::RemoveNotifications()
sl@0
   418
	{
sl@0
   419
	return(SendReceive(EFsNotificationRemove));
sl@0
   420
	}
sl@0
   421
#else //SYMBIAN_F32_ENHANCED_CHANGE_NOTIFICATION
sl@0
   422
sl@0
   423
EXPORT_C TFsNotification::TFsNotificationType TFsNotification::NotificationType() const
sl@0
   424
	{
sl@0
   425
	Panic(ENotificationPanic);
sl@0
   426
	return (TFsNotification::TFsNotificationType)0;
sl@0
   427
	}
sl@0
   428
sl@0
   429
EXPORT_C TInt TFsNotification::Path(TPtrC&) const
sl@0
   430
	{
sl@0
   431
	Panic(ENotificationPanic);
sl@0
   432
	return KErrNotSupported;
sl@0
   433
	}
sl@0
   434
sl@0
   435
EXPORT_C TInt TFsNotification::NewName(TPtrC&) const
sl@0
   436
	{
sl@0
   437
	Panic(ENotificationPanic);
sl@0
   438
	return KErrNotSupported;
sl@0
   439
	}
sl@0
   440
sl@0
   441
EXPORT_C TInt TFsNotification::Attributes(TUint&,TUint&) const
sl@0
   442
	{
sl@0
   443
	Panic(ENotificationPanic);
sl@0
   444
	return KErrNotSupported;
sl@0
   445
	}
sl@0
   446
sl@0
   447
EXPORT_C TInt TFsNotification::FileSize(TInt64&) const
sl@0
   448
	{
sl@0
   449
	Panic(ENotificationPanic);
sl@0
   450
	return KErrNotSupported;
sl@0
   451
	}
sl@0
   452
sl@0
   453
/*
sl@0
   454
EXPORT_C TInt TFsNotification::DriveNumber(TInt&) const
sl@0
   455
	{
sl@0
   456
	Panic(ENotificationPanic);
sl@0
   457
	return KErrNotSupported;
sl@0
   458
	}
sl@0
   459
	
sl@0
   460
EXPORT_C TInt TFsNotification::UID(TUid& aUID) const
sl@0
   461
    {
sl@0
   462
 	Panic(ENotificationPanic);
sl@0
   463
	return KErrNotSupported;
sl@0
   464
    }
sl@0
   465
*/
sl@0
   466
sl@0
   467
EXPORT_C CFsNotify* CFsNotify::NewL(RFs& , TInt)
sl@0
   468
	{
sl@0
   469
	Panic(ENotificationPanic);
sl@0
   470
	User::Leave(KErrNotSupported);
sl@0
   471
	return NULL;
sl@0
   472
	}
sl@0
   473
sl@0
   474
EXPORT_C CFsNotify::~CFsNotify()
sl@0
   475
	{
sl@0
   476
	Panic(ENotificationPanic);
sl@0
   477
	}
sl@0
   478
sl@0
   479
EXPORT_C TInt CFsNotify::AddNotification(TUint, const TDesC&, const TDesC&)
sl@0
   480
	{
sl@0
   481
	Panic(ENotificationPanic);
sl@0
   482
	return KErrNotSupported;
sl@0
   483
	}
sl@0
   484
sl@0
   485
EXPORT_C TInt CFsNotify::RemoveNotifications()
sl@0
   486
	{
sl@0
   487
	Panic(ENotificationPanic);
sl@0
   488
	return KErrNotSupported;
sl@0
   489
	}
sl@0
   490
sl@0
   491
EXPORT_C TInt CFsNotify::RequestNotifications(TRequestStatus&)
sl@0
   492
	{
sl@0
   493
	Panic(ENotificationPanic);
sl@0
   494
	return KErrNotSupported;
sl@0
   495
	}
sl@0
   496
sl@0
   497
EXPORT_C TInt CFsNotify::CancelNotifications(TRequestStatus&)
sl@0
   498
	{
sl@0
   499
	Panic(ENotificationPanic);
sl@0
   500
	return KErrNotSupported;
sl@0
   501
	}
sl@0
   502
sl@0
   503
EXPORT_C const TFsNotification *  CFsNotify::NextNotification()
sl@0
   504
	{
sl@0
   505
	Panic(ENotificationPanic);
sl@0
   506
	return NULL;
sl@0
   507
	}
sl@0
   508
sl@0
   509
CFsNotificationList::~CFsNotificationList()
sl@0
   510
	{
sl@0
   511
	Panic(ENotificationPanic);
sl@0
   512
	}
sl@0
   513
sl@0
   514
CFsNotifyBody::CFsNotifyBody()
sl@0
   515
	{
sl@0
   516
	Panic(ENotificationPanic);
sl@0
   517
	}
sl@0
   518
sl@0
   519
CFsNotifyBody::~CFsNotifyBody()
sl@0
   520
	{
sl@0
   521
	Panic(ENotificationPanic);
sl@0
   522
	}
sl@0
   523
sl@0
   524
#endif //SYMBIAN_F32_ENHANCED_CHANGE_NOTIFICATION
sl@0
   525