imgtools/sisutils/src/sisutils.cpp
changeset 590 360bd6b35136
parent 0 044383f39525
--- a/imgtools/sisutils/src/sisutils.cpp	Wed Jun 16 16:51:40 2010 +0300
+++ b/imgtools/sisutils/src/sisutils.cpp	Wed Jun 23 16:56:47 2010 +0800
@@ -1,291 +1,389 @@
-/*
-* Copyright (c) 2008-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: 
-*
-*/
-
-
-#ifdef WIN32
-#include <windows.h>
-#include <direct.h>
-#endif
-
-#include "sisutils.h"
-
-/**
-Constructor: SisUtilsException class
-Initilize the parameters to data members.
-
-@internalComponent
-@released
-
-@param aFile	- Name of the file
-@param aErrMessage - Error message
-*/
-SisUtilsException::SisUtilsException(char* aFile, char* aErrMessage) : \
-	iSisFileName(aFile), iErrMessage(aErrMessage)
-{
-}
-
-/**
-Destructor: SisUtilsException class
-Deallocates the memory for data members
-
-@internalComponent
-@released
-*/
-SisUtilsException::~SisUtilsException()
-{
-}
-
-/**
-Report: Reports error message on the console
-
-@internalComponent
-@released
-*/
-void SisUtilsException::Report()
-{
-	std::cout << "Error : ";
-	std::cout << iSisFileName.c_str() << " : ";
-	std::cout << iErrMessage.c_str();
-	std::cout << std::endl;
-}
-
-/**
-Constructor: SisUtils class
-Initilize the parameters to data members.
-
-@internalComponent
-@released
-
-@param aFile	- Name of the SIS file
-*/
-SisUtils::SisUtils(char* aFile) :  iVerboseMode(EFalse),iSisFile(aFile)
-{
-}
-
-/**
-Destructor: SisUtils class
-Deallocates the memory for data members
-
-@internalComponent
-@released
-*/
-SisUtils::~SisUtils()
-{
-}
-
-/**
-SetVerboseMode: Sets the verbose mode
-
-@internalComponent
-@released
-*/
-void SisUtils::SetVerboseMode()
-{
-	iVerboseMode = ETrue;
-}
-
-/**
-SisFileName: Returns the SIS file name
-
-@internalComponent
-@released
-*/
-String SisUtils::SisFileName()
-{
-	return iSisFile;
-}
-
-/**
-IsVerboseMode: Returns the status of the verbose mode
-
-@internalComponent
-@released
-*/
-TBool SisUtils::IsVerboseMode()
-{
-	return iVerboseMode;
-}
-
-/**
-IsFileExist: Tests whether the give file exists or not
-
-@internalComponent
-@released
-
-@param aFile - Name of the file
-*/
-TBool SisUtils::IsFileExist(String aFile)
-{
-	std::ifstream aIfs;
-
-	TrimQuotes(aFile);
-
-	aIfs.open((char*)aFile.data(), std::ios::in);
-
-	if( aIfs.fail() )
-	{
-		aIfs.close();
-		return EFalse;
-	}
-
-	aIfs.close();
-
-	return ETrue;
-}
-
-/**
-RunCommand: Runs the given command
-
-@internalComponent
-@released
-
-@param cmd - Command line as string
-*/
-TUint32 SisUtils::RunCommand(String cmd)
-{
-	TUint32 iExitCode = STAT_SUCCESS;
-
-#ifdef WIN32
-    STARTUPINFO si;
-    PROCESS_INFORMATION pi;
-	DWORD dwWaitResult;
-
-    memset(&si, 0, sizeof(si));
-    si.cb = sizeof(si);
-    memset(&pi, 0, sizeof(pi));
-
-    if( !::CreateProcess( NULL,   // No module name (use command line)
-        (char*)cmd.data(),        // Command line
-        NULL,           // Process handle not inheritable
-        NULL,           // Thread handle not inheritable
-        FALSE,          // Set handle inheritance to FALSE
-        DETACHED_PROCESS | CREATE_NO_WINDOW,              // process creation flags
-        NULL,           // Use parent's environment block
-        NULL,           // Use parent's starting directory 
-        &si,            // Pointer to STARTUPINFO structure
-        &pi )           // Pointer to PROCESS_INFORMATION structure
-    ) 
-    {
-		return static_cast<TUint32>(STAT_FAILURE);
-    }
-
-	dwWaitResult = ::WaitForSingleObject( pi.hProcess, INFINITE );
-
-	if(dwWaitResult == WAIT_OBJECT_0)
-	{
-		::GetExitCodeProcess(pi.hProcess, &iExitCode);
-		if(iExitCode != STAT_SUCCESS)
-		{
-			iExitCode = static_cast<TUint32>(STAT_FAILURE);
-		}
-	}
-	else
-	{
-		iExitCode = static_cast<TUint32>(STAT_FAILURE);
-	}
-
-	::CloseHandle( pi.hProcess );
-	::CloseHandle( pi.hThread );
-#else
-#error "TODO: Implement this function under other OS than Windows"
-#endif
-
-	return iExitCode;
-}
-
-/**
-TrimQuotes: Remove the quotes in the given file name
-
-@internalComponent
-@released
-
-@param aStr - File name
-*/
-void SisUtils::TrimQuotes(String& aStr)
-{
-	TUint spos = 0, epos = 0;
-
-	spos = aStr.find("\"");
-	if(spos == String::npos)
-		return;
-
-	epos = aStr.rfind("\"");
-
-	if(spos == epos)
-	{
-		epos = aStr.size();
-		aStr = aStr.substr(spos+1,epos);
-	}
-	else
-	{
-		aStr = aStr.substr(spos+1,epos-1);
-
-		spos = aStr.find("\"");
-		while( spos != String::npos )
-		{
-			aStr.erase(spos,1);
-			spos = aStr.find("\"");
-		}
-	}
-
-	return;
-}
-
-/**
-MakeDirectory: Creates directory if it is not exist
-
-@internalComponent
-@released
-
-@param aPath - Directory name to be created
-*/
-TBool SisUtils::MakeDirectory(String aPath)
-{
-	TBool status = ETrue;
-	TUint currpos = 0;
-	String dir;
-
-	do
-	{
-		currpos = aPath.find_first_of(PATHSEPARATOR, currpos);
-		if(currpos == String::npos)
-		{
-			dir = aPath.substr(0, aPath.length());
-		}
-		else
-		{
-			dir = aPath.substr(0, currpos);
-			currpos++;
-		}
-
-#ifdef WIN32
-		if(mkdir((char*)dir.data()) != 0)
-		{
-			if(errno != EEXIST)
-			{
-				status = EFalse;
-			}
-		}
-#else
-#error "TODO: Implement this function under other OS than Windows"
-#endif
-		if(status == EFalse)
-			break;
-	} while(currpos != String::npos);
-
-	return status;
-}
+/*
+* Copyright (c) 2008-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: 
+*
+*/
+
+
+#ifdef WIN32
+#ifdef _STLP_INTERNAL_WINDOWS_H
+#define __INTERLOCKED_DECLARED
+#endif
+#include <windows.h>
+#include <direct.h>
+#define MKDIR mkdir
+#else
+#include <unistd.h>
+#include <sys/wait.h>
+
+#include <sys/stat.h>
+#include <sys/types.h>
+#define MKDIR(a) mkdir(a,0777)
+#endif
+
+#include "sisutils.h"
+#include <errno.h>
+
+
+/**
+Constructor: SisUtilsException class
+Initilize the parameters to data members.
+
+@internalComponent
+@released
+
+@param aFile	- Name of the file
+@param aErrMessage - Error message
+*/
+SisUtilsException::SisUtilsException(const char* aFile, const char* aErrMessage) : \
+	iSisFileName(aFile), iErrMessage(aErrMessage)
+{
+}
+
+/**
+Destructor: SisUtilsException class
+Deallocates the memory for data members
+
+@internalComponent
+@released
+*/
+SisUtilsException::~SisUtilsException()
+{
+}
+
+/**
+Report: Reports error message on the console
+
+@internalComponent
+@released
+*/
+void SisUtilsException::Report()
+{
+	cout << "Error : " << iSisFileName.c_str() << " : " << iErrMessage.c_str() << endl;
+}
+
+/**
+Constructor: SisUtils class
+Initilize the parameters to data members.
+
+@internalComponent
+@released
+
+@param aFile	- Name of the SIS file
+*/
+SisUtils::SisUtils(const char* aFile) :  iVerboseMode(EFalse),iSisFile(aFile)
+{
+}
+
+/**
+Destructor: SisUtils class
+Deallocates the memory for data members
+
+@internalComponent
+@released
+*/
+SisUtils::~SisUtils()
+{
+}
+
+/**
+SetVerboseMode: Sets the verbose mode
+
+@internalComponent
+@released
+*/
+void SisUtils::SetVerboseMode()
+{
+	iVerboseMode = ETrue;
+}
+
+/**
+SisFileName: Returns the SIS file name
+
+@internalComponent
+@released
+*/
+const char* SisUtils::SisFileName()
+{
+	return iSisFile.c_str();
+}
+
+/**
+IsVerboseMode: Returns the status of the verbose mode
+
+@internalComponent
+@released
+*/
+TBool SisUtils::IsVerboseMode()
+{
+	return iVerboseMode;
+}
+
+/**
+IsFileExist: Tests whether the give file exists or not
+
+@internalComponent
+@released
+
+@param aFile - Name of the file
+*/
+TBool SisUtils::IsFileExist(string aFile)
+{
+	ifstream file;
+	TrimQuotes(aFile);
+	file.open(aFile.c_str(), ios_base::in);
+	TBool retVal = EFalse ;
+	if(file.is_open()){
+		file.close();
+		retVal = ETrue ;
+	}
+	return retVal;
+}
+
+/**
+RunCommand: Runs the given command
+
+@internalComponent
+@released
+
+@param cmd - Command line as string
+*/
+TUint32 SisUtils::RunCommand(const char* aCmd) {
+	TUint32 iExitCode = STAT_SUCCESS;
+
+#ifdef WIN32
+	STARTUPINFO si ; 
+	PROCESS_INFORMATION pi ; 
+	memset(&si,0,sizeof(STARTUPINFO));
+	si.cb = sizeof(STARTUPINFO);
+	memset(&pi,0,sizeof(PROCESS_INFORMATION));
+
+    if( !::CreateProcess( NULL,   // No module name (use command line)
+        const_cast<char*>(aCmd),        // Command line
+        NULL,           // Process handle not inheritable
+        NULL,           // Thread handle not inheritable
+        FALSE,          // Set handle inheritance to FALSE
+        DETACHED_PROCESS | CREATE_NO_WINDOW,              // process creation flags
+        NULL,           // Use parent's environment block
+        NULL,           // Use parent's starting directory 
+        &si,            // Pointer to STARTUPINFO structure
+        &pi ))           // Pointer to PROCESS_INFORMATION structure     
+		return static_cast<TUint32>(STAT_FAILURE);
+    
+
+	TUint32 dwWaitResult = ::WaitForSingleObject( pi.hProcess, INFINITE );
+	if(dwWaitResult == WAIT_OBJECT_0) {
+		::GetExitCodeProcess(pi.hProcess, &iExitCode);
+		if(iExitCode != STAT_SUCCESS){
+			iExitCode = static_cast<TUint32>(STAT_FAILURE);
+		}
+	}
+	else {
+		iExitCode = static_cast<TUint32>(STAT_FAILURE);
+	}
+
+	::CloseHandle( pi.hProcess );
+	::CloseHandle( pi.hThread );
+#else
+
+	TInt child_pid  = fork();
+	if( -1 == child_pid)
+		return (TUint32)STAT_FAILURE;
+	if(0 == child_pid){
+		if(-1 == execl(aCmd,"",NULL))
+			return (TUint32)STAT_FAILURE;
+	}
+	else{
+		TInt status = 0 ;
+		iExitCode = (TUint32)STAT_FAILURE;
+        while(wait(&status) != child_pid);
+        iExitCode  = WEXITSTATUS(status)  ;
+	}
+	
+#endif
+
+	return iExitCode;
+}
+
+/**
+TrimQuotes: Remove the quotes in the given file name
+
+@internalComponent
+@released
+
+@param aStr - File name
+*/
+void SisUtils::TrimQuotes(string& aStr) {
+
+	TUint spos  = aStr.find("\"");
+	if(spos == string::npos)
+		return;
+
+	TUint epos = aStr.rfind("\"");
+
+	if(spos == epos) {
+		epos = aStr.size();
+		aStr = aStr.substr(spos+1,epos);
+	}
+	else {
+		aStr = aStr.substr(spos+1,epos-1);
+		spos = aStr.find("\"");
+		while( spos != string::npos )
+		{
+			aStr.erase(spos,1);
+			spos = aStr.find("\"");
+		}
+	}
+
+	return;
+}
+
+/**
+MakeDirectory: Creates directory if it is not exist
+
+@internalComponent
+@released
+
+@param aPath - Directory name to be created
+*/
+TBool SisUtils::MakeDirectory(const string& aPath) {
+	TBool status = ETrue;
+	TUint currpos = 0;
+	string dir;
+
+	do 	{
+		currpos = aPath.find_first_of(PATHSEPARATOR, currpos);
+		if(currpos == string::npos) {
+			dir = aPath.substr(0, aPath.length());
+		} else {
+			dir = aPath.substr(0, currpos);
+			currpos++;
+		}
+ 
+		if(MKDIR(dir.c_str()) != 0){
+			if(errno != EEXIST)	{
+				status = EFalse;
+			}
+		} 
+		if(status == EFalse)
+			break;
+	} while(currpos != string::npos);
+
+	return status;
+}
+#ifndef WIN32
+/*static inline wchar_t to_lowerW(wchar_t aChar){
+	return (aChar >= L'A' && aChar <= L'Z') ? (aChar | 0x20) : aChar ; 
+}
+int wcsnicmp(const wchar_t* str1,const wchar_t* str2,size_t n){
+	wchar_t a , b ;
+	size_t i = 0 ;
+	while(*str1 && *str2){
+		a = to_lowerW(*str1) ;
+		b = to_lowerW(*str2) ; 
+		if(a > b )
+			return 1 ;
+		else if(a < b)
+			return -1 ;
+		if(++i >= n) break ;
+		str1++ ;
+		str2++ ;		
+	}
+	return 0;
+}
+int wcsicmp(const wchar_t* str1,const wchar_t* str2){
+	wchar_t a , b ;
+	while(*str1 && *str2){
+		a = to_lowerW(*str1) ;
+		b = to_lowerW(*str2) ; 
+		if(a > b )
+			return 1 ;
+		else if(a < b)
+			return -1 ;
+		str1++ ;
+		str2++ ;
+	}
+	if(0 == *str1 && 0 == *str2){
+		return 0 ;
+	}
+	else if(*str1)
+		return 1;
+	else
+		return -1;
+}
+int iswdigit(wchar_t ch){
+	if(ch >= L'0' && ch <= L'9') return 1 ;
+	return 0;
+}*/
+char *_fullpath(char* absPath, const char*relPath, size_t maxLength){
+	if(*relPath == '/'){
+		return strncpy(absPath,relPath,maxLength);
+	}
+	*absPath = 0 ;
+	getcwd(absPath,maxLength);
+	size_t len = strlen(absPath);
+	//absPath[len++] = '/';
+	int upward = 0 ;
+	int status = 0 ;
+	const char* savedPath = relPath ;
+	while(*relPath){
+		if(*relPath == '.'){
+			status ++ ;
+		}
+		else if(*relPath == '/'){
+			if(status == 2){
+				upward ++ ;
+			}
+			else if(status != 1)
+				break ;
+			status = 0 ;
+			savedPath = relPath + 1;
+		}
+		else {
+			break ;
+		}
+		relPath ++ ;
+			
+	}
+	if(0 == *relPath){ // like ".." or "." 
+		if(2 == status) 
+			upward ++ ;			 
+	}
+	else {
+		relPath = savedPath ;
+	}
+	char* pathEnd = &absPath[len];	
+	while(upward > 0){ // we have "../" in the beginning of relPath
+		pathEnd -- ;
+		if(pathEnd <= absPath)	return NULL ;
+		while(pathEnd > absPath){
+			pathEnd -- ;
+			if(*pathEnd == '/')
+				break ;
+		}
+		upward -- ;
+	}
+	if(0 != *relPath){
+		*pathEnd = '/' ;
+		char* conjBegin = pathEnd + 1;
+		size_t bufLen = maxLength - (conjBegin - absPath);	
+		strncpy(conjBegin,relPath,bufLen);
+	}else {
+		*pathEnd = 0 ;
+	}
+		
+	return absPath ;
+	 
+}
+#endif