Some code refactoring.
This commit is contained in:
parent
d4f7e96578
commit
88315729c6
@ -120,11 +120,13 @@
|
|||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">RCC "$(SolutionDir)\tmp\Common\rcc\RCC_%(Filename).cpp"</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">RCC "$(SolutionDir)\tmp\Common\rcc\RCC_%(Filename).cpp"</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)\tmp\Common\rcc\RCC_%(Filename).cpp;%(Outputs)</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)\tmp\Common\rcc\RCC_%(Filename).cpp;%(Outputs)</Outputs>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)\tmp\Common\rcc\RCC_%(Filename).cpp;%(Outputs)</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)\tmp\Common\rcc\RCC_%(Filename).cpp;%(Outputs)</Outputs>
|
||||||
|
<SubType>Designer</SubType>
|
||||||
</CustomBuild>
|
</CustomBuild>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="src\Main.cpp" />
|
<ClCompile Include="src\Main.cpp" />
|
||||||
<ClCompile Include="src\MainWindow.cpp" />
|
<ClCompile Include="src\MainWindow.cpp" />
|
||||||
|
<ClCompile Include="src\Utils.cpp" />
|
||||||
<ClCompile Include="tmp\Common\moc\MOC_MainWindow.cpp" />
|
<ClCompile Include="tmp\Common\moc\MOC_MainWindow.cpp" />
|
||||||
<ClCompile Include="tmp\Common\rcc\RCC_MediaInfoXP.cpp" />
|
<ClCompile Include="tmp\Common\rcc\RCC_MediaInfoXP.cpp" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
@ -140,6 +142,7 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="src\Config.h" />
|
<ClInclude Include="src\Config.h" />
|
||||||
|
<ClInclude Include="src\Utils.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ResourceCompile Include="MediaInfoXP.rcx">
|
<ResourceCompile Include="MediaInfoXP.rcx">
|
||||||
|
@ -27,9 +27,10 @@
|
|||||||
<CustomBuild Include="gui\Dialog.ui">
|
<CustomBuild Include="gui\Dialog.ui">
|
||||||
<Filter>Dialogs</Filter>
|
<Filter>Dialogs</Filter>
|
||||||
</CustomBuild>
|
</CustomBuild>
|
||||||
</ItemGroup>
|
<CustomBuild Include="MediaInfoXP.qrc" />
|
||||||
<ItemGroup>
|
<CustomBuild Include="src\MainWindow.h">
|
||||||
<None Include="MediaInfoXP.qrc" />
|
<Filter>Header Files</Filter>
|
||||||
|
</CustomBuild>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="src\Main.cpp">
|
<ClCompile Include="src\Main.cpp">
|
||||||
@ -44,12 +45,15 @@
|
|||||||
<ClCompile Include="tmp\Common\rcc\RCC_MediaInfoXP.cpp">
|
<ClCompile Include="tmp\Common\rcc\RCC_MediaInfoXP.cpp">
|
||||||
<Filter>Source Files\Generated</Filter>
|
<Filter>Source Files\Generated</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="src\Utils.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="src\MainWindow.h">
|
<ClInclude Include="src\Config.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="src\Config.h">
|
<ClInclude Include="src\Utils.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
@ -41,7 +41,3 @@ static const char *mixp_buildTime = __TIME__;
|
|||||||
#else
|
#else
|
||||||
#define MIXP_DEBUG (0)
|
#define MIXP_DEBUG (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//Helper macros
|
|
||||||
#define MIXP_DELETE_OBJ(PTR) do { if((PTR)) { delete ((PTR)); (PTR) = NULL; } } while (0)
|
|
||||||
#define QWCHAR(STR) reinterpret_cast<const wchar_t*>(STR.utf16())
|
|
||||||
|
183
src/Main.cpp
183
src/Main.cpp
@ -29,17 +29,13 @@
|
|||||||
|
|
||||||
//Qt
|
//Qt
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include <QMutex>
|
|
||||||
#include <QUuid>
|
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
#include <QLibrary>
|
|
||||||
|
|
||||||
//Win32
|
//Win32
|
||||||
#define WIN32_LEAN_AND_MEAN
|
#define WIN32_LEAN_AND_MEAN
|
||||||
#include <Windows.h>
|
#include <Windows.h>
|
||||||
#include <io.h>
|
#include <io.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <Objbase.h>
|
|
||||||
|
|
||||||
#ifdef QT_NODLL
|
#ifdef QT_NODLL
|
||||||
#include <QtPlugin>
|
#include <QtPlugin>
|
||||||
@ -50,6 +46,7 @@
|
|||||||
|
|
||||||
#include "Config.h"
|
#include "Config.h"
|
||||||
#include "MainWindow.h"
|
#include "MainWindow.h"
|
||||||
|
#include "Utils.h"
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
// Debug Console
|
// Debug Console
|
||||||
@ -83,176 +80,6 @@ static void init_console(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
// Detect TEMP folder
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
QString mixp_getAppDataFolder(void)
|
|
||||||
{
|
|
||||||
typedef HRESULT (WINAPI *SHGetKnownFolderPathFun)(__in const GUID &rfid, __in DWORD dwFlags, __in HANDLE hToken, __out PWSTR *ppszPath);
|
|
||||||
typedef HRESULT (WINAPI *SHGetFolderPathFun)(__in HWND hwndOwner, __in int nFolder, __in HANDLE hToken, __in DWORD dwFlags, __out LPWSTR pszPath);
|
|
||||||
|
|
||||||
static const int CSIDL_LOCAL_APPDATA = 0x001c;
|
|
||||||
static const GUID GUID_LOCAL_APPDATA = {0xF1B32785,0x6FBA,0x4FCF,{0x9D,0x55,0x7B,0x8E,0x7F,0x15,0x70,0x91}};
|
|
||||||
|
|
||||||
static SHGetKnownFolderPathFun SHGetKnownFolderPathPtr = NULL;
|
|
||||||
static SHGetFolderPathFun SHGetFolderPathPtr = NULL;
|
|
||||||
|
|
||||||
if((!SHGetKnownFolderPathPtr) && (!SHGetFolderPathPtr))
|
|
||||||
{
|
|
||||||
QLibrary kernel32Lib("shell32.dll");
|
|
||||||
if(kernel32Lib.load())
|
|
||||||
{
|
|
||||||
SHGetKnownFolderPathPtr = (SHGetKnownFolderPathFun) kernel32Lib.resolve("SHGetKnownFolderPath");
|
|
||||||
SHGetFolderPathPtr = (SHGetFolderPathFun) kernel32Lib.resolve("SHGetFolderPathW");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QString folder;
|
|
||||||
|
|
||||||
if(SHGetKnownFolderPathPtr)
|
|
||||||
{
|
|
||||||
WCHAR *path = NULL;
|
|
||||||
if(SHGetKnownFolderPathPtr(GUID_LOCAL_APPDATA, 0x00008000, NULL, &path) == S_OK)
|
|
||||||
{
|
|
||||||
//MessageBoxW(0, path, L"SHGetKnownFolderPath", MB_TOPMOST);
|
|
||||||
QDir folderTemp = QDir(QDir::fromNativeSeparators(QString::fromUtf16(reinterpret_cast<const unsigned short*>(path))));
|
|
||||||
if(!folderTemp.exists())
|
|
||||||
{
|
|
||||||
folderTemp.mkpath(".");
|
|
||||||
}
|
|
||||||
if(folderTemp.exists())
|
|
||||||
{
|
|
||||||
folder = folderTemp.canonicalPath();
|
|
||||||
}
|
|
||||||
CoTaskMemFree(path);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(SHGetFolderPathPtr)
|
|
||||||
{
|
|
||||||
WCHAR *path = new WCHAR[4096];
|
|
||||||
if(SHGetFolderPathPtr(NULL, CSIDL_LOCAL_APPDATA, NULL, NULL, path) == S_OK)
|
|
||||||
{
|
|
||||||
//MessageBoxW(0, path, L"SHGetFolderPathW", MB_TOPMOST);
|
|
||||||
QDir folderTemp = QDir(QDir::fromNativeSeparators(QString::fromUtf16(reinterpret_cast<const unsigned short*>(path))));
|
|
||||||
if(!folderTemp.exists())
|
|
||||||
{
|
|
||||||
folderTemp.mkpath(".");
|
|
||||||
}
|
|
||||||
if(folderTemp.exists())
|
|
||||||
{
|
|
||||||
folder = folderTemp.canonicalPath();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
delete [] path;
|
|
||||||
}
|
|
||||||
|
|
||||||
return folder;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString mixp_getTempFolder(QFile **lockfile)
|
|
||||||
{
|
|
||||||
*lockfile = NULL;
|
|
||||||
QString tempFolder;
|
|
||||||
|
|
||||||
static const char *TEMP_STR = "Temp";
|
|
||||||
const QByteArray WRITE_TEST_DATA = QByteArray("Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.");
|
|
||||||
const QString SUB_FOLDER = QUuid::createUuid().toString();
|
|
||||||
|
|
||||||
//Try the %TMP% or %TEMP% directory first
|
|
||||||
QDir temp = QDir::temp();
|
|
||||||
if(temp.exists())
|
|
||||||
{
|
|
||||||
temp.mkdir(SUB_FOLDER);
|
|
||||||
if(temp.cd(SUB_FOLDER) && temp.exists())
|
|
||||||
{
|
|
||||||
QFile *testFile = new QFile(QString("%1/~lock.tmp").arg(temp.canonicalPath()));
|
|
||||||
if(testFile->open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Unbuffered))
|
|
||||||
{
|
|
||||||
if(testFile->write(WRITE_TEST_DATA) >= WRITE_TEST_DATA.size())
|
|
||||||
{
|
|
||||||
*lockfile = testFile; testFile = NULL;
|
|
||||||
tempFolder = temp.canonicalPath();
|
|
||||||
}
|
|
||||||
if(testFile) testFile->remove();
|
|
||||||
MIXP_DELETE_OBJ(testFile);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(!tempFolder.isEmpty())
|
|
||||||
{
|
|
||||||
return tempFolder;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//Create TEMP folder in %LOCALAPPDATA%
|
|
||||||
QDir localAppData = QDir(mixp_getAppDataFolder());
|
|
||||||
if(!localAppData.path().isEmpty())
|
|
||||||
{
|
|
||||||
if(!localAppData.exists())
|
|
||||||
{
|
|
||||||
localAppData.mkpath(".");
|
|
||||||
}
|
|
||||||
if(localAppData.exists())
|
|
||||||
{
|
|
||||||
if(!localAppData.entryList(QDir::AllDirs).contains(TEMP_STR, Qt::CaseInsensitive))
|
|
||||||
{
|
|
||||||
localAppData.mkdir(TEMP_STR);
|
|
||||||
}
|
|
||||||
if(localAppData.cd(TEMP_STR) && localAppData.exists())
|
|
||||||
{
|
|
||||||
localAppData.mkdir(SUB_FOLDER);
|
|
||||||
if(localAppData.cd(SUB_FOLDER) && localAppData.exists())
|
|
||||||
{
|
|
||||||
QFile *testFile = new QFile(QString("%1/~lock.tmp").arg(localAppData.canonicalPath()));
|
|
||||||
if(testFile->open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Unbuffered))
|
|
||||||
{
|
|
||||||
if(testFile->write(WRITE_TEST_DATA) >= WRITE_TEST_DATA.size())
|
|
||||||
{
|
|
||||||
*lockfile = testFile; testFile = NULL;
|
|
||||||
tempFolder = localAppData.canonicalPath();
|
|
||||||
}
|
|
||||||
if(testFile) testFile->remove();
|
|
||||||
MIXP_DELETE_OBJ(testFile);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(!tempFolder.isEmpty())
|
|
||||||
{
|
|
||||||
return tempFolder;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
qFatal("Failed to determine TEMP folder!");
|
|
||||||
return QString();
|
|
||||||
}
|
|
||||||
|
|
||||||
void mixp_clean_folder(const QString &folderPath)
|
|
||||||
{
|
|
||||||
QDir tempFolder(folderPath);
|
|
||||||
QFileInfoList entryList = tempFolder.entryInfoList(QDir::AllEntries | QDir::NoDotAndDotDot);
|
|
||||||
|
|
||||||
for(int i = 0; i < entryList.count(); i++)
|
|
||||||
{
|
|
||||||
if(entryList.at(i).isDir())
|
|
||||||
{
|
|
||||||
mixp_clean_folder(entryList.at(i).canonicalFilePath());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
for(int j = 0; j < 5; j++)
|
|
||||||
{
|
|
||||||
if(QFile::remove(entryList.at(i).canonicalFilePath()))
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
tempFolder.rmdir(".");
|
|
||||||
}
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
// MAIN function
|
// MAIN function
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
@ -269,7 +96,7 @@ int mixp_main(int argc, char* argv[])
|
|||||||
|
|
||||||
if(bConsole) init_console();
|
if(bConsole) init_console();
|
||||||
|
|
||||||
qDebug("MediaInfoXP [%s]", mixp_buildDate);
|
qDebug("MediaInfoXP v%u.%02u, built on %s at %s.", mixp_versionMajor, mixp_versionMinor, mixp_buildDate, mixp_buildTime);
|
||||||
qDebug("Copyright (c) 2004-%s LoRd_MuldeR <mulder2@gmx.de>. Some rights reserved.", &mixp_buildDate[7]);
|
qDebug("Copyright (c) 2004-%s LoRd_MuldeR <mulder2@gmx.de>. Some rights reserved.", &mixp_buildDate[7]);
|
||||||
qDebug("Built with Qt v%s, running with Qt v%s.\n", QT_VERSION_STR, qVersion());
|
qDebug("Built with Qt v%s, running with Qt v%s.\n", QT_VERSION_STR, qVersion());
|
||||||
|
|
||||||
@ -277,6 +104,12 @@ int mixp_main(int argc, char* argv[])
|
|||||||
|
|
||||||
//Get temp folder
|
//Get temp folder
|
||||||
const QString tempFolder = mixp_getTempFolder(&lockFile);
|
const QString tempFolder = mixp_getTempFolder(&lockFile);
|
||||||
|
if(tempFolder.isEmpty())
|
||||||
|
{
|
||||||
|
qFatal("Failed to determine TEMP folder!");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
qDebug("TEMP folder is:\n%s\n", QDir::toNativeSeparators(tempFolder).toUtf8().constData());
|
qDebug("TEMP folder is:\n%s\n", QDir::toNativeSeparators(tempFolder).toUtf8().constData());
|
||||||
|
|
||||||
//Create application
|
//Create application
|
||||||
|
@ -42,6 +42,7 @@
|
|||||||
|
|
||||||
//Internal
|
//Internal
|
||||||
#include "Config.h"
|
#include "Config.h"
|
||||||
|
#include "Utils.h"
|
||||||
|
|
||||||
//Macros
|
//Macros
|
||||||
#define SET_FONT_BOLD(WIDGET,BOLD) { QFont _font = WIDGET->font(); _font.setBold(BOLD); WIDGET->setFont(_font); }
|
#define SET_FONT_BOLD(WIDGET,BOLD) { QFont _font = WIDGET->font(); _font.setBold(BOLD); WIDGET->setFont(_font); }
|
||||||
|
204
src/Utils.cpp
Normal file
204
src/Utils.cpp
Normal file
@ -0,0 +1,204 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// MediaInfoXP
|
||||||
|
// Copyright (C) 2004-2013 LoRd_MuldeR <MuldeR2@GMX.de>
|
||||||
|
//
|
||||||
|
// This program is free software; you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation; either version 2 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 General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License along
|
||||||
|
// with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
//
|
||||||
|
// http://www.gnu.org/licenses/gpl-2.0.txt
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#include "Utils.h"
|
||||||
|
|
||||||
|
//StdLib
|
||||||
|
#include <cstdio>
|
||||||
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
|
#include <ctime>
|
||||||
|
|
||||||
|
#pragma intrinsic(_InterlockedExchange)
|
||||||
|
|
||||||
|
//Qt
|
||||||
|
#include <QLibrary>
|
||||||
|
#include <QDir>
|
||||||
|
#include <QFileInfo>
|
||||||
|
#include <QUuid>
|
||||||
|
|
||||||
|
//Win32
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#include <Windows.h>
|
||||||
|
#include <io.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <Objbase.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Try to lock folder
|
||||||
|
*/
|
||||||
|
QString mixp_tryLockFolder(const QString &folderPath, QFile **lockfile)
|
||||||
|
{
|
||||||
|
const QString SUB_FOLDER = QUuid::createUuid().toString();
|
||||||
|
const QByteArray WRITE_TEST_DATA = QByteArray("Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.");
|
||||||
|
|
||||||
|
QDir folder(folderPath);
|
||||||
|
if(!folder.exists())
|
||||||
|
{
|
||||||
|
folder.mkdir(".");
|
||||||
|
}
|
||||||
|
|
||||||
|
if(folder.exists())
|
||||||
|
{
|
||||||
|
folder.mkdir(SUB_FOLDER);
|
||||||
|
if(folder.cd(SUB_FOLDER) && folder.exists())
|
||||||
|
{
|
||||||
|
QFile *testFile = new QFile(QString("%1/~lock.tmp").arg(folder.canonicalPath()));
|
||||||
|
if(testFile->open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Unbuffered))
|
||||||
|
{
|
||||||
|
if(testFile->write(WRITE_TEST_DATA) >= WRITE_TEST_DATA.size())
|
||||||
|
{
|
||||||
|
*lockfile = testFile;
|
||||||
|
return folder.canonicalPath();
|
||||||
|
}
|
||||||
|
testFile->remove();
|
||||||
|
}
|
||||||
|
MIXP_DELETE_OBJ(testFile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return QString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get AppData folder
|
||||||
|
*/
|
||||||
|
QString mixp_getAppDataFolder(void)
|
||||||
|
{
|
||||||
|
typedef HRESULT (WINAPI *SHGetKnownFolderPathFun)(__in const GUID &rfid, __in DWORD dwFlags, __in HANDLE hToken, __out PWSTR *ppszPath);
|
||||||
|
typedef HRESULT (WINAPI *SHGetFolderPathFun)(__in HWND hwndOwner, __in int nFolder, __in HANDLE hToken, __in DWORD dwFlags, __out LPWSTR pszPath);
|
||||||
|
|
||||||
|
static const int CSIDL_LOCAL_APPDATA = 0x001c;
|
||||||
|
static const GUID GUID_LOCAL_APPDATA = {0xF1B32785,0x6FBA,0x4FCF,{0x9D,0x55,0x7B,0x8E,0x7F,0x15,0x70,0x91}};
|
||||||
|
|
||||||
|
SHGetKnownFolderPathFun SHGetKnownFolderPathPtr = NULL;
|
||||||
|
SHGetFolderPathFun SHGetFolderPathPtr = NULL;
|
||||||
|
|
||||||
|
QLibrary kernel32Lib("shell32.dll");
|
||||||
|
if(kernel32Lib.load())
|
||||||
|
{
|
||||||
|
SHGetKnownFolderPathPtr = (SHGetKnownFolderPathFun) kernel32Lib.resolve("SHGetKnownFolderPath");
|
||||||
|
SHGetFolderPathPtr = (SHGetFolderPathFun) kernel32Lib.resolve("SHGetFolderPathW");
|
||||||
|
}
|
||||||
|
|
||||||
|
QString folder;
|
||||||
|
|
||||||
|
if(SHGetKnownFolderPathPtr)
|
||||||
|
{
|
||||||
|
qDebug("SHGetKnownFolderPathPtr()\n");
|
||||||
|
WCHAR *path = NULL;
|
||||||
|
if(SHGetKnownFolderPathPtr(GUID_LOCAL_APPDATA, 0x00008000, NULL, &path) == S_OK)
|
||||||
|
{
|
||||||
|
QDir folderTemp = QDir(QDir::fromNativeSeparators(QString::fromUtf16(reinterpret_cast<const unsigned short*>(path))));
|
||||||
|
if(!folderTemp.exists())
|
||||||
|
{
|
||||||
|
folderTemp.mkpath(".");
|
||||||
|
}
|
||||||
|
if(folderTemp.exists())
|
||||||
|
{
|
||||||
|
folder = folderTemp.canonicalPath();
|
||||||
|
}
|
||||||
|
CoTaskMemFree(path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(SHGetFolderPathPtr)
|
||||||
|
{
|
||||||
|
qDebug("SHGetFolderPathPtr()\n");
|
||||||
|
WCHAR *path = new WCHAR[4096];
|
||||||
|
if(SHGetFolderPathPtr(NULL, CSIDL_LOCAL_APPDATA, NULL, NULL, path) == S_OK)
|
||||||
|
{
|
||||||
|
QDir folderTemp = QDir(QDir::fromNativeSeparators(QString::fromUtf16(reinterpret_cast<const unsigned short*>(path))));
|
||||||
|
if(!folderTemp.exists())
|
||||||
|
{
|
||||||
|
folderTemp.mkpath(".");
|
||||||
|
}
|
||||||
|
if(folderTemp.exists())
|
||||||
|
{
|
||||||
|
folder = folderTemp.canonicalPath();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
delete [] path;
|
||||||
|
}
|
||||||
|
|
||||||
|
return folder;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Detect the TEMP folder
|
||||||
|
*/
|
||||||
|
QString mixp_getTempFolder(QFile **lockfile)
|
||||||
|
{
|
||||||
|
*lockfile = NULL;
|
||||||
|
|
||||||
|
//Try the %TMP% or %TEMP% directory first
|
||||||
|
QString tempPath = mixp_tryLockFolder(QDir::temp().absolutePath(), lockfile);
|
||||||
|
if(!tempPath.isEmpty())
|
||||||
|
{
|
||||||
|
return tempPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
qWarning("Failed to init %%TEMP%%, falling back to %%LOCALAPPDATA%%\n");
|
||||||
|
|
||||||
|
//Create TEMP folder in %LOCALAPPDATA%
|
||||||
|
QString localAppDataPath = mixp_getAppDataFolder();
|
||||||
|
if(!localAppDataPath.isEmpty())
|
||||||
|
{
|
||||||
|
if(QDir(localAppDataPath).exists())
|
||||||
|
{
|
||||||
|
tempPath = mixp_tryLockFolder(QString("%1/Temp").arg(localAppDataPath), lockfile);
|
||||||
|
if(!tempPath.isEmpty())
|
||||||
|
{
|
||||||
|
return tempPath;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return QString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Clean folder
|
||||||
|
*/
|
||||||
|
void mixp_clean_folder(const QString &folderPath)
|
||||||
|
{
|
||||||
|
QDir tempFolder(folderPath);
|
||||||
|
QFileInfoList entryList = tempFolder.entryInfoList(QDir::AllEntries | QDir::NoDotAndDotDot);
|
||||||
|
|
||||||
|
for(int i = 0; i < entryList.count(); i++)
|
||||||
|
{
|
||||||
|
if(entryList.at(i).isDir())
|
||||||
|
{
|
||||||
|
mixp_clean_folder(entryList.at(i).canonicalFilePath());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for(int j = 0; j < 5; j++)
|
||||||
|
{
|
||||||
|
if(QFile::remove(entryList.at(i).canonicalFilePath()))
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tempFolder.rmdir(".");
|
||||||
|
}
|
33
src/Utils.h
Normal file
33
src/Utils.h
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// MediaInfoXP
|
||||||
|
// Copyright (C) 2004-2013 LoRd_MuldeR <MuldeR2@GMX.de>
|
||||||
|
//
|
||||||
|
// This program is free software; you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation; either version 2 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 General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License along
|
||||||
|
// with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
//
|
||||||
|
// http://www.gnu.org/licenses/gpl-2.0.txt
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QString>
|
||||||
|
#include <QFile>
|
||||||
|
|
||||||
|
//Helper macros
|
||||||
|
#define MIXP_DELETE_OBJ(PTR) do { if((PTR)) { delete ((PTR)); (PTR) = NULL; } } while (0)
|
||||||
|
#define QWCHAR(STR) reinterpret_cast<const wchar_t*>(STR.utf16())
|
||||||
|
|
||||||
|
//Utils
|
||||||
|
QString mixp_getTempFolder(QFile **lockfile);
|
||||||
|
void mixp_clean_folder(const QString &folderPath);
|
116
z_build.bat
Normal file
116
z_build.bat
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
@echo off
|
||||||
|
REM ///////////////////////////////////////////////////////////////////////////
|
||||||
|
REM // Set Paths
|
||||||
|
REM ///////////////////////////////////////////////////////////////////////////
|
||||||
|
set "MSVC_PATH=C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC"
|
||||||
|
set "QTVC_PATH=C:\Qt\4.8.4"
|
||||||
|
set "UPX3_PATH=C:\UPX"
|
||||||
|
|
||||||
|
REM ###############################################
|
||||||
|
REM # DO NOT MODIFY ANY LINES BELOW THIS LINE !!! #
|
||||||
|
REM ###############################################
|
||||||
|
|
||||||
|
|
||||||
|
REM ///////////////////////////////////////////////////////////////////////////
|
||||||
|
REM // Setup environment
|
||||||
|
REM ///////////////////////////////////////////////////////////////////////////
|
||||||
|
if exist "%QTVC_PATH%\bin\qtvars.bat" ( call "%QTVC_PATH%\bin\qtvars.bat" )
|
||||||
|
if exist "%QTVC_PATH%\bin\qtenv2.bat" ( call "%QTVC_PATH%\bin\qtenv2.bat" )
|
||||||
|
call "%MSVC_PATH%\vcvarsall.bat" x86
|
||||||
|
|
||||||
|
REM ///////////////////////////////////////////////////////////////////////////
|
||||||
|
REM // Check environment
|
||||||
|
REM ///////////////////////////////////////////////////////////////////////////
|
||||||
|
if "%VCINSTALLDIR%"=="" (
|
||||||
|
echo %%VCINSTALLDIR%% not specified. Please check your MSVC_PATH var!
|
||||||
|
goto BuildError
|
||||||
|
)
|
||||||
|
if "%QTDIR%"=="" (
|
||||||
|
echo %%QTDIR%% not specified. Please check your MSVC_PATH var!
|
||||||
|
goto BuildError
|
||||||
|
)
|
||||||
|
if not exist "%VCINSTALLDIR%\bin\cl.exe" (
|
||||||
|
echo C++ compiler not found. Please check your MSVC_PATH var!
|
||||||
|
goto BuildError
|
||||||
|
)
|
||||||
|
if not exist "%QTDIR%\bin\moc.exe" (
|
||||||
|
echo Qt meta compiler not found. Please check your QTVC_PATH var!
|
||||||
|
goto BuildError
|
||||||
|
)
|
||||||
|
|
||||||
|
REM ///////////////////////////////////////////////////////////////////////////
|
||||||
|
REM // Get current date and time (in ISO format)
|
||||||
|
REM ///////////////////////////////////////////////////////////////////////////
|
||||||
|
set "ISO_DATE="
|
||||||
|
set "ISO_TIME="
|
||||||
|
if not exist "%~dp0\etc\date.exe" BuildError
|
||||||
|
for /F "tokens=1,2 delims=:" %%a in ('"%~dp0\etc\date.exe" +ISODATE:%%Y-%%m-%%d') do (
|
||||||
|
if "%%a"=="ISODATE" set "ISO_DATE=%%b"
|
||||||
|
)
|
||||||
|
for /F "tokens=1,2,3,4 delims=:" %%a in ('"%~dp0\etc\date.exe" +ISOTIME:%%T') do (
|
||||||
|
if "%%a"=="ISOTIME" set "ISO_TIME=%%b:%%c:%%d"
|
||||||
|
)
|
||||||
|
if "%ISO_DATE%"=="" goto BuildError
|
||||||
|
if "%ISO_TIME%"=="" goto BuildError
|
||||||
|
|
||||||
|
REM ///////////////////////////////////////////////////////////////////////////
|
||||||
|
REM // Build the binaries
|
||||||
|
REM ///////////////////////////////////////////////////////////////////////////
|
||||||
|
echo ---------------------------------------------------------------------
|
||||||
|
echo BEGIN BUILD
|
||||||
|
echo ---------------------------------------------------------------------
|
||||||
|
MSBuild.exe /property:Configuration=release /target:clean "%~dp0\MediaInfoXP.sln"
|
||||||
|
if not "%ERRORLEVEL%"=="0" goto BuildError
|
||||||
|
MSBuild.exe /property:Configuration=release /target:rebuild "%~dp0\MediaInfoXP.sln"
|
||||||
|
if not "%ERRORLEVEL%"=="0" goto BuildError
|
||||||
|
MSBuild.exe /property:Configuration=release /target:build "%~dp0\MediaInfoXP.sln"
|
||||||
|
if not "%ERRORLEVEL%"=="0" goto BuildError
|
||||||
|
|
||||||
|
REM ///////////////////////////////////////////////////////////////////////////
|
||||||
|
REM // Copy base files
|
||||||
|
REM ///////////////////////////////////////////////////////////////////////////
|
||||||
|
echo ---------------------------------------------------------------------
|
||||||
|
echo BEGIN PACKAGING
|
||||||
|
echo ---------------------------------------------------------------------
|
||||||
|
set "PACK_PATH=%TMP%\~%RANDOM%%RANDOM%.tmp"
|
||||||
|
mkdir "%PACK_PATH%"
|
||||||
|
copy "%~dp0\bin\Win32\Release\*.exe" "%PACK_PATH%"
|
||||||
|
copy "%~dp0\Copying.txt" "%PACK_PATH%"
|
||||||
|
copy "%~dp0\doc\*.txt" "%PACK_PATH%"
|
||||||
|
copy "%~dp0\doc\*.html" "%PACK_PATH%"
|
||||||
|
|
||||||
|
REM ///////////////////////////////////////////////////////////////////////////
|
||||||
|
REM // Compress
|
||||||
|
REM ///////////////////////////////////////////////////////////////////////////
|
||||||
|
"%UPX3_PATH%\upx.exe" --best "%PACK_PATH%\*.exe"
|
||||||
|
|
||||||
|
REM ///////////////////////////////////////////////////////////////////////////
|
||||||
|
REM // Attributes
|
||||||
|
REM ///////////////////////////////////////////////////////////////////////////
|
||||||
|
attrib +R "%PACK_PATH%\*.exe"
|
||||||
|
attrib +R "%PACK_PATH%\*.html"
|
||||||
|
attrib +R "%PACK_PATH%\*.txt"
|
||||||
|
|
||||||
|
REM ///////////////////////////////////////////////////////////////////////////
|
||||||
|
REM // Build the installer
|
||||||
|
REM ///////////////////////////////////////////////////////////////////////////
|
||||||
|
"%~dp0\etc\7za.exe" a -mm=Deflate -mfb=258 -mpass=15 -r "%~dp0\out\MediaInfo-GUI.%ISO_DATE%.zip" "%PACK_PATH%\*.*"
|
||||||
|
rmdir /Q /S "%PACK_PATH%"
|
||||||
|
|
||||||
|
REM ///////////////////////////////////////////////////////////////////////////
|
||||||
|
REM // COMPLETE
|
||||||
|
REM ///////////////////////////////////////////////////////////////////////////
|
||||||
|
echo.
|
||||||
|
echo Build completed.
|
||||||
|
echo.
|
||||||
|
pause
|
||||||
|
goto:eof
|
||||||
|
|
||||||
|
REM ///////////////////////////////////////////////////////////////////////////
|
||||||
|
REM // FAILED
|
||||||
|
REM ///////////////////////////////////////////////////////////////////////////
|
||||||
|
:BuildError
|
||||||
|
echo.
|
||||||
|
echo Build has failed !!!
|
||||||
|
echo.
|
||||||
|
pause
|
Loading…
Reference in New Issue
Block a user