Merge remote-tracking branch 'ryzomcore/develop' into ryzomclassic-develop

ryzomclassic-develop
Jan Boon 5 years ago
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

@ -59,6 +59,25 @@ SET(NL_VERSION_PATCH 2)
SET(YEAR "2001-${CURRENT_YEAR}") SET(YEAR "2001-${CURRENT_YEAR}")
SET(AUTHOR "Winch Gate and The Ryzom Core Community") SET(AUTHOR "Winch Gate and The Ryzom Core Community")
SET(RYZOM_CLIENT_CREATE_ACCOUNT_URL "https://open.ryzom.dev/ams/" CACHE STRING "Ryzom Client Create Account URL")
SET(RYZOM_CLIENT_EDIT_ACCOUNT_URL "https://open.ryzom.dev/ams/" CACHE STRING "Ryzom Client Edit Account URL")
SET(RYZOM_CLIENT_FORGET_PASSWORD_URL "https://open.ryzom.dev/ams/" CACHE STRING "Ryzom Client Forget Password URL")
SET(RYZOM_CLIENT_PATCH_URL "https://cdn.ryzom.dev/open/patch/" CACHE STRING "Ryzom Client Patch URL")
SET(RYZOM_WEBIG_MAIN_URL "https://open.ryzom.dev/" CACHE STRING "Ryzom Client WebIG Main URL")
SET(RYZOM_WEBIG_TRUSTED_DOMAIN "open.ryzom.dev" CACHE STRING "Ryzom Client WebIG Trusted Domain")
# urls when compiling ryzom live client
IF(WITH_RYZOM_LIVE)
SET(RYZOM_CLIENT_CREATE_ACCOUNT_URL "https://account.ryzom.com/signup/from_client.php")
SET(RYZOM_CLIENT_EDIT_ACCOUNT_URL "https://account.ryzom.com/payment_profile/index.php")
SET(RYZOM_CLIENT_FORGET_PASSWORD_URL "https://account.ryzom.com/payment_profile/lost_secure_password.php")
SET(RYZOM_CLIENT_PATCH_URL "http://dl.ryzom.com/patch_live")
SET(RYZOM_WEBIG_MAIN_URL "https://app.ryzom.com/")
SET(RYZOM_WEBIG_TRUSTED_DOMAIN "app.ryzom.com")
ENDIF()
#----------------------------------------------------------------------------- #-----------------------------------------------------------------------------
# Redirect output files # Redirect output files
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
@ -216,6 +235,8 @@ IF(WITH_NEL)
IF(WITH_GUI) IF(WITH_GUI)
FIND_PACKAGE(Luabind REQUIRED) FIND_PACKAGE(Luabind REQUIRED)
ENDIF()
FIND_PACKAGE(CURL REQUIRED) FIND_PACKAGE(CURL REQUIRED)
IF((WIN32 OR CURL_LIBRARIES MATCHES "\\.a") AND WITH_STATIC_CURL) IF((WIN32 OR CURL_LIBRARIES MATCHES "\\.a") AND WITH_STATIC_CURL)
@ -265,7 +286,6 @@ IF(WITH_NEL)
ENDIF() ENDIF()
ENDIF() ENDIF()
ENDIF() ENDIF()
ENDIF()
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/nel/include) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/nel/include)
ADD_SUBDIRECTORY(nel) ADD_SUBDIRECTORY(nel)

@ -281,6 +281,8 @@ MACRO(NL_SETUP_DEFAULT_OPTIONS)
OPTION(WITH_RYZOM "Build Ryzom Core." ON ) OPTION(WITH_RYZOM "Build Ryzom Core." ON )
OPTION(WITH_SNOWBALLS "Build Snowballs." OFF) OPTION(WITH_SNOWBALLS "Build Snowballs." OFF)
OPTION(WITH_TOOLS "Build Tools" OFF) OPTION(WITH_TOOLS "Build Tools" OFF)
OPTION(WITH_RYZOM_LIVE "Use ryzom.com urls" OFF)
ENDMACRO(NL_SETUP_DEFAULT_OPTIONS) ENDMACRO(NL_SETUP_DEFAULT_OPTIONS)
MACRO(NL_SETUP_NEL_DEFAULT_OPTIONS) MACRO(NL_SETUP_NEL_DEFAULT_OPTIONS)
@ -289,6 +291,7 @@ MACRO(NL_SETUP_NEL_DEFAULT_OPTIONS)
### ###
OPTION(WITH_NET "Build NLNET" ON ) OPTION(WITH_NET "Build NLNET" ON )
OPTION(WITH_3D "Build NL3D" ON ) OPTION(WITH_3D "Build NL3D" ON )
OPTION(WITH_WEB "Build WEB" ON )
OPTION(WITH_GUI "Build GUI" ON ) OPTION(WITH_GUI "Build GUI" ON )
OPTION(WITH_PACS "Build NLPACS" ON ) OPTION(WITH_PACS "Build NLPACS" ON )
OPTION(WITH_GEORGES "Build NLGEORGES" ON ) OPTION(WITH_GEORGES "Build NLGEORGES" ON )

@ -33,6 +33,14 @@
#cmakedefine RYZOM_VERSION_RC ${RYZOM_VERSION_RC} #cmakedefine RYZOM_VERSION_RC ${RYZOM_VERSION_RC}
#cmakedefine RYZOM_PRODUCT_VERSION "${RYZOM_PRODUCT_VERSION}" #cmakedefine RYZOM_PRODUCT_VERSION "${RYZOM_PRODUCT_VERSION}"
#cmakedefine RYZOM_CLIENT_CREATE_ACCOUNT_URL "${RYZOM_CLIENT_CREATE_ACCOUNT_URL}"
#cmakedefine RYZOM_CLIENT_EDIT_ACCOUNT_URL "${RYZOM_CLIENT_EDIT_ACCOUNT_URL}"
#cmakedefine RYZOM_CLIENT_FORGET_PASSWORD_URL "${RYZOM_CLIENT_FORGET_PASSWORD_URL}"
#cmakedefine RYZOM_CLIENT_PATCH_URL "${RYZOM_CLIENT_PATCH_URL}"
#cmakedefine RYZOM_WEBIG_MAIN_URL "${RYZOM_WEBIG_MAIN_URL}"
#cmakedefine RYZOM_WEBIG_TRUSTED_DOMAIN "${RYZOM_WEBIG_TRUSTED_DOMAIN}"
#cmakedefine AUTHOR "${AUTHOR}" #cmakedefine AUTHOR "${AUTHOR}"
#cmakedefine YEAR "${YEAR}" #cmakedefine YEAR "${YEAR}"
#cmakedefine COPYRIGHT "${COPYRIGHT}" #cmakedefine COPYRIGHT "${COPYRIGHT}"

@ -4,6 +4,10 @@ IF(WITH_3D)
SUBDIRS(3d) SUBDIRS(3d)
ENDIF() ENDIF()
IF(WITH_WEB OR WITH_GUI)
ADD_SUBDIRECTORY(web)
ENDIF()
IF(WITH_GUI) IF(WITH_GUI)
ADD_SUBDIRECTORY(gui) ADD_SUBDIRECTORY(gui)
ENDIF() ENDIF()

@ -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 */

@ -42,6 +42,8 @@ public:
void serial(NLMISC::IStream &f) throw(NLMISC::EStream); void serial(NLMISC::IStream &f) throw(NLMISC::EStream);
/// result: [out] ex. /00/00/000000000..
/// hash: [in]
static void makePath(std::string &result, const CHashKey &hash); static void makePath(std::string &result, const CHashKey &hash);
public: public:

@ -20,6 +20,7 @@
#include <nel/misc/types_nl.h> #include <nel/misc/types_nl.h>
#include <nel/misc/app_context.h> #include <nel/misc/app_context.h>
#include <nel/misc/streamed_package.h> #include <nel/misc/streamed_package.h>
#include <nel/misc/i_streamed_package_provider.h>
namespace NLMISC { namespace NLMISC {
@ -40,21 +41,19 @@ public:
/// Unload all packages /// Unload all packages
void unloadAll(); void unloadAll();
/// Get an existing file or download if necessary /// Get an existing file or download if necessary. This call is blocking
/// filePath: [out] ex. /games/nel/stream/00/00/000000000.. /// filePath: [out] ex. /games/nel/stream/00/00/000000000..
/// fileName: ex. fy_hof_underwear.dds /// fileName: [in] ex. fy_hof_underwear.dds
bool getFile(std::string &filePath, const std::string &fileName); bool getFile(std::string &filePath, const std::string &fileName);
/// Get file size /// Get file size
/// fileSize: [out]
/// fileName: [in] ex. fy_hof_underwear.dds
bool getFileSize(uint32 &fileSize, const std::string &fileName); bool getFileSize(uint32 &fileSize, const std::string &fileName);
public: public:
/// Set storage path (ex. stream/) /// Streamed package provider. This downloads the files
std::string Path; IStreamedPackageProvider *Provider;
/// Loads a package into the package manager (ex. http://patch.live.polyverse.org/stream/)
typedef std::vector<std::string> THosts;
THosts Hosts;
private: private:
typedef std::map<std::string, CStreamedPackage> TPackages; typedef std::map<std::string, CStreamedPackage> TPackages;

@ -479,6 +479,7 @@ extern void operator delete[](void *p) throw();
# define CHashMultiMap NL_ISO_STDTR1_NAMESPACE::unordered_multimap # define CHashMultiMap NL_ISO_STDTR1_NAMESPACE::unordered_multimap
# define CUniquePtr ::std::auto_ptr # define CUniquePtr ::std::auto_ptr
# define CUniquePtrMove # define CUniquePtrMove
# define NL_OVERRIDE
#elif defined(NL_COMP_VC) && (NL_COMP_VC_VERSION >= 70 && NL_COMP_VC_VERSION <= 90) // VC7 through 9 #elif defined(NL_COMP_VC) && (NL_COMP_VC_VERSION >= 70 && NL_COMP_VC_VERSION <= 90) // VC7 through 9
# include <hash_map> # include <hash_map>
# include <hash_set> # include <hash_set>
@ -487,6 +488,7 @@ extern void operator delete[](void *p) throw();
# define CHashMultiMap stdext::hash_multimap # define CHashMultiMap stdext::hash_multimap
# define CUniquePtr ::std::auto_ptr # define CUniquePtr ::std::auto_ptr
# define CUniquePtrMove # define CUniquePtrMove
# define NL_OVERRIDE
#elif defined(NL_COMP_GCC) // GCC4 #elif defined(NL_COMP_GCC) // GCC4
# include <ext/hash_map> # include <ext/hash_map>
# include <ext/hash_set> # include <ext/hash_set>
@ -526,6 +528,10 @@ template<> struct hash<uint64>
*/ */
typedef uint16 ucchar; typedef uint16 ucchar;
#ifndef NL_OVERRIDE
#define NL_OVERRIDE override
#endif
#if defined(NL_OS_WINDOWS) && (defined(UNICODE) || defined(_UNICODE)) #if defined(NL_OS_WINDOWS) && (defined(UNICODE) || defined(_UNICODE))
#define nltmain wmain #define nltmain wmain
#define nltWinMain wWinMain #define nltWinMain wWinMain

@ -0,0 +1,2 @@
FILE(GLOB HEADERS *.h)
INSTALL(FILES ${HEADERS} DESTINATION include/nel/web COMPONENT headers)

@ -22,7 +22,7 @@
// forward declaration to avoid curl.h inclusion everywhere // forward declaration to avoid curl.h inclusion everywhere
typedef void CURL; typedef void CURL;
namespace NLMISC namespace NLWEB
{ {
class CCurlCertificates class CCurlCertificates
{ {

@ -20,7 +20,7 @@
#include "nel/misc/types_nl.h" #include "nel/misc/types_nl.h"
#include <string> #include <string>
namespace NLMISC namespace NLWEB
{ {
/** /**

@ -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 */

@ -4,6 +4,10 @@ IF(WITH_3D)
ADD_SUBDIRECTORY(3d) ADD_SUBDIRECTORY(3d)
ENDIF() ENDIF()
IF(WITH_WEB OR WITH_GUI)
ADD_SUBDIRECTORY(web)
ENDIF()
IF(WITH_GUI) IF(WITH_GUI)
ADD_SUBDIRECTORY(gui) ADD_SUBDIRECTORY(gui)
ENDIF() ENDIF()

@ -6,9 +6,9 @@ SOURCE_GROUP("src" FILES ${SRC})
NL_TARGET_LIB(nelgui ${SRC} ${HEADERS}) NL_TARGET_LIB(nelgui ${SRC} ${HEADERS})
INCLUDE_DIRECTORIES(${LIBXML2_INCLUDE_DIR} ${LUA_INCLUDE_DIR} ${LUABIND_INCLUDE_DIR} ${CURL_INCLUDE_DIRS} ${OPENSSL_INCLUDE_DIR}) INCLUDE_DIRECTORIES(${LIBXML2_INCLUDE_DIR} ${LUA_INCLUDE_DIR} ${LUABIND_INCLUDE_DIR} ${CURL_INCLUDE_DIRS})
TARGET_LINK_LIBRARIES(nelgui nelmisc nel3d ${LUA_LIBRARIES} ${LUABIND_LIBRARIES} ${CURL_LIBRARIES} ${OPENSSL_LIBRARIES}) TARGET_LINK_LIBRARIES(nelgui nelmisc nelweb nel3d ${LUA_LIBRARIES} ${LUABIND_LIBRARIES} ${CURL_LIBRARIES})
NL_DEFAULT_PROPS(nelgui "NeL, Library: NeL GUI") NL_DEFAULT_PROPS(nelgui "NeL, Library: NeL GUI")
NL_ADD_RUNTIME_FLAGS(nelgui) NL_ADD_RUNTIME_FLAGS(nelgui)

@ -47,7 +47,7 @@
#include "nel/gui/url_parser.h" #include "nel/gui/url_parser.h"
#include "nel/gui/http_cache.h" #include "nel/gui/http_cache.h"
#include "nel/gui/http_hsts.h" #include "nel/gui/http_hsts.h"
#include "nel/misc/curl_certificates.h" #include "nel/web/curl_certificates.h"
#include "nel/gui/html_parser.h" #include "nel/gui/html_parser.h"
#include "nel/gui/html_element.h" #include "nel/gui/html_element.h"
#include "nel/gui/css_style.h" #include "nel/gui/css_style.h"
@ -550,7 +550,7 @@ namespace NLGUI
if (toLower(download.url.substr(0, 8)) == "https://") if (toLower(download.url.substr(0, 8)) == "https://")
{ {
// if supported, use custom SSL context function to load certificates // if supported, use custom SSL context function to load certificates
CCurlCertificates::useCertificates(curl); NLWEB::CCurlCertificates::useCertificates(curl);
} }
download.data = new CCurlWWWData(curl, download.url); download.data = new CCurlWWWData(curl, download.url);
@ -3823,7 +3823,7 @@ namespace NLGUI
if (toLower(url.substr(0, 8)) == "https://") if (toLower(url.substr(0, 8)) == "https://")
{ {
// if supported, use custom SSL context function to load certificates // if supported, use custom SSL context function to load certificates
CCurlCertificates::useCertificates(curl); NLWEB::CCurlCertificates::useCertificates(curl);
} }
// do not follow redirects, we have own handler // do not follow redirects, we have own handler

@ -212,15 +212,16 @@ IF(UNIX)
ENDIF() ENDIF()
INCLUDE_DIRECTORIES(../../3rdparty) INCLUDE_DIRECTORIES(../../3rdparty)
INCLUDE_DIRECTORIES(${LIBXML2_INCLUDE_DIR} ${PNG_INCLUDE_DIR} ${CURL_INCLUDE_DIRS} ${OPENSSL_INCLUDE_DIR} config_file) INCLUDE_DIRECTORIES(${LIBXML2_INCLUDE_DIR} ${PNG_INCLUDE_DIR} config_file)
TARGET_LINK_LIBRARIES(nelmisc ${CMAKE_THREAD_LIBS_INIT} ${LIBXML2_LIBRARIES} ${ZLIB_LIBRARY} nel_sevenzip)
TARGET_LINK_LIBRARIES(nelmisc ${CMAKE_THREAD_LIBS_INIT} ${LIBXML2_LIBRARIES} ${ZLIB_LIBRARY} ${CURL_LIBRARIES} ${OPENSSL_LIBRARIES} nel_sevenzip)
NL_DEFAULT_PROPS(nelmisc "NeL, Library: NeL Misc") NL_DEFAULT_PROPS(nelmisc "NeL, Library: NeL Misc")
NL_ADD_RUNTIME_FLAGS(nelmisc) NL_ADD_RUNTIME_FLAGS(nelmisc)
NL_ADD_LIB_SUFFIX(nelmisc) NL_ADD_LIB_SUFFIX(nelmisc)
ADD_DEFINITIONS(${LIBXML2_DEFINITIONS} ${CURL_DEFINITIONS}) ADD_DEFINITIONS(${LIBXML2_DEFINITIONS})
IF(WITH_PCH) IF(WITH_PCH)
ADD_NATIVE_PRECOMPILED_HEADER(nelmisc ${CMAKE_CURRENT_SOURCE_DIR}/stdmisc.h ${CMAKE_CURRENT_SOURCE_DIR}/stdmisc.cpp) ADD_NATIVE_PRECOMPILED_HEADER(nelmisc ${CMAKE_CURRENT_SOURCE_DIR}/stdmisc.h ${CMAKE_CURRENT_SOURCE_DIR}/stdmisc.cpp)

@ -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 */

@ -16,14 +16,10 @@
#include "stdmisc.h" #include "stdmisc.h"
// 3rd Party includes
#include <curl/curl.h>
// Project includes // Project includes
#include <nel/misc/streamed_package_manager.h> #include <nel/misc/streamed_package_manager.h>
#include <nel/misc/file.h> #include <nel/misc/file.h>
#include <nel/misc/path.h> #include <nel/misc/path.h>
#include <nel/misc/seven_zip.h>
#include <nel/misc/sha1.h> #include <nel/misc/sha1.h>
namespace NLMISC namespace NLMISC
@ -96,113 +92,21 @@ bool CStreamedPackageManager::getFile(std::string &filePath, const std::string &
{ {
// nldebug("Get file path for streamed file '%s'", fileName.c_str()); // nldebug("Get file path for streamed file '%s'", fileName.c_str());
TEntries::iterator it = m_Entries.find(fileName); IStreamedPackageProvider *provider = Provider;
if (it == m_Entries.end()) if (!provider)
return false;
const CStreamedPackage::CEntry *entry = it->second;
CStreamedPackage::makePath(filePath, entry->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()); nlerrornoex("No streamed package provider was set");
return false; 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'", fileName.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(), fileName.c_str());
return false;
}
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if (curl)
{
curl_easy_setopt(curl, CURLOPT_URL, downloadUrl.c_str());
if (downloadUrl.length() > 8 && (downloadUrl[4] == 's' || downloadUrl[4] == 'S')) // 01234 https
{
// Don't need to verify, since we check the hash
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
} }
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) TEntries::iterator it = m_Entries.find(fileName);
{ if (it == m_Entries.end())
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))
{
CFile::deleteFile(downloadPath);
return false;
}
CFile::deleteFile(downloadPath);
if (!(outHash == entry->Hash))
{ {
std::string wantHashS = entry->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; return false;
} }
const CStreamedPackage::CEntry *entry = it->second;
if (!CFile::moveFile(filePath.c_str(), unpackPath.c_str())) return provider->getFile(filePath, entry->Hash, fileName);
{
nldebug("Failed moving '%s' to '%s'", unpackPath.c_str(), filePath.c_str());
// in case downloaded from another thread
return CFile::fileExists(filePath);
}
return true; return true;
} }

@ -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()

@ -14,26 +14,14 @@
// You should have received a copy of the GNU Affero General Public License // 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/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "stdmisc.h" #include "stdweb.h"
#include <nel/misc/curl_certificates.h> #include <nel/web/curl_certificates.h>
#include <nel/misc/common.h> #include <nel/misc/common.h>
#include <nel/misc/debug.h> #include <nel/misc/debug.h>
#include <nel/misc/path.h> #include <nel/misc/path.h>
#include <nel/misc/file.h> #include <nel/misc/file.h>
#include <openssl/x509.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
#include <curl/curl.h>
#ifdef NL_OS_WINDOWS
#include <wincrypt.h>
#ifdef X509_NAME
#undef X509_NAME
#endif
#endif
// for compatibility with older versions // for compatibility with older versions
#ifndef CURL_AT_LEAST_VERSION #ifndef CURL_AT_LEAST_VERSION
#define CURL_VERSION_BITS(x,y,z) ((x)<<16|(y)<<8|z) #define CURL_VERSION_BITS(x,y,z) ((x)<<16|(y)<<8|z)
@ -44,12 +32,13 @@
using namespace std; using namespace std;
using namespace NLMISC; using namespace NLMISC;
using namespace NLWEB;
#ifdef DEBUG_NEW #ifdef DEBUG_NEW
#define new DEBUG_NEW #define new DEBUG_NEW
#endif #endif
namespace NLMISC namespace NLWEB
{ {
// //
// x509CertList lifetime manager // x509CertList lifetime manager

@ -14,16 +14,15 @@
// You should have received a copy of the GNU Affero General Public License // 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/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "stdmisc.h" #include "stdweb.h"
#include <nel/misc/http_client_curl.h> #include <nel/web/http_client_curl.h>
#include <nel/misc/debug.h>
#include <curl/curl.h>
#include <nel/misc/curl_certificates.h> #include <nel/misc/debug.h>
#include <nel/web/curl_certificates.h>
using namespace NLMISC;
using namespace std; using namespace std;
using namespace NLMISC;
using namespace NLWEB;
#ifdef DEBUG_NEW #ifdef DEBUG_NEW
#define new DEBUG_NEW #define new DEBUG_NEW
@ -31,7 +30,7 @@ using namespace std;
#define _Curl (CURL *)_CurlStruct #define _Curl (CURL *)_CurlStruct
namespace NLMISC namespace NLWEB
{ {
// Ugly CURL callback // Ugly CURL callback

@ -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>

@ -42,6 +42,10 @@
// Game Share. // Game Share.
#include "game_share/time_weather_season/time_and_season.h" #include "game_share/time_weather_season/time_and_season.h"
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#ifdef NL_OS_MAC #ifdef NL_OS_MAC
#include "app_bundle_utils.h" #include "app_bundle_utils.h"
#endif // NL_OS_MAC #endif // NL_OS_MAC
@ -321,9 +325,9 @@ CClientConfig::CClientConfig()
TexturesLoginInterface.push_back("texture_interfaces_v3_login"); TexturesLoginInterface.push_back("texture_interfaces_v3_login");
DisplayAccountButtons = true; DisplayAccountButtons = true;
CreateAccountURL = "https://classic.ryzom.dev/signup/from_client.php"; CreateAccountURL = RYZOM_CLIENT_CREATE_ACCOUNT_URL; // "https://open.ryzom.dev/ams/";
EditAccountURL = "https://classic.ryzom.dev/payment_profile/index.php"; EditAccountURL = RYZOM_CLIENT_EDIT_ACCOUNT_URL; // "https://open.ryzom.dev/ams/";
ForgetPwdURL = "https://classic.ryzom.dev/payment_profile/lost_secure_password.php"; ForgetPwdURL = RYZOM_CLIENT_FORGET_PASSWORD_URL; // "https://open.ryzom.dev/ams/";
Position = CVector(0.f, 0.f, 0.f); // Default Position. Position = CVector(0.f, 0.f, 0.f); // Default Position.
Heading = CVector(0.f, 1.f, 0.f); // Default Heading. Heading = CVector(0.f, 1.f, 0.f); // Default Heading.
EyesHeight = 1.5f; // Default User Eyes Height. EyesHeight = 1.5f; // Default User Eyes Height.
@ -421,8 +425,8 @@ CClientConfig::CClientConfig()
#endif #endif
PatchVersion.clear(); PatchVersion.clear();
WebIgMainDomain = "https://classic.ryzom.dev"; WebIgMainDomain = RYZOM_WEBIG_MAIN_URL; // https://open.ryzom.dev/"
WebIgTrustedDomains.push_back("classic.ryzom.dev"); WebIgTrustedDomains.push_back(RYZOM_WEBIG_TRUSTED_DOMAIN); // open.ryzom.dev
WebIgNotifInterval = 10; // time in minutes WebIgNotifInterval = 10; // time in minutes
CurlMaxConnections = 5; CurlMaxConnections = 5;

@ -24,6 +24,9 @@
using namespace NLMISC; using namespace NLMISC;
// *************************************************************************** // ***************************************************************************
// Data
NLWEB::CHttpPackageProvider *HttpPackageProvider = NULL;
// Main System // Main System
NL3D::UDriver *Driver = NULL; // The main 3D Driver NL3D::UDriver *Driver = NULL; // The main 3D Driver
NL3D::IStereoDisplay *StereoDisplay = NULL; // Stereo display NL3D::IStereoDisplay *StereoDisplay = NULL; // Stereo display

@ -28,6 +28,11 @@
// *************************************************************************** // ***************************************************************************
namespace NLWEB
{
class CHttpPackageProvider;
}
namespace NL3D namespace NL3D
{ {
class UDriver; class UDriver;
@ -78,6 +83,9 @@ const float ExtraZoneLoadingVision = 100.f;
// *************************************************************************** // ***************************************************************************
// Data
extern NLWEB::CHttpPackageProvider *HttpPackageProvider; // Http provider from on-the-fly downloaded game data
// Main System // Main System
extern NL3D::UDriver *Driver; // The main 3D Driver extern NL3D::UDriver *Driver; // The main 3D Driver
extern NL3D::IStereoDisplay *StereoDisplay; // Stereo display extern NL3D::IStereoDisplay *StereoDisplay; // Stereo display

@ -35,6 +35,7 @@
#include "nel/misc/block_memory.h" #include "nel/misc/block_memory.h"
#include "nel/misc/system_utils.h" #include "nel/misc/system_utils.h"
#include "nel/misc/streamed_package_manager.h" #include "nel/misc/streamed_package_manager.h"
#include "nel/web/http_package_provider.h"
#include "nel/misc/cmd_args.h" #include "nel/misc/cmd_args.h"
// 3D Interface. // 3D Interface.
#include "nel/3d/bloom_effect.h" #include "nel/3d/bloom_effect.h"
@ -740,9 +741,14 @@ static void addPaths(IProgressCallback &progress, const std::vector<std::string>
void initStreamedPackageManager(NLMISC::IProgressCallback &progress) void initStreamedPackageManager(NLMISC::IProgressCallback &progress)
{ {
CStreamedPackageManager &spm = CStreamedPackageManager::getInstance(); CStreamedPackageManager &spm = CStreamedPackageManager::getInstance();
spm.Path = ClientCfg.StreamedPackagePath; nlassert(!spm.Provider); // If this asserts, init was called twice without release
nlassert(!HttpPackageProvider); // Idem
NLWEB::CHttpPackageProvider *hpp = new NLWEB::CHttpPackageProvider();
hpp->Path = ClientCfg.StreamedPackagePath;
for (uint i = 0; i < ClientCfg.StreamedPackageHosts.size(); i++) for (uint i = 0; i < ClientCfg.StreamedPackageHosts.size(); i++)
spm.Hosts.push_back(ClientCfg.StreamedPackageHosts[i]); hpp->Hosts.push_back(ClientCfg.StreamedPackageHosts[i]);
spm.Provider = hpp;
HttpPackageProvider = hpp;
} }
void addSearchPaths(IProgressCallback &progress) void addSearchPaths(IProgressCallback &progress)

@ -28,7 +28,7 @@
#include "nel/misc/path.h" #include "nel/misc/path.h"
#include "nel/misc/sheet_id.h" #include "nel/misc/sheet_id.h"
#include "nel/misc/big_file.h" #include "nel/misc/big_file.h"
#include "nel/misc/curl_certificates.h" #include "nel/web/curl_certificates.h"
// 3D Interface. // 3D Interface.
#include "nel/3d/bloom_effect.h" #include "nel/3d/bloom_effect.h"
#include "nel/3d/u_driver.h" #include "nel/3d/u_driver.h"
@ -194,8 +194,8 @@ struct CStatThread : public NLMISC::IRunnable
curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
if (url.length() > 8 && (url[4] == 's' || url[4] == 'S')) // 01234 https if (url.length() > 8 && (url[4] == 's' || url[4] == 'S')) // 01234 https
{ {
NLMISC::CCurlCertificates::addCertificateFile("cacert.pem"); NLWEB::CCurlCertificates::addCertificateFile("cacert.pem");
NLMISC::CCurlCertificates::useCertificates(curl); NLWEB::CCurlCertificates::useCertificates(curl);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2L); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2L);
} }

@ -30,7 +30,7 @@
#include "../connection.h" #include "../connection.h"
#include <curl/curl.h> #include <curl/curl.h>
#include "nel/misc/curl_certificates.h" #include "nel/web/curl_certificates.h"
using namespace std; using namespace std;
using namespace NLMISC; using namespace NLMISC;
@ -188,7 +188,7 @@ public:
curl_easy_setopt(Curl, CURLOPT_FOLLOWLOCATION, 1); curl_easy_setopt(Curl, CURLOPT_FOLLOWLOCATION, 1);
curl_easy_setopt(Curl, CURLOPT_WRITEFUNCTION, writeDataFromCurl); curl_easy_setopt(Curl, CURLOPT_WRITEFUNCTION, writeDataFromCurl);
NLMISC::CCurlCertificates::useCertificates(Curl); NLWEB::CCurlCertificates::useCertificates(Curl);
} }
~CWebigNotificationThread() ~CWebigNotificationThread()

@ -113,7 +113,7 @@
#include "nel/gui/lua_helper.h" #include "nel/gui/lua_helper.h"
using namespace NLGUI; using namespace NLGUI;
#include "nel/gui/lua_ihm.h" #include "nel/gui/lua_ihm.h"
#include "nel/misc/curl_certificates.h" #include "nel/web/curl_certificates.h"
#include "lua_ihm_ryzom.h" #include "lua_ihm_ryzom.h"
@ -480,7 +480,7 @@ CInterfaceManager::CInterfaceManager()
if (!ClientCfg.CurlCABundle.empty()) if (!ClientCfg.CurlCABundle.empty())
{ {
// specify custom CA certs, lookup will be made in this function // specify custom CA certs, lookup will be made in this function
NLMISC::CCurlCertificates::addCertificateFile(ClientCfg.CurlCABundle); NLWEB::CCurlCertificates::addCertificateFile(ClientCfg.CurlCABundle);
} }
NLGUI::CDBManager::getInstance()->resizeBanks( NB_CDB_BANKS ); NLGUI::CDBManager::getInstance()->resizeBanks( NB_CDB_BANKS );

@ -51,7 +51,7 @@
#include "global.h" #include "global.h"
#include "input.h" #include "input.h"
#include "nel/gui/libwww.h" #include "nel/gui/libwww.h"
#include "nel/misc/http_client_curl.h" #include "nel/web/http_client_curl.h"
#include "login_progress_post_thread.h" #include "login_progress_post_thread.h"
#include "init.h" #include "init.h"
@ -69,6 +69,7 @@ void ConnectToShard();
// *************************************************************************** // ***************************************************************************
using namespace NLMISC; using namespace NLMISC;
using namespace NLWEB;
using namespace NLNET; using namespace NLNET;
using namespace NL3D; using namespace NL3D;
using namespace std; using namespace std;

@ -19,7 +19,7 @@
#define CL_LOGIN_H #define CL_LOGIN_H
#include <nel/misc/types_nl.h> #include <nel/misc/types_nl.h>
#include <nel/misc/http_client_curl.h> #include <nel/web/http_client_curl.h>
#include <string> #include <string>
#include <vector> #include <vector>
@ -74,7 +74,7 @@ extern sint32 ShardSelected;
/* /*
* HTTP client preconfigured to connect to the startup login host * HTTP client preconfigured to connect to the startup login host
*/ */
class CStartupHttpClient : public NLMISC::CCurlHttpClient class CStartupHttpClient : public NLWEB::CCurlHttpClient
{ {
public: public:

@ -49,7 +49,7 @@
#include "nel/misc/i18n.h" #include "nel/misc/i18n.h"
#include "nel/misc/cmd_args.h" #include "nel/misc/cmd_args.h"
#include "nel/misc/seven_zip.h" #include "nel/misc/seven_zip.h"
#include "nel/misc/curl_certificates.h" #include "nel/web/curl_certificates.h"
#include "game_share/bg_downloader_msg.h" #include "game_share/bg_downloader_msg.h"
@ -1431,8 +1431,8 @@ void CPatchManager::downloadFileWithCurl (const string &source, const string &de
curl_easy_setopt(curl, CURLOPT_URL, source.c_str()); curl_easy_setopt(curl, CURLOPT_URL, source.c_str());
if (source.length() > 8 && (source[4] == 's' || source[4] == 'S')) // 01234 https if (source.length() > 8 && (source[4] == 's' || source[4] == 'S')) // 01234 https
{ {
NLMISC::CCurlCertificates::addCertificateFile("cacert.pem"); NLWEB::CCurlCertificates::addCertificateFile("cacert.pem");
NLMISC::CCurlCertificates::useCertificates(curl); NLWEB::CCurlCertificates::useCertificates(curl);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2L); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2L);
} }

@ -668,6 +668,8 @@ void release()
NLMISC::CBigFile::getInstance().removeAll(); NLMISC::CBigFile::getInstance().removeAll();
NLMISC::CBigFile::releaseInstance(); NLMISC::CBigFile::releaseInstance();
NLMISC::CStreamedPackageManager::releaseInstance(); NLMISC::CStreamedPackageManager::releaseInstance();
delete HttpPackageProvider;
HttpPackageProvider = NULL;
NL3D::CFastHLSModifier::releaseInstance(); NL3D::CFastHLSModifier::releaseInstance();
CLandscapePolyDrawer::releaseInstance(); CLandscapePolyDrawer::releaseInstance();
NL3D::CParticleSystemShape::releaseInstance(); NL3D::CParticleSystemShape::releaseInstance();

@ -21,6 +21,7 @@ INCLUDE_DIRECTORIES(
TARGET_LINK_LIBRARIES(ryzom_client_patcher TARGET_LINK_LIBRARIES(ryzom_client_patcher
nelmisc nelmisc
nelweb
nelnet nelnet
ryzom_gameshare ryzom_gameshare
nel_sevenzip nel_sevenzip

@ -191,7 +191,7 @@ struct CClientPatcherTranslations : public NLMISC::CI18N::ILoadProxy
}; };
// hardcoded URL to not depend on external files // hardcoded URL to not depend on external files
static const std::string PatchUrl = "https://cdn.ryzom.dev/classic/patch"; static const std::string PatchUrl = RYZOM_CLIENT_PATCH_URL; // "https://cdn.ryzom.dev/open/patch";
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {

Loading…
Cancel
Save