/*
Copyright (C) 2015 Sebastian Herbord. All rights reserved.
This file is part of Mod Organizer.
Mod Organizer 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 3 of the License, or
(at your option) any later version.
Mod Organizer 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 Mod Organizer. If not, see .
*/
#include "usvfsconnector.h"
#include
#include
#include
#include
static const char SHMID[] = "mod_organizer_instance";
/*
extern "C" DLLEXPORT BOOL WINAPI VirtualLinkFile(LPCWSTR source, LPCWSTR destination, BOOL failIfExists);
extern "C" DLLEXPORT BOOL WINAPI VirtualLinkDirectoryStatic(LPCWSTR source, LPCWSTR destination, unsigned int flags);
extern "C" DLLEXPORT BOOL WINAPI ConnectVFS(const usvfs::Parameters *parameters);
extern "C" DLLEXPORT void WINAPI DisconnectVFS();
extern "C" DLLEXPORT void WINAPI GetCurrentVFSName(char *buffer, size_t size);
extern "C" DLLEXPORT BOOL WINAPI CreateProcessHooked(LPCWSTR lpApplicationName
, LPWSTR lpCommandLine
, LPSECURITY_ATTRIBUTES lpProcessAttributes
, LPSECURITY_ATTRIBUTES lpThreadAttributes
, BOOL bInheritHandles
, DWORD dwCreationFlags
, LPVOID lpEnvironment
, LPCWSTR lpCurrentDirectory
, LPSTARTUPINFOW lpStartupInfo
, LPPROCESS_INFORMATION lpProcessInformation
);
extern "C" DLLEXPORT void __cdecl InitLogging(bool toLocal = false);
extern "C" DLLEXPORT void __cdecl InitHooks(LPVOID userData, size_t userDataSize);
*/
LogWorker::LogWorker()
: m_Buffer(1024, '\0')
, m_QuitRequested(false)
, m_LogFile(new QTemporaryFile("usvfs-XXXXXX.log"))
{
m_LogFile->open(QIODevice::WriteOnly);
qDebug("usvfs log messages are written to %s", qPrintable(m_LogFile->fileName()));
}
LogWorker::~LogWorker()
{
delete m_LogFile;
}
void LogWorker::process()
{
while (!m_QuitRequested) {
if (GetLogMessages(&m_Buffer[0], m_Buffer.size(), false)) {
m_LogFile->write(m_Buffer.c_str());
m_LogFile->write("\n");
m_LogFile->flush();
//emit outputLog(QString::fromStdString(m_Buffer));
} else {
QThread::sleep(1);
}
}
emit finished();
}
void LogWorker::exit()
{
m_QuitRequested = true;
}
UsvfsConnector::UsvfsConnector()
{
usvfs::Parameters params(SHMID, true, LogLevel::Debug);
InitLogging(false);
ConnectVFS(¶ms);
m_LogWorker.moveToThread(&m_WorkerThread);
connect(&m_WorkerThread, SIGNAL(started()), &m_LogWorker, SLOT(process()));
connect(&m_LogWorker, SIGNAL(finished()), &m_WorkerThread, SLOT(quit()));
m_WorkerThread.start(QThread::LowestPriority);
}
UsvfsConnector::~UsvfsConnector()
{
DisconnectVFS();
m_LogWorker.exit();
m_WorkerThread.quit();
//m_WorkerThread.wait();
}
void UsvfsConnector::updateMapping(const MappingType &mapping)
{
QProgressDialog progress;
progress.setLabelText(tr("Preparing vfs"));
progress.setMaximum(mapping.size());
progress.show();
int value = 0;
for (auto map : mapping) {
progress.setValue(value++);
if (value % 10 == 0) {
QCoreApplication::processEvents();
}
if (map.isDirectory) {
VirtualLinkDirectoryStatic(map.source.toStdWString().c_str()
, map.destination.toStdWString().c_str()
, 0);
} else {
VirtualLinkFile(map.source.toStdWString().c_str()
, map.destination.toStdWString().c_str()
, 0);
}
}
/*
size_t dumpSize = 0;
CreateVFSDump(nullptr, &dumpSize);
std::unique_ptr buffer(new char[dumpSize]);
CreateVFSDump(buffer.get(), &dumpSize);
qDebug(buffer.get());
*/
}