userlibandfileserver/fileserver/sfile/sf_dat.cpp
changeset 0 a41df078684a
child 33 0173bcd7697c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/userlibandfileserver/fileserver/sfile/sf_dat.cpp	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,551 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// f32\sfile\sf_dat.cpp
+// 
+//
+
+#include "sf_std.h"
+
+
+CFsObjectConIx* TheContainer;
+CFsObjectCon* FileSystems;
+CFsObjectCon* Files;
+CFsObjectCon* FileShares;
+CFsObjectCon* Dirs;
+CFsObjectCon* Formats;
+CFsObjectCon* RawDisks;
+CFsObjectCon* Extensions;
+CFsObjectCon* ProxyDrives;
+
+CServerFs* TheFileServer;
+TDrive TheDrives[KMaxDrives];
+
+//#ifndef __SECURE_API__
+TFileName TheDefaultPath;
+//#endif
+
+HBufC* TheDriveNames[KMaxDrives];
+
+
+SCapabilitySet AllCapabilities;
+SCapabilitySet DisabledCapabilities;
+
+RThread TheServerThread;
+RAllocator* ServerThreadAllocator;
+TBool OpenOnDriveZOnly;
+TBool LocalFileSystemInitialized;
+TBool RefreshZDriveCache;
+TBool CompFsMounted;
+TBool CompFsSync;
+TBool StartupInitCompleted;
+TBool LocalDriveMappingSet;
+CKernEventNotifier* TheKernEventNotifier;
+RFTrace TheFtrace;
+
+
+GLDEF_D TCodePageUtils TheCodePage;
+
+TBool FatUtilityFunctionsSet = EFalse;              //-- Flag. Is set to ETrue when LoadLocale() sets a pointer to TFatUtilityFunctions
+TBool FatUtilitiesUpdateDrivesNotified = EFalse;    //-- Flag. Is set to ETrue when all drives get a notification about locale change
+
+
+
+#if defined(_DEBUG) || defined(_DEBUG_RELEASE)
+TInt ErrorCondition;
+TInt ErrorCount;
+TUint32 DebugReg;
+TInt UserHeapAllocFailCount;
+TInt KernHeapAllocFailCount;
+TInt DebugNCNotifier=0;
+TCorruptNameRec* gCorruptFileNameList=NULL;
+TCorruptLogRec* gCorruptLogRecordList=NULL;
+TInt gNumberOfCorruptHits=0;
+HBufC* gCorruptFileNamesListFile=NULL;
+
+#endif
+
+TBool F32Properties::iInitialised = 0;
+TInt  F32Properties::iRomAddress  = 0;
+TInt  F32Properties::iRomLength   = 0;
+
+EXPORT_C TBusLocalDrive& GetLocalDrive(TInt aDrive)
+//
+// Export localdrives
+//
+	{
+	return(LocalDrives::GetLocalDrive(aDrive));
+	}
+
+EXPORT_C TInt GetProxyDrive(TInt aDrive, CProxyDrive*& aProxyDrive)
+//
+// Export proxy drives
+//
+	{
+	return TheDrives[aDrive].CurrentMount().ProxyDrive(aProxyDrive);
+	}
+
+EXPORT_C CExtProxyDrive* GetProxyDrive(TInt aDrive)
+	{
+	return (LocalDrives::GetProxyDrive(aDrive));
+	}
+
+EXPORT_C TBool IsProxyDrive(TInt aDrive)
+	{
+	return (LocalDrives::IsProxyDrive(aDrive));
+	}
+
+EXPORT_C TBool IsValidLocalDriveMapping(TInt aDrive)
+//
+// Is the drive number to local drive mapping valid?
+//
+	{
+	return(LocalDrives::IsValidDriveMapping(aDrive));
+	}
+
+EXPORT_C TInt DriveNumberToLocalDriveNumber(TInt aDrive)
+//
+// Get the mapping from drive number to local drive
+//
+	{
+	return(LocalDrives::DriveNumberToLocalDriveNumber(aDrive));
+	}
+
+EXPORT_C TInt GetLocalDriveNumber(TBusLocalDrive* aLocDrv)
+//
+// Get the local drive number from local drive
+//
+	{
+	return(LocalDrives::GetLocalDriveNumber(aLocDrv));
+	}
+
+struct TFatUtilityFunctions;
+#if defined(_DEBUG) || defined(_DEBUG_RELEASE)
+TBool EnableFatUtilityFunctions = ETrue;
+#endif
+EXPORT_C const TFatUtilityFunctions* GetFatUtilityFunctions()
+	{
+#if defined(_DEBUG) || defined(_DEBUG_RELEASE)
+	if (!EnableFatUtilityFunctions)
+		{
+		return NULL; // Bypass Locale Dll/Codepage FAT converions, use default implementation
+		}
+#endif
+	switch(TheCodePage.CodepageLoaded())
+		{
+		case TCodePageUtils::ECodePageDll:
+			return ((TFatUtilityFunctions*)(TheCodePage.CodepageFatUtilityFunctions().iConvertFromUnicodeL));
+		case TCodePageUtils::ELocaleDll:
+			return TheCodePage.LocaleFatUtilityFunctions();
+		default:
+			return NULL; // if no Locale Dll/Codepage Dll is loaded, use default implementation
+		}
+	}
+
+EXPORT_C const TCodePageUtils& GetCodePage()
+	{
+	return TheCodePage;
+	}
+
+/**
+@internalTechnology
+Helper class for parsing F32 INI files
+*/
+class TIniFileReader
+	{
+public:
+	TIniFileReader(const TPtrC8& aData);
+	TInt Next();
+	TBool IsSection(const TDesC8& aSection = KNullDesC8);
+	TBool IsProperty(const TDesC8& aProperty, TBool& aPropVal);
+	TBool IsProperty(const TDesC8& aProperty, TInt32& aPropVal);
+	TBool IsProperty(const TDesC8& aProperty, TDes8& aPropVal);
+public:
+	const TPtrC8& iData;
+	TPtr8 iCurrentLine;
+	TInt iCurrentPos;
+	};	
+
+
+/**
+@internalTechnology
+TIniFileReader constructor
+*/
+TIniFileReader::TIniFileReader(const TPtrC8& aData)
+  : iData(aData),
+	iCurrentLine(NULL,0,256),
+    iCurrentPos(0)
+	{
+	}
+
+/**
+@internalTechnology
+
+Reads the next line from an F32 INI file.
+	- On exit, iCurrentLine represents the current line
+	- On exit, iCurrentPos points to the next line in the INI file
+*/
+TInt TIniFileReader::Next()
+	{
+	// Check if we have run into the end of the file	
+	TInt bufRemainder = (iData.Length()-iCurrentPos);
+	if (!bufRemainder)
+		{
+		return(KErrEof);
+		}
+		
+	// Setup the descriptor passed with the next record - don't include the record terminator
+	// The line terminators are CR + LF for DOS
+	// whereas only LF for Unix line endings
+	iCurrentLine.Set(((TUint8*)iData.Ptr()+iCurrentPos),bufRemainder,bufRemainder);
+	TInt len = iCurrentLine.Locate('\n');
+	if (len != KErrNotFound)
+		{
+		iCurrentPos += len;
+		// Check for DOS line ending to support both DOS and Unix formats
+		if ((len != 0) && (((TUint8*)iData.Ptr())[iCurrentPos-1] == '\r'))
+			{
+			len--;
+			}
+		iCurrentLine.SetLength(len);
+		}
+	else
+		{
+		iCurrentPos=iData.Length();
+		}
+	
+	// Point iCurrentPos to the next non-empty line
+	while (iCurrentPos<iData.Length() && (((TUint8*)iData.Ptr())[iCurrentPos]=='\n' || ((TUint8*)iData.Ptr())[iCurrentPos]=='\r'))
+		{
+		iCurrentPos++;
+		}
+	
+	// iCurrentLine now describes a single line of the INI file
+	return(KErrNone);
+	}
+
+/**
+@internalTechnology
+
+Examines the current INI line, returning ETrue if the line contains the requested INI section
+	- An INI section must be of the form [section_name]
+	- Passing KNullDesC as an argument returns ETrue if the line describes any INI section
+*/
+TBool TIniFileReader::IsSection(const TDesC8& aSection)
+	{
+	TInt sectionStart = iCurrentLine.Locate('[');
+	TInt sectionEnd   = iCurrentLine.Locate(']');
+	if(sectionStart == 0 && sectionEnd > 1)
+		{
+		if(aSection == KNullDesC8)
+			{
+			return(ETrue);
+			} 
+
+		const TInt sectionLength = sectionEnd-sectionStart-1;
+		// Found a start of section marker - does it match what we're interested in?
+		TPtr8 sectionPtr(&iCurrentLine[1+sectionStart], sectionLength, sectionLength);
+		if(sectionPtr == aSection)
+			{
+			return(ETrue);
+			}
+		}
+	return(EFalse);
+	}
+
+/**
+@internalTechnology
+
+Examines the current INI line, returning ETrue if the line contains the requested property
+*/
+TBool TIniFileReader::IsProperty(const TDesC8& aProperty, TBool& aPropVal)
+	{
+	TPtrC8 token;
+	TLex8 lex(iCurrentLine);
+	token.Set(lex.NextToken());
+	if (token.Length() == 0 || token != aProperty)
+		{
+		return(EFalse);
+		}
+
+	lex.SkipSpace();
+
+	TInt32 propVal;
+	if (lex.BoundedVal(propVal, 1) == KErrNone)
+		{
+		aPropVal = propVal;
+		return(ETrue);
+		}
+
+	// allow "on" or "off" strings if no integer found
+	_LIT8(KBoolOn,"ON");
+	_LIT8(KBoolOff,"OFF");
+
+	if (lex.Remainder().Left(KBoolOn().Length()).CompareF(KBoolOn) == KErrNone)
+		{
+		aPropVal = ETrue;
+		return(ETrue);
+		}
+	if (lex.Remainder().Left(KBoolOff().Length()).CompareF(KBoolOff) == KErrNone)
+		{
+		aPropVal = EFalse;
+		return(ETrue);
+		}
+
+	return(EFalse);
+	}
+
+/**
+@internalTechnology
+
+Examines the current INI line, returning ETrue if the line contains the requested property
+*/
+TBool TIniFileReader::IsProperty(const TDesC8& aProperty, TInt32& aPropVal)
+	{
+	TPtrC8 token;
+	TLex8 lex(iCurrentLine);
+	token.Set(lex.NextToken());
+	if (token.Length() == 0 || token != aProperty)
+		{
+		return(EFalse);
+		}
+
+	lex.SkipSpace();
+
+	TInt32 propVal;
+	if (lex.Val(propVal) != KErrNone)
+		{
+		return(EFalse);
+		}
+
+	aPropVal = propVal;
+
+	return(ETrue);
+	}
+
+/**
+@internalTechnology
+
+Examines the current INI line, returning ETrue if the line contains the requested property
+*/
+TBool TIniFileReader::IsProperty(const TDesC8& aProperty, TDes8& aPropVal)
+	{
+	TPtrC8 token;
+	TLex8 lex(iCurrentLine);
+	token.Set(lex.NextToken());
+	if (token.Length() == 0 || token != aProperty)
+		{
+		return(EFalse);
+		}
+
+	lex.SkipSpace();
+
+	aPropVal = lex.Remainder().Left(aPropVal.MaxLength());
+
+	return(ETrue);
+	}
+
+/**
+@internalTechnology
+
+Initialises the F32 properties with a ROM address representing the INI file in ROM
+
+@return KErrNone on success
+@return KErrAlreadyExists if the properties have already been initialised
+*/
+EXPORT_C TInt F32Properties::Initialise(TInt aRomAddress, TInt aLength)
+	{
+	if(iInitialised)
+		{
+		// F32 properties have already been initialised
+		return(KErrAlreadyExists);
+		}
+
+	iInitialised = ETrue;
+	iRomAddress  = aRomAddress;
+	iRomLength   = aLength;
+
+	return(KErrNone);
+	}
+
+/**
+@internalTechnology
+
+Returns the requested F32 property string
+
+@param aSection  The name of the F32 INI section
+@param aProperty The name of the F32 propery within the section
+@param aPropVal  Returns the requested property value (unchanged if the property does not exist)
+
+@return ETrue if the property exists, EFalse otherwise
+*/
+EXPORT_C TBool F32Properties::GetString(const TDesC8& aSection, const TDesC8& aProperty, TDes8& aPropVal)
+	{
+	if(!iInitialised)
+		{
+		return(EFalse);
+		}
+
+	TPtrC8 iniPtr((TUint8*)iRomAddress, iRomLength);
+	TIniFileReader iniReader(iniPtr);
+
+	FOREVER
+		{
+		// Read the next line of the INI file
+		if(iniReader.Next() == KErrEof)
+			{
+			break;
+			}		
+
+		if(iniReader.IsSection(aSection))
+			{
+			// Found the section we're interested in
+			//  - look for the property, until we get to EOF or the next section
+			FOREVER
+				{
+				if(iniReader.Next() == KErrEof)
+					{
+					return(EFalse);
+					}
+				
+				if(iniReader.IsSection())
+					{
+					return(EFalse);
+					}
+
+				if(iniReader.IsProperty(aProperty, aPropVal))
+					{
+					return(ETrue);
+					}
+				}
+			}
+		}
+
+	// No section found...
+	return(EFalse);
+	}
+
+/**
+@internalTechnology
+
+Returns the requested integer F32 property value
+
+@param aSection  The name of the F32 INI section
+@param aProperty The name of the F32 propery within the section
+@param aPropVal  Returns the requested property value (unchanged if the property does not exist)
+
+@return ETrue if the property exists, EFalse otherwise
+*/
+EXPORT_C TBool F32Properties::GetInt(const TDesC8& aSection, const TDesC8& aProperty, TInt32& aPropVal)
+	{
+	if(!iInitialised)
+		{
+		return(EFalse);
+		}
+
+	TPtrC8 iniPtr((TUint8*)iRomAddress, iRomLength);
+	TIniFileReader iniReader(iniPtr);
+
+	FOREVER
+		{
+		// Read the next line of the INI file
+		if(iniReader.Next() == KErrEof)
+			{
+			break;
+			}		
+
+		if(iniReader.IsSection(aSection))
+			{
+			// Found the section we're interested in
+			//  - look for the property, until we get to EOF or the next section
+			FOREVER
+				{
+				if(iniReader.Next() == KErrEof)
+					{
+					return(EFalse);
+					}
+				
+				
+				if(iniReader.IsSection())
+					{
+					return(EFalse);
+					}
+
+				if(iniReader.IsProperty(aProperty, aPropVal))
+					{
+					return(ETrue);
+					}
+				}
+			}
+		}
+
+	// No section found...
+	return(EFalse);
+	}
+
+/**
+@internalTechnology
+
+Returns the requested boolean F32 property value
+
+@param aSection  The name of the F32 INI section
+@param aProperty The name of the F32 propery within the section
+@param aPropVal  Returns the requested property value (unchanged if the property does not exist)
+
+@return ETrue if the property exists, EFalse otherwise
+*/
+EXPORT_C TBool F32Properties::GetBool(const TDesC8& aSection, const TDesC8& aProperty, TBool& aPropVal)
+	{
+	if(!iInitialised)
+		{
+		return(EFalse);
+		}
+
+	TPtrC8 iniPtr((TUint8*)iRomAddress, iRomLength);
+	TIniFileReader iniReader(iniPtr);
+
+	FOREVER
+		{
+		// Read the next line of the INI file
+		if(iniReader.Next() == KErrEof)
+			{
+			break;
+			}		
+
+		if(iniReader.IsSection(aSection))
+			{
+			// Found the section we're interested in
+			//  - look for the property, until we get to EOF or the next section
+			FOREVER
+				{
+				if(iniReader.Next() == KErrEof)
+					{
+					return(EFalse);
+					}
+				if(iniReader.IsSection())
+					{
+					return(EFalse);
+					}
+
+				if(iniReader.IsProperty(aProperty, aPropVal))
+					{
+					return(ETrue);
+					}
+				}
+			}
+		}
+
+	// No section found...
+	return(EFalse);
+	}
+