imgtools/imglib/host/h_utl.cpp
changeset 620 ad8ffc8e1982
parent 590 360bd6b35136
child 626 ac03b93ca9c4
--- a/imgtools/imglib/host/h_utl.cpp	Thu Jun 10 13:50:24 2010 +0800
+++ b/imgtools/imglib/host/h_utl.cpp	Mon Jul 26 11:04:29 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 <string>
-#else //!__MSVCDOTNET__
-#include <string.h>
-#endif //__MSVCDOTNET__
-
-#include <stdarg.h>
-#include <stdlib.h>
-
-#include <e32std.h>
-#include <e32std_private.h>
-
-#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: "<<iText;
-		break;
-	case EError:
-		cerr << "ERROR: " << iText;
-		iLogFile << "ERROR: " << iText;
-		r=KErrGeneral;
-		break;
-	case EPeError:
-		if (PVerbose)
-			{
-			cerr << "ERROR: " << iText;
-			iLogFile << "ERROR: " << iText;
-			}
-		r=KErrGeneral;
-		break;
-	case ESevereError:
-		cerr << "ERROR: " << iText;
-		iLogFile << "ERROR: " << iText;
-		r=KErrGeneral;
-		break;
-	case EDiagnostic:
-		cerr << "DIAGNOSTIC MESSAGE: " << iText;
-		iLogFile << "DIAGNOSTIC MESSAGE: "<<iText;
-		break;
-	default:
-		cerr << "ERROR: Invalid print type" << endl;
-		r=KErrGeneral;
-		}
-	cout.flush();
-	iLogFile.flush();
-	return r;
-    }
-
-TVersion::TVersion()
-	{}
-TVersion::TVersion(TInt aMajor, TInt aMinor, TInt aBuild)
-	: iMajor((TInt8)aMajor), iMinor((TInt8)aMinor), iBuild((TInt16)aBuild)
-	{}
-#ifdef __TOOLS2__
-istringstream &operator>>(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<len; i++)
-		if (str[i]=='(')
-			break;
-	if (i<len)
-		build=atoi(str+i+1);
-	aVersion.iMajor = (TInt8)Min(KMaxTInt8, atoi(str));
-	int majorV = atoi(str);
-	// iMajor is defined as TInt8 so it should not be bigger than 127
-	if (majorV > 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<aMonth; ii++)
-	    days+=(mTab[isleap][ii]);	
-	days+=aDay;
-	TInt sum=aMilliSeconds+aSecond*KSecondsToMicroSeconds;
-	return((Int64(days)*KDaysToMicroSeconds+Int64(aHour)*KHoursToMicroSeconds) 
-			+(Int64(KMinutesToMicroSeconds)*Int64(aMinute)+Int64(sum))); 
-	}
-	
-TInt StringToTime(Int64 &aTime, char *aString)
-//
-// Convert string to time. String is in the format:
-//
-// dd/mm/yyyy hh:mm:ss.mmmmmmm
-//
-	{
-	TInt day=1;
-	TInt month=1;
-	TInt year=1997;
-	TInt hour=10;
-	TInt minute=10;
-	TInt sec=0;
-	TInt mill=0;
-	char ch;
-	#ifdef __TOOLS2__
-	istringstream val(aString);
-	#else
-	istrstream val(aString,strlen(aString));
-	#endif
-	val >> 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<iFileName)
-		return;
-	if (*s == '.')
-		{
-		iExtPos = s - iFileName;
-		if (iExtPos == 0)
-			{
-			iBaseLength = 0;
-			return;
-			}
-		remain = iExtPos;
-		--s;
-		}
-	else if (s != iFileName + l)
-		return;
-	if (aLookForUid && remain>=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<ECapability_Limit; i++)
-				{
-				if(CapabilityNames[i])
-					aCapabilities[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; i++)
-			{
-			const char* cap = CapabilityNames[i];
-			if(!cap)
-				continue;
-			if((TUint)strlen(cap)!=n) 
-				continue;
-			if(strnicmp(cap,name,n)!=0)
-				continue;
-			break;
-			}
-		if(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 <string.h>
+#endif //__MSVCDOTNET__
+
+#include <stdarg.h>
+#include <stdlib.h>
+
+#include <e32std.h>
+#include <e32std_private.h>
+
+#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: "<<iText;
+		break;
+	case EError:
+		cerr << "ERROR: " << iText;
+		iLogFile << "ERROR: " << iText;
+		r=KErrGeneral;
+		break;
+	case EPeError:
+		if (PVerbose)
+			{
+			cerr << "ERROR: " << iText;
+			iLogFile << "ERROR: " << iText;
+			}
+		r=KErrGeneral;
+		break;
+	case ESevereError:
+		cerr << "ERROR: " << iText;
+		iLogFile << "ERROR: " << iText;
+		r=KErrGeneral;
+		break;
+	case EDiagnostic:
+		cerr << "DIAGNOSTIC MESSAGE: " << iText;
+		iLogFile << "DIAGNOSTIC MESSAGE: "<<iText;
+		break;
+	default:
+		cerr << "ERROR: Invalid print type" << endl;
+		r=KErrGeneral;
+		}
+	cout.flush();
+	iLogFile.flush();
+	return r;
+    }
+
+TVersion::TVersion()
+	{}
+TVersion::TVersion(TInt aMajor, TInt aMinor, TInt aBuild)
+	: iMajor((TInt8)aMajor), iMinor((TInt8)aMinor), iBuild((TInt16)aBuild)
+	{}
+#ifdef __TOOLS2__
+istringstream &operator>>(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<len; i++)
+		if (str[i]=='(')
+			break;
+	if (i<len)
+		build=atoi(str+i+1);
+	aVersion.iMajor = (TInt8)Min(KMaxTInt8, atoi(str));
+	int majorV = atoi(str);
+	// iMajor is defined as TInt8 so it should not be bigger than 127
+	if (majorV > 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<aMonth; ii++)
+	    days+=(mTab[isleap][ii]);	
+	days+=aDay;
+	TInt sum=aMilliSeconds+aSecond*KSecondsToMicroSeconds;
+	return((Int64(days)*KDaysToMicroSeconds+Int64(aHour)*KHoursToMicroSeconds) 
+			+(Int64(KMinutesToMicroSeconds)*Int64(aMinute)+Int64(sum))); 
+	}
+	
+TInt StringToTime(Int64 &aTime, char *aString)
+//
+// Convert string to time. String is in the format:
+//
+// dd/mm/yyyy hh:mm:ss.mmmmmmm
+//
+	{
+	TInt day=1;
+	TInt month=1;
+	TInt year=1997;
+	TInt hour=10;
+	TInt minute=10;
+	TInt sec=0;
+	TInt mill=0;
+	char ch;
+	#ifdef __TOOLS2__
+	istringstream val(aString);
+	#else
+	istrstream val(aString,strlen(aString));
+	#endif
+	val >> 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<iFileName)
+		return;
+	if (*s == '.')
+		{
+		iExtPos = s - iFileName;
+		if (iExtPos == 0)
+			{
+			iBaseLength = 0;
+			return;
+			}
+		remain = iExtPos;
+		--s;
+		}
+	else if (s != iFileName + l)
+		return;
+	if (aLookForUid && remain>=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<ECapability_Limit; i++)
+				{
+				if(CapabilityNames[i])
+					aCapabilities[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; i++)
+			{
+			const char* cap = CapabilityNames[i];
+			if(!cap)
+				continue;
+			if((TUint)strlen(cap)!=n) 
+				continue;
+			if(strnicmp(cap,name,n)!=0)
+				continue;
+			break;
+			}
+		if(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 ;
+}