khanat-opennel-code/code/ryzom/tools/leveldesign/export/tools.cpp
2016-10-30 15:59:20 +01:00

249 lines
7.4 KiB
C++

// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "tools.h"
#include <windows.h>
#include "nel/misc/common.h"
// ---------------------------------------------------------------------------
using namespace std;
using namespace NLMISC;
// ---------------------------------------------------------------------------
void CTools::mkdir (const string &dirName)
{
if (dirName.empty())
return;
// Does the directory exist ?
string newDir = pwd();
if (SetCurrentDirectory (dirName.c_str()))
{
SetCurrentDirectory (newDir.c_str());
return;
}
SetCurrentDirectory (newDir.c_str());
// Create upper levels
newDir.clear();
string::size_type pos = dirName.rfind('\\');
if (pos != string::npos)
{
for (uint i = 0; i < pos; ++i)
newDir += dirName[i];
mkdir (newDir);
}
// Create Directory
if (!CreateDirectory(dirName.c_str(),NULL))
throw Exception(string("Cannot create directory ")+dirName);
}
// ---------------------------------------------------------------------------
void CTools::chdir (const std::string &newDir)
{
if (!SetCurrentDirectory (newDir.c_str()))
throwError ((newDir+" : ").c_str ());
}
// ---------------------------------------------------------------------------
std::string CTools::pwd ()
{
char sTmp[512];
if (GetCurrentDirectory (512, sTmp) == 0)
{
throwError ("Get current directory : ");
}
string sTmp2 = sTmp;
return sTmp2;
}
// ---------------------------------------------------------------------------
std::string CTools::normalizePath (const std::string &path)
{
// Convert slash to anti-slash
string retPath = path;
for (uint32 i = 0; i < retPath.size(); ++i)
if (retPath[i] == '/')
retPath[i] = '\\';
return retPath;
}
// ---------------------------------------------------------------------------
bool CTools::fileExist (const std::string &sFileName)
{
HANDLE hFile = CreateFile (sFileName.c_str(), GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
return false;
CloseHandle (hFile);
return true;
}
// ---------------------------------------------------------------------------
int CTools::fileDateCmp (const std::string &file1, const std::string &file2)
{
HANDLE hFile1 = CreateFile (file1.c_str(), GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
HANDLE hFile2 = CreateFile (file2.c_str(), GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if ((hFile1 == INVALID_HANDLE_VALUE) && (hFile2 == INVALID_HANDLE_VALUE))
return 0;
if (hFile1 == INVALID_HANDLE_VALUE)
{
CloseHandle(hFile2);
return -1;
}
if (hFile2 == INVALID_HANDLE_VALUE)
{
CloseHandle(hFile1);
return 1;
}
FILETIME CreationTime1, LastAccessTime1, LastWrite1;
GetFileTime (hFile1, &CreationTime1, &LastAccessTime1, &LastWrite1);
FILETIME CreationTime2, LastAccessTime2, LastWrite2;
GetFileTime (hFile2, &CreationTime2, &LastAccessTime2, &LastWrite2);
LONG nRet = CompareFileTime (&LastWrite1, &LastWrite2);
CloseHandle(hFile1);
CloseHandle(hFile2);
return nRet;
}
// ---------------------------------------------------------------------------
int CTools::fileDateCmp (const std::string &file1, uint32 nDateLow, uint32 nDateHigh)
{
HANDLE hFile1 = CreateFile (file1.c_str(), GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile1 == INVALID_HANDLE_VALUE)
{
return -1;
}
FILETIME CreationTime1, LastAccessTime1, LastWrite1;
GetFileTime (hFile1, &CreationTime1, &LastAccessTime1, &LastWrite1);
FILETIME Date;
Date.dwLowDateTime = nDateLow;
Date.dwHighDateTime = nDateHigh;
LONG nRet = CompareFileTime (&LastWrite1, &Date);
CloseHandle(hFile1);
return nRet;
}
// ---------------------------------------------------------------------------
void CTools::dir (const std::string &sFilter, std::vector<std::string> &sAllFiles, bool bFullPath)
{
WIN32_FIND_DATA findData;
HANDLE hFind;
char sCurDir[MAX_PATH];
sAllFiles.clear ();
GetCurrentDirectory (MAX_PATH, sCurDir);
hFind = FindFirstFile (sFilter.c_str(), &findData);
while (hFind != INVALID_HANDLE_VALUE)
{
if (!(GetFileAttributes(findData.cFileName)&FILE_ATTRIBUTE_DIRECTORY))
{
if (bFullPath)
sAllFiles.push_back(string(sCurDir) + "\\" + findData.cFileName);
else
sAllFiles.push_back(findData.cFileName);
}
if (FindNextFile (hFind, &findData) == 0)
break;
}
FindClose (hFind);
}
// ---------------------------------------------------------------------------
void CTools::dirSub (const std::string &sFilter, std::vector<std::string> &sAllFiles, bool bFullPath)
{
sAllFiles.clear();
string sTmp;
for (uint32 i = 0; i < sFilter.size(); ++i)
if (sFilter[i] != '*')
sTmp += sFilter[i];
dirSubRecurse (sTmp, sAllFiles, bFullPath);
}
// ---------------------------------------------------------------------------
void CTools::copy (const std::string &DstFile, const std::string &SrcFile)
{
if (!CopyFile (SrcFile.c_str(), DstFile.c_str(), false))
{
throw Exception(string("Cannot copy ")+SrcFile+" to "+DstFile);
}
}
// *******
// PRIVATE
// *******
// ---------------------------------------------------------------------------
void CTools::throwError (const char *message)
{
LPVOID lpMsgBuf;
FormatMessage ( FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL );
string sTmp = (char*)lpMsgBuf;
sTmp = message + sTmp;
LocalFree (lpMsgBuf);
throw Exception (sTmp);
}
// ---------------------------------------------------------------------------
void CTools::dirSubRecurse (const std::string &sFilter, std::vector<std::string> &sAllFiles, bool bFullPath)
{
WIN32_FIND_DATA findData;
HANDLE hFind;
char sCurDir[MAX_PATH];
GetCurrentDirectory (MAX_PATH, sCurDir);
hFind = FindFirstFile ("*.*", &findData);
while (hFind != INVALID_HANDLE_VALUE)
{
if (!(GetFileAttributes(findData.cFileName)&FILE_ATTRIBUTE_DIRECTORY))
{
string sTmp = findData.cFileName;
if (sTmp.size() > sFilter.size())
if (strcmp(sTmp.c_str()+sTmp.size()-sFilter.size(), sFilter.c_str()) == 0)
{
if (bFullPath)
sAllFiles.push_back(string(sCurDir) + "\\" + findData.cFileName);
else
sAllFiles.push_back(findData.cFileName);
}
}
else if ((strcmp(findData.cFileName, ".") != 0) && (strcmp(findData.cFileName, "..") != 0))
{
SetCurrentDirectory (findData.cFileName);
dirSubRecurse (sFilter, sAllFiles, bFullPath);
SetCurrentDirectory (sCurDir);
}
if (FindNextFile (hFind, &findData) == 0)
break;
}
FindClose (hFind);
}