From 48757c15b75766fb0169c51a0a0d91a3e40b021e Mon Sep 17 00:00:00 2001 From: kervala Date: Sat, 9 Jan 2016 16:08:34 +0100 Subject: [PATCH] Merge with develop --- .../src/object_viewer_widget.cpp | 61 ++- .../src/object_viewer_widget.h | 20 +- .../3d/object_viewer_widget/src/stdpch.h | 8 + code/ryzom/client/src/3d_notes.cpp | 4 +- code/ryzom/client/src/animation_fx_sheet.cpp | 3 +- .../client_sheets/automaton_list_sheet.cpp | 6 +- .../src/client_sheets/character_sheet.cpp | 6 +- .../client/src/client_sheets/item_sheet.cpp | 20 +- .../client_sheets/outpost_building_sheet.cpp | 8 +- .../client/src/client_sheets/player_sheet.cpp | 4 +- .../client/src/client_sheets/sbrick_sheet.cpp | 11 +- code/ryzom/client/src/commands.cpp | 4 +- .../src/interface_v3/sphrase_manager.cpp | 2 +- code/ryzom/client/src/login_patch.cpp | 219 -------- .../client/src/login_patch_seven_zip.cpp | 482 ++++++++++++++++++ code/ryzom/client/src/teleport.cpp | 6 +- 16 files changed, 585 insertions(+), 279 deletions(-) create mode 100644 code/ryzom/client/src/login_patch_seven_zip.cpp diff --git a/code/nel/tools/3d/object_viewer_widget/src/object_viewer_widget.cpp b/code/nel/tools/3d/object_viewer_widget/src/object_viewer_widget.cpp index 83dec01e1..328850ecd 100644 --- a/code/nel/tools/3d/object_viewer_widget/src/object_viewer_widget.cpp +++ b/code/nel/tools/3d/object_viewer_widget/src/object_viewer_widget.cpp @@ -51,6 +51,14 @@ along with this program. If not, see . Q_EXPORT_PLUGIN2(object_viewer_widget_qt, NLQT::CObjectViewerWidget) #endif +#if defined(NL_OS_WINDOWS) + typedef bool (*winProc)(NL3D::IDriver *driver, HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); +#elif defined(NL_OS_MAC) + typedef bool (*cocoaProc)(NL3D::IDriver*, const void* e); +#else + typedef bool (*x11Proc)(NL3D::IDriver *drv, XEvent *e); +#endif + using namespace NLMISC; using namespace NL3D; using namespace std; @@ -87,13 +95,13 @@ namespace NLQT void CObjectViewerWidget::showEvent ( QShowEvent * event ) { - if (!_mainTimer->isActive()) + if (!_mainTimer->isActive()) { _mainTimer->start(25); } } - void CObjectViewerWidget::setNelContext(NLMISC::INelContext &nelContext) + void CObjectViewerWidget::setNelContext(NLMISC::INelContext &nelContext) { _LibContext = new CLibraryContext(nelContext); } @@ -260,7 +268,7 @@ namespace NLQT // ... // 09. Update Animations (playlists) - // - Needs to be either before or after entities, not sure, + // - Needs to be either before or after entities, not sure, // there was a problem with wrong order a while ago!!! @@ -283,7 +291,7 @@ namespace NLQT if (_isGraphicsInitialized && !getDriver()->isLost()) { - // 01. Render Driver (background color) + // 01. Render Driver (background color) renderDriver(); // clear all buffers // 02. Render Sky (sky scene) @@ -428,14 +436,14 @@ namespace NLQT bool CObjectViewerWidget::loadMesh(const std::string &meshFileName, const std::string &skelFileName) { std::string fileName = CFile::getFilenameWithoutExtension(meshFileName); - if ( _Entities.count(fileName) != 0) + if ( _Entities.count(fileName) != 0) return false; CPath::addSearchPath(CFile::getPath(meshFileName), false, false); // create instance of the mesh character UInstance Entity = _Scene->createInstance(meshFileName); - + CAABBox bbox; Entity.getShapeAABBox(bbox); setCamera(_Scene, bbox , Entity, true); @@ -456,7 +464,7 @@ namespace NLQT entity._FileNameShape = meshFileName; entity._FileNameSkeleton = skelFileName; entity._Instance = Entity; - if (!Skeleton.empty()) + if (!Skeleton.empty()) { entity._Skeleton = Skeleton; entity._Skeleton.bindSkin (entity._Instance); @@ -735,11 +743,38 @@ namespace NLQT _Scene->animate ( fdelta); } +#ifdef USE_QT5 + + bool CObjectViewerWidget::nativeEvent(const QByteArray &eventType, void *message, long *result) + { + if (getDriver() && getDriver()->isActive()) + { + NL3D::IDriver *driver = dynamic_cast(getDriver())->getDriver(); + if (driver) + { + // see what to do with result +#if defined(NL_OS_WINDOWS) + MSG *msg = (MSG*)message; + winProc proc = (winProc)driver->getWindowProc(); + return proc(driver, msg->hwnd, msg->message, msg->wParam, msg->lParam); +#elif defined(NL_OS_MAC) + cocoaProc proc = (cocoaProc)driver->getWindowProc(); + return proc(driver, message); +#else + x11Proc proc = (x11Proc)driver->getWindowProc(); + return proc(driver, message); +#endif + } + } + + return false; + } + +#else + #if defined(NL_OS_WINDOWS) - typedef bool (*winProc)(NL3D::IDriver *driver, HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); - - bool CObjectViewerWidget::winEvent(MSG * message, long * result) + bool CObjectViewerWidget::winEvent(MSG *message, long *result) { if (getDriver() && getDriver()->isActive()) { @@ -756,8 +791,6 @@ namespace NLQT #elif defined(NL_OS_MAC) - typedef bool (*cocoaProc)(NL3D::IDriver*, const void* e); - bool CObjectViewerWidget::macEvent(EventHandlerCallRef caller, EventRef event) { if(caller) @@ -778,8 +811,6 @@ namespace NLQT #elif defined(NL_OS_UNIX) - typedef bool (*x11Proc)(NL3D::IDriver *drv, XEvent *e); - bool CObjectViewerWidget::x11Event(XEvent *event) { if (getDriver() && getDriver()->isActive()) @@ -796,4 +827,6 @@ namespace NLQT } #endif +#endif + } /* namespace NLQT */ diff --git a/code/nel/tools/3d/object_viewer_widget/src/object_viewer_widget.h b/code/nel/tools/3d/object_viewer_widget/src/object_viewer_widget.h index fb6656679..69629ef40 100644 --- a/code/nel/tools/3d/object_viewer_widget/src/object_viewer_widget.h +++ b/code/nel/tools/3d/object_viewer_widget/src/object_viewer_widget.h @@ -33,7 +33,7 @@ along with this program. If not, see . #include "entity.h" #include "interfaces.h" -namespace NL3D +namespace NL3D { class UDriver; class UScene; @@ -50,14 +50,14 @@ class QIcon; namespace NLQT @brief namespace NLQT */ -namespace NLQT +namespace NLQT { - class CObjectViewerWidget: - public QWidget, + class CObjectViewerWidget: + public QWidget, public IObjectViewer { Q_OBJECT - Q_INTERFACES(NLQT::IObjectViewer) + Q_INTERFACES(NLQT::IObjectViewer) public: /// Default constructor. @@ -113,7 +113,7 @@ namespace NLQT /// @param w - width window. /// @param h - height window. void setSizeViewport(uint16 w, uint16 h); - + void setBloomEffect(bool enabled) { _BloomEffect = enabled; } /// Select instance from the scene @@ -166,19 +166,25 @@ namespace NLQT virtual QString name() const {return ("ObjectViewerWidget");} protected: +#ifdef USE_QT5 + virtual bool nativeEvent(const QByteArray &eventType, void *message, long *result); +#else + #if defined(NL_OS_WINDOWS) virtual bool winEvent(MSG * message, long * result); #elif defined(NL_OS_MAC) virtual bool macEvent(EventHandlerCallRef caller, EventRef event); #elif defined(NL_OS_UNIX) virtual bool x11Event(XEvent *event); +#endif + #endif private Q_SLOTS: void updateRender(); private: - + /// Update the animation time for Particle System animation. /// @param deltaTime - set the manual animation time. void updateAnimatePS(uint64 deltaTime = 0); diff --git a/code/nel/tools/3d/object_viewer_widget/src/stdpch.h b/code/nel/tools/3d/object_viewer_widget/src/stdpch.h index 34aaaa7d0..2c5b38f92 100644 --- a/code/nel/tools/3d/object_viewer_widget/src/stdpch.h +++ b/code/nel/tools/3d/object_viewer_widget/src/stdpch.h @@ -56,4 +56,12 @@ along with this program. If not, see . #include #include +#if defined(NL_OS_WINDOWS) +#define NOMINMAX +#include +#elif defined(NL_OS_MAC) +#else +#include +#endif + #endif diff --git a/code/ryzom/client/src/3d_notes.cpp b/code/ryzom/client/src/3d_notes.cpp index 618525de4..c53ac7ef1 100644 --- a/code/ryzom/client/src/3d_notes.cpp +++ b/code/ryzom/client/src/3d_notes.cpp @@ -280,11 +280,11 @@ NLMISC_COMMAND(gotoNote, "go to a note", "|") if(i != 0) tok += " "; tok += args[i]; } - tok = strlwr(tok); + tok = toLower(tok); list::iterator it; for(it = Notes.Notes.begin(); it != Notes.Notes.end(); it++) { - string note = strlwr((*it).Note); + string note = toLower((*it).Note); if(note.find(tok) != string::npos) { pos = (*it).Position; diff --git a/code/ryzom/client/src/animation_fx_sheet.cpp b/code/ryzom/client/src/animation_fx_sheet.cpp index 99175ad71..b5c778b11 100644 --- a/code/ryzom/client/src/animation_fx_sheet.cpp +++ b/code/ryzom/client/src/animation_fx_sheet.cpp @@ -64,8 +64,7 @@ void CAnimationFX::buildTrack(NL3D::UAnimationSet *as) nlassert(Sheet != NULL); if (!as) return; if (Sheet->TrajectoryAnim.empty()) return; - std::string animName = Sheet->TrajectoryAnim; - NLMISC::strlwr(animName); + std::string animName = NLMISC::toLower(Sheet->TrajectoryAnim); uint id = as->getAnimationIdByName(animName); NL3D::UAnimation *anim = NULL; if (id != NL3D::UAnimationSet::NotFound) diff --git a/code/ryzom/client/src/client_sheets/automaton_list_sheet.cpp b/code/ryzom/client/src/client_sheets/automaton_list_sheet.cpp index fe7cd002c..1f0b6565c 100644 --- a/code/ryzom/client/src/client_sheets/automaton_list_sheet.cpp +++ b/code/ryzom/client/src/client_sheets/automaton_list_sheet.cpp @@ -204,7 +204,7 @@ void CAutomatonStateSheet::build(const NLGEORGES::UFormElm &item, const string & for(uint mode = 0; mode ") if (args.size() == 0) return false; - if (!ClientCfg.AllowDebugLua && strlwr(args[0]) == "lua") + if (!ClientCfg.AllowDebugLua && toLower(args[0]) == "lua") { return false; // not allowed!! } @@ -1883,7 +1883,7 @@ NLMISC_COMMAND(pos, "Change the position of the user (in local only)", "_Stream->serialBuffer((uint8*)buffer, (uint)size); - *processedSize = size; - return SZ_OK; - } - catch (...) - { - return SZE_FAIL; - } - } - - // the seek function called by seven zip to seek inside stream - static SZ_RESULT seekFunc(void *object, CFileSize pos) - { - try - { - CNel7ZipInStream *me = (CNel7ZipInStream*)object; - bool ret= me->_Stream->seek(pos, NLMISC::IStream::begin); - if (ret) - return SZ_OK; - else - return SZE_FAIL; - } - catch (...) - { - return SZE_FAIL; - } - } -}; -#endif - static std::string ClientRootPath; // **************************************************************************** @@ -2192,164 +2131,6 @@ void CPatchManager::getCorruptedFileInfo(const SFileToPatch &ftp, ucstring &sTra toString("%.1f ", (float)ftp.FinalFileSize/1000000.f) + CI18N::get("uiMb") + ")"; } -bool CPatchManager::unpack7Zip(const std::string &sevenZipFile, const std::string &destFileName) -{ -#ifdef RZ_USE_SEVENZIP - nlinfo("Uncompressing 7zip archive '%s' to '%s'", sevenZipFile.c_str(), destFileName.c_str()); - - // init seven zip - ISzAlloc allocImp; - ISzAlloc allocTempImp; - CArchiveDatabaseEx db; - - allocImp.Alloc = SzAlloc; - allocImp.Free = SzFree; - - allocTempImp.Alloc = SzAllocTemp; - allocTempImp.Free = SzFreeTemp; - - InitCrcTable(); - SzArDbExInit(&db); - - // unpack the file using the 7zip API - - CIFile input(sevenZipFile); - CNel7ZipInStream inStr(&input); - - SZ_RESULT res = SzArchiveOpen(&inStr, &db, &allocImp, &allocTempImp); - if (res != SZ_OK) - { - nlerror("Failed to open archive file %s", sevenZipFile.c_str()); - return false; - } - - if (db.Database.NumFiles != 1) - { - nlerror("Seven zip archive with more than 1 file are unsupported"); - return false; - } - - UInt32 blockIndex = 0xFFFFFFFF; /* it can have any value before first call (if outBuffer = 0) */ - Byte *outBuffer = 0; /* it must be 0 before first call for each new archive. */ - size_t outBufferSize = 0; /* it can have any value before first call (if outBuffer = 0) */ - - size_t offset; - size_t outSizeProcessed = 0; - - // get the first file - CFileItem *f = db.Database.Files; - res = SzExtract(&inStr, &db, 0, - &blockIndex, &outBuffer, &outBufferSize, - &offset, &outSizeProcessed, - &allocImp, &allocTempImp); - - // write the extracted file - FILE *outputHandle; - UInt32 processedSize; - char *fileName = f->Name; - size_t nameLen = strlen(f->Name); - for (; nameLen > 0; nameLen--) - { - if (f->Name[nameLen - 1] == '/') - { - fileName = f->Name + nameLen; - break; - } - } - - outputHandle = fopen(destFileName.c_str(), "wb+"); - if (outputHandle == 0) - { - nlerror("Can not open output file '%s'", destFileName.c_str()); - return false; - } - processedSize = (UInt32)fwrite(outBuffer + offset, 1, outSizeProcessed, outputHandle); - if (processedSize != outSizeProcessed) - { - nlerror("Failed to write %u char to output file '%s'", outSizeProcessed-processedSize, destFileName.c_str()); - return false; - } - fclose(outputHandle); - allocImp.Free(outBuffer); - - // free 7z context - SzArDbExFree(&db, allocImp.Free); - - // ok, all is fine, file is unpacked - return true; -#else - return false; -#endif -} - -bool CPatchManager::unpackLZMA(const std::string &lzmaFile, const std::string &destFileName) -{ -#ifdef RZ_USE_SEVENZIP - nldebug("unpackLZMA : decompression the lzma file '%s' into output file '%s", lzmaFile.c_str(), destFileName.c_str()); - CIFile inStream(lzmaFile); - uint32 inSize = inStream.getFileSize(); - auto_ptr inBuffer = auto_ptr(new uint8[inSize]); - inStream.serialBuffer(inBuffer.get(), inSize); - - CLzmaDecoderState state; - - uint8 *pos = inBuffer.get(); - // read the lzma properties - int ret = LzmaDecodeProperties(&state.Properties, (unsigned char*) pos, LZMA_PROPERTIES_SIZE); - if (ret != 0) - { - nlwarning("Failed to decode lzma properies in file '%s'!", lzmaFile.c_str()); - return false; - } - - if (inSize < LZMA_PROPERTIES_SIZE + 8) - { - nlwarning("Invalid file size, too small file '%s'", lzmaFile.c_str()); - return false; - } - - // alloc the probs, making sure they are deleted in function exit - size_t nbProb = LzmaGetNumProbs(&state.Properties); - auto_ptr probs = auto_ptr(new CProb[nbProb]); - state.Probs = probs.get(); - - pos += LZMA_PROPERTIES_SIZE; - - // read the output file size - size_t fileSize = 0; - for (int i = 0; i < 8; i++) - { - //Byte b; - if (pos >= inBuffer.get()+inSize) - { - nlassert(false); - return false; - } - fileSize |= ((UInt64)*pos++) << (8 * i); - } - - SizeT outProcessed = 0; - SizeT inProcessed = 0; - // allocate the output buffer - auto_ptr outBuffer = auto_ptr(new uint8[fileSize]); - // decompress the file in memory - ret = LzmaDecode(&state, (unsigned char*) pos, (SizeT)(inSize-(pos-inBuffer.get())), &inProcessed, (unsigned char*)outBuffer.get(), (SizeT)fileSize, &outProcessed); - if (ret != 0 || outProcessed != fileSize) - { - nlwarning("Failed to decode lzma file '%s'", lzmaFile.c_str()); - return false; - } - - // store on output buffer - COFile outStream(destFileName); - outStream.serialBuffer(outBuffer.get(), (uint)fileSize); - - return true; -#else - return false; -#endif -} - // **************************************************************************** // **************************************************************************** diff --git a/code/ryzom/client/src/login_patch_seven_zip.cpp b/code/ryzom/client/src/login_patch_seven_zip.cpp new file mode 100644 index 000000000..4ce8ac122 --- /dev/null +++ b/code/ryzom/client/src/login_patch_seven_zip.cpp @@ -0,0 +1,482 @@ +// Ryzom - MMORPG Framework +// 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 . + +// +// Includes +// + +#include "stdpch.h" +#include "login_patch.h" + +#define RZ_USE_SEVENZIP 1 +//#define RZ_USE_NEW_LZMA + +#ifdef RZ_USE_SEVENZIP + +#ifdef RZ_USE_NEW_LZMA + +#include "seven_zip/7z.h" +#include "seven_zip/7zAlloc.h" +#include "seven_zip/7zBuf.h" +#include "seven_zip/7zCrc.h" +#include "seven_zip/7zFile.h" +#include "seven_zip/7zVersion.h" +#include "seven_zip/LzmaDec.h" + +#else + +#include "seven_zip/7zCrc.h" +#include "seven_zip/7zIn.h" +#include "seven_zip/7zExtract.h" +#include "seven_zip/LzmaDecode.h" + +#endif + +// +// Namespaces +// + +using namespace std; +using namespace NLMISC; + + +#ifdef RZ_USE_NEW_LZMA + +/// Input stream class for 7zip archive +class CNel7ZipInStream : public ISeekInStream +{ + NLMISC::IStream *_Stream; + +public: + /// Constructor, only allow file stream because 7zip will 'seek' in the stream + CNel7ZipInStream(NLMISC::IStream *s) + : _Stream(s) + { + Read = readFunc; + Seek = seekFunc; + } + + // the read function called by 7zip to read data + static SRes readFunc(void *object, void *buffer, size_t *size) + { + try + { + CNel7ZipInStream *me = (CNel7ZipInStream*)object; + uint len = (uint)*size; + me->_Stream->serialBuffer((uint8*)buffer, len); + return SZ_OK; + } + catch (...) + { + return SZ_ERROR_READ; + } + } + + // the seek function called by seven zip to seek inside stream + static SRes seekFunc(void *object, Int64 *pos, ESzSeek origin) + { + try + { + CNel7ZipInStream *me = (CNel7ZipInStream*)object; + sint32 offset = (sint32)*pos; + bool ret = me->_Stream->seek(offset, (NLMISC::IStream::TSeekOrigin)origin); + + if (ret) + { + *pos = (Int64)me->_Stream->getPos(); + return SZ_OK; + } + } + catch (...) + { + } + + return SZ_ERROR_READ; + } +}; + +#else + +/// Input stream class for 7zip archive +class CNel7ZipInStream : public _ISzInStream +{ + NLMISC::IStream *_Stream; + +public: + /// Constructor, only allow file stream because 7zip will 'seek' in the stream + CNel7ZipInStream(NLMISC::IStream *s) + : _Stream(s) + { + Read = readFunc; + Seek = seekFunc; + } + + // the read function called by 7zip to read data + static SZ_RESULT readFunc(void *object, void *buffer, size_t size, size_t *processedSize) + { + try + { + CNel7ZipInStream *me = (CNel7ZipInStream*)object; + me->_Stream->serialBuffer((uint8*)buffer, (uint)size); + *processedSize = size; + return SZ_OK; + } + catch (...) + { + return SZE_FAIL; + } + } + + // the seek function called by seven zip to seek inside stream + static SZ_RESULT seekFunc(void *object, CFileSize pos) + { + try + { + CNel7ZipInStream *me = (CNel7ZipInStream*)object; + bool ret= me->_Stream->seek(pos, NLMISC::IStream::begin); + if (ret) + return SZ_OK; + else + return SZE_FAIL; + } + catch (...) + { + return SZE_FAIL; + } + } +}; + +#endif + +#endif + +bool CPatchManager::unpack7Zip(const std::string &sevenZipFile, const std::string &destFileName) +{ +#ifdef RZ_USE_SEVENZIP + nlinfo("Uncompressing 7zip archive '%s' to '%s'", sevenZipFile.c_str(), destFileName.c_str()); + + // init seven zip + ISzAlloc allocImp; + allocImp.Alloc = SzAlloc; + allocImp.Free = SzFree; + + ISzAlloc allocTempImp; + allocTempImp.Alloc = SzAllocTemp; + allocTempImp.Free = SzFreeTemp; + + // wrap file in a CIFile + CIFile input(sevenZipFile); + CNel7ZipInStream inStr(&input); + +#ifdef RZ_USE_NEW_LZMA + + CLookToRead lookStream; + lookStream.realStream = &inStr; + LookToRead_CreateVTable(&lookStream, False); + LookToRead_Init(&lookStream); + + CrcGenerateTable(); + + CSzArEx db; + SzArEx_Init(&db); + + // unpack the file using the 7zip API + SRes res = SzArEx_Open(&db, &lookStream.s, &allocImp, &allocTempImp); + + if (res != SZ_OK) + { + nlerror("Failed to open archive file %s", sevenZipFile.c_str()); + return false; + } + + if (db.NumFiles != 1) + { + nlerror("Seven zip archive with more than 1 file are unsupported"); + return false; + } + + UInt32 blockIndex = 0xFFFFFFFF; /* it can have any value before first call (if outBuffer = 0) */ + Byte *outBuffer = 0; /* it must be 0 before first call for each new archive. */ + size_t outBufferSize = 0; /* it can have any value before first call (if outBuffer = 0) */ + + size_t offset; + size_t outSizeProcessed = 0; + + // get the first file + res = SzArEx_Extract(&db, &lookStream.s, 0, + &blockIndex, &outBuffer, &outBufferSize, + &offset, &outSizeProcessed, + &allocImp, &allocTempImp); + + // get the length of first file + size_t nameLen = SzArEx_GetFileNameUtf16(&db, 0, NULL); + + ucstring filename; + filename.resize(nameLen); + + // write filename into ucstring + SzArEx_GetFileNameUtf16(&db, 0, &filename[0]); + + // write the extracted file + FILE *outputHandle = fopen(destFileName.c_str(), "wb+"); + + if (outputHandle == 0) + { + nlerror("Can not open output file '%s'", destFileName.c_str()); + return false; + } + + UInt32 processedSize = (UInt32)fwrite(outBuffer + offset, 1, outSizeProcessed, outputHandle); + + if (processedSize != outSizeProcessed) + { + nlerror("Failed to write %u char to output file '%s'", outSizeProcessed-processedSize, destFileName.c_str()); + return false; + } + + fclose(outputHandle); + + IAlloc_Free(&allocImp, outBuffer); + + // free 7z context + SzArEx_Free(&db, &allocImp); + +#else + + InitCrcTable(); + + CArchiveDatabaseEx db; + SzArDbExInit(&db); + + // unpack the file using the 7zip API + SZ_RESULT res = SzArchiveOpen(&inStr, &db, &allocImp, &allocTempImp); + + if (res != SZ_OK) + { + nlerror("Failed to open archive file %s", sevenZipFile.c_str()); + return false; + } + + if (db.Database.NumFiles != 1) + { + nlerror("Seven zip archive with more than 1 file are unsupported"); + return false; + } + + UInt32 blockIndex = 0xFFFFFFFF; /* it can have any value before first call (if outBuffer = 0) */ + Byte *outBuffer = 0; /* it must be 0 before first call for each new archive. */ + size_t outBufferSize = 0; /* it can have any value before first call (if outBuffer = 0) */ + + size_t offset; + size_t outSizeProcessed = 0; + + // get the first file + CFileItem *f = db.Database.Files; + res = SzExtract(&inStr, &db, 0, + &blockIndex, &outBuffer, &outBufferSize, + &offset, &outSizeProcessed, + &allocImp, &allocTempImp); + + // write the extracted file + FILE *outputHandle; + UInt32 processedSize; + char *fileName = f->Name; + size_t nameLen = strlen(f->Name); + for (; nameLen > 0; nameLen--) + { + if (f->Name[nameLen - 1] == '/') + { + fileName = f->Name + nameLen; + break; + } + } + + outputHandle = fopen(destFileName.c_str(), "wb+"); + + if (outputHandle == 0) + { + nlerror("Can not open output file '%s'", destFileName.c_str()); + return false; + } + + processedSize = (UInt32)fwrite(outBuffer + offset, 1, outSizeProcessed, outputHandle); + + if (processedSize != outSizeProcessed) + { + nlerror("Failed to write %u char to output file '%s'", outSizeProcessed-processedSize, destFileName.c_str()); + return false; + } + + fclose(outputHandle); + allocImp.Free(outBuffer); + + // free 7z context + SzArDbExFree(&db, allocImp.Free); + +#endif + + // ok, all is fine, file is unpacked + return true; +#else + return false; +#endif +} + +bool CPatchManager::unpackLZMA(const std::string &lzmaFile, const std::string &destFileName) +{ +#ifdef RZ_USE_SEVENZIP + nldebug("unpackLZMA : decompression the lzma file '%s' into output file '%s", lzmaFile.c_str(), destFileName.c_str()); + + CIFile inStream(lzmaFile); + uint32 inSize = inStream.getFileSize(); + +#ifdef RZ_USE_NEW_LZMA + + if (inSize < LZMA_PROPS_SIZE + 8) + { + nlwarning("Invalid file size, too small file '%s'", lzmaFile.c_str()); + return false; + } + + // read the compressed file in buffer + auto_ptr inBuffer = auto_ptr(new uint8[inSize]); + inStream.serialBuffer(inBuffer.get(), inSize); + + uint8 *pos = inBuffer.get(); + + pos += LZMA_PROPS_SIZE; + + // read the output file size + size_t fileSize = 0; + + for (int i = 0; i < 8; ++i) + { + if (pos >= inBuffer.get()+inSize) + { + nlassert(false); + return false; + } + + fileSize |= ((UInt64)*pos++) << (8 * i); + } + + // allocators + ISzAlloc allocImp; + allocImp.Alloc = SzAlloc; + allocImp.Free = SzFree; + + CLzmaDec state; + LzmaDec_Construct(&state); + + // allocate and decode props and probs + SRes res = LzmaDec_Allocate(&state, inBuffer.get(), LZMA_PROPS_SIZE, &allocImp); + + if (res != 0) + { + nlwarning("Failed to decode lzma properies in file '%s'!", lzmaFile.c_str()); + return false; + } + + // allocate the output buffer + auto_ptr outBuffer = auto_ptr(new uint8[fileSize]); + + // in and out file sizes + SizeT outProcessed = fileSize; + SizeT inProcessed = (SizeT)(inSize-(pos-inBuffer.get())); + + LzmaDec_Init(&state); + + // decompress the file in memory + ELzmaStatus status; + res = LzmaDec_DecodeToBuf(&state, (Byte*)outBuffer.get(), &outProcessed, (Byte*)pos, &inProcessed, LZMA_FINISH_ANY, &status); + + // free memory + LzmaDec_Free(&state, &allocImp); + + if (res != 0 || outProcessed != fileSize) + { + nlwarning("Failed to decode lzma file '%s' with status %d", lzmaFile.c_str(), (sint)status); + return false; + } + +#else + + auto_ptr inBuffer = auto_ptr(new uint8[inSize]); + inStream.serialBuffer(inBuffer.get(), inSize); + + CLzmaDecoderState state; + + uint8 *pos = inBuffer.get(); + + // read the lzma properties + int res = LzmaDecodeProperties(&state.Properties, (unsigned char*) pos, LZMA_PROPERTIES_SIZE); + if (res != 0) + { + nlwarning("Failed to decode lzma properies in file '%s'!", lzmaFile.c_str()); + return false; + } + + if (inSize < LZMA_PROPERTIES_SIZE + 8) + { + nlwarning("Invalid file size, too small file '%s'", lzmaFile.c_str()); + return false; + } + + // alloc the probs, making sure they are deleted in function exit + size_t nbProb = LzmaGetNumProbs(&state.Properties); + auto_ptr probs = auto_ptr(new CProb[nbProb]); + state.Probs = probs.get(); + + pos += LZMA_PROPERTIES_SIZE; + + // read the output file size + size_t fileSize = 0; + for (int i = 0; i < 8; i++) + { + if (pos >= inBuffer.get()+inSize) + { + nlassert(false); + return false; + } + fileSize |= ((UInt64)*pos++) << (8 * i); + } + + SizeT outProcessed = 0; + SizeT inProcessed = 0; + + // allocate the output buffer + auto_ptr outBuffer = auto_ptr(new uint8[fileSize]); + + // decompress the file in memory + res = LzmaDecode(&state, (unsigned char*) pos, (SizeT)(inSize-(pos-inBuffer.get())), &inProcessed, (unsigned char*)outBuffer.get(), (SizeT)fileSize, &outProcessed); + + if (res != 0 || outProcessed != fileSize) + { + nlwarning("Failed to decode lzma file '%s'", lzmaFile.c_str()); + return false; + } + +#endif + + // store on output buffer + COFile outStream(destFileName); + outStream.serialBuffer(outBuffer.get(), (uint)fileSize); + + return true; +#else + return false; +#endif +} diff --git a/code/ryzom/client/src/teleport.cpp b/code/ryzom/client/src/teleport.cpp index f5ec933a7..c85c938fa 100644 --- a/code/ryzom/client/src/teleport.cpp +++ b/code/ryzom/client/src/teleport.cpp @@ -97,16 +97,14 @@ void CTeleport::load(const std::string &/* filename */) string destName; if(tpElmt->getValueByName(destName, "name")) { - // All in UPPER CASE to not be CASE SENSITIVE. - NLMISC::strlwr(destName); - // Get the position CVector pos; if(tpElmt->getValueByName(pos.x, "position.X") && tpElmt->getValueByName(pos.y, "position.Y") && tpElmt->getValueByName(pos.z, "position.Z")) { - _Destinations.insert(make_pair(destName, pos)); + // All in UPPER CASE to not be CASE SENSITIVE. + _Destinations.insert(make_pair(NLMISC::toLower(destName), pos)); } else nlwarning("CTeleport::load: Cannot find the one of the key 'position.X or Y or Z' for the element %d.", i);