secureswitools/swisistools/source/interpretsislib/adornedutilities.cpp
changeset 0 ba25891c3a9e
child 24 5cc91383ab1e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/secureswitools/swisistools/source/interpretsislib/adornedutilities.cpp	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,134 @@
+/*
+* 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: 
+*
+*/
+
+
+
+#include "adornedutilities.h"
+#include <algorithm>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "stringutils.h"
+#include "symbiantypes.h"
+#include "logger.h"
+#include "is_utils.h"
+
+const std::wstring KAdornedWildCharString = L"{????????}";
+const int KFileNameUnadornedPartLength = 10;
+
+
+void GetUnadornedFileName(const std::wstring& aAdornedFilename, std::wstring& aUnadornedFilename)
+{
+	aUnadornedFilename = aAdornedFilename;
+	int length = aAdornedFilename.length();
+
+	// check to see if the name is adorned. If so, remove the version number
+	int startVersion = aAdornedFilename.find('{');
+	if (startVersion != 0)
+	{
+		int endVersion = aAdornedFilename.find('}');
+		if ((endVersion != 0) && (endVersion - startVersion == (KFileNameUnadornedPartLength - 1)))
+		{
+			// get unadorned version of the file
+			aUnadornedFilename = aAdornedFilename.substr(0,startVersion);
+
+			// for names ending with } i.e: DummyFile{12345678} nothing is to be appended to 
+			// aUnadornedFilename in such a case aAdornedFilename.Mid(endVersion+1) would cause a crash
+			if (endVersion < (length - 1))
+			{
+				aUnadornedFilename.append(aAdornedFilename.substr(endVersion + 1,length));
+			}
+		}
+	}
+}
+
+bool IsAdornedVariationOf(const std::wstring& aFileName1, const std::wstring& aFileName2)
+{
+	std::wstring unadornedFileName1;
+	GetUnadornedFileName(aFileName1,unadornedFileName1);
+
+	std::wstring unadornedFileName2;
+	GetUnadornedFileName(aFileName2,unadornedFileName2);
+
+  	// Check whether filename2 is a variant of filename1
+  	// e.g: d:\sys\bin\DummyDll{000A0001}.dll is considered a variant of c:\sys\bin\DummyDll.dll 
+  	// because they both break down to \sys\bin\DummyDll.dll
+	std::wstring fileName1Path(StringUtils::Path(unadornedFileName1));
+	std::wstring fileName1NameAndExt(StringUtils::NameAndExt(unadornedFileName1));
+
+	std::wstring fileName2Path(StringUtils::Path(unadornedFileName2));
+	std::wstring fileName2NameAndExt(StringUtils::NameAndExt(unadornedFileName2));
+
+	return ((fileName1Path == fileName2Path) && (fileName1NameAndExt == fileName2NameAndExt));
+}
+	
+void FindAllAdornedVariants(const std::wstring& aSearchNameWild, const std::wstring& aSearchPath, std::list<std::wstring>& aAdornedFileNamesFound, const DrivesMap& aDriveMap)
+{
+	DrivesMap::const_iterator it = aDriveMap.begin();
+	DrivesMap::const_iterator end = aDriveMap.end();
+
+	for ( ; it != end ; ++it)
+	{
+		// drive to search on
+		int disk = tolower(it->first);
+		std::wstring drive = L"$:";
+		drive[0] = disk;
+
+		std::wstring searchPath(aSearchPath);
+
+		// actual readable directory
+		std::wstring localDir = it->second->iDir;
+
+		// using ROM/ROFS logs for the z drive, searching for adorned variants is handled later.
+		if (disk == 'z' && localDir.empty())
+			continue;
+
+		// convert to the local path and see if the file exists on the drive
+		ConvertToLocalPath( searchPath, localDir );
+
+		// search this directory 
+		std::list<std::wstring> dirContents;
+		GetDirContents(searchPath, dirContents);
+
+		std::list<std::wstring>::iterator curr = dirContents.begin();
+		std::list<std::wstring>::iterator end = dirContents.end();
+		while (curr != end)
+		{
+			std::wstring dirFile(*curr);
+
+			if (StringUtils::WildcardCompare(aSearchNameWild,dirFile))
+			{
+				// found an adorned file, add to the list of adorned names found
+				std::wstringstream foundFile;
+				foundFile << drive << aSearchPath << dirFile;
+				aAdornedFileNamesFound.push_back(foundFile.str());
+			}
+
+			++curr;
+		}
+	}
+}
+
+void GenerateSearchNameWild(const std::wstring& aFileName, std::wstring& aSearchNameWild)
+{
+	std::wstring unadornedFileName;
+	GetUnadornedFileName(aFileName, unadornedFileName);
+
+	aSearchNameWild = StringUtils::Name(unadornedFileName);
+	aSearchNameWild.append(KAdornedWildCharString);
+	aSearchNameWild.append(StringUtils::Ext(unadornedFileName));
+}