diff -r c7c26511138f -r 360bd6b35136 imgtools/imglib/host/h_utl.cpp --- a/imgtools/imglib/host/h_utl.cpp Wed Jun 16 16:51:40 2010 +0300 +++ b/imgtools/imglib/host/h_utl.cpp Wed Jun 23 16:56:47 2010 +0800 @@ -1,684 +1,714 @@ -/* -* 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: -* -*/ - - - -#define __INCLUDE_CAPABILITY_NAMES__ - -#if defined(_MSVCDOTNET__) || defined(__TOOLS2__) -#include -#else //!__MSVCDOTNET__ -#include -#endif //__MSVCDOTNET__ - -#include -#include - -#include -#include - -#include "h_utl.h" - -#ifdef __LINUX__ - - // Convert the supplied string to uppercase, in-place - char* strupr(char *a) - { - char *ret = a; - - while (*a) - { - *a = toupper(*a); - a++; - } - - return ret; - } - - off_t filelength(int filedes) - { - struct stat buf; - if(!fstat(filedes, &buf)) - { - return buf.st_size; - } - perror("fstat failed"); - return 0; - } - -#endif - -TBool PVerbose=ETrue; - -HPrint H; - -HPrint::~HPrint() - { - iLogFile.close(); - } - -void HPrint::SetLogFile(TText *aFileName) - { - iLogFile.open((const char *)aFileName); - } - - -/** -Closing the logfile.(since 'n' number of drive images can be created) - -@internalComponent -@released - -*/ -void HPrint::CloseLogFile() - { - if(iLogFile.is_open()) - iLogFile.close(); - } - -TInt HPrint::PrintString(TPrintType aType,const char *aFmt,...) -// -// Print text, noting where to send it. -// - { - - TInt r=KErrNone; - va_list list; - va_start(list,aFmt); - _vsnprintf((char *)iText,KMaxStringLength,aFmt,list); - va_end(list); - switch (aType) - { - case EAlways: - cout << iText; - iLogFile << iText; - break; - case EScreen: - cout << iText; - break; - case ELog: - if (iVerbose) - cout << iText; - iLogFile << iText; - break; - case EWarning: - cerr << "WARNING: " << iText; - iLogFile << "WARNING: "<>(istringstream &is, TVersion &aVersion) -#else -istrstream &operator>>(istrstream &is, TVersion &aVersion) -#endif -// -// Input a TVersion with syntax: major[.minor][(build)] -// - { -#ifdef __TOOLS2__ -string tmp = is.str(); -const char *str=tmp.c_str(); -#else -#ifdef __LINUX__ - char *str = is.rdbuf()->str(); -#else - char *str=is.str(); -#endif -#endif - - - TInt build=0; - memset(&aVersion, sizeof(TVersion), 0); - TInt i; - TInt len=strlen(str); - for (i=0; i 127) - { - cout << "\n Warning: major version must be in range 0 - 127 \n"; - } - char* pMinor = strchr(str, '.'); - if (pMinor) - { - pMinor++; - aVersion.iMinor = (TInt8)Min(KMaxTInt8, atoi(pMinor)); - int minorV = atoi(pMinor); - // iMinor is defined as TInt8 so it should not be bigger than 127 - if (minorV > 127) - { - cout << "\n Warning: minor version must be in range 0 - 127 \n"; - } - } - aVersion.iBuild=(TInt16)build; - return is; - } - -TInt Locate(const char *aString, char aChar) -// -// Locate aChar in aString -// - { - - if (aString==NULL) - return KErrNotFound; - TInt i=0; - while (*aString!=0) - { - if (*aString==aChar) - return i; - aString++; - i++; - } - return KErrNotFound; - } - - -#define KHoursToMicroSeconds Int64(3600000000UL) -#define KDaysToMicroSeconds (Int64(24)*KHoursToMicroSeconds) -const TInt KMinutesToMicroSeconds = 60000000; -const TInt KSecondsToMicroSeconds = 1000000; - -const TInt8 mTab[2][12]= - { - {31,28,31,30,31,30,31,31,30,31,30,31}, // 28 days in Feb - {31,29,31,30,31,30,31,31,30,31,30,31} // 29 days in Feb - }; - -TInt Time::LeapYearsUpTo(TInt aYear) -// -// from 0AD to present year according to the rule above -// - { - - if (aYear<=0) - return(aYear/4); - if (aYear<=1600) - return(1+((aYear-1)/4)); - TInt num=401; // 1600/4+1 - aYear-=1601; - num+=(aYear/4-aYear/100+aYear/400); - return(num); - } - -TBool Time::IsLeapYear(TInt aYear) -// -// up to and including 1600 leap years were every 4 years,since then leap years are every 4 years unless -// the year falls on a century which is not divisible by 4 (ie 1900 wasnt,2000 will be) -// for simplicity define year 0 as a leap year -// - { - - if (aYear>1600) - return(!(aYear%4) && (aYear%100 || !(aYear%400))); - return(!(aYear%4)); - } - - -Int64 ConvertTime(TInt aDay, TInt aMonth, TInt aYear, TInt aHour, TInt aMinute, TInt aSecond, TInt aMilliSeconds) -// -// converts TDateTime into a TTime, doesnt check for overflows -// - { - - TInt days=365*aYear+Time::LeapYearsUpTo(aYear); - TBool isleap=Time::IsLeapYear(aYear); - for (TInt ii=0; ii> dec >> day; // locks istrstream in decimal mode for further extractions - val >> ch; - if (ch!='/') - return KErrGeneral; - val >> month; - val >> ch; - if (ch!='/') - return KErrGeneral; - val >> year; - val >> ch; - - if (ch=='_') - { - // time too. - val >> hour; - val >> ch; - if (ch!=':') - return KErrGeneral; - val >> minute; - val >> ch; - if (ch!=':') - return KErrGeneral; - val >> sec; - val >> ch; - if (ch=='.') - { - val >> mill; - } - } - - if (day<1 || day>31) - return KErrArgument; - if (month<1 || month>12) - return KErrArgument; - if (year<1970 || year>2060) - return KErrArgument; - if (hour<0 || hour>23) - return KErrArgument; - if (minute<0 || minute>59) - return KErrArgument; - if (sec<0 || sec>59) - return KErrArgument; - if (mill<0 || mill>999999) - return KErrArgument; - - aTime=ConvertTime(day-1, month-1, year, hour, minute, sec, mill); - return KErrNone; - } - -void ByteSwap(TUint &aVal) - { - TUint t0=aVal & 0xff; - TUint t1=(aVal>>8) & 0xff; - TUint t2=(aVal>>16) & 0xff; - TUint t3=aVal>>24; - aVal=(t0 << 24) | (t1 << 16) | (t2 << 8) | (t3); - } - -void ByteSwap(TUint16 &aVal) - { - TUint16 t0=(TUint16)((aVal >> 8) & 0xff); - TUint16 t1=(TUint16)(aVal & 0xff); - aVal=(TUint16)((t1 << 8) | t0); - } - -void ByteSwap(TUint *aPtr, TInt aSize) - { - - while ((aSize-=4)>=0) - ByteSwap(*aPtr++); - } - -TBool IsBracketedHex(const char* s, const char* brackets, TInt digits, TUint32& aValue) - { - if (s[0]!=brackets[0] || s[1+digits]!=brackets[1]) - return EFalse; - TInt i; - TUint32 x = 0; - for (i=1; i<=digits; ++i) - { - TInt c = s[i]; - if (c>='a' && c<='z') c-=32; - if (c<'0' || (c>'9' && c<'A') || c>'F') - return EFalse; - c-='0'; - if (c>9) c-=7; - x = (x<<4) | (TUint32)c; - } - aValue = x; - return ETrue; - } - -TInt CheckForDecimalVersion(const char* begin, const char* s, TUint32& aValue) - { - aValue = 0; - if (s <= begin || *s != '}') - return 0; - TUint32 v[2] = {0,0}; - TUint32 m = 1; - TInt pos = 0; - const char* s0 = s + 1; - for (--s; s >= begin; --s) - { - int c = *s; - if (c >= '0' && c <= '9') - { - v[pos] += m * (c - '0'); - if (v[pos] >= 65536u) - return 0; - m *= 10; - } - else if (c == '.') - { - m = 1; - if (++pos >= 2) - return 0; - } - else if (c == '{') - break; - else - return 0; - } - if (s < begin) - return 0; - aValue = (v[1] << 16) | v[0]; - return s0 - s; - } - -// Decompose a name of the form NAME{MMMMmmmm}[UUUUUUUU].EXT where the bracketed -// sections and extension are both optional. -// Return a newly malloc-ed string containing NAME.EXT -// Set aUid = 0xUUUUUUUU if present, 0 if not -// Set aModuleVersion = 0xMMMMmmmm if present, 0 if not -// Set aFlags according to which of these are present -char* SplitFileName(const char* aName, TUint32& aUid, TUint32& aModuleVersion, TUint32& aFlags) - { - TFileNameInfo f(aName, ETrue); - aUid = f.iUid3; - aModuleVersion = f.iModuleVersion; - aFlags = f.iFlags; - TInt nl = f.iBaseLength; - TInt el = f.iTotalLength - f.iExtPos; - TInt tl = nl + el; - char* t = (char*)malloc(tl + 1); - if (t) - { - memcpy(t, aName, nl); - if (el) - memcpy(t + nl, aName + f.iExtPos, el); - t[tl] = 0; - } - return t; - } - - -// Decompose a name of the form NAME{MMMMmmmm}.EXT where the bracketed -// sections and extension are both optional. -// Return a newly malloc-ed string containing NAME.EXT -// Set aModuleVersion = 0xMMMMmmmm if present, 0 if not -// Set aFlags according to whether version present -char* SplitFileName(const char* aName, TUint32& aModuleVersion, TUint32& aFlags) - { - TFileNameInfo f(aName, EFalse); - aModuleVersion = f.iModuleVersion; - aFlags = f.iFlags; - TInt nl = f.iBaseLength; - TInt el = f.iTotalLength - f.iExtPos; - TInt tl = nl + el; - char* t = (char*)malloc(tl + 1); - if (t) - { - memcpy(t, aName, nl); - if (el) - memcpy(t + nl, aName + f.iExtPos, el); - t[tl] = 0; - } - return t; - } - - -// Parse a filename and convert decimal version number to hex -char* NormaliseFileName(const char* aName) -{ - //convert forward slashes into back slashes. - char* filename = strdup(aName); //prevent violated access from stack. - char* fwdslashfinder = filename; - fwdslashfinder=strstr(fwdslashfinder, "/"); - while(fwdslashfinder) - { - *fwdslashfinder++ = '\\'; - fwdslashfinder=strstr(fwdslashfinder, "/"); - } - - //normalize filename. - TFileNameInfo f(filename, EFalse); - TInt nl = f.iBaseLength; - TInt el = f.iTotalLength - f.iExtPos; - TInt tl = nl + el; - if (f.iFlags & EVerPresent) - tl += 10; - char* t = (char*)malloc(tl + 1); - if (t) - { - memcpy(t, filename, nl); - if (f.iFlags & EVerPresent) - sprintf(t + nl, "{%08lx}%s", f.iModuleVersion, filename + f.iExtPos); - else if (el) - memcpy(t + nl, filename + f.iExtPos, el); - t[tl] = 0; - } - free(filename); - - return t; -} - -TFileNameInfo::TFileNameInfo(const char* aFileName, TBool aLookForUid) - { - iFileName = aFileName; - TInt l = strlen(aFileName); - iTotalLength = l; - TInt remain = l; - iFlags = 0; - iUid3 = 0; - iModuleVersion = 0; - iBaseLength = l; - iExtPos = l; - const char* s = iFileName + l; - for (; s>=iFileName && *s!='.' && *s!='}' && (!aLookForUid || *s!=']'); --s) {} - if (s=10 && IsBracketedHex(s-9, "[]", 8, iUid3)) - { - iFlags |= EUidPresent; - remain -= 10; - s -= 10; - } - if (remain>=10 && IsBracketedHex(s-9, "{}", 8, iModuleVersion)) - { - iFlags |= EVerPresent; - remain -= 10; - s -= 10; - } - else - { - TInt n = CheckForDecimalVersion(iFileName, s, iModuleVersion); - if (n>0) - { - iFlags |= EVerPresent; - remain -= n; - s -= n; - } - } - iBaseLength = remain; - } - - -#define PARSE_CAPABILITIES_ERROR(aMessage) Print(EError, "%s\n",aMessage) -#define PARSE_CAPABILITIES_ERROR2(aMessage1,aMessage2) Print(EError, "%s%s\n",aMessage1,aMessage2) - -TInt ParseCapabilitiesArg(SCapabilitySet& aCapabilities, const char *aText) -// -// This is a cun'n'paste copy of the function in BASE\WINS\SPECIFIC\PROPERTY.CPP -// Keep both of these versions up to date with each other -// - { - memset(&aCapabilities,0,sizeof(aCapabilities)); - char c; - while((c=*aText)!=0) - { - if(c<=' ') - { - ++aText; - continue; - } - int invert=0; - if(c=='+') - { - ++aText; - c=*aText; - } - if(c=='-') - { - invert=1; - ++aText; - } - const char* name = aText; - while((c=*aText)>' ') - { - if(c=='-' || c=='+') - break; - ++aText; - } - TUint n = aText-name; - TInt i; - - if(n==3 && strnicmp("all",name,n)==0) - { - if(invert) - { - PARSE_CAPABILITIES_ERROR("Capability '-ALL' not allowed"); - return KErrArgument; - } - for(i=0; i>5] |= (1<<(i&31)); - } - continue; - } - - if(n==4 && strnicmp("none",name,n)==0) - { - if(invert) - { - PARSE_CAPABILITIES_ERROR("Capability '-NONE' not allowed"); - return KErrArgument; - } - memset(&aCapabilities,0,sizeof(aCapabilities)); - continue; - } - - for(i=0; i=ECapability_Limit) - { - char badName[32]; - if(n>=sizeof(badName)) n=sizeof(badName)-1; - memcpy(badName,name,n); - badName[n]=0; - PARSE_CAPABILITIES_ERROR2("Unrecognised capability name: ",badName); - return KErrArgument; - } - if(invert) - aCapabilities[i>>5] &= ~(1<<(i&31)); - else - aCapabilities[i>>5] |= (1<<(i&31)); - } - return KErrNone; - } - -TInt ParseBoolArg(TBool& aValue, const char *aText) - { - if (_stricmp(aText, "on")==0 || _stricmp(aText, "yes")==0 || _stricmp(aText, "1")==0 || strlen(aText)==0) - { - aValue = ETrue; - return KErrNone; - } - if (_stricmp(aText, "off")==0 || _stricmp(aText, "no")==0 || _stricmp(aText, "0")==0 ) - { - aValue = EFalse; - return KErrNone; - } - Print(EError, "Expected a boolean on/off value but found %s\n",aText); - return KErrArgument; - } +/* +* 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: +* +*/ + + + +#define __INCLUDE_CAPABILITY_NAMES__ + +#if defined(_MSVCDOTNET__) || defined(__TOOLS2__) + +#else //!__MSVCDOTNET__ +#include +#endif //__MSVCDOTNET__ + +#include +#include + +#include +#include + +#include "h_utl.h" + +#ifdef __LINUX__ + + // Convert the supplied string to uppercase, in-place + char* strupr(char *a) + { + char *ret = a; + + while (*a) + { + *a = toupper(*a); + a++; + } + + return ret; + } + + off_t filelength(int filedes) + { + struct stat buf; + if(!fstat(filedes, &buf)) + { + return buf.st_size; + } + perror("fstat failed"); + return 0; + } + +#endif + +TBool PVerbose=ETrue; + +HPrint H; + +HPrint::~HPrint() + { + iLogFile.close(); + } + +void HPrint::SetLogFile(const char* aFileName) + { + iLogFile.open(aFileName); + } + + +/** +Closing the logfile.(since 'n' number of drive images can be created) + +@internalComponent +@released + +*/ +void HPrint::CloseLogFile() + { + if(iLogFile.is_open()) + iLogFile.close(); + } + +TInt HPrint::PrintString(TPrintType aType,const char *aFmt,...) +// +// Print text, noting where to send it. +// + { + + TInt r=KErrNone; + va_list list; + va_start(list,aFmt); + _vsnprintf((char *)iText,KMaxStringLength,aFmt,list); + va_end(list); + switch (aType) + { + case EAlways: + cout << iText; + iLogFile << iText; + break; + case EScreen: + cout << iText; + break; + case ELog: + if (iVerbose) + cout << iText; + iLogFile << iText; + break; + case EWarning: + cerr << "WARNING: " << iText; + iLogFile << "WARNING: "<>(istringstream &is, TVersion &aVersion) +#else +istrstream &operator>>(istrstream &is, TVersion &aVersion) +#endif +// +// Input a TVersion with syntax: major[.minor][(build)] +// + { +#ifdef __TOOLS2__ +string tmp = is.str(); +const char *str=tmp.c_str(); +#else +#ifdef __LINUX__ + char *str = is.rdbuf()->str(); +#else + char *str=is.str(); +#endif +#endif + + + TInt build=0; + memset(&aVersion, sizeof(TVersion), 0); + TInt i; + TInt len=strlen(str); + for (i=0; i 127) + { + cout << "\n Warning: major version must be in range 0 - 127 \n"; + } + char* pMinor = strchr(str, '.'); + if (pMinor) + { + pMinor++; + aVersion.iMinor = (TInt8)Min(KMaxTInt8, atoi(pMinor)); + int minorV = atoi(pMinor); + // iMinor is defined as TInt8 so it should not be bigger than 127 + if (minorV > 127) + { + cout << "\n Warning: minor version must be in range 0 - 127 \n"; + } + } + aVersion.iBuild=(TInt16)build; + return is; + } + +TInt Locate(const char *aString, char aChar) +// +// Locate aChar in aString +// + { + + if (aString==NULL) + return KErrNotFound; + TInt i=0; + while (*aString!=0) + { + if (*aString==aChar) + return i; + aString++; + i++; + } + return KErrNotFound; + } + + +#define KHoursToMicroSeconds Int64(3600000000UL) +#define KDaysToMicroSeconds (Int64(24)*KHoursToMicroSeconds) +const TInt KMinutesToMicroSeconds = 60000000; +const TInt KSecondsToMicroSeconds = 1000000; + +const TInt8 mTab[2][12]= + { + {31,28,31,30,31,30,31,31,30,31,30,31}, // 28 days in Feb + {31,29,31,30,31,30,31,31,30,31,30,31} // 29 days in Feb + }; + +TInt Time::LeapYearsUpTo(TInt aYear) +// +// from 0AD to present year according to the rule above +// + { + + if (aYear<=0) + return(aYear/4); + if (aYear<=1600) + return(1+((aYear-1)/4)); + TInt num=401; // 1600/4+1 + aYear-=1601; + num+=(aYear/4-aYear/100+aYear/400); + return(num); + } + +TBool Time::IsLeapYear(TInt aYear) +// +// up to and including 1600 leap years were every 4 years,since then leap years are every 4 years unless +// the year falls on a century which is not divisible by 4 (ie 1900 wasnt,2000 will be) +// for simplicity define year 0 as a leap year +// + { + + if (aYear>1600) + return(!(aYear%4) && (aYear%100 || !(aYear%400))); + return(!(aYear%4)); + } + + +Int64 ConvertTime(TInt aDay, TInt aMonth, TInt aYear, TInt aHour, TInt aMinute, TInt aSecond, TInt aMilliSeconds) +// +// converts TDateTime into a TTime, doesnt check for overflows +// + { + + TInt days=365*aYear+Time::LeapYearsUpTo(aYear); + TBool isleap=Time::IsLeapYear(aYear); + for (TInt ii=0; ii> dec >> day; // locks istrstream in decimal mode for further extractions + val >> ch; + if (ch!='/') + return KErrGeneral; + val >> month; + val >> ch; + if (ch!='/') + return KErrGeneral; + val >> year; + val >> ch; + + if (ch=='_') + { + // time too. + val >> hour; + val >> ch; + if (ch!=':') + return KErrGeneral; + val >> minute; + val >> ch; + if (ch!=':') + return KErrGeneral; + val >> sec; + val >> ch; + if (ch=='.') + { + val >> mill; + } + } + + if (day<1 || day>31) + return KErrArgument; + if (month<1 || month>12) + return KErrArgument; + if (year<1970 || year>2060) + return KErrArgument; + if (hour<0 || hour>23) + return KErrArgument; + if (minute<0 || minute>59) + return KErrArgument; + if (sec<0 || sec>59) + return KErrArgument; + if (mill<0 || mill>999999) + return KErrArgument; + + aTime=ConvertTime(day-1, month-1, year, hour, minute, sec, mill); + return KErrNone; + } + +void ByteSwap(TUint &aVal) + { + TUint t0=aVal & 0xff; + TUint t1=(aVal>>8) & 0xff; + TUint t2=(aVal>>16) & 0xff; + TUint t3=aVal>>24; + aVal=(t0 << 24) | (t1 << 16) | (t2 << 8) | (t3); + } + +void ByteSwap(TUint16 &aVal) + { + TUint16 t0=(TUint16)((aVal >> 8) & 0xff); + TUint16 t1=(TUint16)(aVal & 0xff); + aVal=(TUint16)((t1 << 8) | t0); + } + +void ByteSwap(TUint *aPtr, TInt aSize) + { + + while ((aSize-=4)>=0) + ByteSwap(*aPtr++); + } + +TBool IsBracketedHex(const char* s, const char* brackets, TInt digits, TUint32& aValue) + { + if (s[0]!=brackets[0] || s[1+digits]!=brackets[1]) + return EFalse; + TInt i; + TUint32 x = 0; + for (i=1; i<=digits; ++i) + { + TInt c = s[i]; + if (c>='a' && c<='z') c-=32; + if (c<'0' || (c>'9' && c<'A') || c>'F') + return EFalse; + c-='0'; + if (c>9) c-=7; + x = (x<<4) | (TUint32)c; + } + aValue = x; + return ETrue; + } + +TInt CheckForDecimalVersion(const char* begin, const char* s, TUint32& aValue) + { + aValue = 0; + if (s <= begin || *s != '}') + return 0; + TUint32 v[2] = {0,0}; + TUint32 m = 1; + TInt pos = 0; + const char* s0 = s + 1; + for (--s; s >= begin; --s) + { + int c = *s; + if (c >= '0' && c <= '9') + { + v[pos] += m * (c - '0'); + if (v[pos] >= 65536u) + return 0; + m *= 10; + } + else if (c == '.') + { + m = 1; + if (++pos >= 2) + return 0; + } + else if (c == '{') + break; + else + return 0; + } + if (s < begin) + return 0; + aValue = (v[1] << 16) | v[0]; + return s0 - s; + } + +// Decompose a name of the form NAME{MMMMmmmm}[UUUUUUUU].EXT where the bracketed +// sections and extension are both optional. +// Return a newly malloc-ed string containing NAME.EXT +// Set aUid = 0xUUUUUUUU if present, 0 if not +// Set aModuleVersion = 0xMMMMmmmm if present, 0 if not +// Set aFlags according to which of these are present +char* SplitFileName(const char* aName, TUint32& aUid, TUint32& aModuleVersion, TUint32& aFlags) + { + TFileNameInfo f(aName, ETrue); + aUid = f.iUid3; + aModuleVersion = f.iModuleVersion; + aFlags = f.iFlags; + TInt nl = f.iBaseLength; + TInt el = f.iTotalLength - f.iExtPos; + TInt tl = nl + el; + char* t = (char*)malloc(tl + 1); + if (t) + { + memcpy(t, aName, nl); + if (el) + memcpy(t + nl, aName + f.iExtPos, el); + t[tl] = 0; + } + return t; + } + + +// Decompose a name of the form NAME{MMMMmmmm}.EXT where the bracketed +// sections and extension are both optional. +// Return a newly malloc-ed string containing NAME.EXT +// Set aModuleVersion = 0xMMMMmmmm if present, 0 if not +// Set aFlags according to whether version present +char* SplitFileName(const char* aName, TUint32& aModuleVersion, TUint32& aFlags) + { + TFileNameInfo f(aName, EFalse); + aModuleVersion = f.iModuleVersion; + aFlags = f.iFlags; + TInt nl = f.iBaseLength; + TInt el = f.iTotalLength - f.iExtPos; + TInt tl = nl + el; + char* t = (char*)malloc(tl + 1); + if (t) + { + memcpy(t, aName, nl); + if (el) + memcpy(t + nl, aName + f.iExtPos, el); + t[tl] = 0; + } + return t; + } + + +// Parse a filename and convert decimal version number to hex +char* NormaliseFileName(const char* aName) { + //convert forward slashes into back slashes. + char* filename = strdup(aName); //prevent violated access from stack. +#ifdef WIN32 +#define SPLIT_CHAR1 '/' +#define SPLIT_CHAR2 '\\' +#else +#define SPLIT_CHAR1 '\\' +#define SPLIT_CHAR2 '/' +#endif + char* fwdslashfinder = filename; + fwdslashfinder=strchr(fwdslashfinder, SPLIT_CHAR1); + while(fwdslashfinder){ + *fwdslashfinder++ = SPLIT_CHAR2; + fwdslashfinder=strchr(fwdslashfinder, SPLIT_CHAR1); + } + + //normalize filename. + TFileNameInfo f(filename, EFalse); + TInt nl = f.iBaseLength; + TInt el = f.iTotalLength - f.iExtPos; + TInt tl = nl + el; + if (f.iFlags & EVerPresent) + tl += 10; + char* t = new char[tl + 1]; + if (t) { + memcpy(t, filename, nl); + if (f.iFlags & EVerPresent) + sprintf(t + nl, "{%08lx}%s", f.iModuleVersion, filename + f.iExtPos); + else if (el) + memcpy(t + nl, filename + f.iExtPos, el); + t[tl] = 0; + } + free(filename); + return t; +} + +TFileNameInfo::TFileNameInfo(const char* aFileName, TBool aLookForUid) + { + iFileName = aFileName; + TInt l = strlen(aFileName); + iTotalLength = l; + TInt remain = l; + iFlags = 0; + iUid3 = 0; + iModuleVersion = 0; + iBaseLength = l; + iExtPos = l; + const char* s = iFileName + l; + for (; s>=iFileName && *s!='.' && *s!='}' && (!aLookForUid || *s!=']'); --s) {} + if (s=10 && IsBracketedHex(s-9, "[]", 8, iUid3)) + { + iFlags |= EUidPresent; + remain -= 10; + s -= 10; + } + if (remain>=10 && IsBracketedHex(s-9, "{}", 8, iModuleVersion)) + { + iFlags |= EVerPresent; + remain -= 10; + s -= 10; + } + else + { + TInt n = CheckForDecimalVersion(iFileName, s, iModuleVersion); + if (n>0) + { + iFlags |= EVerPresent; + remain -= n; + s -= n; + } + } + iBaseLength = remain; + } + + +#define PARSE_CAPABILITIES_ERROR(aMessage) Print(EError, "%s\n",aMessage) +#define PARSE_CAPABILITIES_ERROR2(aMessage1,aMessage2) Print(EError, "%s%s\n",aMessage1,aMessage2) + +TInt ParseCapabilitiesArg(SCapabilitySet& aCapabilities, const char *aText) +// +// This is a cun'n'paste copy of the function in BASE\WINS\SPECIFIC\PROPERTY.CPP +// Keep both of these versions up to date with each other +// + { + memset(&aCapabilities,0,sizeof(aCapabilities)); + char c; + while((c=*aText)!=0) + { + if(c<=' ') + { + ++aText; + continue; + } + int invert=0; + if(c=='+') + { + ++aText; + c=*aText; + } + if(c=='-') + { + invert=1; + ++aText; + } + const char* name = aText; + while((c=*aText)>' ') + { + if(c=='-' || c=='+') + break; + ++aText; + } + TUint n = aText-name; + TInt i; + + if(n==3 && strnicmp("all",name,n)==0) + { + if(invert) + { + PARSE_CAPABILITIES_ERROR("Capability '-ALL' not allowed"); + return KErrArgument; + } + for(i=0; i>5] |= (1<<(i&31)); + } + continue; + } + + if(n==4 && strnicmp("none",name,n)==0) + { + if(invert) + { + PARSE_CAPABILITIES_ERROR("Capability '-NONE' not allowed"); + return KErrArgument; + } + memset(&aCapabilities,0,sizeof(aCapabilities)); + continue; + } + + for(i=0; i=ECapability_Limit) + { + char badName[32]; + if(n>=sizeof(badName)) n=sizeof(badName)-1; + memcpy(badName,name,n); + badName[n]=0; + PARSE_CAPABILITIES_ERROR2("Unrecognised capability name: ",badName); + return KErrArgument; + } + if(invert) + aCapabilities[i>>5] &= ~(1<<(i&31)); + else + aCapabilities[i>>5] |= (1<<(i&31)); + } + return KErrNone; + } + +TInt ParseBoolArg(TBool& aValue, const char *aText) + { + if (_stricmp(aText, "on")==0 || _stricmp(aText, "yes")==0 || _stricmp(aText, "1")==0 || strlen(aText)==0) + { + aValue = ETrue; + return KErrNone; + } + if (_stricmp(aText, "off")==0 || _stricmp(aText, "no")==0 || _stricmp(aText, "0")==0 ) + { + aValue = EFalse; + return KErrNone; + } + Print(EError, "Expected a boolean on/off value but found %s\n",aText); + return KErrArgument; +} + +TBool IsValidNumber(const char* aStr){ + if(0 == aStr || 0 == *aStr) + return EFalse ; + if(*aStr == '+' || *aStr == '-') + aStr ++ ; + if(aStr[0] == '0' && (aStr[1] | 0x20) == 'x'){ + aStr += 2 ; + while(*aStr){ + if((*aStr >= '0' && *aStr <= '9') || + (*aStr >= 'a' && *aStr <= 'f') || + (*aStr >= 'A' && *aStr <= 'F')) + aStr++ ; + else + return EFalse ; + } + } + else { + while(*aStr){ + if(*aStr >= '0' && *aStr <= '9') + aStr++ ; + else + return EFalse ; + } + } + return ETrue ; +}