userlibandfileserver/fileserver/sfile/sf_std.h
changeset 300 1d28c8722707
parent 286 48e57fb1237e
--- a/userlibandfileserver/fileserver/sfile/sf_std.h	Wed Oct 20 13:58:28 2010 +0100
+++ b/userlibandfileserver/fileserver/sfile/sf_std.h	Tue Nov 02 15:29:23 2010 +0000
@@ -34,7 +34,7 @@
 #include "sf_func.h"
 #include <f32plugin.h>
 #include "f32trace.h"
-
+#include "sf_pool.h"
 
 #define __PRINT1TEMP_ALWAYS(t,a) {{TBuf<KMaxFileName>temp(a);RDebug::Print(t,&temp);}}
 #define __PRINT2TEMP_ALWAYS(t,a,b) {{TBuf<KMaxFileName>temp(b);RDebug::Print(t,a,&temp);}}
@@ -455,6 +455,8 @@
 	EFsObjectOpen,
 	EContainerHeapCorruptionOnRemove,
 	ESessionOpenError,
+	ENotifyPoolCreation,
+	ENotificationInfoDeletion
 	};
 
 
@@ -1006,7 +1008,6 @@
 	TBool IsChangeNotify() const;
 	TBool IsDiskSpaceNotify() const;
 	TBool IsWrite() const;
-	TUint NotifyType() const;
 	TBool IsCompleted() const;
 	TBool IsOpenSubSess() const; //used to allocate for close as well as open task for subsessions
 	TBool IsCloseSubSess() const;
@@ -1209,8 +1210,10 @@
 	inline TInt FsFunction();
 	void Close();	// close the session & dispatch object this request is using
 
-public:
 	CFsRequest();
+	
+	virtual TUid Uid();
+	
 protected:
 	inline void Set(const TOperation& aOperation,CSessionFs* aSession);
 	inline void Set(CSessionFs* aSession);
@@ -1262,8 +1265,7 @@
 	{
 public:
 	void Set(const RMessage2& aMessage,CSessionFs* aSession);
-	void Set(const RMessage2& aMessage,const TOperation& aOperation,CSessionFs* aSession);
-	void Set(const TOperation& aOperation);
+	void Set(const RMessage2& aMessage,const TOperation& aOperation,CSessionFs* aSession, TUid aUid = TUid::Null());
 	inline void SetPostInitialise(TFsRequestFunc aCacheFunction);
 	//
 	inline void SetMessage(RMessage2& aMessage);
@@ -1305,8 +1307,7 @@
 	TBool IsPluginRequest();
 	static inline CFsMessageRequest* RequestFromMessage(const RMessagePtr2& aMessage);
 	
-   // UID of the process to touching the file. (To be used in notification framework).
-   // TUid iUID;
+	virtual TUid Uid();
 private:
 	void DoNotify(TInt aError);
 	void DoNotifyDiskSpace(TInt aError);
@@ -1327,6 +1328,7 @@
 private:
 	TMsgOperation* iCurrentOperation;
 	TInt iLastError;
+    TUid iUID;//UID of the process this message belongs to
 	};
 
 
@@ -1486,8 +1488,8 @@
 	{
 public:
 	void Initialise(TNotifyType aChangeType,TRequestStatus* aStatus,const RMessagePtr2& aMessage,CSessionFs* aSession);
-	TUint RequestNotifyType(CFsRequest* aRequest);
-	TBool IsMatching(CFsRequest* aRequest);
+	TUint RequestNotifyType(CFsNotificationInfo* aRequest);
+	TBool IsMatching(CFsNotificationInfo* aRequest);
 protected:
 	TNotifyType iChangeType;
 	};
@@ -1496,7 +1498,7 @@
 	{
 public:
 	void Initialise(TNotifyType aChangeType,TRequestStatus* aStatus,const RMessagePtr2& aMessage,CSessionFs* aSession,const TDesC& aName);
-	TBool IsMatching(CFsRequest* aRequest);
+	TBool IsMatching(CFsNotificationInfo* aRequest);
 private:
 	TFileName iName;
 	};
@@ -1557,7 +1559,7 @@
 	TInt AddNotify(CNotifyInfo* aInfo);
 	TBool CancelSession(CSessionFs* aSession,TInt aCompletionCode,TRequestStatus* aStatus=NULL);
 	void CancelAll(TInt aCompletionCode);
-	void CheckChange(CFsRequest* aRequest);
+	void CheckChange(CFsNotificationInfo& aNotificationInfo);
 	TBool IsEmpty();
 	};
 
@@ -1598,6 +1600,30 @@
 	TBool HandlePendingDismount(CSessionFs* aSession, TInt aDrive);
 	};
 
+class CFsNotificationInfo;
+
+class CFsNotificationInfoBody : public CBase
+    {
+public:
+    CFsNotificationInfoBody();
+private:    
+    TParsePtrC iSrc;
+    TBuf<2> iSrcBuf;
+    TParsePtrC iDest;
+    TBool iDestDriveStored;
+    TInt iDriveNumber;
+    TInt iFunction;
+    CFsRequest* iRequest; //Can be NULL
+    
+    //CFsNotify framework
+    TInt64 iData;
+    TNotificationType iNotificationType;
+    TUid iUid;
+    
+    friend class CFsNotificationInfo;
+    };
+
+
 class FsNotify
 	{
 public:
@@ -1607,7 +1633,7 @@
 	static TInt AddDebug(CNotifyInfo* aDebugInfo);
 	static TInt AddDismountNotify(CNotifyInfo* aDismountNotifyInfo);
 	static void DiskChange(TInt aDrive);
-	static void HandleChange(CFsRequest* aRequest,TInt aDrive);
+	static void HandleChange(CFsNotificationInfo& aNotificationInfo);
 	static void HandleDiskSpace(CFsRequest* aRequest,TInt aDrive);
 	static void HandleDiskSpace(TInt aDrive, TInt64& aFreeSpace);
 	static void HandleDebug(TUint aFunction);
@@ -1689,6 +1715,7 @@
 extern CFsObjectCon* RawDisks;
 extern CFsObjectCon* Extensions;
 extern CFsObjectCon* ProxyDrives;
+extern CFsPool<CFsNotificationInfo>* NotificationInfoPool;
 
 extern CKernEventNotifier* TheKernEventNotifier;
 
@@ -1767,18 +1794,18 @@
  TBool CompareResource(const TDesC & aThePath);
 
 #ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
- TInt PathCheck(CFsRequest* aRequest, const TDesC& aThePath, const TSecurityPolicy* aSysCap, const TSecurityPolicy* aPriCap, const char* aDiag);
- TInt PathCheck(CFsRequest* aRequest, const TDesC& aThePath, const TSecurityPolicy* aSysCap, const TSecurityPolicy* aPriCap, const TSecurityPolicy* aROCap, const char* aDiag);
- TInt PathCheck(CFsRequest* aRequest, const TDesC& aThePath,const TSecurityPolicy* aCap, const char* aDiag, TBool aExactMatchAllowed = EFalse);
+ TInt PathCheck(const RMessage2& aMessage, const TDesC& aThePath, const TSecurityPolicy* aSysCap, const TSecurityPolicy* aPriCap, const char* aDiag);
+ TInt PathCheck(const RMessage2& aMessage, const TDesC& aThePath, const TSecurityPolicy* aSysCap, const TSecurityPolicy* aPriCap, const TSecurityPolicy* aROCap, const char* aDiag);
+ TInt PathCheck(const RMessage2& aMessage, const TDesC& aThePath,const TSecurityPolicy* aCap, const char* aDiag, TBool aExactMatchAllowed = EFalse);
 #else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
- TInt PathCheck(CFsRequest* aRequest, const TDesC& aThePath, const TSecurityPolicy* aSysCap, const TSecurityPolicy* aPriCap, OnlyCreateWithNull aDiag);
- TInt PathCheck(CFsRequest* aRequest, const TDesC& aThePath, const TSecurityPolicy* aSysCap, const TSecurityPolicy* aPriCap, const TSecurityPolicy* aROCap, OnlyCreateWithNull aDiag); 
- TInt PathCheck(CFsRequest* aRequest, const TDesC& aThePath,const TSecurityPolicy* aCap, OnlyCreateWithNull aDiag, TBool aExactMatchAllowed = EFalse);
+ TInt PathCheck(const RMessage2& aRequest, const TDesC& aThePath, const TSecurityPolicy* aSysCap, const TSecurityPolicy* aPriCap, OnlyCreateWithNull aDiag);
+ TInt PathCheck(const RMessage2& aRequest, const TDesC& aThePath, const TSecurityPolicy* aSysCap, const TSecurityPolicy* aPriCap, const TSecurityPolicy* aROCap, OnlyCreateWithNull aDiag); 
+ TInt PathCheck(const RMessage2& aRequest, const TDesC& aThePath,const TSecurityPolicy* aCap, OnlyCreateWithNull aDiag, TBool aExactMatchAllowed = EFalse);
 #endif //!__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
 
  TBool ComparePrivate(const TDesC & aThePath);
  TBool CompareSystem(const TDesC & aThePath);
- TBool SIDCheck(CFsRequest* aRequest, const TDesC& aThePath);
+ TBool SIDCheck(const RMessage2& aMessage, const TDesC& aThePath);
  TBool ComparePaths(const TDesC& aPath1,const TDesC& aPath2);
  TUint32 CalcNameHash(const TDesC& aName);