2016-02-25 20:19:27 +00:00
|
|
|
// 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 "stdpch.h"
|
|
|
|
#include "utils.h"
|
|
|
|
|
2016-05-25 21:29:11 +00:00
|
|
|
QString qBytesToHumanReadable(qint64 bytes)
|
|
|
|
{
|
|
|
|
static std::vector<std::string> units;
|
|
|
|
|
|
|
|
if (units.empty())
|
|
|
|
{
|
|
|
|
units.push_back(QObject::tr("B").toUtf8().constData());
|
|
|
|
units.push_back(QObject::tr("KiB").toUtf8().constData());
|
|
|
|
units.push_back(QObject::tr("MiB").toUtf8().constData());
|
|
|
|
units.push_back(QObject::tr("GiB").toUtf8().constData());
|
|
|
|
units.push_back(QObject::tr("TiB").toUtf8().constData());
|
|
|
|
units.push_back(QObject::tr("PiB").toUtf8().constData());
|
|
|
|
}
|
|
|
|
|
|
|
|
return QString::fromUtf8(NLMISC::bytesToHumanReadable(bytes).c_str());
|
|
|
|
}
|
|
|
|
|
2016-05-29 18:27:49 +00:00
|
|
|
qint64 getDirectorySize(const QString &directory)
|
|
|
|
{
|
|
|
|
qint64 size = 0;
|
|
|
|
|
2016-06-12 12:18:36 +00:00
|
|
|
if (!directory.isEmpty())
|
2016-05-29 18:27:49 +00:00
|
|
|
{
|
2016-06-12 12:18:36 +00:00
|
|
|
QDir dir(directory);
|
2016-05-29 18:27:49 +00:00
|
|
|
|
2016-06-12 12:18:36 +00:00
|
|
|
if (dir.exists())
|
2016-05-29 18:27:49 +00:00
|
|
|
{
|
2016-06-12 12:18:36 +00:00
|
|
|
QFileInfoList list = dir.entryInfoList(QDir::Files | QDir::Dirs | QDir::Hidden | QDir::NoSymLinks | QDir::NoDotAndDotDot);
|
2016-05-29 18:27:49 +00:00
|
|
|
|
2016-06-12 12:18:36 +00:00
|
|
|
for (int i = 0; i < list.size(); ++i)
|
2016-05-29 18:27:49 +00:00
|
|
|
{
|
2016-06-12 12:18:36 +00:00
|
|
|
QFileInfo fileInfo = list.at(i);
|
|
|
|
|
|
|
|
if (fileInfo.isDir())
|
|
|
|
{
|
|
|
|
size += getDirectorySize(fileInfo.absoluteFilePath());
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
size += fileInfo.size();
|
|
|
|
}
|
2016-05-29 18:27:49 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return size;
|
|
|
|
}
|
|
|
|
|
2016-02-25 20:19:27 +00:00
|
|
|
QString qFromUtf8(const std::string &str)
|
|
|
|
{
|
|
|
|
return QString::fromUtf8(str.c_str());
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string qToUtf8(const QString &str)
|
|
|
|
{
|
|
|
|
return str.toUtf8().constData();
|
|
|
|
}
|
|
|
|
|
|
|
|
QString qFromUtf16(const ucstring &str)
|
|
|
|
{
|
|
|
|
return QString::fromUtf16(str.c_str());
|
|
|
|
}
|
|
|
|
|
|
|
|
ucstring qToUtf16(const QString &str)
|
|
|
|
{
|
|
|
|
return ucstring::makeFromUtf8(qToUtf8(str));
|
|
|
|
}
|
|
|
|
|
|
|
|
QString qFromWide(const wchar_t *str)
|
|
|
|
{
|
|
|
|
return QString::fromUtf16((ushort*)str);
|
|
|
|
}
|
|
|
|
|
|
|
|
wchar_t* qToWide(const QString &str)
|
|
|
|
{
|
|
|
|
return (wchar_t*)str.utf16();
|
|
|
|
}
|
|
|
|
|
2016-05-14 16:48:06 +00:00
|
|
|
#ifdef Q_OS_WIN32
|
2016-02-25 20:19:27 +00:00
|
|
|
|
|
|
|
// CreateLink - Uses the Shell's IShellLink and IPersistFile interfaces
|
|
|
|
// to create and store a shortcut to the specified object.
|
|
|
|
//
|
|
|
|
// Returns the result of calling the member functions of the interfaces.
|
|
|
|
//
|
|
|
|
// Parameters:
|
|
|
|
// lpszPathObj - Address of a buffer that contains the path of the object,
|
|
|
|
// including the file name.
|
|
|
|
// lpszPathLink - Address of a buffer that contains the path where the
|
|
|
|
// Shell link is to be stored, including the file name.
|
|
|
|
// lpszDesc - Address of a buffer that contains a description of the
|
|
|
|
// Shell link, stored in the Comment field of the link
|
|
|
|
// properties.
|
|
|
|
|
|
|
|
HRESULT CreateLink(const QString &pathObj, const QString &pathLink, const QString &desc)
|
|
|
|
{
|
|
|
|
IShellLinkW* psl;
|
|
|
|
|
|
|
|
// Get a pointer to the IShellLink interface. It is assumed that CoInitialize
|
|
|
|
// has already been called.
|
|
|
|
HRESULT hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&psl);
|
|
|
|
if (SUCCEEDED(hres))
|
|
|
|
{
|
|
|
|
IPersistFile* ppf;
|
|
|
|
|
|
|
|
// Set the path to the shortcut target and add the description.
|
|
|
|
psl->SetPath(qToWide(pathObj));
|
|
|
|
psl->SetDescription(qToWide(desc));
|
|
|
|
psl->SetArguments(L"--profil ");
|
|
|
|
psl->SetWorkingDirectory(L"");
|
|
|
|
|
|
|
|
// Query IShellLink for the IPersistFile interface, used for saving the
|
|
|
|
// shortcut in persistent storage.
|
|
|
|
hres = psl->QueryInterface(IID_IPersistFile, (LPVOID*)&ppf);
|
|
|
|
|
|
|
|
if (SUCCEEDED(hres))
|
|
|
|
{
|
|
|
|
// Add code here to check return value from MultiByteWideChar
|
|
|
|
// for success.
|
|
|
|
|
|
|
|
// Save the link by calling IPersistFile::Save.
|
|
|
|
hres = ppf->Save(qToWide(pathLink), TRUE);
|
|
|
|
ppf->Release();
|
|
|
|
}
|
|
|
|
psl->Release();
|
|
|
|
}
|
|
|
|
return hres;
|
|
|
|
}
|
|
|
|
|
|
|
|
// ResolveIt - Uses the Shell's IShellLink and IPersistFile interfaces
|
|
|
|
// to retrieve the path and description from an existing shortcut.
|
|
|
|
//
|
|
|
|
// Returns the result of calling the member functions of the interfaces.
|
|
|
|
//
|
|
|
|
// Parameters:
|
|
|
|
// hwnd - A handle to the parent window. The Shell uses this window to
|
|
|
|
// display a dialog box if it needs to prompt the user for more
|
|
|
|
// information while resolving the link.
|
|
|
|
// lpszLinkFile - Address of a buffer that contains the path of the link,
|
|
|
|
// including the file name.
|
|
|
|
// lpszPath - Address of a buffer that receives the path of the link
|
|
|
|
// target, including the file name.
|
|
|
|
// lpszDesc - Address of a buffer that receives the description of the
|
|
|
|
// Shell link, stored in the Comment field of the link
|
|
|
|
// properties.
|
|
|
|
|
|
|
|
HRESULT ResolveIt(HWND hwnd, const QString &linkFile, QString &path)
|
|
|
|
{
|
|
|
|
IShellLinkW* psl;
|
|
|
|
WIN32_FIND_DATAW wfd;
|
|
|
|
|
|
|
|
path.clear(); // Assume failure
|
|
|
|
|
|
|
|
// Get a pointer to the IShellLink interface. It is assumed that CoInitialize
|
|
|
|
// has already been called.
|
|
|
|
HRESULT hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&psl);
|
|
|
|
if (SUCCEEDED(hres))
|
|
|
|
{
|
|
|
|
IPersistFile* ppf;
|
|
|
|
|
|
|
|
// Get a pointer to the IPersistFile interface.
|
|
|
|
hres = psl->QueryInterface(IID_IPersistFile, (void**)&ppf);
|
|
|
|
|
|
|
|
if (SUCCEEDED(hres))
|
|
|
|
{
|
|
|
|
// Add code here to check return value from MultiByteWideChar
|
|
|
|
// for success.
|
|
|
|
|
|
|
|
// Load the shortcut.
|
|
|
|
hres = ppf->Load(qToWide(linkFile), STGM_READ);
|
|
|
|
|
|
|
|
if (SUCCEEDED(hres))
|
|
|
|
{
|
|
|
|
// Resolve the link.
|
|
|
|
hres = psl->Resolve(hwnd, 0);
|
|
|
|
|
|
|
|
if (SUCCEEDED(hres))
|
|
|
|
{
|
|
|
|
WCHAR szGotPath[MAX_PATH];
|
|
|
|
|
|
|
|
// Get the path to the link target.
|
|
|
|
hres = psl->GetPath(szGotPath, MAX_PATH, (WIN32_FIND_DATAW*)&wfd, SLGP_SHORTPATH);
|
|
|
|
|
|
|
|
if (SUCCEEDED(hres))
|
|
|
|
{
|
|
|
|
WCHAR szDescription[MAX_PATH];
|
|
|
|
|
|
|
|
// Get the description of the target.
|
|
|
|
hres = psl->GetDescription(szDescription, MAX_PATH);
|
|
|
|
|
|
|
|
if (SUCCEEDED(hres))
|
|
|
|
{
|
|
|
|
// Handle success
|
|
|
|
path = qFromWide(szGotPath);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Release the pointer to the IPersistFile interface.
|
|
|
|
ppf->Release();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Release the pointer to the IShellLink interface.
|
|
|
|
psl->Release();
|
|
|
|
}
|
|
|
|
|
|
|
|
return hres;
|
|
|
|
}
|
2016-05-14 16:48:06 +00:00
|
|
|
|
|
|
|
#endif
|