emulator/emulatorbsp/win_drive/settings_manager.cpp
changeset 0 cec860690d41
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/emulator/emulatorbsp/win_drive/settings_manager.cpp	Tue Feb 02 01:39:10 2010 +0200
@@ -0,0 +1,319 @@
+// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "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:
+// Implementation of the classes responsible for the settings handling in the .ini file
+// 
+//
+
+/**
+ @file
+*/
+
+#include "settings_manager.h"
+#include "win_media_device.h"
+
+//-----------------------------------------------------------------------------
+TSettingsManager::TSettingsManager(const char* apFileName, TInt aEpocDrvNumber)
+{
+    //-- store ini file name
+    ASSERT(lstrlenA(apFileName) < KMaxFileName);
+    lstrcpyA(iIniFileName, apFileName);
+
+    //-- make the drive section name e.g. [Drive_D]
+    ASSERT(aEpocDrvNumber >= EDriveA && aEpocDrvNumber <= EDriveZ);
+    wsprintfA(iDrvSectionName, "Drive_%C", 'A'+aEpocDrvNumber);
+}
+
+
+//-----------------------------------------------------------------------------
+/** 
+    Factory function
+*/
+TSettingsManager* TSettingsManager::Create(TInt aEpocDrvNumber)
+{
+    TSettingsManager* pThis = NULL;
+
+    const char* KDefaultEpocRootName = "EPOCROOT"; 
+
+    //-- try to find the configuration file. It must be: "\\epoc32\\data\\win_drive.ini"
+    char buf[KMaxFileName];
+
+    TInt nRes = GetEnvironmentVariableA(KDefaultEpocRootName, buf, sizeof(buf));
+    if(!nRes)
+    {
+     __LOG(_L("#-- TSettingsManager::Create() env. var. 'EPOCROOT' is not set!"));   
+     return NULL;
+    }
+
+    lstrcatA(buf, "epoc32\\data\\win_drive.ini");
+
+    //-- try to locate ini file
+    WIN32_FIND_DATAA wfd;
+    HANDLE hFile = FindFirstFileA(buf, &wfd);
+    const TBool bIniFilePresent = (hFile != INVALID_HANDLE_VALUE);
+    FindClose(hFile);
+
+    if(!bIniFilePresent)
+    {
+     __LOG(_L("#-- TSettingsManager::Create() ini file is not present, aborting!"));   
+     __LOGF(buf); 
+     return NULL;
+    }
+
+    pThis = new TSettingsManager(buf, aEpocDrvNumber);
+    
+    return pThis;
+}
+
+//-----------------------------------------------------------------------------
+/**
+    Read a string from the ini file.
+ 
+    @param  aAppName    pointer to the name of the section
+    @param  aKeyName    pointer to the name of the key
+    @param  aStrDefault pointer to the string with the default value
+    @param  aStrDest    pointer to the destination buffer
+    @param  aSize       size of the buffer, where the string to bee copied to.
+ 
+    @return length of the read string or length of the aStrDefault if the value hasn't been found
+*/
+DWORD TSettingsManager::ReadString (const char* aAppName, const char* aKeyName, const char* aStrDefault, char* aStrDest, DWORD aSize) const
+{
+    return GetPrivateProfileStringA(aAppName, aKeyName, aStrDefault, aStrDest, aSize, IniFileName());
+}
+
+
+/**
+    Read integer value from the ini file.
+ 
+    @param aAppName         pointer to the name of the section
+    @param aKeyName         pointer to the name of the key
+    @param aDefaultIntVal   default value, the result if section, key or value is not found
+ 
+    @return integer value from appropriate section and key, or aDefaultIntVal
+*/
+int TSettingsManager::ReadInt(const char* aAppName, const char* aKeyName, int aDefaultIntVal) const
+{
+    return GetPrivateProfileIntA(aAppName, aKeyName, aDefaultIntVal, IniFileName());
+}
+
+/**
+    Read a boolean value from the ini file.
+ 
+    @param aAppName        pointer to the name of the section
+    @param aKeyName        pointer to the name of the key
+    @param aDefaultBoolVal default value, the result if section, key of value is not found
+    @return     the boolean value or aDefaultBoolVal if section, key or value is not found
+*/
+TBool TSettingsManager::ReadBool(const char* aAppName, const char* aKeyName, int  aDefaultBoolVal) const
+{
+    return (ReadInt(aAppName, aKeyName, aDefaultBoolVal ? 1 : 0) != 0);
+}
+
+
+/**
+    read a hexadecimal value from the ini file.
+ 
+    @param aAppName pointer to the name of the section
+    @param aKeyName pointer to the name of the key
+    @param aVal     default value input, if there is a valid value in th eini file, it will be returned here
+    @return         ETrue if the valid value from ini file is read; EFalse otherwise.
+
+*/
+TBool TSettingsManager::ReadUintFromHex(const char* aAppName, const char* aKeyName, TUint32& aVal) const
+{
+    unsigned char buff[80];
+    
+    DWORD dwLen = ReadString(aAppName, aKeyName, "", (char*)buff, sizeof(buff));
+    if(!dwLen)
+        return EFalse;  //-- the value is not set
+        
+    //-- try to convert the string from hexadecimal representation to a number.
+    TLex8 lex(buff);
+    lex.SkipSpace();
+    
+    //-- skip '0x' prefix if it is present by chance
+    TPtrC8 rem = lex.Remainder();
+    TInt offset = rem.FindF(_L8("x"));
+    if(offset >= 0)
+        lex.Inc(offset+1);
+
+    TUint32 val32;
+    if(lex.Val(val32, EHex) == KErrNone)
+    {
+        aVal = val32;
+        return ETrue;
+    }        
+
+    return EFalse;
+}
+
+//-----------------------------------------------------------------------------
+/** 
+    Get media sector size in bytes. 
+    Usually it is 512 bytes, other values are not recommended.
+    
+    '0' means "auto", i.e. if the media allows, it will be queried for the sector size,
+    otherwise 512 bytes will be used.
+
+    @return media sector size in bytes. 
+*/
+TUint32 TSettingsManager::MediaSectorSize() const
+{
+    
+    const char KeyName[]="BytesPerSector";
+    const TInt KDefaultSPC = 0; //-- default value, means "use media settings or 512 bytes by default"
+    
+    return ReadInt(DriveSection(), KeyName, KDefaultSPC);
+}
+
+//-----------------------------------------------------------------------------
+/**
+    Get media size in sectors. See also MediaSectorSize().
+    '0' means "auto". i.e. size will be taken from windows media device (partition or image file)
+    
+    @return media size in sectors.  
+*/
+TUint32 TSettingsManager::MediaSizeInSectors() const
+{
+   
+    const char KeyName[]="MediaSizeInSectors";
+    const TInt KDefaultSzSec = 0; 
+
+    return ReadInt(DriveSection(), KeyName, KDefaultSzSec);
+}
+
+//-----------------------------------------------------------------------------
+/**
+    Get windows device name that will be used for media emulation.
+    like "\\\\.\\Z:" for a physical volume or "K:\\epoc32\\data\\media\\mmccrd0a.bin" for a image file.
+
+    @param  apszName pointer to the buffer, where the name will be copied to.
+    @param  aBufLen  length of the input buffer
+    @return ETrue on success
+*/
+TBool TSettingsManager::WinDeviceName(char* apszName, TUint aBufLen) const
+{
+    const char KeyName[]="DeviceName";
+    const char KDefaultValue[]="";
+
+    TInt nRes = ReadString(DriveSection(), KeyName, KDefaultValue, apszName, aBufLen);
+    
+    if(nRes == 0)
+    {
+    __LOG(_L("#-- TSettingsManager: 'DeviceName' key value isn't set !"));   
+    }
+
+    return ETrue;
+}
+
+
+//-----------------------------------------------------------------------------
+/**
+    @return ETrue if the device is Read-Only
+*/
+TBool TSettingsManager::IsReadOnly() const
+{
+    const char KeyName[]="ReadOnly";
+    const TBool KDefaultValue = EFalse; 
+
+    return ReadBool(DriveSection(), KeyName, KDefaultValue);
+}
+
+//-----------------------------------------------------------------------------
+/**
+    @return Media type override value from the ini file or 0 if it is not set there
+*/
+TUint32 TSettingsManager::TMediaType_Override() const
+{
+    const char KeyName[]="MediaTypeOverride";
+    const TInt KDefaultVal = 0; 
+
+    return ReadInt(DriveSection(), KeyName, KDefaultVal);
+}
+
+//-----------------------------------------------------------------------------
+
+/**
+    Get Media Attributes override "AND" and "OR" bitmasks. (the need to be in hex in the ini file).
+    
+    @param  aAndMask    On return contains "And" mask; default value == 0xFFFFFFFF
+    @param  aOrMask     On return contains "OR" mask;  default value == 0x00
+*/
+void TSettingsManager::MediaAtt_OverrideMasks(TUint32 &aAndMask, TUint32 &aOrMask) const
+{
+    TUint32 defVal;
+
+    //-- 1. read "AND" mask
+    defVal = KMaxTUint;
+    const char KeyName1[]="MediaAttOverride_AND";
+    TBool bRes = ReadUintFromHex(DriveSection(), KeyName1, defVal);
+    aAndMask = defVal;
+
+    //-- 2. read "OR" mask
+    const char KeyName2[]="MediaAttOverride_OR";
+    defVal = 0;
+    bRes = ReadUintFromHex(DriveSection(), KeyName2, defVal);
+    aOrMask = defVal;
+}
+
+//-----------------------------------------------------------------------------
+/**
+    Get Drive Attributes override "AND" and "OR" bitmasks. (the need to be in hex in the ini file).
+    
+    @param  aAndMask    On return contains "And" mask; default value == 0xFFFFFFFF
+    @param  aOrMask     On return contains "OR" mask;  default value == 0x00
+*/
+void TSettingsManager::DriveAtt_OverrideMasks(TUint32 &aAndMask, TUint32 &aOrMask) const
+{
+    TUint32 defVal;
+
+    //-- 1. read "AND" mask
+    defVal = KMaxTUint;
+    const char KeyName1[]="DriveAttOverride_AND";
+    TBool bRes = ReadUintFromHex(DriveSection(), KeyName1, defVal);
+    aAndMask = defVal;
+
+    //-- 2. read "OR" mask
+    const char KeyName2[]="DriveAttOverride_OR";
+    defVal = 0;
+    bRes = ReadUintFromHex(DriveSection(), KeyName2, defVal);
+    aOrMask = defVal;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+