Merge remote-tracking branch 'ryzomcore/develop' into ryzomclassic-develop
commit
31e1cd6feb
@ -1,17 +1,27 @@
|
|||||||
4eddbaff0c5e5d685db96ee3e8427aa0fd96ac83 ryzomcore/v0.8.0
|
4eddbaff0c5e5d685db96ee3e8427aa0fd96ac83 v0.8.0
|
||||||
00d9b6e29e95f56785fbf85abe60afd34674f402 ryzomcore/v0.9.0
|
00d9b6e29e95f56785fbf85abe60afd34674f402 v0.9.0
|
||||||
79776c337176dd5b02e1a74fe5dfb703b91747aa ryzomcore/v0.9.1
|
79776c337176dd5b02e1a74fe5dfb703b91747aa v0.9.1
|
||||||
fedf2aa443d09707beed814b0f499c6a5519cc84 ryzomcore/v0.10.0
|
fedf2aa443d09707beed814b0f499c6a5519cc84 v0.10.0
|
||||||
edaa3624a56420b02ccc64c26059801a389927ee ryzomcore/v0.11.0
|
edaa3624a56420b02ccc64c26059801a389927ee v0.11.0
|
||||||
e3fe4855f22c3e75722e015dc33c091c340b3ad7 ryzomcore/v0.11.1
|
e3fe4855f22c3e75722e015dc33c091c340b3ad7 v0.11.1
|
||||||
9e583b717fd63be0be9fd60b99087abf1691ea49 ryzomcore/v0.11.2
|
9e583b717fd63be0be9fd60b99087abf1691ea49 v0.11.2
|
||||||
bfe5628e14a024ba7ea32e4b326ae433a07856b9 ryzomcore/v0.11.3
|
bfe5628e14a024ba7ea32e4b326ae433a07856b9 v0.11.3
|
||||||
9a6120735daa97c96ac5d85ca35c7f21f607bd87 ryzomcore/v0.12.0
|
9a6120735daa97c96ac5d85ca35c7f21f607bd87 v0.12.0
|
||||||
3e17907af67e8d66d80e6b714707bbf912607f2a ryzom-patch-3.0.0
|
3e92c7104c20d6bc6c2147b4b5fc289e8621d322 v1.0.0
|
||||||
153e0b605c9e0c83ba05b6428c62838b49cc84b2 ryzom-patch-3.0.1
|
8eb94c3549be898fdc4a7c6d791d2477bdc11a18 v1.0.1
|
||||||
4300cc14aad098b1f86ea4c55577b7fa4a4cb5d2 ryzom-patch-3.1.0
|
3e17907af67e8d66d80e6b714707bbf912607f2a ryzom/3.0.0
|
||||||
043aaeb3d8a2a54177581b57bda87a9deaad510e ryzom-patch-3.1.0-april_patch
|
153e0b605c9e0c83ba05b6428c62838b49cc84b2 ryzom/3.0.1
|
||||||
00dde390a394fce9da06c2f3264140282158d39f ryzom-patch-3.3.0
|
9d41f2994d44b9aad92b83f945f114e4b6bed44a ryzom/3.0.2
|
||||||
dcd4c4d161ef775136e18c7e8f5072b75dede27e ryzom-patch-3.3.1
|
4300cc14aad098b1f86ea4c55577b7fa4a4cb5d2 ryzom/3.1.0
|
||||||
8eb94c3549be898fdc4a7c6d791d2477bdc11a18 ryzomcore/v1.0.1
|
d4060f217f4f834cc62a33f2f1ccdf3c28298066 ryzom/3.1.0-hotfix
|
||||||
3e92c7104c20d6bc6c2147b4b5fc289e8621d322 ryzomcore/v1.0.0
|
043aaeb3d8a2a54177581b57bda87a9deaad510e ryzom/3.1.0-april_patch
|
||||||
|
4036ecf59e83960f03acebc2089eb2ff5eeaed0a ryzom/3.2.0
|
||||||
|
18403bb9485da3d9742c6f007a16d5619ebfb196 ryzom/3.2.1
|
||||||
|
822ff8f8917ad66e09e2c21c983282f6f693b9f6 ryzom/3.3.0
|
||||||
|
00dde390a394fce9da06c2f3264140282158d39f ryzom/3.3.0
|
||||||
|
dcd4c4d161ef775136e18c7e8f5072b75dede27e ryzom/3.3.1
|
||||||
|
fc4be8ebec5ca754ef4453bc6a9faef90837c674 ryzom/3.4.0
|
||||||
|
70eba02e8eab6920586dbabf74e9e8180c729980 ryzom/3.4.0-steam_fix
|
||||||
|
3941482843f9cd130cfc16634efc08d34a98ed35 ryzom/3.4.0-atysmas
|
||||||
|
ecae9feb4cceb78103e5d7236caccaf450796cdb ryzom/3.5.0
|
||||||
|
95783afa226f241062134eb62f4323295d29ac84 ryzom/3.5.0.9637
|
||||||
|
@ -0,0 +1,44 @@
|
|||||||
|
// NeL - MMORPG Framework <https://wiki.ryzom.dev/>
|
||||||
|
// Copyright (C) 2019 Jan BOON (jan.boon@kaetemi.be)
|
||||||
|
//
|
||||||
|
// 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/>.
|
||||||
|
|
||||||
|
#ifndef NLMISC_STREAMED_PACKAGE_PROVIDER_H
|
||||||
|
#define NLMISC_STREAMED_PACKAGE_PROVIDER_H
|
||||||
|
|
||||||
|
#include <nel/misc/types_nl.h>
|
||||||
|
#include <nel/misc/sha1.h>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace NLMISC {
|
||||||
|
|
||||||
|
class IStreamedPackageProvider
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
IStreamedPackageProvider();
|
||||||
|
virtual ~IStreamedPackageProvider();
|
||||||
|
|
||||||
|
/// Download a file. This call is blocking
|
||||||
|
/// filePath: [out] ex. /games/nel/stream/00/00/000000000..
|
||||||
|
/// hash: [in]
|
||||||
|
/// name: [in] name for debugging purposes
|
||||||
|
virtual bool getFile(std::string &filePath, const CHashKey &hash, const std::string &name = "") = 0;
|
||||||
|
|
||||||
|
}; /* class IStreamedPackageProvider */
|
||||||
|
|
||||||
|
} /* namespace NLMISC */
|
||||||
|
|
||||||
|
#endif /* #ifndef NLMISC_STREAMED_PACKAGE_PROVIDER_H */
|
||||||
|
|
||||||
|
/* end of file */
|
@ -0,0 +1,2 @@
|
|||||||
|
FILE(GLOB HEADERS *.h)
|
||||||
|
INSTALL(FILES ${HEADERS} DESTINATION include/nel/web COMPONENT headers)
|
@ -0,0 +1,71 @@
|
|||||||
|
// NeL - MMORPG Framework <https://wiki.ryzom.dev/>
|
||||||
|
// Copyright (C) 2019 Jan BOON (jan.boon@kaetemi.be)
|
||||||
|
//
|
||||||
|
// 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/>.
|
||||||
|
|
||||||
|
#ifndef NLWEB_HTTP_PACKAGE_PROVIDER_H
|
||||||
|
#define NLWEB_HTTP_PACKAGE_PROVIDER_H
|
||||||
|
|
||||||
|
#include <nel/misc/types_nl.h>
|
||||||
|
#include <nel/misc/i_streamed_package_provider.h>
|
||||||
|
|
||||||
|
/// NeL Streamed Packages are like NeL Big Packages, but storing only
|
||||||
|
/// the file hash, allowing to load the file from a remote source instead.
|
||||||
|
|
||||||
|
/// Technically, this works, because NeL 3D already loads resources
|
||||||
|
/// asynchronously. However, NeL 3D will not simultaneously load more
|
||||||
|
/// than one file, so on connections with high latency a backlog builds up.
|
||||||
|
/// It will need further changes in NeL 3D to be practical.
|
||||||
|
|
||||||
|
/// Alternatively, it could be modified to plug in dynamic data packages
|
||||||
|
/// at runtime, for example to load in user models for Ring. It would
|
||||||
|
/// need an adjustment to download all files as soon as the package is
|
||||||
|
/// enabled. Advantage is that existing files are automatically matched
|
||||||
|
/// by their hash, so will only be downloaded once, and that files are
|
||||||
|
/// accessed in the same way as files inside bnp packages.
|
||||||
|
|
||||||
|
/// The extension `.snp` is used for streamed packages.
|
||||||
|
|
||||||
|
/// This class uses an HTTP server with LZMA compressed resources as
|
||||||
|
/// the package data source.
|
||||||
|
|
||||||
|
namespace NLWEB {
|
||||||
|
|
||||||
|
class CHttpPackageProvider : public NLMISC::IStreamedPackageProvider
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CHttpPackageProvider();
|
||||||
|
virtual ~CHttpPackageProvider();
|
||||||
|
|
||||||
|
/// Download a file. This call is blocking
|
||||||
|
/// filePath: [out] ex. /games/nel/stream/00/00/000000000..
|
||||||
|
/// hash: [in]
|
||||||
|
/// name: [in] name for debugging purposes
|
||||||
|
virtual bool getFile(std::string &filePath, const NLMISC::CHashKey &hash, const std::string &name) NL_OVERRIDE;
|
||||||
|
|
||||||
|
public:
|
||||||
|
/// Set storage path (ex. stream/)
|
||||||
|
std::string Path;
|
||||||
|
|
||||||
|
/// Loads a package into the package manager (ex. http://cdn.ryzom.dev/open/stream/)
|
||||||
|
typedef std::vector<std::string> THosts;
|
||||||
|
THosts Hosts;
|
||||||
|
|
||||||
|
}; /* class CHttpPackageProvider */
|
||||||
|
|
||||||
|
} /* namespace NLMISC */
|
||||||
|
|
||||||
|
#endif /* #ifndef NLWEB_HTTP_PACKAGE_PROVIDER_H */
|
||||||
|
|
||||||
|
/* end of file */
|
@ -0,0 +1,37 @@
|
|||||||
|
// NeL - MMORPG Framework <https://wiki.ryzom.dev/>
|
||||||
|
// Copyright (C) 2019 Jan BOON (jan.boon@kaetemi.be)
|
||||||
|
//
|
||||||
|
// 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 "stdmisc.h"
|
||||||
|
|
||||||
|
// Project includes
|
||||||
|
#include <nel/misc/i_streamed_package_provider.h>
|
||||||
|
|
||||||
|
namespace NLMISC
|
||||||
|
{
|
||||||
|
|
||||||
|
IStreamedPackageProvider::IStreamedPackageProvider()
|
||||||
|
{
|
||||||
|
// init
|
||||||
|
}
|
||||||
|
|
||||||
|
IStreamedPackageProvider::~IStreamedPackageProvider()
|
||||||
|
{
|
||||||
|
// release
|
||||||
|
}
|
||||||
|
|
||||||
|
} /* namespace NLMISC */
|
||||||
|
|
||||||
|
/* end of file */
|
@ -0,0 +1,28 @@
|
|||||||
|
FILE(GLOB SRC *.cpp *.h)
|
||||||
|
FILE(GLOB HEADERS ../../include/nel/web/*.h)
|
||||||
|
|
||||||
|
SOURCE_GROUP("" FILES ${SRC} ${HEADERS})
|
||||||
|
|
||||||
|
NL_TARGET_LIB(nelweb ${HEADERS} ${SRC})
|
||||||
|
|
||||||
|
INCLUDE_DIRECTORIES(../../3rdparty)
|
||||||
|
INCLUDE_DIRECTORIES(${LIBXML2_INCLUDE_DIR} ${CURL_INCLUDE_DIRS} ${OPENSSL_INCLUDE_DIR})
|
||||||
|
|
||||||
|
TARGET_LINK_LIBRARIES(nelweb ${LIBXML2_LIBRARIES} ${CURL_LIBRARIES} ${OPENSSL_LIBRARIES} nelmisc nel_sevenzip)
|
||||||
|
|
||||||
|
NL_DEFAULT_PROPS(nelweb "NeL, Library: NeL Web")
|
||||||
|
NL_ADD_RUNTIME_FLAGS(nelweb)
|
||||||
|
|
||||||
|
NL_ADD_LIB_SUFFIX(nelweb)
|
||||||
|
|
||||||
|
ADD_DEFINITIONS(${LIBXML2_DEFINITIONS} ${CURL_DEFINITIONS})
|
||||||
|
|
||||||
|
IF(WITH_PCH)
|
||||||
|
ADD_NATIVE_PRECOMPILED_HEADER(nelweb ${CMAKE_CURRENT_SOURCE_DIR}/stdweb.h ${CMAKE_CURRENT_SOURCE_DIR}/stdweb.cpp)
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
NL_GEN_PC(nel-web.pc)
|
||||||
|
|
||||||
|
IF((WITH_INSTALL_LIBRARIES AND WITH_STATIC) OR NOT WITH_STATIC)
|
||||||
|
INSTALL(TARGETS nelweb LIBRARY DESTINATION ${NL_LIB_PREFIX} ARCHIVE DESTINATION ${NL_LIB_PREFIX} COMPONENT libraries)
|
||||||
|
ENDIF()
|
@ -0,0 +1,146 @@
|
|||||||
|
// NeL - MMORPG Framework <https://wiki.ryzom.dev/>
|
||||||
|
// Copyright (C) 2019 Jan BOON (jan.boon@kaetemi.be)
|
||||||
|
//
|
||||||
|
// 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 "stdweb.h"
|
||||||
|
#include <nel/web/http_package_provider.h>
|
||||||
|
|
||||||
|
// Project includes
|
||||||
|
#include <nel/misc/streamed_package.h>
|
||||||
|
#include <nel/misc/file.h>
|
||||||
|
#include <nel/misc/path.h>
|
||||||
|
#include <nel/misc/seven_zip.h>
|
||||||
|
#include <nel/misc/sha1.h>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
using namespace NLMISC;
|
||||||
|
using namespace NLWEB;
|
||||||
|
|
||||||
|
namespace NLWEB
|
||||||
|
{
|
||||||
|
|
||||||
|
CHttpPackageProvider::CHttpPackageProvider()
|
||||||
|
{
|
||||||
|
// init
|
||||||
|
}
|
||||||
|
|
||||||
|
CHttpPackageProvider::~CHttpPackageProvider()
|
||||||
|
{
|
||||||
|
// release
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CHttpPackageProvider::getFile(std::string &filePath, const CHashKey &hash, const std::string &name)
|
||||||
|
{
|
||||||
|
CStreamedPackage::makePath(filePath, hash);
|
||||||
|
std::string downloadUrlFile = filePath + ".lzma";
|
||||||
|
filePath = Path + filePath;
|
||||||
|
std::string downloadPath = filePath + ".download." + toString(rand() * rand());
|
||||||
|
|
||||||
|
std::string storageDirectory = CFile::getPath(downloadPath);
|
||||||
|
CFile::createDirectoryTree(storageDirectory);
|
||||||
|
/*if (!CFile::isDirectory(storageDirectory) || !CFile::createDirectoryTree(storageDirectory))
|
||||||
|
{
|
||||||
|
nldebug("Unable to create directory '%s'", storageDirectory.c_str());
|
||||||
|
return false;
|
||||||
|
}*/
|
||||||
|
|
||||||
|
// download
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
if (CFile::fileExists(filePath))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
std::string downloadUrl = Hosts[rand() % Hosts.size()] + downloadUrlFile;
|
||||||
|
nldebug("Download streamed package '%s' from '%s'", name.c_str(), downloadUrl.c_str());
|
||||||
|
|
||||||
|
FILE *fp = fopen(downloadPath.c_str(), "wb");
|
||||||
|
if (fp == NULL)
|
||||||
|
{
|
||||||
|
nldebug("Unable to create file '%s' for '%s'", downloadPath.c_str(), name.c_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
CURL *curl;
|
||||||
|
CURLcode res;
|
||||||
|
curl = curl_easy_init();
|
||||||
|
if (curl)
|
||||||
|
{
|
||||||
|
curl_easy_setopt(curl, CURLOPT_URL, downloadUrl.c_str());
|
||||||
|
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
|
||||||
|
curl_easy_setopt(curl, CURLOPT_FILE, fp);
|
||||||
|
res = curl_easy_perform(curl);
|
||||||
|
long r;
|
||||||
|
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &r);
|
||||||
|
curl_easy_cleanup(curl);
|
||||||
|
|
||||||
|
bool diskFull = ferror(fp) && errno == 28 /*ENOSPC*/;
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
if (diskFull)
|
||||||
|
{
|
||||||
|
CFile::deleteFile(downloadPath);
|
||||||
|
throw EDiskFullError(downloadPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (res != CURLE_OK || r < 200 || r >= 300)
|
||||||
|
{
|
||||||
|
CFile::deleteFile(downloadPath);
|
||||||
|
nldebug("Download failed '%s', retry in 1s", downloadUrl.c_str());
|
||||||
|
nlSleep(1000);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nldebug("Curl initialize failed");
|
||||||
|
fclose(fp);
|
||||||
|
CFile::deleteFile(downloadPath);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ok!
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// extract into file
|
||||||
|
std::string unpackPath = filePath + ".extract." + toString(rand() * rand());
|
||||||
|
|
||||||
|
CHashKey outHash;
|
||||||
|
if (!unpackLZMA(downloadPath, unpackPath, outHash))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(outHash == hash))
|
||||||
|
{
|
||||||
|
std::string wantHashS = hash.toString();
|
||||||
|
std::string outHashS = outHash.toString();
|
||||||
|
nlwarning("Invalid SHA1 hash for file '%s', download has hash '%s'", wantHashS.c_str(), outHashS.c_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!CFile::moveFile(filePath.c_str(), unpackPath.c_str()))
|
||||||
|
{
|
||||||
|
nldebug("Failed moving '%s' to '%s'", unpackPath.c_str(), filePath.c_str());
|
||||||
|
// in case downloaded from another thread
|
||||||
|
return CFile::fileExists(filePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
} /* namespace NLMISC */
|
||||||
|
|
||||||
|
/* end of file */
|
@ -0,0 +1,17 @@
|
|||||||
|
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
|
||||||
|
// 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 "stdweb.h"
|
@ -0,0 +1,85 @@
|
|||||||
|
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
|
||||||
|
// 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/>.
|
||||||
|
|
||||||
|
#ifndef NL_STDWEB_H
|
||||||
|
#define NL_STDWEB_H
|
||||||
|
|
||||||
|
#if defined(_MSC_VER) && defined(_DEBUG)
|
||||||
|
#define _CRTDBG_MAP_ALLOC
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <malloc.h>
|
||||||
|
#include <crtdbg.h>
|
||||||
|
#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
|
||||||
|
#elif defined(_MSC_VER)
|
||||||
|
#include <malloc.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <cmath>
|
||||||
|
#include <csignal>
|
||||||
|
#include <cstdarg>
|
||||||
|
#include <cstddef>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <cstring>
|
||||||
|
#include <ctime>
|
||||||
|
#include <deque>
|
||||||
|
#include <exception>
|
||||||
|
#include <fstream>
|
||||||
|
#include <iomanip>
|
||||||
|
#include <iostream>
|
||||||
|
#include <limits>
|
||||||
|
#include <list>
|
||||||
|
#include <map>
|
||||||
|
#include <memory>
|
||||||
|
#include <numeric>
|
||||||
|
#include <set>
|
||||||
|
#include <string>
|
||||||
|
#include <typeinfo>
|
||||||
|
#include <utility>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include <nel/misc/types_nl.h>
|
||||||
|
|
||||||
|
#ifdef NL_OS_WINDOWS
|
||||||
|
# define WIN32_LEAN_AND_MEAN
|
||||||
|
# define _WIN32_WINDOWS 0x0500
|
||||||
|
# ifndef _WIN32_WINNT
|
||||||
|
# define _WIN32_WINNT 0x0500
|
||||||
|
# endif
|
||||||
|
# ifndef NL_COMP_MINGW
|
||||||
|
# define WINVER 0x0500
|
||||||
|
# define NOMINMAX
|
||||||
|
# endif
|
||||||
|
# include <WinSock2.h>
|
||||||
|
# include <Windows.h>
|
||||||
|
# include <wincrypt.h>
|
||||||
|
# ifdef X509_NAME
|
||||||
|
# undef X509_NAME
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <libxml/parser.h>
|
||||||
|
|
||||||
|
#include <openssl/x509.h>
|
||||||
|
#include <openssl/ssl.h>
|
||||||
|
#include <openssl/err.h>
|
||||||
|
|
||||||
|
#include <curl/curl.h>
|
||||||
|
|
||||||
|
#include <nel/misc/debug.h>
|
||||||
|
|
||||||
|
#endif // NL_STDWEB_H
|
@ -0,0 +1,11 @@
|
|||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
int main(int argc, char * argv[])
|
||||||
|
{
|
||||||
|
QApplication application(argc, argv);
|
||||||
|
MainWindow window;
|
||||||
|
|
||||||
|
window.show();
|
||||||
|
|
||||||
|
return application.exec();
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
#ifndef MAIN_H
|
||||||
|
#define MAIN_H
|
||||||
|
|
||||||
|
#include <QApplication>
|
||||||
|
|
||||||
|
#include "mainwindow.h"
|
||||||
|
|
||||||
|
#endif // MAIN_H
|
@ -0,0 +1,253 @@
|
|||||||
|
#include "mainwindow.h"
|
||||||
|
|
||||||
|
MainWindow::MainWindow(QWidget * parent) :
|
||||||
|
QMainWindow(parent),
|
||||||
|
uiMainWindow_(new Ui::MainWindow),
|
||||||
|
processList_(new QProcess(this)),
|
||||||
|
processSearch_(new QProcess(this)),
|
||||||
|
processPack_(new QProcess(this)),
|
||||||
|
processUnpack_(new QProcess(this))
|
||||||
|
{
|
||||||
|
uiMainWindow_->setupUi(this);
|
||||||
|
|
||||||
|
settings_ = new QSettings("bnp_make_frontend.cfg", QSettings::IniFormat);
|
||||||
|
bnpMakeBinary_ = settings_->value("BnpMakeBinary").toString();
|
||||||
|
dataPath_ = settings_->value("DataPath").toString();
|
||||||
|
|
||||||
|
uiMainWindow_->lineEditSearchPath->setText(dataPath_);
|
||||||
|
uiMainWindow_->lineEditBnpMake->setText(bnpMakeBinary_);
|
||||||
|
uiMainWindow_->lineEditDataPath->setText(dataPath_);
|
||||||
|
|
||||||
|
connect(uiMainWindow_->pushButtonListBrowse, SIGNAL(clicked()), this, SLOT(onButtonListBrowseClicked()));
|
||||||
|
connect(uiMainWindow_->pushButtonList, SIGNAL(clicked()), this, SLOT(onButtonListClicked()));
|
||||||
|
connect(processList_, SIGNAL(finished(int)), this, SLOT(onProcessListComplete()));
|
||||||
|
|
||||||
|
connect(uiMainWindow_->pushButtonSearchBrowse, SIGNAL(clicked()), this, SLOT(onButtonSearchBrowseClicked()));
|
||||||
|
connect(uiMainWindow_->pushButtonSearch, SIGNAL(clicked()), this, SLOT(onButtonSearchClicked()));
|
||||||
|
connect(processSearch_, SIGNAL(finished(int)), this, SLOT(onProcessSearchComplete()));
|
||||||
|
|
||||||
|
connect(uiMainWindow_->pushButtonPackBrowse, SIGNAL(clicked()), this, SLOT(onButtonPackBrowseClicked()));
|
||||||
|
connect(uiMainWindow_->pushButtonPack, SIGNAL(clicked()), this, SLOT(onButtonPackClicked()));
|
||||||
|
connect(processPack_, SIGNAL(finished(int)), this, SLOT(onProcessPackComplete()));
|
||||||
|
|
||||||
|
connect(uiMainWindow_->pushButtonUnpackBrowse, SIGNAL(clicked()), this, SLOT(onButtonUnpackBrowseClicked()));
|
||||||
|
connect(uiMainWindow_->pushButtonUnpack, SIGNAL(clicked()), this, SLOT(onButtonUnpackClicked()));
|
||||||
|
connect(processUnpack_, SIGNAL(finished(int)), this, SLOT(onProcessUnpackComplete()));
|
||||||
|
|
||||||
|
connect(uiMainWindow_->pushButtonBnpMakeBrowse, SIGNAL(clicked()), this, SLOT(onButtonBnpMakeBrowseClicked()));
|
||||||
|
connect(uiMainWindow_->pushButtonDataPathBrowse, SIGNAL(clicked()), this, SLOT(onButtonDataPathBrowseClicked()));
|
||||||
|
}
|
||||||
|
|
||||||
|
MainWindow::~MainWindow()
|
||||||
|
{
|
||||||
|
delete uiMainWindow_;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::onButtonListBrowseClicked()
|
||||||
|
{
|
||||||
|
QString fileName;
|
||||||
|
|
||||||
|
fileName = QFileDialog::getOpenFileName(this, "Choose a BNP file", dataPath_, "BNP file (*.bnp)");
|
||||||
|
uiMainWindow_->lineEditList->setText(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::onButtonListClicked()
|
||||||
|
{
|
||||||
|
QStringList arguments;
|
||||||
|
|
||||||
|
uiMainWindow_->textEditList->clear();
|
||||||
|
|
||||||
|
if (bnpMakeBinary_ != "")
|
||||||
|
if (uiMainWindow_->lineEditList->text() != "")
|
||||||
|
{
|
||||||
|
arguments << "/l" << uiMainWindow_->lineEditList->text();
|
||||||
|
processList_->start(bnpMakeBinary_, arguments);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
uiMainWindow_->textEditList->append("Choose a BNP file.");
|
||||||
|
else
|
||||||
|
uiMainWindow_->textEditList->append("Check bnp_make path.");
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::onProcessListComplete()
|
||||||
|
{
|
||||||
|
QString output;
|
||||||
|
|
||||||
|
output = processList_->readAllStandardOutput();
|
||||||
|
uiMainWindow_->textEditList->append(output);
|
||||||
|
uiMainWindow_->textEditList->append("List complete.");
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::onButtonSearchBrowseClicked()
|
||||||
|
{
|
||||||
|
QString directory;
|
||||||
|
|
||||||
|
directory = QFileDialog::getExistingDirectory(this, tr("Choose a directory"), dataPath_, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
|
||||||
|
uiMainWindow_->lineEditSearchPath->setText(directory);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::onButtonSearchClicked()
|
||||||
|
{
|
||||||
|
QDir dir;
|
||||||
|
QStringList nameFilters;
|
||||||
|
|
||||||
|
uiMainWindow_->textEditSearch->clear();
|
||||||
|
|
||||||
|
if (bnpMakeBinary_ != "")
|
||||||
|
if (uiMainWindow_->lineEditSearchPath->text() != "")
|
||||||
|
{
|
||||||
|
dir.cd(uiMainWindow_->lineEditSearchPath->text());
|
||||||
|
|
||||||
|
nameFilters << "*.bnp";
|
||||||
|
dir.setNameFilters(nameFilters);
|
||||||
|
dir.setFilter(QDir::Files);
|
||||||
|
|
||||||
|
fileInfoList_ = dir.entryInfoList();
|
||||||
|
fileInfoListIndex_ = 0;
|
||||||
|
|
||||||
|
onProcessSearchComplete();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
uiMainWindow_->textEditSearch->append("Choose a directory.");
|
||||||
|
else
|
||||||
|
uiMainWindow_->textEditSearch->append("Check bnp_make path.");
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::onProcessSearchComplete()
|
||||||
|
{
|
||||||
|
QFileInfo fileInfo;
|
||||||
|
QStringList arguments;
|
||||||
|
QString output;
|
||||||
|
QStringList outputList;
|
||||||
|
QString line;
|
||||||
|
|
||||||
|
if (fileInfoListIndex_ > 0)
|
||||||
|
{
|
||||||
|
output = processSearch_->readAllStandardOutput();
|
||||||
|
|
||||||
|
if (uiMainWindow_->lineEditSearchString->text() == "")
|
||||||
|
uiMainWindow_->textEditSearch->append(output);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
outputList = output.split("\n");
|
||||||
|
|
||||||
|
foreach (line, outputList)
|
||||||
|
if (line.contains(uiMainWindow_->lineEditSearchString->text()))
|
||||||
|
uiMainWindow_->textEditSearch->append(line.trimmed());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fileInfoListIndex_ < fileInfoList_.count())
|
||||||
|
{
|
||||||
|
fileInfo = fileInfoList_.at(fileInfoListIndex_++);
|
||||||
|
uiMainWindow_->textEditSearch->append("===> " + uiMainWindow_->lineEditSearchPath->text() + "/" + fileInfo.fileName() + ":");
|
||||||
|
arguments << "/l" << uiMainWindow_->lineEditSearchPath->text() + "/" + fileInfo.fileName();
|
||||||
|
processSearch_->start(bnpMakeBinary_, arguments);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
uiMainWindow_->textEditSearch->append("Search complete.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::onButtonPackBrowseClicked()
|
||||||
|
{
|
||||||
|
QString directory;
|
||||||
|
|
||||||
|
directory = QFileDialog::getExistingDirectory(this, tr("Choose the source directory"), dataPath_, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
|
||||||
|
uiMainWindow_->lineEditPack->setText(directory);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::onButtonPackClicked()
|
||||||
|
{
|
||||||
|
QStringList arguments;
|
||||||
|
|
||||||
|
uiMainWindow_->textEditPack->clear();
|
||||||
|
|
||||||
|
if (bnpMakeBinary_ != "")
|
||||||
|
if (uiMainWindow_->lineEditPack->text() != "")
|
||||||
|
{
|
||||||
|
uiMainWindow_->textEditPack->append("Pack in progress...");
|
||||||
|
|
||||||
|
arguments << "/p" << uiMainWindow_->lineEditPack->text();
|
||||||
|
processPack_->start(bnpMakeBinary_, arguments);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
uiMainWindow_->textEditPack->append("Choose the source directory.");
|
||||||
|
else
|
||||||
|
uiMainWindow_->textEditPack->append("Check bnp_make path.");
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::onProcessPackComplete()
|
||||||
|
{
|
||||||
|
QString output;
|
||||||
|
|
||||||
|
output = processPack_->readAllStandardOutput();
|
||||||
|
uiMainWindow_->textEditPack->append(output);
|
||||||
|
uiMainWindow_->textEditPack->append("Pack complete.");
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::onButtonUnpackBrowseClicked()
|
||||||
|
{
|
||||||
|
QString fileName;
|
||||||
|
|
||||||
|
fileName = QFileDialog::getOpenFileName(this, "Choose a BNP file", dataPath_, "BNP file (*.bnp)");
|
||||||
|
uiMainWindow_->lineEditUnpack->setText(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::onButtonUnpackClicked()
|
||||||
|
{
|
||||||
|
QStringList arguments;
|
||||||
|
|
||||||
|
uiMainWindow_->textEditUnpack->clear();
|
||||||
|
|
||||||
|
if (bnpMakeBinary_ != "")
|
||||||
|
if (uiMainWindow_->lineEditUnpack->text() != "")
|
||||||
|
{
|
||||||
|
uiMainWindow_->textEditUnpack->append("Unpack in progress...");
|
||||||
|
|
||||||
|
arguments << "/u" << uiMainWindow_->lineEditUnpack->text();
|
||||||
|
processUnpack_->start(bnpMakeBinary_, arguments);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
uiMainWindow_->textEditUnpack->append("Choose a BNP file.");
|
||||||
|
else
|
||||||
|
uiMainWindow_->textEditUnpack->append("Check bnp_make path.");
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::onProcessUnpackComplete()
|
||||||
|
{
|
||||||
|
uiMainWindow_->textEditUnpack->append("Unpack complete.");
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::onButtonBnpMakeBrowseClicked()
|
||||||
|
{
|
||||||
|
QString fileName;
|
||||||
|
|
||||||
|
fileName = QFileDialog::getOpenFileName(this, "Locate the bnp_make binary", dataPath_);
|
||||||
|
uiMainWindow_->lineEditBnpMake->setText(fileName);
|
||||||
|
|
||||||
|
bnpMakeBinary_ = fileName;
|
||||||
|
settings_->setValue("BnpMakeBinary", fileName);
|
||||||
|
|
||||||
|
uiMainWindow_->textEditSettings->clear();
|
||||||
|
if (fileName != "")
|
||||||
|
uiMainWindow_->textEditSettings->append("bnp_make path changed.");
|
||||||
|
else
|
||||||
|
uiMainWindow_->textEditSettings->append("Locate the bnp_make binary.");
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::onButtonDataPathBrowseClicked()
|
||||||
|
{
|
||||||
|
QString directory;
|
||||||
|
|
||||||
|
directory = QFileDialog::getExistingDirectory(this, tr("Choose a directory"), dataPath_, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
|
||||||
|
uiMainWindow_->lineEditDataPath->setText(directory);
|
||||||
|
|
||||||
|
dataPath_ = directory;
|
||||||
|
settings_->setValue("DataPath", directory);
|
||||||
|
uiMainWindow_->lineEditSearchPath->setText(directory);
|
||||||
|
|
||||||
|
uiMainWindow_->textEditSettings->clear();
|
||||||
|
uiMainWindow_->textEditSettings->append("Data path changed.");
|
||||||
|
}
|
@ -0,0 +1,61 @@
|
|||||||
|
#ifndef MAINWINDOW_H
|
||||||
|
#define MAINWINDOW_H
|
||||||
|
|
||||||
|
#include <QMainWindow>
|
||||||
|
#include <QSettings>
|
||||||
|
#include <QProcess>
|
||||||
|
#include <QFileDialog>
|
||||||
|
|
||||||
|
#include "ui_mainwindow.h"
|
||||||
|
|
||||||
|
namespace Ui
|
||||||
|
{
|
||||||
|
class MainWindow;
|
||||||
|
}
|
||||||
|
|
||||||
|
class MainWindow : public QMainWindow
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit MainWindow(QWidget * parent = 0);
|
||||||
|
~MainWindow();
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void onButtonListBrowseClicked();
|
||||||
|
void onButtonListClicked();
|
||||||
|
void onProcessListComplete();
|
||||||
|
|
||||||
|
void onButtonSearchBrowseClicked();
|
||||||
|
void onButtonSearchClicked();
|
||||||
|
void onProcessSearchComplete();
|
||||||
|
|
||||||
|
void onButtonPackBrowseClicked();
|
||||||
|
void onButtonPackClicked();
|
||||||
|
void onProcessPackComplete();
|
||||||
|
|
||||||
|
void onButtonUnpackBrowseClicked();
|
||||||
|
void onButtonUnpackClicked();
|
||||||
|
void onProcessUnpackComplete();
|
||||||
|
|
||||||
|
void onButtonBnpMakeBrowseClicked();
|
||||||
|
void onButtonDataPathBrowseClicked();
|
||||||
|
|
||||||
|
private:
|
||||||
|
Ui::MainWindow * uiMainWindow_;
|
||||||
|
QSettings * settings_;
|
||||||
|
QString bnpMakeBinary_;
|
||||||
|
QString dataPath_;
|
||||||
|
|
||||||
|
QProcess * processList_;
|
||||||
|
|
||||||
|
QProcess * processSearch_;
|
||||||
|
int fileInfoListIndex_;
|
||||||
|
QFileInfoList fileInfoList_;
|
||||||
|
|
||||||
|
QProcess * processPack_;
|
||||||
|
|
||||||
|
QProcess * processUnpack_;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // MAINWINDOW_H
|
@ -0,0 +1,322 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>MainWindow</class>
|
||||||
|
<widget class="QMainWindow" name="MainWindow">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>800</width>
|
||||||
|
<height>600</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>bnp-make-frontend</string>
|
||||||
|
</property>
|
||||||
|
<property name="windowIcon">
|
||||||
|
<iconset resource="bnp-make-frontend.qrc">
|
||||||
|
<normaloff>:/images/bnp-make-frontend.ico</normaloff>:/images/bnp-make-frontend.ico</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="tabShape">
|
||||||
|
<enum>QTabWidget::Rounded</enum>
|
||||||
|
</property>
|
||||||
|
<widget class="QWidget" name="centralWidget">
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QTabWidget" name="tabWidgetMenu">
|
||||||
|
<property name="currentIndex">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<widget class="QWidget" name="tabList">
|
||||||
|
<attribute name="title">
|
||||||
|
<string>List</string>
|
||||||
|
</attribute>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_5">
|
||||||
|
<item>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayoutList">
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayoutList">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="labelList">
|
||||||
|
<property name="text">
|
||||||
|
<string>BNP file:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLineEdit" name="lineEditList">
|
||||||
|
<property name="readOnly">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="pushButtonListBrowse">
|
||||||
|
<property name="text">
|
||||||
|
<string>Browse</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="pushButtonList">
|
||||||
|
<property name="text">
|
||||||
|
<string>List</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QTextEdit" name="textEditList">
|
||||||
|
<property name="readOnly">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<widget class="QWidget" name="tabSearch">
|
||||||
|
<attribute name="title">
|
||||||
|
<string>Search</string>
|
||||||
|
</attribute>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_3">
|
||||||
|
<item>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayoutSearch">
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayoutSearchPath">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="labelSearchPath">
|
||||||
|
<property name="text">
|
||||||
|
<string>Search path:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLineEdit" name="lineEditSearchPath">
|
||||||
|
<property name="readOnly">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="pushButtonSearchBrowse">
|
||||||
|
<property name="text">
|
||||||
|
<string>Browse</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayoutSearchString">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="labelSearchString">
|
||||||
|
<property name="text">
|
||||||
|
<string>Search string:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLineEdit" name="lineEditSearchString"/>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="pushButtonSearch">
|
||||||
|
<property name="text">
|
||||||
|
<string>Search</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QTextEdit" name="textEditSearch">
|
||||||
|
<property name="readOnly">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<widget class="QWidget" name="tabPack">
|
||||||
|
<attribute name="title">
|
||||||
|
<string>Pack</string>
|
||||||
|
</attribute>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_7">
|
||||||
|
<item>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayoutPack">
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayoutPack">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="labelPack">
|
||||||
|
<property name="text">
|
||||||
|
<string>Source path:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLineEdit" name="lineEditPack">
|
||||||
|
<property name="readOnly">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="pushButtonPackBrowse">
|
||||||
|
<property name="text">
|
||||||
|
<string>Browse</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="pushButtonPack">
|
||||||
|
<property name="text">
|
||||||
|
<string>Pack</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QTextEdit" name="textEditPack">
|
||||||
|
<property name="readOnly">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<widget class="QWidget" name="tabUnpack">
|
||||||
|
<attribute name="title">
|
||||||
|
<string>Unpack</string>
|
||||||
|
</attribute>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_4">
|
||||||
|
<item>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayoutUnpack">
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayoutUnpack">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="labelUnpack">
|
||||||
|
<property name="text">
|
||||||
|
<string>BNP file:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLineEdit" name="lineEditUnpack">
|
||||||
|
<property name="readOnly">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="pushButtonUnpackBrowse">
|
||||||
|
<property name="text">
|
||||||
|
<string>Browse</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="pushButtonUnpack">
|
||||||
|
<property name="text">
|
||||||
|
<string>Unpack</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QTextEdit" name="textEditUnpack">
|
||||||
|
<property name="readOnly">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<widget class="QWidget" name="tabSettings">
|
||||||
|
<attribute name="title">
|
||||||
|
<string>Settings</string>
|
||||||
|
</attribute>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_6">
|
||||||
|
<item>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayoutSettings">
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayoutBnpMake">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="labelSettingsBnpMake">
|
||||||
|
<property name="text">
|
||||||
|
<string>bnp_make path:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLineEdit" name="lineEditBnpMake">
|
||||||
|
<property name="readOnly">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="pushButtonBnpMakeBrowse">
|
||||||
|
<property name="text">
|
||||||
|
<string>Browse</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayoutDataPath">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="labelDataPath">
|
||||||
|
<property name="text">
|
||||||
|
<string>Data path:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLineEdit" name="lineEditDataPath">
|
||||||
|
<property name="readOnly">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="pushButtonDataPathBrowse">
|
||||||
|
<property name="text">
|
||||||
|
<string>Browse</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QTextEdit" name="textEditSettings">
|
||||||
|
<property name="readOnly">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
<layoutdefault spacing="6" margin="11"/>
|
||||||
|
<resources>
|
||||||
|
<include location="bnp-make-frontend.qrc"/>
|
||||||
|
</resources>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
Loading…
Reference in New Issue