diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt
index b229d87a5..84654584a 100644
--- a/code/CMakeLists.txt
+++ b/code/CMakeLists.txt
@@ -258,7 +258,8 @@ IF(WITH_QT5)
FIND_PACKAGE(Qt5Network)
IF(WIN32)
- FIND_PACKAGE(Qt5WinExtras)
+ # Please add option to switch off
+ # FIND_PACKAGE(Qt5WinExtras)
ENDIF()
IF(QT_STATIC)
diff --git a/code/nel/include/nel/misc/bitmap.h b/code/nel/include/nel/misc/bitmap.h
index 8d2bf156f..0466cd673 100644
--- a/code/nel/include/nel/misc/bitmap.h
+++ b/code/nel/include/nel/misc/bitmap.h
@@ -320,16 +320,8 @@ public:
// don't forget to update operator=() and swap() if adding a data member
- CBitmap()
- {
- _MipMapCount = 1;
- _Width = 0;
- _Height = 0;
- PixelFormat = RGBA;
- _LoadGrayscaleAsAlpha = true;
- }
-
- virtual ~CBitmap() { }
+ CBitmap();
+ virtual ~CBitmap();
// swap 2 bitmaps contents
void swap(CBitmap &other);
diff --git a/code/nel/include/nel/misc/common.h b/code/nel/include/nel/misc/common.h
index 3b5465eaa..dd1c80fb3 100644
--- a/code/nel/include/nel/misc/common.h
+++ b/code/nel/include/nel/misc/common.h
@@ -282,6 +282,13 @@ inline sint nlstricmp(const std::string &lhs, const std::string &rhs) { return s
inline sint nlstricmp(const std::string &lhs, const char *rhs) { return stricmp(lhs.c_str(),rhs); }
inline sint nlstricmp(const char *lhs, const std::string &rhs) { return stricmp(lhs,rhs.c_str()); }
+// macros helper to convert UTF-8 std::string and wchar_t*
+#define wideToUtf8(str) (ucstring((ucchar*)str).toUtf8())
+#define utf8ToWide(str) ((wchar_t*)ucstring::makeFromUtf8(str).c_str())
+
+// wrapper for fopen to be able to open files with an UTF-8 filename
+FILE* nlfopen(const std::string &filename, const std::string &mode);
+
/** Signed 64 bit fseek. Same interface as fseek
*/
int nlfseek64( FILE *stream, sint64 offset, int origin );
@@ -346,6 +353,8 @@ uint32 humanReadableToBytes (const std::string &str);
/// Convert a time into a string that is easily readable by an human, for example 3600 -> "1h"
std::string secondsToHumanReadable (uint32 time);
+/// Convert a UNIX timestamp to a formatted date in ISO format
+std::string timestampToHumanReadable(uint32 timestamp);
/// Get a bytes or time in string format and convert it in seconds or bytes
uint32 fromHumanReadable (const std::string &str);
diff --git a/code/nel/include/nel/misc/debug.h b/code/nel/include/nel/misc/debug.h
index 8d2483e4e..54e22880d 100644
--- a/code/nel/include/nel/misc/debug.h
+++ b/code/nel/include/nel/misc/debug.h
@@ -229,7 +229,7 @@ void setCrashAlreadyReported(bool state);
*\code
void function(char *filename)
{
- FILE *fp = fopen (filename, "r");
+ FILE *fp = nlfopen (filename, "r");
if (fp==NULL)
{
nlerror("file not found");
diff --git a/code/nel/include/nel/misc/path.h b/code/nel/include/nel/misc/path.h
index 1fa049fa5..a16b03f15 100644
--- a/code/nel/include/nel/misc/path.h
+++ b/code/nel/include/nel/misc/path.h
@@ -722,7 +722,6 @@ struct CFile
/** Try to set the file access to read/write if not already set.
* return true if the file doesn't exist or if the file already have RW access.
- * Work actually only on Windows and returns always true on other platforms.
* \return true if RW access is granted
*/
static bool setRWAccess(const std::string &filename);
diff --git a/code/nel/tools/3d/mesh_utils/database_config.h b/code/nel/include/nel/pipeline/database_config.h
similarity index 97%
rename from code/nel/tools/3d/mesh_utils/database_config.h
rename to code/nel/include/nel/pipeline/database_config.h
index 25bcc2a00..ec9bb6ec6 100644
--- a/code/nel/tools/3d/mesh_utils/database_config.h
+++ b/code/nel/include/nel/pipeline/database_config.h
@@ -28,6 +28,8 @@ typedef NLMISC::CSString TPathString;
typedef std::string TPathString;
#endif
+namespace NLPIPELINE {
+
/// Asset database configuration
class CDatabaseConfig
{
@@ -55,4 +57,6 @@ private:
};
+} /* namespace NLPIPELINE */
+
/* end of file */
diff --git a/code/nel/include/nel/pipeline/project_config.h b/code/nel/include/nel/pipeline/project_config.h
new file mode 100644
index 000000000..a63cbda20
--- /dev/null
+++ b/code/nel/include/nel/pipeline/project_config.h
@@ -0,0 +1,80 @@
+// NeL - MMORPG Framework
+// Copyright (C) 2015 Winch Gate Property Limited
+// Author: Jan Boon
+//
+// 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 .
+
+#ifndef NLPIPELINE_PROJECT_CONFIG_H
+#define NLPIPELINE_PROJECT_CONFIG_H
+#include
+#include
+
+namespace NLMISC {
+ class CConfigFile;
+}
+
+#ifdef NL_OS_WINDOWS
+#include
+typedef NLMISC::CSString TPathString;
+#else
+typedef std::string TPathString;
+#endif
+
+namespace NLPIPELINE {
+
+/// Asset project configuration. Used to configure lookup directories for tools and buildsite specific setup. Do not use for pipeline build settings
+class CProjectConfig
+{
+public:
+ enum Flags
+ {
+ DatabaseTextureSearchPaths = 0x0001,
+ DatabaseMaterialSearchPaths = 0x0002,
+ RuntimeTextureSearchPaths = 0x0100,
+ RuntimeShapeSearchPaths = 0x0200,
+ };
+
+public:
+ ~CProjectConfig();
+
+ /// Searches for the configuration for the specified asset path by recursively going through all parent directories looking for 'nel.cfg', matches it to a project cfg if partial is not set, initializes and applies the configuration.
+ static bool init(const std::string &asset, Flags flags, bool partial = false);
+ /// Undo init
+ static void release();
+
+private:
+ static void cleanup();
+ static void searchDirectories(const char *var);
+
+ static CProjectConfig s_Instance;
+
+ static uint32 s_AssetConfigModification;
+ static uint32 s_ProjectConfigModification;
+
+ static TPathString s_AssetConfigPath;
+ static TPathString s_ProjectConfigPath;
+
+ static std::string s_ProjectName;
+ static CProjectConfig::Flags s_InitFlags;
+
+ static std::vector s_ConfigPaths;
+ static std::vector s_ConfigFiles;
+
+};
+
+} /* namespace NLPIPELINE */
+
+#endif /* #ifndef NLPIPELINE_PROJECT_CONFIG_H */
+
+/* end of file */
diff --git a/code/nel/include/nel/misc/tool_logger.h b/code/nel/include/nel/pipeline/tool_logger.h
similarity index 89%
rename from code/nel/include/nel/misc/tool_logger.h
rename to code/nel/include/nel/pipeline/tool_logger.h
index ff78a6afa..55b3b2455 100644
--- a/code/nel/include/nel/misc/tool_logger.h
+++ b/code/nel/include/nel/pipeline/tool_logger.h
@@ -27,8 +27,8 @@
* .
*/
-#ifndef NLMISC_TOOL_LOGGER_H
-#define NLMISC_TOOL_LOGGER_H
+#ifndef NLPIPELINE_TOOL_LOGGER_H
+#define NLPIPELINE_TOOL_LOGGER_H
#include
// STL includes
@@ -47,16 +47,16 @@
#endif
#ifdef NL_DEBUG_H
-#define tlerror(toolLogger, path, error, ...) nlwarning(error, ## __VA_ARGS__), toolLogger.writeError(NLMISC::ERROR, path, error, ## __VA_ARGS__)
-#define tlwarning(toolLogger, path, error, ...) nlwarning(error, ## __VA_ARGS__), toolLogger.writeError(NLMISC::WARNING, path, error, ## __VA_ARGS__)
-#define tlmessage(toolLogger, path, error, ...) nlinfo(error, ## __VA_ARGS__), toolLogger.writeError(NLMISC::MESSAGE, path, error, ## __VA_ARGS__)
+#define tlerror(toolLogger, path, error, ...) nlwarning(error, ## __VA_ARGS__), toolLogger.writeError(NLPIPELINE::ERROR, path, error, ## __VA_ARGS__)
+#define tlwarning(toolLogger, path, error, ...) nlwarning(error, ## __VA_ARGS__), toolLogger.writeError(NLPIPELINE::WARNING, path, error, ## __VA_ARGS__)
+#define tlmessage(toolLogger, path, error, ...) nlinfo(error, ## __VA_ARGS__), toolLogger.writeError(NLPIPELINE::MESSAGE, path, error, ## __VA_ARGS__)
#else
-#define tlerror(toolLogger, path, error, ...) toolLogger.writeError(NLMISC::ERROR, path, error, ## __VA_ARGS__)
-#define tlwarning(toolLogger, path, error, ...) toolLogger.writeError(NLMISC::WARNING, path, error, ## __VA_ARGS__)
-#define tlmessage(toolLogger, path, error, ...) toolLogger.writeError(NLMISC::MESSAGE, path, error, ## __VA_ARGS__)
+#define tlerror(toolLogger, path, error, ...) toolLogger.writeError(NLPIPELINE::ERROR, path, error, ## __VA_ARGS__)
+#define tlwarning(toolLogger, path, error, ...) toolLogger.writeError(NLPIPELINE::WARNING, path, error, ## __VA_ARGS__)
+#define tlmessage(toolLogger, path, error, ...) toolLogger.writeError(NLPIPELINE::MESSAGE, path, error, ## __VA_ARGS__)
#endif
-namespace NLMISC {
+namespace NLPIPELINE {
enum TError
{
@@ -203,8 +203,8 @@ public:
}
}; /* class CToolLogger */
-} /* namespace NLMISC */
+} /* namespace NLPIPELINE */
-#endif /* #ifndef NLMISC_TOOL_LOGGER_H */
+#endif /* #ifndef NLPIPELINE_TOOL_LOGGER_H */
/* end of file */
diff --git a/code/nel/src/3d/driver/direct3d/driver_direct3d.cpp b/code/nel/src/3d/driver/direct3d/driver_direct3d.cpp
index 23ed1bedc..2b90ea1ed 100644
--- a/code/nel/src/3d/driver/direct3d/driver_direct3d.cpp
+++ b/code/nel/src/3d/driver/direct3d/driver_direct3d.cpp
@@ -1243,23 +1243,23 @@ bool CDriverD3D::init (uintptr_t windowIcon, emptyProc exitFunc)
createCursors();
+ _WindowClass = "NLD3D" + toString(windowIcon);
+
// Register a window class
- WNDCLASSW wc;
+ WNDCLASSA wc;
memset(&wc,0,sizeof(wc));
wc.style = 0; // CS_HREDRAW | CS_VREDRAW ;//| CS_DBLCLKS;
wc.lpfnWndProc = (WNDPROC)WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
- wc.hInstance = GetModuleHandleW(NULL);
+ wc.hInstance = GetModuleHandleA(NULL);
wc.hIcon = (HICON)windowIcon;
wc.hCursor = _DefaultCursor;
wc.hbrBackground = WHITE_BRUSH;
- _WindowClass = "NLD3D" + toString(windowIcon);
- ucstring us = _WindowClass;
- wc.lpszClassName = (LPCWSTR)us.c_str();
+ wc.lpszClassName = _WindowClass.c_str();
wc.lpszMenuName = NULL;
- if (!RegisterClassW(&wc))
+ if (!RegisterClassA(&wc))
{
DWORD error = GetLastError();
if (error != ERROR_CLASS_ALREADY_EXISTS)
@@ -1806,7 +1806,7 @@ emptyProc CDriverD3D::getWindowProc()
IDriver::TMessageBoxId CDriverD3D::systemMessageBox (const char* message, const char* title, TMessageBoxType type, TMessageBoxIcon icon)
{
- switch (::MessageBox (_HWnd, message, title, ((type==retryCancelType)?MB_RETRYCANCEL:
+ switch (::MessageBoxW (_HWnd, utf8ToWide(message), utf8ToWide(title), ((type==retryCancelType)?MB_RETRYCANCEL:
(type==yesNoCancelType)?MB_YESNOCANCEL:
(type==okCancelType)?MB_OKCANCEL:
(type==abortRetryIgnoreType)?MB_ABORTRETRYIGNORE:
@@ -2327,13 +2327,13 @@ void CDriverD3D::setWindowIcon(const std::vector &bitmaps)
if (winIconBig)
{
- SendMessage(_HWnd, WM_SETICON, 0 /* ICON_SMALL */, (LPARAM)winIconSmall);
- SendMessage(_HWnd, WM_SETICON, 1 /* ICON_BIG */, (LPARAM)winIconBig);
+ SendMessageA(_HWnd, WM_SETICON, 0 /* ICON_SMALL */, (LPARAM)winIconSmall);
+ SendMessageA(_HWnd, WM_SETICON, 1 /* ICON_BIG */, (LPARAM)winIconBig);
}
else
{
- SendMessage(_HWnd, WM_SETICON, 0 /* ICON_SMALL */, (LPARAM)winIconSmall);
- SendMessage(_HWnd, WM_SETICON, 1 /* ICON_BIG */, (LPARAM)winIconSmall);
+ SendMessageA(_HWnd, WM_SETICON, 0 /* ICON_SMALL */, (LPARAM)winIconSmall);
+ SendMessageA(_HWnd, WM_SETICON, 1 /* ICON_BIG */, (LPARAM)winIconSmall);
}
}
diff --git a/code/nel/src/3d/driver/opengl/driver_opengl.cpp b/code/nel/src/3d/driver/opengl/driver_opengl.cpp
index 2b7f76515..e247275ab 100644
--- a/code/nel/src/3d/driver/opengl/driver_opengl.cpp
+++ b/code/nel/src/3d/driver/opengl/driver_opengl.cpp
@@ -2527,7 +2527,7 @@ void CDriverGL::retrieveATIDriverVersion()
// get from the registry
HKEY parentKey;
// open key about current video card
- LONG result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E968-E325-11CE-BFC1-08002BE10318}", 0, KEY_READ, &parentKey);
+ LONG result = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E968-E325-11CE-BFC1-08002BE10318}", 0, KEY_READ, &parentKey);
if (result == ERROR_SUCCESS)
{
// find last config
@@ -2541,7 +2541,7 @@ void CDriverGL::retrieveATIDriverVersion()
for(;;)
{
nameBufferSize = sizeof(subKeyName) / sizeof(subKeyName[0]);
- result = RegEnumKeyEx(parentKey, keyIndex, subKeyName, &nameBufferSize, NULL, NULL, NULL, &lastWriteTime);
+ result = RegEnumKeyExA(parentKey, keyIndex, subKeyName, &nameBufferSize, NULL, NULL, NULL, &lastWriteTime);
if (result == ERROR_NO_MORE_ITEMS) break;
if (result == ERROR_SUCCESS)
{
@@ -2577,14 +2577,14 @@ void CDriverGL::retrieveATIDriverVersion()
if (configFound)
{
HKEY subKey;
- result = RegOpenKeyEx(parentKey, latestSubKeyName, 0, KEY_READ, &subKey);
+ result = RegOpenKeyExA(parentKey, latestSubKeyName, 0, KEY_READ, &subKey);
if (result == ERROR_SUCCESS)
{
// see if it is a radeon card
DWORD valueType;
char driverDesc[256];
DWORD driverDescBufSize = sizeof(driverDesc) / sizeof(driverDesc[0]);
- result = RegQueryValueEx(subKey, "DriverDesc", NULL, &valueType, (unsigned char *) driverDesc, &driverDescBufSize);
+ result = RegQueryValueExA(subKey, "DriverDesc", NULL, &valueType, (unsigned char *) driverDesc, &driverDescBufSize);
if (result == ERROR_SUCCESS && valueType == REG_SZ)
{
toLower(driverDesc);
@@ -2592,7 +2592,7 @@ void CDriverGL::retrieveATIDriverVersion()
{
char driverVersion[256];
DWORD driverVersionBufSize = sizeof(driverVersion) / sizeof(driverVersion[0]);
- result = RegQueryValueEx(subKey, "DriverVersion", NULL, &valueType, (unsigned char *) driverVersion, &driverVersionBufSize);
+ result = RegQueryValueExA(subKey, "DriverVersion", NULL, &valueType, (unsigned char *) driverVersion, &driverVersionBufSize);
if (result == ERROR_SUCCESS && valueType == REG_SZ)
{
int subVersionNumber[4];
diff --git a/code/nel/src/3d/driver/opengl/driver_opengl_vertex_program.cpp b/code/nel/src/3d/driver/opengl/driver_opengl_vertex_program.cpp
index 1c06ece9a..93d281fec 100644
--- a/code/nel/src/3d/driver/opengl/driver_opengl_vertex_program.cpp
+++ b/code/nel/src/3d/driver/opengl/driver_opengl_vertex_program.cpp
@@ -1672,7 +1672,7 @@ bool CDriverGL::compileEXTVertexShader(CVertexProgram *program)
}
/*
- FILE *f = fopen(getLogDirectory() + "test.txt", "wb");
+ FILE *f = nlfopen(getLogDirectory() + "test.txt", "wb");
if (f)
{
std::string vpText;
diff --git a/code/nel/src/3d/driver/opengl/driver_opengl_window.cpp b/code/nel/src/3d/driver/opengl/driver_opengl_window.cpp
index d2abbfd38..db6400042 100644
--- a/code/nel/src/3d/driver/opengl/driver_opengl_window.cpp
+++ b/code/nel/src/3d/driver/opengl/driver_opengl_window.cpp
@@ -326,7 +326,7 @@ bool CDriverGL::init (uintptr_t windowIcon, emptyProc exitFunc)
}
// Backup monitor color parameters
- HDC dc = CreateDC ("DISPLAY", NULL, NULL, NULL);
+ HDC dc = CreateDCA ("DISPLAY", NULL, NULL, NULL);
if (dc)
{
_NeedToRestoreGammaRamp = GetDeviceGammaRamp (dc, _GammaRampBackuped) != FALSE;
@@ -468,7 +468,7 @@ bool CDriverGL::unInit()
// Restore monitor color parameters
if (_NeedToRestoreGammaRamp)
{
- HDC dc = CreateDC ("DISPLAY", NULL, NULL, NULL);
+ HDC dc = CreateDCA ("DISPLAY", NULL, NULL, NULL);
if (dc)
{
if (!SetDeviceGammaRamp (dc, _GammaRampBackuped))
@@ -558,13 +558,13 @@ void CDriverGL::setWindowIcon(const std::vector &bitmaps)
if (winIconBig)
{
- SendMessage(_win, WM_SETICON, 0 /* ICON_SMALL */, (LPARAM)winIconSmall);
- SendMessage(_win, WM_SETICON, 1 /* ICON_BIG */, (LPARAM)winIconBig);
+ SendMessageA(_win, WM_SETICON, 0 /* ICON_SMALL */, (LPARAM)winIconSmall);
+ SendMessageA(_win, WM_SETICON, 1 /* ICON_BIG */, (LPARAM)winIconBig);
}
else
{
- SendMessage(_win, WM_SETICON, 0 /* ICON_SMALL */, (LPARAM)winIconSmall);
- SendMessage(_win, WM_SETICON, 1 /* ICON_BIG */, (LPARAM)winIconSmall);
+ SendMessageA(_win, WM_SETICON, 0 /* ICON_SMALL */, (LPARAM)winIconSmall);
+ SendMessageA(_win, WM_SETICON, 1 /* ICON_BIG */, (LPARAM)winIconSmall);
}
#elif defined(NL_OS_MAC)
@@ -1629,7 +1629,7 @@ bool CDriverGL::destroyWindow()
if (_hDC)
wglMakeCurrent(_hDC, NULL);
- if (_DestroyWindow && _hRC)
+ if (_hRC)
{
wglDeleteContext(_hRC);
_hRC = NULL;
@@ -1644,7 +1644,7 @@ bool CDriverGL::destroyWindow()
#elif defined(NL_OS_MAC)
#elif defined(NL_OS_UNIX)
- if (_DestroyWindow && _ctx)
+ if (_DestroyWindow && _ctx) // FIXME: _DestroyWindow may need to be removed here as well
glXDestroyContext(_dpy, _ctx);
_ctx = NULL;
@@ -2622,7 +2622,7 @@ IDriver::TMessageBoxId CDriverGL::systemMessageBox (const char* message, const c
{
H_AUTO_OGL(CDriverGL_systemMessageBox)
#ifdef NL_OS_WINDOWS
- switch (::MessageBox (NULL, message, title, ((type==retryCancelType)?MB_RETRYCANCEL:
+ switch (::MessageBoxW (NULL, utf8ToWide(message), utf8ToWide(title), ((type==retryCancelType)?MB_RETRYCANCEL:
(type==yesNoCancelType)?MB_YESNOCANCEL:
(type==okCancelType)?MB_OKCANCEL:
(type==abortRetryIgnoreType)?MB_ABORTRETRYIGNORE:
@@ -2847,7 +2847,7 @@ bool CDriverGL::setMonitorColorProperties (const CMonitorColorProperties &proper
#ifdef NL_OS_WINDOWS
// Get a DC
- HDC dc = CreateDC ("DISPLAY", NULL, NULL, NULL);
+ HDC dc = CreateDCA ("DISPLAY", NULL, NULL, NULL);
if (dc)
{
// The ramp
diff --git a/code/nel/src/3d/font_generator.cpp b/code/nel/src/3d/font_generator.cpp
index 21453ba82..cdbaf8834 100644
--- a/code/nel/src/3d/font_generator.cpp
+++ b/code/nel/src/3d/font_generator.cpp
@@ -22,6 +22,7 @@
#include "nel/misc/debug.h"
#include "nel/misc/common.h"
#include "nel/misc/path.h"
+#include "nel/misc/file.h"
#include "nel/3d/font_generator.h"
@@ -81,6 +82,93 @@ CFontGenerator *newCFontGenerator(const std::string &fontFileName)
return new CFontGenerator(fontFileName);
}
+// Freetype will call this function to get a buffer in data
+static unsigned long nlFreetypeStreamIo(FT_Stream stream, unsigned long offset, unsigned char* buffer, unsigned long count)
+{
+ // if count is 0, we don't need to do anything
+ if (count > 0)
+ {
+ // get a pointer on our CIFile
+ CIFile *file = (CIFile*)stream->descriptor.pointer;
+
+ // try to seek to offset
+ if (file->seek(offset, IStream::begin))
+ {
+ try
+ {
+ // try to fill buffer with data from file
+ file->serialBuffer(buffer, count);
+ }
+ catch(const EFile &e)
+ {
+ nlwarning("Unable to read %u bytes from position %u of %s", (uint)count, (uint)offset, file->getStreamName().c_str());
+ count = 0;
+ }
+ }
+ else
+ {
+ nlwarning("Unable to seek to position %u of %s", (uint)offset, file->getStreamName().c_str());
+ count = 0;
+ }
+ }
+
+ return count;
+}
+
+// Freetype will call this function when it won't need to access to file anymore
+static void nlFreetypeStreamClose(FT_Stream stream)
+{
+ if (!stream) return;
+
+ // get a pointer on our CIFile
+ CIFile *file = (CIFile*)stream->descriptor.pointer;
+
+ if (file)
+ {
+ // close and delete file
+ file->close();
+ delete file;
+
+ stream->descriptor.pointer = NULL;
+ }
+
+ // free Freetype stream structure
+ free(stream);
+}
+
+// helper to open a font and use our functions to handle BNP files and UTF-8 filenames
+static bool createFreetypeStream(const std::string &filename, FT_Open_Args &args)
+{
+ CIFile *file = new CIFile();
+
+ if (!file->open(filename))
+ {
+ nlwarning("Unable to open %s", filename.c_str());
+ return false;
+ }
+
+ args.flags = FT_OPEN_STREAM;
+ args.stream = (FT_Stream)malloc(sizeof(*args.stream));
+
+ if (args.stream == NULL)
+ {
+ nlwarning("Unable to allocate FT_Stream for %s", filename.c_str());
+
+ delete file;
+ return false;
+ }
+
+ args.stream->base = NULL; // only used for memory streams
+ args.stream->size = file->getFileSize();
+ args.stream->pos = 0;
+ args.stream->descriptor.pointer = file;
+ args.stream->pathname.pointer = NULL; // filename is already managed by CIFile
+ args.stream->read = nlFreetypeStreamIo;
+ args.stream->close = nlFreetypeStreamClose;
+
+ return true;
+}
+
/*
* Constructor
*/
@@ -102,7 +190,14 @@ CFontGenerator::CFontGenerator (const std::string &fontFileName, const std::stri
}
++_LibraryInit;
- error = FT_New_Face (_Library, fontFileName.c_str (), 0, &_Face);
+ FT_Open_Args args;
+
+ if (!createFreetypeStream(fontFileName, args))
+ {
+ nlerror ("createFreetypeStream failed with file '%s'", fontFileName.c_str());
+ }
+
+ error = FT_Open_Face(_Library, &args, 0, &_Face);
if (error)
{
nlerror ("FT_New_Face() failed with file '%s': %s", fontFileName.c_str(), getFT2Error(error));
@@ -117,7 +212,12 @@ CFontGenerator::CFontGenerator (const std::string &fontFileName, const std::stri
if (!fontEx.empty())
{
- error = FT_Attach_File (_Face, fontEx.c_str ());
+ if (!createFreetypeStream(fontEx, args))
+ {
+ nlerror ("createFreetypeStream failed with file '%s'", fontFileName.c_str());
+ }
+
+ error = FT_Attach_Stream(_Face, &args);
if (error)
{
nlwarning ("FT_Attach_File() failed with file '%s': %s", fontEx.c_str(), getFT2Error(error));
diff --git a/code/nel/src/3d/landscapeig_manager.cpp b/code/nel/src/3d/landscapeig_manager.cpp
index d69ba3166..f4388f9fa 100644
--- a/code/nel/src/3d/landscapeig_manager.cpp
+++ b/code/nel/src/3d/landscapeig_manager.cpp
@@ -26,9 +26,6 @@
#include "nel/misc/file.h"
#include "nel/misc/hierarchical_timer.h"
-// std.
-#include
-
using namespace NLMISC;
using namespace std;
@@ -85,8 +82,6 @@ void CLandscapeIGManager::initIG(UScene *scene, const std::string &igDesc, UDriv
string igFile = CPath::lookup(igDesc);
- //ifstream file(igFile.c_str(), ios::in);
-
CIFile file;
// Shape to add should be empty !
diff --git a/code/nel/src/CMakeLists.txt b/code/nel/src/CMakeLists.txt
index 06faa5251..60e5afccb 100644
--- a/code/nel/src/CMakeLists.txt
+++ b/code/nel/src/CMakeLists.txt
@@ -35,3 +35,7 @@ ENDIF(WITH_NEL_CEGUI)
IF(WITH_PACS)
ADD_SUBDIRECTORY(pacs)
ENDIF(WITH_PACS)
+
+IF(WITH_NEL_TOOLS)
+ ADD_SUBDIRECTORY(pipeline)
+ENDIF(WITH_NEL_TOOLS)
diff --git a/code/nel/src/gui/group_html.cpp b/code/nel/src/gui/group_html.cpp
index a0f65827e..f72198ec7 100644
--- a/code/nel/src/gui/group_html.cpp
+++ b/code/nel/src/gui/group_html.cpp
@@ -304,7 +304,7 @@ namespace NLGUI
return;
}
- FILE *fp = fopen (tmpdest.c_str(), "wb");
+ FILE *fp = nlfopen (tmpdest, "wb");
if (fp == NULL)
{
curl_easy_cleanup(curl);
@@ -411,7 +411,7 @@ namespace NLGUI
return false;
}
- FILE *fp = fopen (tmpdest.c_str(), "wb");
+ FILE *fp = nlfopen (tmpdest, "wb");
if (fp == NULL)
{
curl_easy_cleanup(curl);
diff --git a/code/nel/src/ligo/stdligo.h b/code/nel/src/ligo/stdligo.h
index c8f4e2a9a..85e7a2120 100644
--- a/code/nel/src/ligo/stdligo.h
+++ b/code/nel/src/ligo/stdligo.h
@@ -27,7 +27,6 @@
#include
#include
#include
-#include
#include
#include
#include
diff --git a/code/nel/src/misc/async_file_manager.cpp b/code/nel/src/misc/async_file_manager.cpp
index 366237722..e8f6414e4 100644
--- a/code/nel/src/misc/async_file_manager.cpp
+++ b/code/nel/src/misc/async_file_manager.cpp
@@ -207,16 +207,11 @@ CAsyncFileManager::CFileLoad::CFileLoad (const std::string& sFileName, uint8 **p
// ***************************************************************************
void CAsyncFileManager::CFileLoad::run (void)
{
- FILE *f = fopen (_FileName.c_str(), "rb");
+ FILE *f = nlfopen (_FileName, "rb");
if (f != NULL)
{
- uint8 *ptr;
- long filesize=CFile::getFileSize (f);
- //fseek (f, 0, SEEK_END);
- //long filesize = ftell (f);
- //nlSleep(5);
- //fseek (f, 0, SEEK_SET);
- ptr = new uint8[filesize];
+ uint32 filesize=CFile::getFileSize (f);
+ uint8 *ptr = new uint8[filesize];
if (fread (ptr, filesize, 1, f) != 1)
nlwarning("AFM: Couldn't read '%s'", _FileName.c_str());
fclose (f);
@@ -253,16 +248,11 @@ void CAsyncFileManager::CMultipleFileLoad::run (void)
{
for (uint32 i = 0; i < _FileNames.size(); ++i)
{
- FILE *f = fopen (_FileNames[i].c_str(), "rb");
+ FILE *f = nlfopen (_FileNames[i], "rb");
if (f != NULL)
{
- uint8 *ptr;
- long filesize=CFile::getFileSize (f);
- //fseek (f, 0, SEEK_END);
- //long filesize = ftell (f);
- //nlSleep(5);
- //fseek (f, 0, SEEK_SET);
- ptr = new uint8[filesize];
+ uint32 filesize=CFile::getFileSize (f);
+ uint8 *ptr = new uint8[filesize];
if (fread (ptr, filesize, 1, f) != 1)
nlwarning("AFM: Couldn't read '%s'", _FileNames[i].c_str());
fclose (f);
diff --git a/code/nel/src/misc/big_file.cpp b/code/nel/src/misc/big_file.cpp
index 1de1c2b73..a458b602d 100644
--- a/code/nel/src/misc/big_file.cpp
+++ b/code/nel/src/misc/big_file.cpp
@@ -136,7 +136,7 @@ bool CBigFile::add (const std::string &sBigFileName, uint32 nOptions)
CHandleFile &handle= _ThreadFileArray.get(bnp.ThreadFileId);
// Open the big file.
- handle.File = fopen (sBigFileName.c_str(), "rb");
+ handle.File = nlfopen (sBigFileName, "rb");
if (handle.File == NULL)
return false;
@@ -197,7 +197,7 @@ bool CBigFile::BNP::readHeader()
// Only external use
if (InternalUse || BigFileName.empty()) return false;
- FILE *f = fopen (BigFileName.c_str(), "rb");
+ FILE *f = nlfopen (BigFileName, "rb");
if (f == NULL) return false;
bool res = readHeader(f);
@@ -348,7 +348,7 @@ bool CBigFile::BNP::appendHeader()
// Only external use
if (InternalUse || BigFileName.empty()) return false;
- FILE *f = fopen (BigFileName.c_str(), "ab");
+ FILE *f = nlfopen (BigFileName, "ab");
if (f == NULL) return false;
uint32 nNbFile = (uint32)SFiles.size();
@@ -438,10 +438,10 @@ bool CBigFile::BNP::appendFile(const std::string &filename)
SFiles.push_back(ftmp);
OffsetFromBeginning += ftmp.Size;
- FILE *f1 = fopen(BigFileName.c_str(), "ab");
+ FILE *f1 = nlfopen(BigFileName, "ab");
if (f1 == NULL) return false;
- FILE *f2 = fopen(filename.c_str(), "rb");
+ FILE *f2 = nlfopen(filename, "rb");
if (f2 == NULL)
{
fclose(f1);
@@ -473,7 +473,7 @@ bool CBigFile::BNP::unpack(const std::string &sDestDir, TUnpackProgressCallback
// Only external use
if (InternalUse || BigFileName.empty()) return false;
- FILE *bnp = fopen (BigFileName.c_str(), "rb");
+ FILE *bnp = nlfopen (BigFileName, "rb");
if (bnp == NULL)
return false;
@@ -506,7 +506,7 @@ bool CBigFile::BNP::unpack(const std::string &sDestDir, TUnpackProgressCallback
return false;
}
- out = fopen (filename.c_str(), "wb");
+ out = nlfopen (filename, "wb");
if (out != NULL)
{
nlfseek64 (bnp, rBNPFile.Pos, SEEK_SET);
@@ -681,7 +681,7 @@ FILE* CBigFile::getFile (const std::string &sFileName, uint32 &rFileSize,
*/
if(handle.File== NULL)
{
- handle.File = fopen (bnp->BigFileName.c_str(), "rb");
+ handle.File = nlfopen (bnp->BigFileName, "rb");
if (handle.File == NULL)
{
nlwarning ("bnp: can't fopen big file '%s' error %d '%s'", bnp->BigFileName.c_str(), errno, strerror(errno));
diff --git a/code/nel/src/misc/bitmap.cpp b/code/nel/src/misc/bitmap.cpp
index c1249319e..11a27e67e 100644
--- a/code/nel/src/misc/bitmap.cpp
+++ b/code/nel/src/misc/bitmap.cpp
@@ -84,6 +84,20 @@ void MakeWhite(CBitmap &bitmaps)
}
#endif // NEL_ALL_BITMAP_WHITE
+CBitmap::CBitmap()
+{
+ _MipMapCount = 1;
+ _Width = 0;
+ _Height = 0;
+ PixelFormat = RGBA;
+ _LoadGrayscaleAsAlpha = true;
+}
+
+CBitmap::~CBitmap()
+{
+
+}
+
/*-------------------------------------------------------------------*\
load
\*-------------------------------------------------------------------*/
@@ -541,17 +555,10 @@ uint8 CBitmap::readDDS(NLMISC::IStream &f, uint mipMapSkip)
(very) bad rendered with this fix so we have to deactivate it the for moment
*/
-//#ifdef NL_OS_WINDOWS
-// if(PixelFormat==DXTC1) //AlphaBitDepth
-// {
-// PixelFormat = DXTC1Alpha;
-// }
-//#else
if(PixelFormat==DXTC1 && _DDSSurfaceDesc[21]>0) //AlphaBitDepth
{
PixelFormat = DXTC1Alpha;
}
-//#endif
if(PixelFormat!= DXTC1 && PixelFormat!= DXTC1Alpha && PixelFormat!= DXTC3 && PixelFormat!= DXTC5)
{
diff --git a/code/nel/src/misc/cmd_args.cpp b/code/nel/src/misc/cmd_args.cpp
index 85239e8ff..647bac008 100644
--- a/code/nel/src/misc/cmd_args.cpp
+++ b/code/nel/src/misc/cmd_args.cpp
@@ -199,11 +199,11 @@ bool CCmdArgs::parse(const std::string &args)
std::vector argv;
#ifdef NL_OS_WINDOWS
- char str[4096];
- uint len = GetModuleFileNameA(NULL, str, 4096);
+ wchar_t str[4096];
+ uint len = GetModuleFileNameW(NULL, str, 4096);
if (len && len < 4096)
- argv.push_back(str);
+ argv.push_back(wideToUtf8(str));
#endif
std::string::size_type pos1 = 0, pos2 = 0;
diff --git a/code/nel/src/misc/common.cpp b/code/nel/src/misc/common.cpp
index decd52dbf..c71688174 100644
--- a/code/nel/src/misc/common.cpp
+++ b/code/nel/src/misc/common.cpp
@@ -506,6 +506,21 @@ string secondsToHumanReadable (uint32 time)
return toString ("%u%s", res, divTable[div]);
}
+std::string timestampToHumanReadable(uint32 timestamp)
+{
+ char buffer[30];
+ time_t dtime = timestamp;
+ tm *tms = localtime(&dtime);
+
+ if (tms)
+ {
+ strftime(buffer, 30, "%Y-%m-%d %H:%M:%S", tms);
+ return std::string(buffer);
+ }
+
+ return "";
+}
+
uint32 fromHumanReadable (const std::string &str)
{
if (str.size() == 0)
@@ -710,50 +725,54 @@ bool abortProgram(uint32 pid)
#endif
}
-bool launchProgram(const std::string &programName, const std::string &arguments, bool log)
-{
#ifdef NL_OS_WINDOWS
- STARTUPINFOA si;
- PROCESS_INFORMATION pi;
+static bool createProcess(const std::string &programName, const std::string &arguments, bool log, PROCESS_INFORMATION &pi)
+{
+ STARTUPINFOW si;
memset(&si, 0, sizeof(si));
memset(&pi, 0, sizeof(pi));
si.cb = sizeof(si);
// Enable nlassert/nlstop to display the error reason & callstack
- const TCHAR *SE_TRANSLATOR_IN_MAIN_MODULE = _T("NEL_SE_TRANS");
- TCHAR envBuf [2];
- if ( GetEnvironmentVariable( SE_TRANSLATOR_IN_MAIN_MODULE, envBuf, 2 ) != 0)
+ const char *SE_TRANSLATOR_IN_MAIN_MODULE = "NEL_SE_TRANS";
+
+ char envBuf[2];
+ if (GetEnvironmentVariableA(SE_TRANSLATOR_IN_MAIN_MODULE, envBuf, 2) != 0)
{
- SetEnvironmentVariable( SE_TRANSLATOR_IN_MAIN_MODULE, NULL );
+ SetEnvironmentVariableA(SE_TRANSLATOR_IN_MAIN_MODULE, NULL);
}
- const char *sProgramName = programName.c_str();
-
+ wchar_t *sProgramName = NULL;
+
std::string args;
// a .bat file must have first parameter to NULL and use 2nd parameter to pass filename
if (CFile::getExtension(programName) == "bat")
{
- sProgramName = NULL;
args = "\"" + programName + "\" " + arguments;
}
else
{
+ ucstring ucProgramName;
+ ucProgramName.fromUtf8(programName);
+
+ sProgramName = new wchar_t[MAX_PATH];
+ wcscpy(sProgramName, (wchar_t*)ucProgramName.c_str());
+
args = arguments;
}
- BOOL res = CreateProcessA(sProgramName, (char*)args.c_str(), NULL, NULL, FALSE, CREATE_DEFAULT_ERROR_MODE | CREATE_NO_WINDOW, NULL, NULL, &si, &pi);
+ BOOL res = CreateProcessW(sProgramName, utf8ToWide(args), NULL, NULL, FALSE, CREATE_DEFAULT_ERROR_MODE | CREATE_NO_WINDOW, NULL, NULL, &si, &pi);
- if (res)
+ if (sProgramName)
{
- //nldebug("LAUNCH: Successful launch '%s' with arg '%s'", programName.c_str(), arguments.c_str());
- CloseHandle( pi.hProcess );
- CloseHandle( pi.hThread );
- return true;
+ delete [] sProgramName;
+ sProgramName = NULL;
}
- else
+
+ if (!res)
{
if (log)
{
@@ -763,8 +782,26 @@ bool launchProgram(const std::string &programName, const std::string &arguments,
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
+
+ return false;
}
+ return true;
+}
+
+#endif
+
+bool launchProgram(const std::string &programName, const std::string &arguments, bool log)
+{
+#ifdef NL_OS_WINDOWS
+ PROCESS_INFORMATION pi;
+
+ if (!createProcess(programName, arguments, log, pi)) return false;
+
+ //nldebug("LAUNCH: Successful launch '%s' with arg '%s'", programName.c_str(), arguments.c_str());
+ CloseHandle( pi.hProcess );
+ CloseHandle( pi.hThread );
+ return true;
#else
#ifdef NL_OS_MAC
@@ -869,76 +906,28 @@ bool launchProgram(const std::string &programName, const std::string &arguments,
sint launchProgramAndWaitForResult(const std::string &programName, const std::string &arguments, bool log)
{
- sint res = 0;
-
#ifdef NL_OS_WINDOWS
- STARTUPINFOA si;
PROCESS_INFORMATION pi;
- memset(&si, 0, sizeof(si));
- memset(&pi, 0, sizeof(pi));
+ if (!createProcess(programName, arguments, log, pi)) return -1;
- si.cb = sizeof(si);
+ // Successfully created the process. Wait for it to finish.
+ WaitForSingleObject(pi.hProcess, INFINITE);
- // Enable nlassert/nlstop to display the error reason & callstack
- const TCHAR *SE_TRANSLATOR_IN_MAIN_MODULE = _T("NEL_SE_TRANS");
- TCHAR envBuf [2];
- if ( GetEnvironmentVariable( SE_TRANSLATOR_IN_MAIN_MODULE, envBuf, 2 ) != 0)
- {
- SetEnvironmentVariable( SE_TRANSLATOR_IN_MAIN_MODULE, NULL );
- }
+ // Get the exit code.
+ DWORD exitCode = 0;
+ BOOL ok = GetExitCodeProcess(pi.hProcess, &exitCode);
- const char *sProgramName = programName.c_str();
+ //nldebug("LAUNCH: Successful launch '%s' with arg '%s'", programName.c_str(), arguments.c_str());
+ CloseHandle(pi.hProcess);
+ CloseHandle(pi.hThread);
- std::string args;
+ if (ok) return (sint)exitCode;
- // a .bat file must have first parameter to NULL and use 2nd parameter to pass filename
- if (CFile::getExtension(programName) == "bat")
- {
- sProgramName = NULL;
- args = "\"" + programName + "\" " + arguments;
- }
- else
- {
- args = arguments;
- }
+ if (log)
+ nlwarning("LAUNCH: Failed launched '%s' with arg '%s'", programName.c_str(), arguments.c_str());
- BOOL ok = CreateProcessA(sProgramName, (char*)args.c_str(), NULL, NULL, FALSE, CREATE_DEFAULT_ERROR_MODE | CREATE_NO_WINDOW, NULL, NULL, &si, &pi);
-
- if (ok)
- {
- // Successfully created the process. Wait for it to finish.
- WaitForSingleObject(pi.hProcess, INFINITE);
-
- // Get the exit code.
- DWORD exitCode = 0;
- ok = GetExitCodeProcess(pi.hProcess, &exitCode);
-
- //nldebug("LAUNCH: Successful launch '%s' with arg '%s'", programName.c_str(), arguments.c_str());
- CloseHandle(pi.hProcess);
- CloseHandle(pi.hThread);
-
- if (ok)
- {
- res = (sint)exitCode;
- }
- else
- {
- if (log)
- nlwarning("LAUNCH: Failed launched '%s' with arg '%s'", programName.c_str(), arguments.c_str());
- }
- }
- else
- {
- if (log)
- {
- sint lastError = getLastError();
- nlwarning("LAUNCH: Failed launched '%s' with arg '%s' err %d: '%s'", programName.c_str(), arguments.c_str(), lastError, formatErrorMessage(lastError).c_str());
- }
-
- CloseHandle(pi.hProcess);
- CloseHandle(pi.hThread);
- }
+ return -1;
#else
// program name is the only required string
std::string command = programName;
@@ -947,13 +936,13 @@ sint launchProgramAndWaitForResult(const std::string &programName, const std::st
if (!arguments.empty()) command += " " + arguments;
// execute the command
- res = system(command.c_str());
+ sint res = system(command.c_str());
if (res && log)
nlwarning ("LAUNCH: Failed launched '%s' with arg '%s' return code %d", programName.c_str(), arguments.c_str(), res);
-#endif
return res;
+#endif
}
std::string getCommandOutput(const std::string &command)
@@ -1099,6 +1088,14 @@ void displayDwordBits( uint32 b, uint nbits, sint beginpos, bool displayBegin, N
}
}
+FILE* nlfopen(const std::string &filename, const std::string &mode)
+{
+#ifdef NL_OS_WINDOWS
+ return _wfopen(utf8ToWide(filename), utf8ToWide(mode));
+#else
+ return fopen(filename.c_str(), mode.c_str());
+#endif
+}
int nlfseek64( FILE *stream, sint64 offset, int origin )
{
diff --git a/code/nel/src/misc/config_file/config_file.cpp b/code/nel/src/misc/config_file/config_file.cpp
index c969f614d..093992487 100644
--- a/code/nel/src/misc/config_file/config_file.cpp
+++ b/code/nel/src/misc/config_file/config_file.cpp
@@ -600,7 +600,7 @@ void CConfigFile::save () const
// Avoid any problem, Force Locale to default
setlocale(LC_ALL, "C");
- FILE *fp = fopen (getFilename().c_str (), "w");
+ FILE *fp = nlfopen (getFilename(), "w");
if (fp == NULL)
{
nlwarning ("CF: Couldn't create %s file", getFilename().c_str ());
diff --git a/code/nel/src/misc/cpu_time_stat.cpp b/code/nel/src/misc/cpu_time_stat.cpp
index 6441a8b45..455104b25 100644
--- a/code/nel/src/misc/cpu_time_stat.cpp
+++ b/code/nel/src/misc/cpu_time_stat.cpp
@@ -42,7 +42,7 @@ bool CCPUTimeStat::getCPUTicks(uint64& user, uint64& nice, uint64& system, uint6
#ifdef NL_OS_UNIX
const char* statfile = "/proc/stat";
- FILE* f = fopen(statfile, "r");
+ FILE* f = nlfopen(statfile, "r");
if (f == NULL)
return false;
@@ -66,7 +66,7 @@ bool CCPUTimeStat::getPIDTicks(uint64& utime, uint64& stime, uint64& cutime, uin
#ifdef NL_OS_UNIX
std::string statfile = NLMISC::toString("/proc/%u/stat", pid);
- FILE* f = fopen(statfile.c_str(), "r");
+ FILE* f = nlfopen(statfile, "r");
if (f == NULL)
return false;
diff --git a/code/nel/src/misc/debug.cpp b/code/nel/src/misc/debug.cpp
index 44cd6f706..1f0bb4fd1 100644
--- a/code/nel/src/misc/debug.cpp
+++ b/code/nel/src/misc/debug.cpp
@@ -310,14 +310,14 @@ static DWORD __stdcall GetModuleBase(HANDLE hProcess, DWORD dwReturnAddress)
&memoryBasicInfo, sizeof(memoryBasicInfo)))
{
DWORD cch = 0;
- char szFile[MAX_PATH] = { 0 };
+ wchar_t szFile[MAX_PATH] = { 0 };
- cch = GetModuleFileNameA((HINSTANCE)memoryBasicInfo.AllocationBase,
+ cch = GetModuleFileNameW((HINSTANCE)memoryBasicInfo.AllocationBase,
szFile, MAX_PATH);
- if (cch && (lstrcmpA(szFile, "DBFN")== 0))
- {
- if (!SymLoadModule(hProcess,
+ if (cch && (lstrcmpA(szFile, "DBFN")== 0))
+ {
+ if (!SymLoadModule(hProcess,
NULL, "MN",
NULL, (DWORD) memoryBasicInfo.AllocationBase, 0))
{
@@ -527,9 +527,9 @@ public:
string progname;
if(!shortExc.empty() || !longExc.empty())
{
- char name[1024];
- GetModuleFileNameA (NULL, name, 1023);
- progname = CFile::getFilename(name);
+ wchar_t name[1024];
+ GetModuleFileNameW (NULL, name, 1023);
+ progname = CFile::getFilename(wideToUtf8(name));
progname += " ";
}
@@ -1171,12 +1171,12 @@ void createDebug (const char *logPath, bool logInFile, bool eraseLastLog)
// Use an environment variable to share the value among the EXE and its child DLLs
// (otherwise there would be one distinct bool by module, and the last
// _set_se_translator would overwrite the previous ones)
- const TCHAR *SE_TRANSLATOR_IN_MAIN_MODULE = _T("NEL_SE_TRANS");
- TCHAR envBuf [2];
- if ( GetEnvironmentVariable( SE_TRANSLATOR_IN_MAIN_MODULE, envBuf, 2 ) == 0)
+ const char *SE_TRANSLATOR_IN_MAIN_MODULE = "NEL_SE_TRANS";
+ char envBuf [2];
+ if ( GetEnvironmentVariableA( SE_TRANSLATOR_IN_MAIN_MODULE, envBuf, 2 ) == 0)
{
_set_se_translator(exceptionTranslator);
- SetEnvironmentVariable( SE_TRANSLATOR_IN_MAIN_MODULE, _T("1") );
+ SetEnvironmentVariableA( SE_TRANSLATOR_IN_MAIN_MODULE, "1" );
}
}
# endif // NL_OS_WINDOWS
diff --git a/code/nel/src/misc/diff_tool.cpp b/code/nel/src/misc/diff_tool.cpp
index 15a91cdb8..f57746b1a 100644
--- a/code/nel/src/misc/diff_tool.cpp
+++ b/code/nel/src/misc/diff_tool.cpp
@@ -93,7 +93,7 @@ bool loadStringFile(const std::string filename, vector &stringInfos
return true;
}
*/
-/* FILE *fp = fopen(filename.c_str(), "rb");
+/* FILE *fp = nlfopen(filename, "rb");
if (fp == NULL)
{
diff --git a/code/nel/src/misc/displayer.cpp b/code/nel/src/misc/displayer.cpp
index 60fa244b6..798a4f80a 100644
--- a/code/nel/src/misc/displayer.cpp
+++ b/code/nel/src/misc/displayer.cpp
@@ -216,7 +216,7 @@ void CStdDisplayer::doDisplay ( const CLog::TDisplayInfo& args, const char *mess
static bool consoleModeTest = false;
if (!consoleModeTest)
{
- HANDLE handle = CreateFile ("CONOUT$", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0);
+ HANDLE handle = CreateFileA ("CONOUT$", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0);
consoleMode = handle != INVALID_HANDLE_VALUE;
if (consoleMode)
CloseHandle (handle);
@@ -286,20 +286,14 @@ void CStdDisplayer::doDisplay ( const CLog::TDisplayInfo& args, const char *mess
// WARNING: READ THIS !!!!!!!!!!!!!!!! ///////////////////////////
// If at the release time, it freezes here, it's a microsoft bug:
// http://support.microsoft.com/support/kb/articles/q173/2/60.asp
- OutputDebugStringW((LPCWSTR)ucstring::makeFromUtf8(str2).c_str());
+ OutputDebugStringW(utf8ToWide(str2));
}
else
{
- /*OutputDebugString(ss2.str().c_str());
- OutputDebugString("\n\t\t\t");
- OutputDebugString("message end: ");
- OutputDebugString(&message[strlen(message) - 1024]);
- OutputDebugString("\n");*/
-
sint count = 0;
uint n = (uint)strlen(message);
std::string s(&str2.c_str()[0], (str2.size() - n));
- OutputDebugStringW((LPCWSTR)ucstring::makeFromUtf8(s).c_str());
+ OutputDebugStringW(utf8ToWide(s));
for(;;)
{
@@ -307,15 +301,15 @@ void CStdDisplayer::doDisplay ( const CLog::TDisplayInfo& args, const char *mess
if((n - count) < maxOutString )
{
s = std::string(&message[count], (n - count));
- OutputDebugStringW((LPCWSTR)ucstring::makeFromUtf8(s).c_str());
- OutputDebugStringW((LPCWSTR)ucstring::makeFromUtf8("\n").c_str());
+ OutputDebugStringW(utf8ToWide(s));
+ OutputDebugStringW(L"\n");
break;
}
else
{
s = std::string(&message[count] , count + maxOutString);
- OutputDebugStringW((LPCWSTR)ucstring::makeFromUtf8(s).c_str());
- OutputDebugStringW((LPCWSTR)ucstring::makeFromUtf8("\n\t\t\t").c_str());
+ OutputDebugStringW(utf8ToWide(s));
+ OutputDebugStringW(L"\n\t\t\t");
count += maxOutString;
}
}
@@ -329,13 +323,13 @@ void CStdDisplayer::doDisplay ( const CLog::TDisplayInfo& args, const char *mess
if (pos+1000 < args.CallstackAndLog.size ())
{
splited = args.CallstackAndLog.substr (pos, 1000);
- OutputDebugStringW((LPCWSTR)ucstring::makeFromUtf8(splited).c_str());
+ OutputDebugStringW(utf8ToWide(splited));
pos += 1000;
}
else
{
splited = args.CallstackAndLog.substr (pos);
- OutputDebugStringW((LPCWSTR)ucstring::makeFromUtf8(splited).c_str());
+ OutputDebugStringW(utf8ToWide(splited));
break;
}
}
@@ -491,7 +485,7 @@ void CFileDisplayer::doDisplay ( const CLog::TDisplayInfo& args, const char *mes
if (_FilePointer == (FILE*)1)
{
- _FilePointer = fopen (_FileName.c_str(), "at");
+ _FilePointer = nlfopen (_FileName, "at");
if (_FilePointer == NULL)
printf ("Can't open log file '%s': %s\n", _FileName.c_str(), strerror (errno));
}
@@ -702,58 +696,4 @@ void CMsgBoxDisplayer::doDisplay ( const CLog::TDisplayInfo& args, const char *m
}
}
-
-
-/***************************************************************/
-/******************* THE FOLLOWING CODE IS COMMENTED OUT *******/
-/***************************************************************
-void CStdDisplayer::display (const std::string& str)
-{
-// printf("%s", str.c_str ());
- cout << str;
-
-#ifdef NL_OS_WINDOWS
- // display the string in the debugger is the application is started with the debugger
- if (IsDebuggerPresent ())
- OutputDebugString(str.c_str ());
-#endif
-}
-
-
-void CFileDisplayer::display (const std::string& str)
-{
- if (_FileName.size () == 0) return;
-
- ofstream ofs (_FileName.c_str (), ios::out | ios::app);
- if (ofs.is_open ())
- {
- ofs << str;
- ofs.close();
- }
-
-
-// FILE *fp = fopen (_FileName.c_str (), "a");
-// if (fp == NULL) return;
-
-// fprintf (fp, "%s", str.c_str ());
-
-// fclose (fp);
-}
-
-
-
-void CMsgBoxDisplayer::display (const std::string& str)
-{
-#ifdef NL_OS_WINDOWS
-
- CSystemUtils::copyTextToClipboard(str);
-
- string strf = str;
- strf += "\n\n(this message was copied in the clipboard)";
- MessageBox (NULL, strf.c_str (), "", MB_OK | MB_ICONEXCLAMATION);
-#endif
-}
-**************************************************************************/
-
-
} // NLMISC
diff --git a/code/nel/src/misc/dummy_window.cpp b/code/nel/src/misc/dummy_window.cpp
index a0d807ac5..60fe51795 100644
--- a/code/nel/src/misc/dummy_window.cpp
+++ b/code/nel/src/misc/dummy_window.cpp
@@ -45,32 +45,32 @@ bool CDummyWindow::init(HINSTANCE hInstance, WNDPROC winProc)
{
release();
static const char *INVISIBLE_WINDOW_CLASS = "nl_invisible_wnd_class";
- WNDCLASSEX wc;
- wc.cbSize = sizeof(WNDCLASSEX);
- if (!GetClassInfoEx(hInstance, INVISIBLE_WINDOW_CLASS, &wc))
+ WNDCLASSEXA wc;
+ wc.cbSize = sizeof(WNDCLASSEXA);
+ if (!GetClassInfoExA(hInstance, INVISIBLE_WINDOW_CLASS, &wc))
{
- wc.cbSize = sizeof(WNDCLASSEX);
+ wc.cbSize = sizeof(WNDCLASSEXA);
wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
wc.lpfnWndProc = nlDefaultWinProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
- wc.hIcon = 0;
- wc.hCursor = 0;
- wc.hbrBackground = 0;
- wc.lpszMenuName = 0;
+ wc.hIcon = NULL;
+ wc.hCursor = NULL;
+ wc.hbrBackground = NULL;
+ wc.lpszMenuName = NULL;
wc.lpszClassName = INVISIBLE_WINDOW_CLASS;
- wc.hIconSm = 0;
- RegisterClassEx(&wc);
+ wc.hIconSm = NULL;
+ RegisterClassExA(&wc);
}
- _HWnd = CreateWindow(INVISIBLE_WINDOW_CLASS, "", WS_POPUP,
+ _HWnd = CreateWindowA(INVISIBLE_WINDOW_CLASS, "", WS_POPUP,
CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,
NULL, 0,
hInstance, 0);
if (_HWnd)
{
- if (winProc) SetWindowLongPtr(_HWnd, GWLP_WNDPROC, (LONG_PTR) winProc);
+ if (winProc) SetWindowLongPtrA(_HWnd, GWLP_WNDPROC, (LONG_PTR) winProc);
return true;
}
return false;
diff --git a/code/nel/src/misc/dynloadlib.cpp b/code/nel/src/misc/dynloadlib.cpp
index 0b456f166..fadf2e249 100644
--- a/code/nel/src/misc/dynloadlib.cpp
+++ b/code/nel/src/misc/dynloadlib.cpp
@@ -32,7 +32,7 @@ NL_LIB_HANDLE nlLoadLibrary(const std::string &libName)
{
NL_LIB_HANDLE res = 0;
#ifdef NL_OS_WINDOWS
- res = LoadLibrary(libName.c_str());
+ res = LoadLibraryW(utf8ToWide(libName));
#elif defined(NL_OS_UNIX)
res = dlopen(libName.c_str(), RTLD_NOW);
#else
diff --git a/code/nel/src/misc/eid_translator.cpp b/code/nel/src/misc/eid_translator.cpp
index acf4046e5..591b9db7a 100644
--- a/code/nel/src/misc/eid_translator.cpp
+++ b/code/nel/src/misc/eid_translator.cpp
@@ -445,7 +445,7 @@ void cbInvalidEntityNamesFilename(const std::string &invalidEntityNamesFilename)
return;
}
- FILE *fp = fopen (fn.c_str(), "r");
+ FILE *fp = nlfopen (fn, "r");
if (fp == NULL)
{
nlwarning ("EIT: Can't load filename '%s' for invalid entity names filename", fn.c_str());
diff --git a/code/nel/src/misc/file.cpp b/code/nel/src/misc/file.cpp
index 00a1823ef..01c417635 100644
--- a/code/nel/src/misc/file.cpp
+++ b/code/nel/src/misc/file.cpp
@@ -243,7 +243,7 @@ bool CIFile::open(const std::string &path, bool text)
_IsInXMLPackFile = false;
_BigFileOffset = 0;
_AlwaysOpened = false;
- _F = fopen (path.c_str(), mode);
+ _F = nlfopen (path, mode);
if (_F != NULL)
{
/*
@@ -598,7 +598,7 @@ bool COFile::open(const std::string &path, bool append, bool text, bool useTempF
return false;
}
- _F=fopen(fileToOpen.c_str(), mode);
+ _F = nlfopen(fileToOpen, mode);
return _F!=NULL;
}
diff --git a/code/nel/src/misc/i18n.cpp b/code/nel/src/misc/i18n.cpp
index 99e9c68a0..427c102da 100644
--- a/code/nel/src/misc/i18n.cpp
+++ b/code/nel/src/misc/i18n.cpp
@@ -567,7 +567,7 @@ void CI18N::readTextFile(const string &filename,
if (!readContext.IfStack.empty())
{
- nlwarning("Preprocess: Missing %u closing #endif after parsing %s", readContext.IfStack.size(), filename.c_str() );
+ nlwarning("Preprocess: Missing %u closing #endif after parsing %s", (uint)readContext.IfStack.size(), filename.c_str() );
}
}
diff --git a/code/nel/src/misc/inter_window_msg_queue.cpp b/code/nel/src/misc/inter_window_msg_queue.cpp
index 77e72e654..cca8f1a37 100644
--- a/code/nel/src/misc/inter_window_msg_queue.cpp
+++ b/code/nel/src/misc/inter_window_msg_queue.cpp
@@ -96,7 +96,7 @@ namespace NLMISC
nlassert(_Id == 0); // init done twice
release();
// create a system wide mutex
- _SharedMemMutex = CreateMutex(NULL, FALSE, toString("NL_MUTEX_%d", (int) id).c_str());
+ _SharedMemMutex = CreateMutexA(NULL, FALSE, toString("NL_MUTEX_%d", (int) id).c_str());
if (!_SharedMemMutex) return false;
_Id = id;
return true;
@@ -197,7 +197,7 @@ namespace NLMISC
cds.lpData = (PVOID) msgOut.buffer();
for(;;)
{
- LRESULT result = ::SendMessage(targetWindow, WM_COPYDATA, (WPARAM) _Parent->_LocalWindow.getWnd(), (LPARAM) &cds);
+ LRESULT result = ::SendMessageA(targetWindow, WM_COPYDATA, (WPARAM) _Parent->_LocalWindow.getWnd(), (LPARAM) &cds);
if (result) break;
// retry ...
Sleep(30);
diff --git a/code/nel/src/misc/log.cpp b/code/nel/src/misc/log.cpp
index 9e5f0a1bc..08f6b3107 100644
--- a/code/nel/src/misc/log.cpp
+++ b/code/nel/src/misc/log.cpp
@@ -59,9 +59,9 @@ void CLog::setDefaultProcessName ()
#ifdef NL_OS_WINDOWS
if ((*_ProcessName).empty())
{
- char name[1024];
- GetModuleFileName (NULL, name, 1023);
- (*_ProcessName) = CFile::getFilename(name);
+ wchar_t name[1024];
+ GetModuleFileNameW(NULL, name, 1023);
+ (*_ProcessName) = CFile::getFilename(wideToUtf8(name));
}
#else
if ((*_ProcessName).empty())
diff --git a/code/nel/src/misc/mem_displayer.cpp b/code/nel/src/misc/mem_displayer.cpp
index 40cc1bb6e..b8f4f2ea3 100644
--- a/code/nel/src/misc/mem_displayer.cpp
+++ b/code/nel/src/misc/mem_displayer.cpp
@@ -165,16 +165,15 @@ static DWORD __stdcall GetModuleBase(HANDLE hProcess, DWORD dwReturnAddress)
DWORD cch = 0;
char szFile[MAX_PATH] = { 0 };
- cch = GetModuleFileNameA((HINSTANCE)memoryBasicInfo.AllocationBase,
- szFile, MAX_PATH);
+ cch = GetModuleFileNameA((HINSTANCE)memoryBasicInfo.AllocationBase, szFile, MAX_PATH);
- if (cch && (lstrcmp(szFile, "DBFN")== 0))
- {
- char mn[] = { 'M', 'N', 0x00 };
+ if (cch && (lstrcmpA(szFile, "DBFN")== 0))
+ {
+ char mn[] = { 'M', 'N', 0x00 };
#ifdef NL_OS_WIN64
- if (!SymLoadModule64(
+ if (!SymLoadModule64(
#else
- if (!SymLoadModule(
+ if (!SymLoadModule(
#endif
hProcess,
NULL, mn,
@@ -227,28 +226,28 @@ static void displayCallStack (CLog *log)
if (symbolPath.empty())
{
- CHAR tmpPath[stringSize];
+ wchar_t tmpPath[stringSize];
symbolPath = ".";
- if (GetEnvironmentVariable ("_NT_SYMBOL_PATH", tmpPath, stringSize))
+ if (GetEnvironmentVariableW (L"_NT_SYMBOL_PATH", tmpPath, stringSize))
{
symbolPath += ";";
- symbolPath += tmpPath;
+ symbolPath += wideToUtf8(tmpPath);
}
- if (GetEnvironmentVariable ("_NT_ALTERNATE_SYMBOL_PATH", tmpPath, stringSize))
+ if (GetEnvironmentVariableW (L"_NT_ALTERNATE_SYMBOL_PATH", tmpPath, stringSize))
{
symbolPath += ";";
- symbolPath += tmpPath;
+ symbolPath += wideToUtf8(tmpPath);
}
- if (GetEnvironmentVariable ("SYSTEMROOT", tmpPath, stringSize))
+ if (GetEnvironmentVariableW (L"SYSTEMROOT", tmpPath, stringSize))
{
symbolPath += ";";
- symbolPath += tmpPath;
+ symbolPath += wideToUtf8(tmpPath);
symbolPath += ";";
- symbolPath += tmpPath;
+ symbolPath += wideToUtf8(tmpPath);
symbolPath += "\\system32";
}
}
diff --git a/code/nel/src/misc/mutex.cpp b/code/nel/src/misc/mutex.cpp
index 098bce795..ef0cb4216 100644
--- a/code/nel/src/misc/mutex.cpp
+++ b/code/nel/src/misc/mutex.cpp
@@ -159,7 +159,7 @@ bool CSharedMutex::createByName( const char *objectName )
#ifdef NL_DEBUG
nlassert( _Mutex == NULL );
#endif
- _Mutex = (void *) CreateMutex( NULL, FALSE, objectName );
+ _Mutex = (void *) CreateMutexA( NULL, FALSE, objectName );
//nldebug( "Creating mutex %s: handle %p", objectName, _Mutex );
return ( _Mutex != NULL );
}
diff --git a/code/nel/src/misc/path.cpp b/code/nel/src/misc/path.cpp
index ee47fd494..b5375e005 100644
--- a/code/nel/src/misc/path.cpp
+++ b/code/nel/src/misc/path.cpp
@@ -681,11 +681,11 @@ std::string CPath::getCurrentPath ()
std::string CFileContainer::getCurrentPath ()
{
- char buffer [1024];
-
#ifdef NL_OS_WINDOWS
- return standardizePath(_getcwd(buffer, 1024), false);
+ wchar_t buffer[1024];
+ return standardizePath(wideToUtf8(_wgetcwd(buffer, 1024)), false);
#else
+ char buffer [1024];
return standardizePath(getcwd(buffer, 1024), false);
#endif
}
@@ -700,7 +700,7 @@ bool CFileContainer::setCurrentPath (const std::string &path)
int res;
//nldebug("Change current path to '%s' (current path is '%s')", path.c_str(), getCurrentPath().c_str());
#ifdef NL_OS_WINDOWS
- res = _chdir(path.c_str());
+ res = _wchdir(utf8ToWide(path));
#else
res = chdir(path.c_str());
#endif
@@ -756,11 +756,11 @@ std::string CFileContainer::getFullPath (const std::string &path, bool addFinalS
#ifdef NL_OS_WINDOWS
-# define dirent WIN32_FIND_DATA
+# define dirent WIN32_FIND_DATAW
# define DIR void
static string sDir;
-static WIN32_FIND_DATA findData;
+static WIN32_FIND_DATAW findData;
static HANDLE hFind;
DIR *opendir (const char *path)
@@ -792,13 +792,12 @@ dirent *readdir (DIR *dir)
// first visit in this directory : FindFirstFile()
if (hFind == NULL)
{
- string fullPath = CPath::standardizePath(sDir) + "*";
- hFind = FindFirstFileA (fullPath.c_str(), &findData);
+ hFind = FindFirstFileW (utf8ToWide(CPath::standardizePath(sDir) + "*"), &findData);
}
// directory already visited : FindNextFile()
else
{
- if (!FindNextFileA (hFind, &findData))
+ if (!FindNextFileW (hFind, &findData))
return NULL;
}
@@ -845,7 +844,7 @@ string getname (dirent *de)
{
nlassert (de != NULL);
#ifdef NL_OS_WINDOWS
- return de->cFileName;
+ return wideToUtf8(de->cFileName);
#else
return de->d_name;
#endif // NL_OS_WINDOWS
@@ -1269,7 +1268,7 @@ void CFileContainer::addSearchBigFile (const string &sBigFilename, bool recurse,
// Open and read the big file header
nlassert(!_MemoryCompressed);
- FILE *Handle = fopen (sBigFilename.c_str(), "rb");
+ FILE *Handle = nlfopen (sBigFilename, "rb");
if (Handle == NULL)
{
nlwarning ("PATH: CPath::addSearchBigFile(%s, %d, %d): can't open file, skip it", sBigFilename.c_str(), recurse, alternative);
@@ -1421,7 +1420,7 @@ void CFileContainer::addSearchXmlpackFile (const string &sXmlpackFilename, bool
}
// Open and read the xmlpack file header
- FILE *Handle = fopen (sXmlpackFilename.c_str(), "rb");
+ FILE *Handle = nlfopen (sXmlpackFilename, "rb");
if (Handle == NULL)
{
nlwarning ("PATH: CPath::addSearchXmlpackFile(%s, %d, %d): can't open file, skip it", sXmlpackFilename.c_str(), recurse, alternative);
@@ -1766,14 +1765,14 @@ std::string CFileContainer::getWindowsDirectory()
nlwarning("not a ms windows platform");
return "";
#else
- char winDir[MAX_PATH];
- UINT numChar = ::GetWindowsDirectory(winDir, MAX_PATH);
+ wchar_t winDir[MAX_PATH];
+ UINT numChar = GetWindowsDirectoryW(winDir, MAX_PATH);
if (numChar > MAX_PATH || numChar == 0)
{
nlwarning("Couldn't retrieve windows directory");
return "";
}
- return CPath::standardizePath(winDir);
+ return CPath::standardizePath(wideToUtf8(winDir));
#endif
}
@@ -1789,18 +1788,18 @@ std::string CFileContainer::getApplicationDirectory(const std::string &appName,
if (appPath.empty())
{
#ifdef NL_OS_WINDOWS
- char buffer[MAX_PATH];
+ wchar_t buffer[MAX_PATH];
#ifdef CSIDL_LOCAL_APPDATA
if (local)
{
- SHGetSpecialFolderPathA(NULL, buffer, CSIDL_LOCAL_APPDATA, TRUE);
+ SHGetSpecialFolderPathW(NULL, buffer, CSIDL_LOCAL_APPDATA, TRUE);
}
else
#endif
{
- SHGetSpecialFolderPathA(NULL, buffer, CSIDL_APPDATA, TRUE);
+ SHGetSpecialFolderPathW(NULL, buffer, CSIDL_APPDATA, TRUE);
}
- appPath = CPath::standardizePath(buffer);
+ appPath = CPath::standardizePath(wideToUtf8(buffer));
#elif defined(NL_OS_MAC)
appPath = CPath::standardizePath(getenv("HOME"));
appPath += "/Library/Application Support/";
@@ -1918,7 +1917,7 @@ string CFile::getPath (const string &filename)
bool CFile::isDirectory (const string &filename)
{
#ifdef NL_OS_WINDOWS
- DWORD res = GetFileAttributes(filename.c_str());
+ DWORD res = GetFileAttributesW(utf8ToWide(filename));
if (res == INVALID_FILE_ATTRIBUTES)
{
// nlwarning ("PATH: '%s' is not a valid file or directory name", filename.c_str ());
@@ -1941,7 +1940,7 @@ bool CFile::isDirectory (const string &filename)
bool CFile::isExists (const string &filename)
{
#ifdef NL_OS_WINDOWS
- return (GetFileAttributes(filename.c_str()) != INVALID_FILE_ATTRIBUTES);
+ return GetFileAttributesW(utf8ToWide(filename)) != INVALID_FILE_ATTRIBUTES;
#else // NL_OS_WINDOWS
struct stat buf;
return stat (filename.c_str (), &buf) == 0;
@@ -1950,7 +1949,7 @@ bool CFile::isExists (const string &filename)
bool CFile::createEmptyFile (const std::string& filename)
{
- FILE *file = fopen (filename.c_str(), "wb");
+ FILE *file = nlfopen (filename, "wb");
if (file)
{
@@ -1964,7 +1963,14 @@ bool CFile::createEmptyFile (const std::string& filename)
bool CFile::fileExists (const string& filename)
{
//H_AUTO(FileExists);
- return ! ! fstream( filename.c_str(), ios::in );
+#ifdef NL_OS_WINDOWS
+ DWORD attr = GetFileAttributesW(utf8ToWide(filename));
+ // attributes are valid and file is not a directory
+ if (attr == INVALID_FILE_ATTRIBUTES || (attr & FILE_ATTRIBUTE_DIRECTORY)) return false;
+ return true;
+#else
+ return access(filename.c_str(), R_OK) != -1;
+#endif
}
@@ -2013,7 +2019,7 @@ uint32 CFile::getFileSize (const std::string &filename)
{
#if defined (NL_OS_WINDOWS)
struct _stat buf;
- int result = _stat (filename.c_str (), &buf);
+ int result = _wstat (utf8ToWide(filename), &buf);
#elif defined (NL_OS_UNIX)
struct stat buf;
int result = stat (filename.c_str (), &buf);
@@ -2064,7 +2070,7 @@ uint32 CFile::getFileModificationDate(const std::string &filename)
// Use the WIN32 API to read the file times in UTC
// create a file handle (this does not open the file)
- HANDLE h = CreateFile(fn.c_str(), 0, 0, NULL, OPEN_EXISTING, 0, 0);
+ HANDLE h = CreateFileW(utf8ToWide(fn), 0, 0, NULL, OPEN_EXISTING, 0, 0);
if (h == INVALID_HANDLE_VALUE)
{
nlwarning("Can't get modification date on file '%s' : %s", fn.c_str(), NLMISC::formatErrorMessage(NLMISC::getLastError()).c_str());
@@ -2134,7 +2140,7 @@ bool CFile::setFileModificationDate(const std::string &filename, uint32 modTime)
// Use the WIN32 API to set the file times in UTC
// create a file handle (this does not open the file)
- HANDLE h = CreateFile(fn.c_str(), GENERIC_WRITE|GENERIC_READ, FILE_SHARE_WRITE|FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0);
+ HANDLE h = CreateFileW(utf8ToWide(fn), GENERIC_WRITE|GENERIC_READ, FILE_SHARE_WRITE|FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0);
if (h == INVALID_HANDLE_VALUE)
{
nlwarning("Can't set modification date on file '%s' (error accessing file) : %s", fn.c_str(), NLMISC::formatErrorMessage(NLMISC::getLastError()).c_str());
@@ -2219,10 +2225,10 @@ uint32 CFile::getFileCreationDate(const std::string &filename)
#if defined (NL_OS_WINDOWS)
struct _stat buf;
- int result = _stat (fn.c_str (), &buf);
+ int result = _wstat(utf8ToWide(fn), &buf);
#elif defined (NL_OS_UNIX)
struct stat buf;
- int result = stat (fn.c_str (), &buf);
+ int result = stat(fn.c_str (), &buf);
#endif
if (result != 0) return 0;
@@ -2299,9 +2305,6 @@ static bool CopyMoveFile(const std::string &dest, const std::string &src, bool c
std::string sdest = CPath::standardizePath(dest,false);
std::string ssrc = CPath::standardizePath(src,false);
-// return copyFile ? CopyFile(dossrc.c_str(), dosdest.c_str(), failIfExists) != FALSE
-// : MoveFile(dossrc.c_str(), dosdest.c_str()) != FALSE;
-
if (progress) progress->progress(0.f);
if(copyFile)
{
@@ -2311,13 +2314,13 @@ static bool CopyMoveFile(const std::string &dest, const std::string &src, bool c
{
totalSize = CFile::getFileSize(ssrc);
}
- FILE *fp1 = fopen(ssrc.c_str(), "rb");
+ FILE *fp1 = nlfopen(ssrc, "rb");
if (fp1 == NULL)
{
nlwarning ("PATH: CopyMoveFile error: can't fopen in read mode '%s'", ssrc.c_str());
return false;
}
- FILE *fp2 = fopen(sdest.c_str(), "wb");
+ FILE *fp2 = nlfopen(sdest, "wb");
if (fp2 == NULL)
{
nlwarning ("PATH: CopyMoveFile error: can't fopen in read write mode '%s'", sdest.c_str());
@@ -2356,7 +2359,7 @@ static bool CopyMoveFile(const std::string &dest, const std::string &src, bool c
else
{
#ifdef NL_OS_WINDOWS
- if (MoveFile(ssrc.c_str(), sdest.c_str()) == 0)
+ if (MoveFileW(utf8ToWide(ssrc), utf8ToWide(sdest)) == 0)
{
sint lastError = NLMISC::getLastError();
nlwarning ("PATH: CopyMoveFile error: can't link/move '%s' into '%s', error %u (%s)",
@@ -2390,15 +2393,15 @@ bool CFile::copyFile(const std::string &dest, const std::string &src, bool failI
bool CFile::quickFileCompare(const std::string &fileName0, const std::string &fileName1)
{
// make sure the files both exist
- if (!fileExists(fileName0.c_str()) || !fileExists(fileName1.c_str()))
+ if (!fileExists(fileName0) || !fileExists(fileName1))
return false;
// compare time stamps
- if (getFileModificationDate(fileName0.c_str()) != getFileModificationDate(fileName1.c_str()))
+ if (getFileModificationDate(fileName0) != getFileModificationDate(fileName1))
return false;
// compare file sizes
- if (getFileSize(fileName0.c_str()) != getFileSize(fileName1.c_str()))
+ if (getFileSize(fileName0) != getFileSize(fileName1))
return false;
// everything matched so return true
@@ -2408,14 +2411,14 @@ bool CFile::quickFileCompare(const std::string &fileName0, const std::string &fi
bool CFile::thoroughFileCompare(const std::string &fileName0, const std::string &fileName1,uint32 maxBufSize)
{
// make sure the files both exist
- if (!fileExists(fileName0.c_str()) || !fileExists(fileName1.c_str()))
+ if (!fileExists(fileName0) || !fileExists(fileName1))
return false;
// setup the size variable from file length of first file
- uint32 fileSize=getFileSize(fileName0.c_str());
+ uint32 fileSize=getFileSize(fileName0);
// compare file sizes
- if (fileSize != getFileSize(fileName1.c_str()))
+ if (fileSize != getFileSize(fileName1))
return false;
// allocate a couple of data buffers for our 2 files
@@ -2459,7 +2462,7 @@ bool CFile::moveFile(const std::string &dest, const std::string &src)
bool CFile::createDirectory(const std::string &filename)
{
#ifdef NL_OS_WINDOWS
- return _mkdir(filename.c_str())==0;
+ return _wmkdir(utf8ToWide(filename))==0;
#else
// Set full permissions....
return mkdir(filename.c_str(), 0xFFFF)==0;
@@ -2680,11 +2683,16 @@ bool CPath::isAbsolutePath(const std::string &path)
bool CFile::setRWAccess(const std::string &filename)
{
#ifdef NL_OS_WINDOWS
+ ucstring ucFile;
+ ucFile.fromUtf8(filename);
+
+ wchar_t *wideFile = (wchar_t*)ucFile.c_str();
+
// if the file exists and there's no write access
- if (_access (filename.c_str(), 00) == 0 && _access (filename.c_str(), 06) == -1)
+ if (_waccess (wideFile, 00) == 0 && _waccess (wideFile, 06) == -1)
{
// try to set the read/write access
- if (_chmod (filename.c_str(), _S_IREAD | _S_IWRITE) == -1)
+ if (_wchmod (wideFile, _S_IREAD | _S_IWRITE) == -1)
{
if (INelContext::getInstance().getAlreadyCreateSharedAmongThreads())
{
@@ -2719,15 +2727,14 @@ bool CFile::setRWAccess(const std::string &filename)
return true;
}
-
-#ifdef NL_OS_WINDOWS
-#define unlink _unlink
-#endif
-
bool CFile::deleteFile(const std::string &filename)
{
setRWAccess(filename);
- int res = unlink (filename.c_str());
+#ifdef NL_OS_WINDOWS
+ sint res = _wunlink(utf8ToWide(filename));
+#else
+ sint res = unlink(filename.c_str());
+#endif
if (res == -1)
{
if (INelContext::getInstance().getAlreadyCreateSharedAmongThreads())
@@ -2739,14 +2746,14 @@ bool CFile::deleteFile(const std::string &filename)
return true;
}
-#ifdef NL_OS_WINDOWS
-#define rmdir _rmdir
-#endif
-
bool CFile::deleteDirectory(const std::string &filename)
{
setRWAccess(filename);
- int res = rmdir (filename.c_str());
+#ifdef NL_OS_WINDOWS
+ sint res = _wrmdir(utf8ToWide(filename));
+#else
+ sint res = rmdir(filename.c_str());
+#endif
if (res == -1)
{
nlwarning ("PATH: Can't delete directory '%s': (errno %d) %s", filename.c_str(), errno, strerror(errno));
diff --git a/code/nel/src/misc/report.cpp b/code/nel/src/misc/report.cpp
index 261ef4d5d..f997be6e0 100644
--- a/code/nel/src/misc/report.cpp
+++ b/code/nel/src/misc/report.cpp
@@ -82,9 +82,10 @@ TReportResult report(const std::string &title, const std::string &subject, const
{
std::string reportFile = getLogDirectory() + NLMISC::toString("nel_report_%u.log", (uint)time(NULL));
reportPath = CFile::findNewFile(reportFile);
- std::ofstream f;
- f.open(reportPath.c_str());
- if (!f.good())
+
+ FILE *f = nlfopen(reportPath, "wb"); // write as binary so \n are preserved
+
+ if (!f)
{
#if NL_DEBUG_REPORT
if (INelContext::isContextInitialised())
@@ -94,8 +95,14 @@ TReportResult report(const std::string &title, const std::string &subject, const
}
else
{
- f << body;
- f.close();
+ size_t written = fwrite(body.c_str(), 1, body.length(), f);
+
+ if (written != body.length())
+ {
+ nlwarning("Unable to write %u bytes to %s, only %u written", (uint)body.length(), reportPath.c_str(), (uint)written);
+ }
+
+ fclose(f);
}
}
diff --git a/code/nel/src/misc/sha1.cpp b/code/nel/src/misc/sha1.cpp
index 19e8a440a..8afa0c039 100644
--- a/code/nel/src/misc/sha1.cpp
+++ b/code/nel/src/misc/sha1.cpp
@@ -147,7 +147,7 @@ CHashKey getSHA1(const string &filename, bool forcePath)
return CHashKey();
}
- //FILE *fp = fopen (filename.c_str(), "rb");
+ //FILE *fp = nlfopen (filename, "rb");
//if (fp == NULL) return CHashKey();
err = SHA1Reset(&sha);
diff --git a/code/nel/src/misc/shared_memory.cpp b/code/nel/src/misc/shared_memory.cpp
index 3afe795f1..99333a9c8 100644
--- a/code/nel/src/misc/shared_memory.cpp
+++ b/code/nel/src/misc/shared_memory.cpp
@@ -51,7 +51,7 @@ void *CSharedMemory::createSharedMemory( TSharedMemId sharedMemId, uint32 size
#ifdef NL_OS_WINDOWS
// Create a file mapping backed by the virtual memory swap file (not a data file)
- HANDLE hMapFile = CreateFileMapping( INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, size, sharedMemId );
+ HANDLE hMapFile = CreateFileMappingA( INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, size, sharedMemId );
if ( (hMapFile == NULL) || (GetLastError() == ERROR_ALREADY_EXISTS) )
{
nlwarning( "SHDMEM: Cannot create file mapping for smid %s: error %u%s, mapFile %p", sharedMemId, GetLastError(), (GetLastError()==ERROR_ALREADY_EXISTS) ? " (already exists) ": "", hMapFile );
@@ -97,7 +97,7 @@ void *CSharedMemory::accessSharedMemory( TSharedMemId sharedMemId )
#ifdef NL_OS_WINDOWS
// Open the existing file mapping by name
- HANDLE hMapFile = OpenFileMapping( FILE_MAP_ALL_ACCESS, false, sharedMemId );
+ HANDLE hMapFile = OpenFileMappingA( FILE_MAP_ALL_ACCESS, false, sharedMemId );
if ( hMapFile == NULL )
return NULL;
//nldebug( "SHDMEM: Opening smid %s --> mapFile %p", sharedMemId, hMapFile );
diff --git a/code/nel/src/misc/sstring.cpp b/code/nel/src/misc/sstring.cpp
index 5f5702d01..a42981421 100644
--- a/code/nel/src/misc/sstring.cpp
+++ b/code/nel/src/misc/sstring.cpp
@@ -1743,7 +1743,7 @@ namespace NLMISC
bool CSString::readFromFile(const CSString& fileName)
{
FILE* file;
- file=fopen(fileName.c_str(),"rb");
+ file = nlfopen(fileName, "rb");
if (file==NULL)
{
clear();
@@ -1766,7 +1766,7 @@ namespace NLMISC
bool CSString::writeToFile(const CSString& fileName) const
{
FILE* file;
- file=fopen(fileName.c_str(),"wb");
+ file = nlfopen(fileName, "wb");
if (file==NULL)
{
nlwarning("Failed to open file for writing: %s",fileName.c_str());
diff --git a/code/nel/src/misc/system_info.cpp b/code/nel/src/misc/system_info.cpp
index aa826bccd..f5a80238a 100644
--- a/code/nel/src/misc/system_info.cpp
+++ b/code/nel/src/misc/system_info.cpp
@@ -638,7 +638,7 @@ string CSystemInfo::getOS()
else // Test for specific product on Windows NT 4.0 SP5 and earlier
{
HKEY hKey;
- TCHAR szProductType[BUFSIZE];
+ char szProductType[BUFSIZE];
DWORD dwBufLen=BUFSIZE;
LONG lRet;
@@ -652,18 +652,18 @@ string CSystemInfo::getOS()
RegCloseKey( hKey );
- if ( lstrcmpi( _T("WINNT"), szProductType) == 0 )
+ if ( lstrcmpiA( "WINNT", szProductType) == 0 )
OSString += " Workstation";
- if ( lstrcmpi( _T("LANMANNT"), szProductType) == 0 )
+ if ( lstrcmpiA( "LANMANNT", szProductType) == 0 )
OSString += " Server";
- if ( lstrcmpi( _T("SERVERNT"), szProductType) == 0 )
+ if ( lstrcmpiA( "SERVERNT", szProductType) == 0 )
OSString += " Advanced Server";
}
}
std::string servicePack;
- if( osvi.dwMajorVersion == 4 && lstrcmpi( osvi.szCSDVersion, _T("Service Pack 6") ) == 0 )
+ if (osvi.dwMajorVersion == 4 && lstrcmpiA(osvi.szCSDVersion, "Service Pack 6") == 0 )
{
HKEY hKey;
LONG lRet;
@@ -768,7 +768,7 @@ string CSystemInfo::getProc ()
{
// get processor name
valueSize = 1024;
- result = ::RegQueryValueEx (hKey, _T("ProcessorNameString"), NULL, NULL, (LPBYTE)value, &valueSize);
+ result = ::RegQueryValueExA (hKey, "ProcessorNameString", NULL, NULL, (LPBYTE)value, &valueSize);
if (result == ERROR_SUCCESS)
ProcString = value;
else
@@ -778,7 +778,7 @@ string CSystemInfo::getProc ()
// get processor identifier
valueSize = 1024;
- result = ::RegQueryValueEx (hKey, _T("Identifier"), NULL, NULL, (LPBYTE)value, &valueSize);
+ result = ::RegQueryValueExA (hKey, "Identifier", NULL, NULL, (LPBYTE)value, &valueSize);
if (result == ERROR_SUCCESS)
ProcString += value;
else
@@ -788,7 +788,7 @@ string CSystemInfo::getProc ()
// get processor vendor
valueSize = 1024;
- result = ::RegQueryValueEx (hKey, _T("VendorIdentifier"), NULL, NULL, (LPBYTE)value, &valueSize);
+ result = ::RegQueryValueExA (hKey, "VendorIdentifier", NULL, NULL, (LPBYTE)value, &valueSize);
if (result == ERROR_SUCCESS)
ProcString += value;
else
@@ -797,7 +797,7 @@ string CSystemInfo::getProc ()
ProcString += " / ";
// get processor frequency
- result = ::RegQueryValueEx (hKey, _T("~MHz"), NULL, NULL, (LPBYTE)value, &valueSize);
+ result = ::RegQueryValueExA (hKey, "~MHz", NULL, NULL, (LPBYTE)value, &valueSize);
if (result == ERROR_SUCCESS)
{
uint32 freq = *(int *)value;
@@ -1062,7 +1062,7 @@ uint64 CSystemInfo::availableHDSpace (const string &filename)
return (uint64)(stfs.f_bavail * stst.st_blksize);
#else
ULARGE_INTEGER freeSpace = {0};
- BOOL bRes = ::GetDiskFreeSpaceExA(path.c_str(), &freeSpace, NULL, NULL);
+ BOOL bRes = ::GetDiskFreeSpaceExW(utf8ToWide(path), &freeSpace, NULL, NULL);
if (!bRes) return 0;
return (uint64)freeSpace.QuadPart;
@@ -1387,12 +1387,12 @@ bool CSystemInfo::getVideoInfo (std::string &deviceName, uint64 &driverVersion)
}
// Version dll link
- HMODULE hmVersion = LoadLibrary (_T("version"));
+ HMODULE hmVersion = LoadLibraryA ("version.dll");
if (hmVersion)
{
- BOOL (WINAPI* _GetFileVersionInfo)(LPTSTR, DWORD, DWORD, LPVOID) = NULL;
- DWORD (WINAPI* _GetFileVersionInfoSize)(LPTSTR, LPDWORD) = NULL;
- BOOL (WINAPI* _VerQueryValue)(const LPVOID, LPTSTR, LPVOID*, PUINT) = NULL;
+ BOOL (WINAPI* _GetFileVersionInfo)(LPSTR, DWORD, DWORD, LPVOID) = NULL;
+ DWORD (WINAPI* _GetFileVersionInfoSize)(LPSTR, LPDWORD) = NULL;
+ BOOL (WINAPI* _VerQueryValue)(const LPVOID, LPSTR, LPVOID*, PUINT) = NULL;
*(FARPROC*)&_GetFileVersionInfo = GetProcAddress(hmVersion, "GetFileVersionInfoA");
*(FARPROC*)&_GetFileVersionInfoSize = GetProcAddress(hmVersion, "GetFileVersionInfoSizeA");
*(FARPROC*)&_VerQueryValue = GetProcAddress(hmVersion, "VerQueryValueA");
diff --git a/code/nel/src/misc/system_utils.cpp b/code/nel/src/misc/system_utils.cpp
index 3997f75ab..7ea9ad544 100644
--- a/code/nel/src/misc/system_utils.cpp
+++ b/code/nel/src/misc/system_utils.cpp
@@ -273,14 +273,14 @@ bool CSystemUtils::isScreensaverEnabled()
// SystemParametersInfoA(SPI_GETSCREENSAVEACTIVE, 0, &bRetValue, 0);
// res = (bRetValue == TRUE);
HKEY hKeyScreenSaver = NULL;
- LSTATUS lReturn = RegOpenKeyExA(HKEY_CURRENT_USER, TEXT("Control Panel\\Desktop"), 0, KEY_QUERY_VALUE, &hKeyScreenSaver);
+ LSTATUS lReturn = RegOpenKeyExA(HKEY_CURRENT_USER, "Control Panel\\Desktop", 0, KEY_QUERY_VALUE, &hKeyScreenSaver);
if (lReturn == ERROR_SUCCESS)
{
DWORD dwType = 0L;
DWORD dwSize = KeyMaxLength;
unsigned char Buffer[KeyMaxLength] = {0};
- lReturn = RegQueryValueExA(hKeyScreenSaver, TEXT("SCRNSAVE.EXE"), NULL, &dwType, NULL, &dwSize);
+ lReturn = RegQueryValueExA(hKeyScreenSaver, "SCRNSAVE.EXE", NULL, &dwType, NULL, &dwSize);
// if SCRNSAVE.EXE is present, check also if it's empty
if (lReturn == ERROR_SUCCESS)
res = (Buffer[0] != '\0');
@@ -315,19 +315,19 @@ string CSystemUtils::getRegKey(const string &Entry)
#ifdef NL_OS_WINDOWS
HKEY hkey;
- if(RegOpenKeyEx(HKEY_CURRENT_USER, RootKey.c_str(), 0, KEY_READ, &hkey) == ERROR_SUCCESS)
+ if (RegOpenKeyExW(HKEY_CURRENT_USER, utf8ToWide(RootKey), 0, KEY_READ, &hkey) == ERROR_SUCCESS)
{
DWORD dwType = 0L;
DWORD dwSize = KeyMaxLength;
unsigned char Buffer[KeyMaxLength];
- if(RegQueryValueEx(hkey, Entry.c_str(), NULL, &dwType, Buffer, &dwSize) != ERROR_SUCCESS)
+ if (RegQueryValueExW(hkey, utf8ToWide(Entry), NULL, &dwType, Buffer, &dwSize) != ERROR_SUCCESS)
{
nlwarning("Can't get the reg key '%s'", Entry.c_str());
}
else
{
- ret = (char*)Buffer;
+ ret = wideToUtf8(Buffer);
}
RegCloseKey(hkey);
}
@@ -346,10 +346,12 @@ bool CSystemUtils::setRegKey(const string &ValueName, const string &Value)
HKEY hkey;
DWORD dwDisp;
- char nstr[] = { 0x00 };
- if (RegCreateKeyExA(HKEY_CURRENT_USER, RootKey.c_str(), 0, nstr, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &dwDisp) == ERROR_SUCCESS)
+ wchar_t nstr[] = { 0x00 };
+ if (RegCreateKeyExW(HKEY_CURRENT_USER, utf8ToWide(RootKey), 0, nstr, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &dwDisp) == ERROR_SUCCESS)
{
- if (RegSetValueExA(hkey, ValueName.c_str(), 0L, REG_SZ, (const BYTE *)Value.c_str(), (DWORD)(Value.size())+1) == ERROR_SUCCESS)
+ ucstring utf16Value = ucstring::makeFromUtf8(Value);
+ DWORD size = (utf16Value.length() + 1) * 2;
+ if (RegSetValueExW(hkey, utf8ToWide(ValueName), 0L, REG_SZ, (const BYTE *)utf16Value.c_str(), size) == ERROR_SUCCESS)
res = true;
RegCloseKey(hkey);
}
@@ -453,7 +455,7 @@ static void EnumerateUsingDXGI(IDXGIFactory *pDXGIFactory)
{
SAdapter adapter;
adapter.id = index;
- adapter.name = ucstring((ucchar*)desc.Description).toUtf8();
+ adapter.name = wideToUtf8(desc.Description);
adapter.memory = desc.DedicatedVideoMemory / 1024;
adapter.found = true;
diff --git a/code/nel/src/misc/win32_util.cpp b/code/nel/src/misc/win32_util.cpp
index 6085e98e5..7631ac7b2 100644
--- a/code/nel/src/misc/win32_util.cpp
+++ b/code/nel/src/misc/win32_util.cpp
@@ -32,12 +32,12 @@ namespace NLMISC
void CWin32Util::localizeWindow(HWND wnd)
{
if (!wnd) return;
- int textLength = GetWindowTextLength(wnd);
+ sint textLength = GetWindowTextLengthW(wnd);
if (textLength > 0)
{
- std::vector str(textLength + 1);
- GetWindowText(wnd, &str[0], textLength + 1);
- std::string winText(str.begin(), str.end() - 1);
+ wchar_t str[1024];
+ GetWindowTextW(wnd, str, 1024);
+ std::string winText = wideToUtf8(str);
if (CI18N::hasTranslation(winText))
{
SetWindowTextW(wnd, (const WCHAR *) CI18N::get(winText).c_str());
diff --git a/code/nel/src/misc/win_displayer.cpp b/code/nel/src/misc/win_displayer.cpp
index 5da7db65b..c9e81bbb3 100644
--- a/code/nel/src/misc/win_displayer.cpp
+++ b/code/nel/src/misc/win_displayer.cpp
@@ -40,7 +40,7 @@ using namespace std;
namespace NLMISC {
-static CHARFORMAT2 CharFormat;
+static CHARFORMAT2A CharFormat;
CWinDisplayer::CWinDisplayer(const char *displayerName) : CWindowDisplayer(displayerName), Exit(false)
{
@@ -149,10 +149,9 @@ LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
CWinDisplayer *cwd=(CWinDisplayer *)GetWindowLongPtr (hWnd, GWLP_USERDATA);
// get the text as unicode string
GetWindowTextW(cwd->_HInputEdit, wText, 20000);
- ucstring ucs((ucchar*)wText);
// and convert it to UTF-8 encoding.
- TextSend = ucs.toUtf8();
- SendMessage (cwd->_HInputEdit, WM_SETTEXT, (WPARAM)0, (LPARAM)"");
+ TextSend = wideToUtf8(wText);
+ SendMessageA (cwd->_HInputEdit, WM_SETTEXT, (WPARAM)0, (LPARAM)"");
const char *pos2 = TextSend.c_str();
string str;
while (*pos2 != '\0')
@@ -193,14 +192,13 @@ LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
// get the text as unicode string
GetWindowTextW(cwd->_HInputEdit, wText, 20000);
- ucstring ucs((ucchar*)wText);
// and convert it to UTF-8 encoding
- string str = ucs.toUtf8();
+ string str = wideToUtf8(wText);
nlassert (cwd->Log != NULL);
ICommand::expand (str, *cwd->Log);
- SendMessage (cwd->_HInputEdit, WM_SETTEXT, (WPARAM)0, (LPARAM)str.c_str());
+ SendMessageW (cwd->_HInputEdit, WM_SETTEXT, (WPARAM)0, (LPARAM)wText);
- SendMessage (cwd->_HInputEdit, EM_SETSEL, str.size(), str.size());
+ SendMessageA (cwd->_HInputEdit, EM_SETSEL, wcslen(wText), wcslen(wText));
return 1;
}
@@ -209,7 +207,7 @@ LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
if (pmf->wParam == VK_UP)
{
- CWinDisplayer *cwd=(CWinDisplayer *)GetWindowLongPtrW (hWnd, GWLP_USERDATA);
+ CWinDisplayer *cwd=(CWinDisplayer *)GetWindowLongPtrA (hWnd, GWLP_USERDATA);
if (cwd->_PosInHistory > 0)
cwd->_PosInHistory--;
@@ -221,7 +219,7 @@ LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
ucs.fromUtf8(cwd->_History[cwd->_PosInHistory]);
// set the text as unicode string
SetWindowTextW(cwd->_HInputEdit, (LPCWSTR)ucs.c_str());
- SendMessage (cwd->_HInputEdit, EM_SETSEL, (WPARAM)ucs.size(), (LPARAM)ucs.size());
+ SendMessageA (cwd->_HInputEdit, EM_SETSEL, (WPARAM)ucs.size(), (LPARAM)ucs.size());
}
}
else if (pmf->wParam == VK_DOWN)
@@ -238,7 +236,7 @@ LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
ucs.fromUtf8(cwd->_History[cwd->_PosInHistory]);
// set the text as unicode string
SetWindowTextW(cwd->_HInputEdit, (LPCWSTR)ucs.c_str());
- SendMessage (cwd->_HInputEdit, EM_SETSEL, (WPARAM)ucs.size(), (LPARAM)ucs.size());
+ SendMessageA (cwd->_HInputEdit, EM_SETSEL, (WPARAM)ucs.size(), (LPARAM)ucs.size());
}
}
}
@@ -262,13 +260,13 @@ void CWinDisplayer::updateLabels ()
// create a button for command and label for variables
if (access.value()[i].Value[0] == '@')
{
- access.value()[i].Hwnd = CreateWindowW (L"BUTTON", L"", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 0, 0, 0, 0, _HWnd, (HMENU) NULL, (HINSTANCE) GetWindowLongPtr(_HWnd, GWLP_HINSTANCE), NULL);
+ access.value()[i].Hwnd = CreateWindowA ("BUTTON", "", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 0, 0, 0, 0, _HWnd, (HMENU) NULL, (HINSTANCE) GetWindowLongPtrA(_HWnd, GWLP_HINSTANCE), NULL);
}
else
{
- access.value()[i].Hwnd = CreateWindowW (L"STATIC", L"", WS_CHILD | WS_VISIBLE | SS_SIMPLE, 0, 0, 0, 0, _HWnd, (HMENU) NULL, (HINSTANCE) GetWindowLongPtr(_HWnd, GWLP_HINSTANCE), NULL);
+ access.value()[i].Hwnd = CreateWindowA ("STATIC", "", WS_CHILD | WS_VISIBLE | SS_SIMPLE, 0, 0, 0, 0, _HWnd, (HMENU) NULL, (HINSTANCE) GetWindowLongPtrA(_HWnd, GWLP_HINSTANCE), NULL);
}
- SendMessage ((HWND)access.value()[i].Hwnd, WM_SETFONT, (WPARAM)_HFont, TRUE);
+ SendMessageA ((HWND)access.value()[i].Hwnd, WM_SETFONT, (WPARAM)_HFont, TRUE);
needResize = true;
}
@@ -290,7 +288,7 @@ void CWinDisplayer::updateLabels ()
}
}
- SendMessage ((HWND)access.value()[i].Hwnd, WM_SETTEXT, 0, (LPARAM) n.c_str());
+ SendMessageW ((HWND)access.value()[i].Hwnd, WM_SETTEXT, 0, (LPARAM) utf8ToWide(n));
access.value()[i].NeedUpdate = false;
}
}
@@ -427,14 +425,14 @@ void CWinDisplayer::open (string titleBar, bool iconified, sint x, sint y, sint
dwStyle |= WS_HSCROLL;
_HEdit = CreateWindowExW(WS_EX_OVERLAPPEDWINDOW, RICHEDIT_CLASSW, L"", dwStyle, 0, _ToolBarHeight, w, h-_ToolBarHeight-_InputEditHeight, _HWnd, (HMENU) NULL, (HINSTANCE) GetWindowLongPtr(_HWnd, GWLP_HINSTANCE), NULL);
- SendMessage (_HEdit, WM_SETFONT, (WPARAM)_HFont, TRUE);
+ SendMessageA (_HEdit, WM_SETFONT, (WPARAM)_HFont, TRUE);
// set the edit text limit to lot of :)
- SendMessage (_HEdit, EM_LIMITTEXT, -1, 0);
+ SendMessageA (_HEdit, EM_LIMITTEXT, -1, 0);
CharFormat.cbSize = sizeof(CharFormat);
CharFormat.dwMask = CFM_COLOR;
- SendMessage(_HEdit,EM_GETCHARFORMAT,(WPARAM)0,(LPARAM)&CharFormat);
+ SendMessageA(_HEdit,EM_GETCHARFORMAT,(WPARAM)0,(LPARAM)&CharFormat);
CharFormat.dwEffects &= ~CFE_AUTOCOLOR;
// create the input edit control
@@ -445,7 +443,7 @@ void CWinDisplayer::open (string titleBar, bool iconified, sint x, sint y, sint
LRESULT dwEvent = SendMessageW(_HInputEdit, EM_GETEVENTMASK, (WPARAM)0, (LPARAM)0);
dwEvent |= ENM_MOUSEEVENTS | ENM_KEYEVENTS | ENM_CHANGE;
- SendMessage(_HInputEdit, EM_SETEVENTMASK, (WPARAM)0, (LPARAM)dwEvent);
+ SendMessageA(_HInputEdit, EM_SETEVENTMASK, (WPARAM)0, (LPARAM)dwEvent);
// resize the window
RECT rc;
@@ -477,8 +475,8 @@ void CWinDisplayer::clear ()
bool focus = (GetFocus() == _HEdit);
if (focus)
{
- SendMessage(_HEdit,EM_SETOPTIONS,ECOOP_AND,(LPARAM)~ECO_AUTOVSCROLL);
- SendMessage(_HEdit,EM_SETOPTIONS,ECOOP_AND,(LPARAM)~ECO_AUTOHSCROLL);
+ SendMessageA(_HEdit,EM_SETOPTIONS,ECOOP_AND,(LPARAM)~ECO_AUTOVSCROLL);
+ SendMessageA(_HEdit,EM_SETOPTIONS,ECOOP_AND,(LPARAM)~ECO_AUTOHSCROLL);
}
// get number of line
@@ -534,13 +532,13 @@ void CWinDisplayer::display_main ()
bool focus = (GetFocus() == _HEdit);
if (focus)
{
- SendMessage(_HEdit,EM_SETOPTIONS,ECOOP_AND,(LPARAM)~ECO_AUTOVSCROLL);
- SendMessage(_HEdit,EM_SETOPTIONS,ECOOP_AND,(LPARAM)~ECO_AUTOHSCROLL);
+ SendMessageA(_HEdit,EM_SETOPTIONS,ECOOP_AND,(LPARAM)~ECO_AUTOVSCROLL);
+ SendMessageA(_HEdit,EM_SETOPTIONS,ECOOP_AND,(LPARAM)~ECO_AUTOHSCROLL);
}
// store old selection
DWORD startSel, endSel;
- SendMessage (_HEdit, EM_GETSEL, (WPARAM)&startSel, (LPARAM)&endSel);
+ SendMessageA (_HEdit, EM_GETSEL, (WPARAM)&startSel, (LPARAM)&endSel);
// find how many lines we have to remove in the current output to add new lines
@@ -554,7 +552,7 @@ void CWinDisplayer::display_main ()
if (nblineremove == _HistorySize)
{
- SendMessage (_HEdit, WM_SETTEXT, 0, (LPARAM) "");
+ SendMessageA (_HEdit, WM_SETTEXT, 0, (LPARAM) "");
startSel = endSel = -1;
}
else
@@ -594,31 +592,31 @@ void CWinDisplayer::display_main ()
str += ucstring::makeFromUtf8((*it).second);
}
- SendMessage (_HEdit, EM_SETSEL, -1, -1);
+ SendMessageA(_HEdit, EM_SETSEL, -1, -1);
if ((col>>24) == 0)
{
// there s a specific color
CharFormat.crTextColor = RGB ((col>>16)&0xFF, (col>>8)&0xFF, col&0xFF);
- SendMessage((HWND) _HEdit, EM_SETCHARFORMAT, (WPARAM) SCF_SELECTION, (LPARAM) &CharFormat);
+ SendMessageA(_HEdit, EM_SETCHARFORMAT, (WPARAM) SCF_SELECTION, (LPARAM) &CharFormat);
}
// add the string to the edit control
- SendMessageW (_HEdit, EM_REPLACESEL, FALSE, (LPARAM) str.c_str());
+ SendMessageW(_HEdit, EM_REPLACESEL, FALSE, (LPARAM) str.c_str());
}
// restore old selection
- SendMessage (_HEdit, EM_SETSEL, startSel, endSel);
+ SendMessageA(_HEdit, EM_SETSEL, startSel, endSel);
- SendMessage(_HEdit,EM_SETMODIFY,(WPARAM)TRUE,(LPARAM)0);
+ SendMessageA(_HEdit,EM_SETMODIFY,(WPARAM)TRUE,(LPARAM)0);
if (bottom)
- SendMessage(_HEdit,WM_VSCROLL,(WPARAM)SB_BOTTOM,(LPARAM)0L);
+ SendMessageA(_HEdit,WM_VSCROLL,(WPARAM)SB_BOTTOM,(LPARAM)0L);
if (focus)
{
- SendMessage(_HEdit,EM_SETOPTIONS,ECOOP_OR,(LPARAM)ECO_AUTOVSCROLL);
- SendMessage(_HEdit,EM_SETOPTIONS,ECOOP_OR,(LPARAM)ECO_AUTOHSCROLL);
+ SendMessageA(_HEdit,EM_SETOPTIONS,ECOOP_OR,(LPARAM)ECO_AUTOVSCROLL);
+ SendMessageA(_HEdit,EM_SETOPTIONS,ECOOP_OR,(LPARAM)ECO_AUTOHSCROLL);
}
}
diff --git a/code/nel/src/misc/win_thread.cpp b/code/nel/src/misc/win_thread.cpp
index 4178b7a58..f8063b6b7 100644
--- a/code/nel/src/misc/win_thread.cpp
+++ b/code/nel/src/misc/win_thread.cpp
@@ -277,10 +277,10 @@ uint64 CWinThread::getCPUMask()
std::string CWinThread::getUserName()
{
- char userName[512];
+ wchar_t userName[512];
DWORD size = 512;
- GetUserName (userName, &size);
- return (const char*)userName;
+ GetUserNameW (userName, &size);
+ return wideToUtf8(userName);
}
// **** Process
@@ -333,10 +333,10 @@ class CPSAPILib
{
public:
typedef BOOL (WINAPI *EnumProcessesFunPtr)(DWORD *lpidProcess, DWORD cb, DWORD *cbNeeded);
- typedef DWORD (WINAPI *GetModuleFileNameExAFunPtr)(HANDLE hProcess, HMODULE hModule, LPTSTR lpFilename, DWORD nSize);
+ typedef DWORD (WINAPI *GetModuleFileNameExWFunPtr)(HANDLE hProcess, HMODULE hModule, LPWSTR lpFilename, DWORD nSize);
typedef BOOL (WINAPI *EnumProcessModulesFunPtr)(HANDLE hProcess, HMODULE *lphModule, DWORD cb, LPDWORD lpcbNeeded);
EnumProcessesFunPtr EnumProcesses;
- GetModuleFileNameExAFunPtr GetModuleFileNameExA;
+ GetModuleFileNameExWFunPtr GetModuleFileNameExW;
EnumProcessModulesFunPtr EnumProcessModules;
public:
CPSAPILib();
@@ -353,7 +353,7 @@ CPSAPILib::CPSAPILib()
_LoadFailed = false;
_PSAPILibHandle = NULL;
EnumProcesses = NULL;
- GetModuleFileNameExA = NULL;
+ GetModuleFileNameExW = NULL;
EnumProcessModules = NULL;
}
@@ -373,7 +373,7 @@ bool CPSAPILib::init()
if (_LoadFailed) return false;
if (!_PSAPILibHandle)
{
- _PSAPILibHandle = LoadLibrary("psapi.dll");
+ _PSAPILibHandle = LoadLibraryA("psapi.dll");
if (!_PSAPILibHandle)
{
nlwarning("couldn't load psapi.dll, possibly not supported by os");
@@ -381,10 +381,10 @@ bool CPSAPILib::init()
return false;
}
EnumProcesses = (EnumProcessesFunPtr) GetProcAddress(_PSAPILibHandle, "EnumProcesses");
- GetModuleFileNameExA = (GetModuleFileNameExAFunPtr) GetProcAddress(_PSAPILibHandle, "GetModuleFileNameExA");
+ GetModuleFileNameExW = (GetModuleFileNameExWFunPtr) GetProcAddress(_PSAPILibHandle, "GetModuleFileNameExW");
EnumProcessModules = (EnumProcessModulesFunPtr) GetProcAddress(_PSAPILibHandle, "EnumProcessModules");
if (!EnumProcesses ||
- !GetModuleFileNameExA ||
+ !GetModuleFileNameExW ||
!EnumProcessModules
)
{
@@ -453,12 +453,12 @@ bool CWinProcess::enumProcessModules(uint32 processId, std::vector
}
moduleNames.clear();
std::vector resultModuleNames;
- char moduleName[MAX_PATH + 1];
+ wchar_t moduleName[MAX_PATH + 1];
for (uint m = 0; m < prcModules.size(); ++m)
{
- if (PSAPILib.GetModuleFileNameExA(hProcess, prcModules[m], moduleName, MAX_PATH))
+ if (PSAPILib.GetModuleFileNameExW(hProcess, prcModules[m], moduleName, MAX_PATH))
{
- moduleNames.push_back(moduleName);
+ moduleNames.push_back(wideToUtf8(moduleName));
}
}
CloseHandle(hProcess);
@@ -563,7 +563,7 @@ public:
PROCESS_INFORMATION processInfo;
STARTUPINFO startupInfo = {0};
startupInfo.cb = sizeof(STARTUPINFO);
- if (CreateProcess(programName.c_str(), const_cast(arguments.c_str()), NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInfo))
+ if (CreateProcessW(programName.c_str(), const_cast(arguments.c_str()), NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInfo))
{
WatchTask = new CProcessWatchTask(processInfo.hProcess);
WatchThread = IThread::create(WatchTask);
diff --git a/code/nel/src/misc/xml_pack.cpp b/code/nel/src/misc/xml_pack.cpp
index 4494be062..ec12eb6bc 100644
--- a/code/nel/src/misc/xml_pack.cpp
+++ b/code/nel/src/misc/xml_pack.cpp
@@ -93,7 +93,7 @@ namespace NLMISC
TXMLPackInfo &packInfo = _XMLPacks[packId];
// open the xml pack for later access
-// packInfo.FileHandler = fopen(xmlPackFileName.c_str(), "rb");
+// packInfo.FileHandler = nlfopen(xmlPackFileName, "rb");
// open the xml pack for parsing
CIFile packFile;
@@ -182,7 +182,7 @@ namespace NLMISC
fileInfo.FileName = CStringMapper::map(subFileName);
fileInfo.FileOffset = (uint32)(beginOfFile - buffer.begin());
fileInfo.FileSize = (uint32)(endOfFile - beginOfFile);
-// fileInfo.FileHandler = fopen(xmlPackFileName.c_str(), "rb");
+// fileInfo.FileHandler = nlfopen(xmlPackFileName, "rb");
packInfo._XMLFiles.insert(make_pair(fileInfo.FileName, fileInfo));
// advance to next line
@@ -264,7 +264,7 @@ namespace NLMISC
rFileOffset = fileInfo.FileOffset;
rCacheFileOnOpen = false;
rAlwaysOpened = false;
- FILE *fp = fopen(parts[0].c_str(), "rb");
+ FILE *fp = nlfopen(parts[0], "rb");
return fp;
}
diff --git a/code/nel/src/net/email.cpp b/code/nel/src/net/email.cpp
index ae6f92477..9ac22c886 100644
--- a/code/nel/src/net/email.cpp
+++ b/code/nel/src/net/email.cpp
@@ -271,7 +271,7 @@ bool sendEmail (const string &smtpServer, const string &from, const string &to,
char dst_buf[dst_buf_size + 1];
size_t size;
- FILE *src_stream = fopen (attachedFile.c_str(), "rb");
+ FILE *src_stream = nlfopen (attachedFile, "rb");
if (src_stream == NULL)
{
nlwarning ("EMAIL: Can't attach file '%s' to the email because the file can't be open", attachedFile.c_str());
@@ -299,7 +299,7 @@ bool sendEmail (const string &smtpServer, const string &from, const string &to,
}
// debug, display what we send into a file
- // { FILE *fp = fopen (CFile::findNewFile(getLogDirectory() + "mail.txt").c_str(), "wb");
+ // { FILE *fp = nlfopen (CFile::findNewFile(getLogDirectory() + "mail.txt"), "wb");
// fwrite (formatedBody.c_str(), 1, formatedBody.size(), fp);
// fclose (fp); }
diff --git a/code/nel/src/net/service.cpp b/code/nel/src/net/service.cpp
index 8f5a142cc..e2db26bd5 100644
--- a/code/nel/src/net/service.cpp
+++ b/code/nel/src/net/service.cpp
@@ -575,7 +575,7 @@ sint IService::main (const char *serviceShortName, const char *serviceLongName,
if (haveLongArg("writepid"))
{
// use legacy C primitives
- FILE *fp = fopen("pid.state", "wt");
+ FILE *fp = nlfopen("pid.state", "wt");
if (fp)
{
fprintf(fp, "%u", getpid());
@@ -600,7 +600,6 @@ sint IService::main (const char *serviceShortName, const char *serviceLongName,
ListeningPort = servicePort;
- // setReportEmailFunction ((void*)sendEmail);
// setDefaultEmailParams ("gw.nevrax.com", "", "cado@nevrax.com");
@@ -623,7 +622,7 @@ sint IService::main (const char *serviceShortName, const char *serviceLongName,
else
{
// create the basic .cfg that link the default one
- FILE *fp = fopen (cfn.c_str(), "w");
+ FILE *fp = nlfopen (cfn, "w");
if (fp == NULL)
{
nlerror ("SERVICE: Can't create config file '%s'", cfn.c_str());
diff --git a/code/nel/src/pipeline/CMakeLists.txt b/code/nel/src/pipeline/CMakeLists.txt
new file mode 100644
index 000000000..47ab9a376
--- /dev/null
+++ b/code/nel/src/pipeline/CMakeLists.txt
@@ -0,0 +1,18 @@
+FILE(GLOB SRC *.cpp *.h)
+FILE(GLOB HEADERS ../../include/nel/pipeline/*.h)
+
+SOURCE_GROUP("" FILES ${HEADERS} ${SRC})
+
+NL_TARGET_LIB(nelpipeline ${HEADERS} ${SRC})
+
+INCLUDE_DIRECTORIES(${LIBXML2_INCLUDE_DIR})
+
+TARGET_LINK_LIBRARIES(nelpipeline nelmisc)
+NL_DEFAULT_PROPS(nelpipeline "NeL, Library: NeL Pipeline")
+NL_ADD_RUNTIME_FLAGS(nelpipeline)
+
+NL_ADD_LIB_SUFFIX(nelpipeline)
+
+IF((WITH_INSTALL_LIBRARIES AND WITH_STATIC) OR NOT WITH_STATIC)
+ INSTALL(TARGETS nelpipeline LIBRARY DESTINATION ${NL_LIB_PREFIX} ARCHIVE DESTINATION ${NL_LIB_PREFIX} COMPONENT libraries)
+ENDIF((WITH_INSTALL_LIBRARIES AND WITH_STATIC) OR NOT WITH_STATIC)
diff --git a/code/nel/tools/3d/mesh_utils/database_config.cpp b/code/nel/src/pipeline/database_config.cpp
similarity index 96%
rename from code/nel/tools/3d/mesh_utils/database_config.cpp
rename to code/nel/src/pipeline/database_config.cpp
index 7e6ea5b37..b326a2888 100644
--- a/code/nel/tools/3d/mesh_utils/database_config.cpp
+++ b/code/nel/src/pipeline/database_config.cpp
@@ -16,7 +16,7 @@
// along with this program. If not, see .
#include
-#include "database_config.h"
+#include "nel/pipeline/database_config.h"
#include
#include
@@ -25,6 +25,8 @@
using namespace std;
using namespace NLMISC;
+namespace NLPIPELINE {
+
TPathString CDatabaseConfig::s_RootPath;
NLMISC::CConfigFile *CDatabaseConfig::s_ConfigFile = NULL;
CDatabaseConfig CDatabaseConfig::s_Instance;
@@ -104,4 +106,6 @@ void CDatabaseConfig::release()
cleanup();
}
+} /* namespace NLPIPELINE */
+
/* end of file */
diff --git a/code/nel/src/pipeline/project_config.cpp b/code/nel/src/pipeline/project_config.cpp
new file mode 100644
index 000000000..995f92fd4
--- /dev/null
+++ b/code/nel/src/pipeline/project_config.cpp
@@ -0,0 +1,238 @@
+// NeL - MMORPG Framework
+// Copyright (C) 2015 Winch Gate Property Limited
+// Author: Jan Boon
+//
+// 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 .
+
+#include
+#include "nel/pipeline/project_config.h"
+
+#ifdef NL_OS_WINDOWS
+# include
+#else
+# include
+#endif
+
+#include
+
+#include
+#include
+#include
+
+using namespace std;
+using namespace NLMISC;
+
+namespace NLPIPELINE {
+
+TPathString CProjectConfig::s_AssetConfigPath;
+TPathString CProjectConfig::s_ProjectConfigPath;
+std::vector CProjectConfig::s_ConfigFiles;
+std::vector CProjectConfig::s_ConfigPaths;
+CProjectConfig CProjectConfig::s_Instance;
+uint32 CProjectConfig::s_AssetConfigModification;
+uint32 CProjectConfig::s_ProjectConfigModification;
+CProjectConfig::Flags CProjectConfig::s_InitFlags = (CProjectConfig::Flags)0;
+std::string CProjectConfig::s_ProjectName;
+
+static std::set s_SearchPaths;
+
+void CProjectConfig::cleanup()
+{
+ for (std::vector::iterator it(s_ConfigFiles.begin()), end(s_ConfigFiles.end()); it != end; ++it)
+ delete *it;
+ s_ConfigFiles.clear();
+}
+
+CProjectConfig::~CProjectConfig()
+{
+ cleanup();
+}
+
+bool CProjectConfig::init(const std::string &asset, Flags flags, bool partial)
+{
+ TPathString rootPath = NLMISC::CPath::standardizePath(asset, false);
+ TPathString configPath = rootPath + "/nel.cfg";
+ while (!CFile::fileExists(configPath))
+ {
+ int sep = CFile::getLastSeparator(rootPath);
+ if (sep == string::npos)
+ return false;
+
+ rootPath = rootPath.substr(0, sep);
+ if (rootPath.empty())
+ return false;
+
+ configPath = rootPath + "/nel.cfg";
+ }
+
+ rootPath += "/";
+ uint32 configFileModification = CFile::getFileModificationDate(configPath);
+ bool assetConfigSame = configPath == s_AssetConfigPath && s_AssetConfigModification == configFileModification && s_InitFlags == flags;
+
+ std::vector configRootPaths;
+ TPathString projectConfigPath;
+ uint32 projectConfigModification;
+ std::string projectName;
+ if (partial)
+ {
+ if (assetConfigSame && s_ProjectConfigPath.empty())
+ return true; // Do not reload
+ }
+ else
+ {
+ if (assetConfigSame && !s_ProjectConfigPath.empty() && CFile::fileExists(s_ProjectConfigPath))
+ {
+ projectConfigModification = CFile::getFileModificationDate(s_ProjectConfigPath);
+
+ if (s_ProjectConfigModification == projectConfigModification)
+ return true; // Do not reload
+ }
+
+ // Search for project and load up all root paths
+ std::vector files;
+ CPath::getPathContent(CPath::getApplicationDirectory("NeL", true) + "/projects", false, false, true, files);
+ for (std::vector::iterator it(files.begin()), end(files.end()); it != end; ++it)
+ {
+ const std::string& file = *it;
+ if (file.length() >= 4 && (file.compare(file.length() - 4, 4, ".cfg") == 0))
+ {
+ CConfigFile project;
+ project.load(file);
+ CConfigFile::CVar &directories = project.getVar("Directories");
+ bool isProject = false;
+ for (uint i = 0; i < directories.size(); ++i)
+ {
+ if (rootPath == CPath::standardizePath(directories.asString(i), true))
+ {
+ isProject = true;
+ break;
+ }
+ }
+ if (isProject)
+ {
+ projectConfigModification = CFile::getFileModificationDate(file);
+ projectConfigPath = file;
+
+ for (uint i = 0; i < directories.size(); ++i)
+ {
+ std::string dir = CPath::standardizePath(directories.asString(i), true);
+ std::string cfgPath = dir + "nel.cfg";
+ if (CFile::fileExists(cfgPath))
+ configRootPaths.push_back(dir);
+ }
+
+ projectName = project.getVar("ProjectName").asString();
+
+ break;
+ }
+ }
+ }
+ }
+
+ if (projectConfigPath.empty())
+ {
+ projectName = "NeL Project";
+ configRootPaths.push_back(rootPath);
+ projectConfigModification = 0;
+ }
+
+ nldebug("Initializing project config '%s'", projectConfigPath.empty() ? configPath.c_str() : projectConfigPath.c_str());
+ release();
+
+ s_InitFlags = flags;
+ s_AssetConfigPath = configPath;
+ s_AssetConfigModification = configFileModification;
+ s_ProjectConfigPath = projectConfigPath;
+ s_ProjectConfigModification = projectConfigModification;
+ s_ProjectName = projectName;
+ s_ConfigPaths = configRootPaths;
+
+ std::map configFiles;
+ for (std::vector::iterator it(configRootPaths.begin()), end(configRootPaths.end()); it != end; ++it)
+ {
+ const std::string &dir = *it;
+ const std::string &cfgPath = *it + "nel.cfg";
+ CConfigFile *cfgFile = new CConfigFile();
+ cfgFile->load(cfgPath);
+ std::string identifier = cfgFile->getVar("Identifier").asString();
+ if (configFiles.find(identifier) != configFiles.end()) // Identifier already exists
+ {
+ if (dir == rootPath)
+ {
+ // Replace config that was already added, asset root gets priority
+ std::vector::iterator old = std::find(s_ConfigFiles.begin(), s_ConfigFiles.end(), configFiles[identifier]);
+ uint idx = old - s_ConfigFiles.begin();
+ s_ConfigFiles.erase(old);
+ s_ConfigPaths.erase(s_ConfigPaths.begin() + idx);
+ }
+ else
+ {
+ // Skip, first listed config gets priority
+ s_ConfigPaths.erase(s_ConfigPaths.begin() + s_ConfigFiles.size());
+ continue;
+ }
+ }
+#ifdef NL_OS_WINDOWS
+ SetEnvironmentVariableA(identifier.c_str(), dir.c_str());
+#else
+ setenv(identifier.c_str(), dir.c_str(), 1);
+#endif
+ configFiles[identifier] = cfgFile;
+ s_ConfigFiles.push_back(cfgFile);
+ }
+
+ nlassert(s_ConfigFiles.size() == s_ConfigPaths.size());
+
+ if (flags & DatabaseTextureSearchPaths)
+ {
+ searchDirectories("DatabaseTextureSearchPaths");
+ }
+
+ return true;
+}
+
+void CProjectConfig::searchDirectories(const char *var)
+{
+ for (uint i = 0; i < s_ConfigFiles.size(); ++i)
+ {
+ CConfigFile *cfg = s_ConfigFiles[i];
+ const TPathString &dir = s_ConfigPaths[i];
+ CConfigFile::CVar *paths = cfg->getVarPtr(var);
+ if (paths)
+ {
+ for (uint i = 0; i < paths->size(); i++)
+ {
+ TPathString path = paths->asString(i);
+ if (!CPath::isAbsolutePath(path)) path = dir + path;
+ path = CPath::standardizePath(path);
+ if (s_SearchPaths.find(path) == s_SearchPaths.end())
+ {
+ CPath::addSearchPath(path);
+ s_SearchPaths.insert(path);
+ }
+ }
+ }
+ }
+}
+
+void CProjectConfig::release()
+{
+ s_SearchPaths.clear();
+ CPath::clearMap();
+ cleanup();
+}
+
+} /* namespace NLPIPELINE */
+
+/* end of file */
diff --git a/code/nel/src/misc/tool_logger.cpp b/code/nel/src/pipeline/tool_logger.cpp
similarity index 92%
rename from code/nel/src/misc/tool_logger.cpp
rename to code/nel/src/pipeline/tool_logger.cpp
index e6a9fbf36..064e25f77 100644
--- a/code/nel/src/misc/tool_logger.cpp
+++ b/code/nel/src/pipeline/tool_logger.cpp
@@ -25,8 +25,7 @@
* .
*/
-#include "stdmisc.h"
-#include "nel/misc/tool_logger.h"
+#include "nel/pipeline/tool_logger.h"
// STL includes
@@ -35,11 +34,11 @@
// Project includes
-namespace NLMISC {
+namespace NLPIPELINE {
// Tool logger is fully implemented in header so small tools do not need to link to this library unnecessarily.
void dummy_tool_logger_cpp() { }
-} /* namespace NLMISC */
+} /* namespace NLPIPELINE */
/* end of file */
diff --git a/code/nel/src/sound/audio_decoder.cpp b/code/nel/src/sound/audio_decoder.cpp
index d8283c227..f4884a427 100644
--- a/code/nel/src/sound/audio_decoder.cpp
+++ b/code/nel/src/sound/audio_decoder.cpp
@@ -110,15 +110,18 @@ bool IAudioDecoder::getInfo(const std::string &filepath, std::string &artist, st
CIFile ifile;
ifile.setCacheFileOnOpen(false);
ifile.allowBNPCacheFileOnOpen(false);
- ifile.open(lookup);
- return CAudioDecoderVorbis::getInfo(&ifile, artist, title);
+ if (ifile.open(lookup))
+ return CAudioDecoderVorbis::getInfo(&ifile, artist, title);
+
+ nlwarning("Unable to open: '%s'", filepath.c_str());
}
else
{
nlwarning("Music file type unknown: '%s'", type_lower.c_str());
- artist.clear(); title.clear();
- return false;
}
+
+ artist.clear(); title.clear();
+ return false;
}
/// Get audio/container extensions that are currently supported by the nel sound library.
diff --git a/code/nel/src/sound/driver/xaudio2/sound_driver_xaudio2.cpp b/code/nel/src/sound/driver/xaudio2/sound_driver_xaudio2.cpp
index 3cc7a7dd2..d15f2f6aa 100644
--- a/code/nel/src/sound/driver/xaudio2/sound_driver_xaudio2.cpp
+++ b/code/nel/src/sound/driver/xaudio2/sound_driver_xaudio2.cpp
@@ -266,8 +266,7 @@ void CSoundDriverXAudio2::getDevices(std::vector &devices)
for (uint i = 0; i < deviceCount; ++i)
{
_XAudio2->GetDeviceDetails(i, &deviceDetails);
- std::basic_string deviceNameW = deviceDetails.DisplayName;
- std::string deviceName = std::string(deviceNameW.begin(), deviceNameW.end());
+ std::string deviceName = wideToUtf8(deviceDetails.DisplayName);
nldebug("XA2: - %s", deviceName.c_str());
devices.push_back(deviceName);
}
@@ -289,8 +288,7 @@ uint CSoundDriverXAudio2::getDeviceIndex(const std::string &device, XAUDIO2_DEVI
for (uint i = 0; i < deviceCount; ++i)
{
_XAudio2->GetDeviceDetails(i, deviceDetails);
- std::basic_string deviceNameW = deviceDetails->DisplayName;
- std::string deviceName = std::string(deviceNameW.begin(), deviceNameW.end());
+ std::string deviceName = wideToUtf8(deviceDetails->DisplayName);
if (deviceName == device)
return i;
}
diff --git a/code/nel/tools/3d/mesh_utils/CMakeLists.txt b/code/nel/tools/3d/mesh_utils/CMakeLists.txt
index a5a9fa952..c8390587c 100644
--- a/code/nel/tools/3d/mesh_utils/CMakeLists.txt
+++ b/code/nel/tools/3d/mesh_utils/CMakeLists.txt
@@ -7,7 +7,7 @@ INCLUDE_DIRECTORIES(${assimp_INCLUDE_DIRS})
NL_TARGET_LIB(mesh_utils ${SRCS} ${HDRS})
-TARGET_LINK_LIBRARIES(mesh_utils ${assimp_LIBRARIES} nelmisc nel3d)
+TARGET_LINK_LIBRARIES(mesh_utils ${assimp_LIBRARIES} nelmisc nelpipeline nel3d)
NL_DEFAULT_PROPS(mesh_utils "NeL, Tools, 3D: Mesh Utils")
NL_ADD_RUNTIME_FLAGS(mesh_utils)
diff --git a/code/nel/tools/3d/mesh_utils/assimp_material.cpp b/code/nel/tools/3d/mesh_utils/assimp_material.cpp
index 5dbe8643c..4830d1b33 100644
--- a/code/nel/tools/3d/mesh_utils/assimp_material.cpp
+++ b/code/nel/tools/3d/mesh_utils/assimp_material.cpp
@@ -28,7 +28,7 @@
#include
#include
-#include
+#include
#include
#include
diff --git a/code/nel/tools/3d/mesh_utils/assimp_shape.cpp b/code/nel/tools/3d/mesh_utils/assimp_shape.cpp
index 7b404d1e2..7ab0729ae 100644
--- a/code/nel/tools/3d/mesh_utils/assimp_shape.cpp
+++ b/code/nel/tools/3d/mesh_utils/assimp_shape.cpp
@@ -28,7 +28,7 @@
#include
#include
-#include
+#include
#include
diff --git a/code/nel/tools/3d/mesh_utils/mesh_utils.cpp b/code/nel/tools/3d/mesh_utils/mesh_utils.cpp
index b8d70660e..8765e3960 100644
--- a/code/nel/tools/3d/mesh_utils/mesh_utils.cpp
+++ b/code/nel/tools/3d/mesh_utils/mesh_utils.cpp
@@ -19,7 +19,8 @@
#include "mesh_utils.h"
#include
-#include
+#include
+#include
#include
#include
#include
@@ -28,7 +29,6 @@
#include
#include
-#include "database_config.h"
#include "scene_meta.h"
#include
@@ -231,7 +231,7 @@ void exportShapes(CMeshUtilsContext &context)
if (nodeContext.Shape)
{
std::string shapePath = NLMISC::CPath::standardizePath(context.Settings.DestinationDirectoryPath, true) + it->first + ".shape";
- context.ToolLogger.writeDepend(NLMISC::BUILD, shapePath.c_str(), "*");
+ context.ToolLogger.writeDepend(NLPIPELINE::BUILD, shapePath.c_str(), "*");
NLMISC::COFile f;
if (f.open(shapePath, false, false, true))
{
@@ -262,7 +262,7 @@ void exportShapes(CMeshUtilsContext &context)
std::string knownPath = NLMISC::CPath::lookup(fileName, false, false, false);
if (!knownPath.empty())
{
- context.ToolLogger.writeDepend(NLMISC::RUNTIME, shapePath.c_str(), knownPath.c_str());
+ context.ToolLogger.writeDepend(NLPIPELINE::RUNTIME, shapePath.c_str(), knownPath.c_str());
}
else
{
@@ -289,17 +289,17 @@ int exportScene(const CMeshUtilsSettings &settings)
context.ToolLogger.initDepend(settings.ToolDependLog);
if (!settings.ToolErrorLog.empty())
context.ToolLogger.initError(settings.ToolErrorLog);
- context.ToolLogger.writeDepend(NLMISC::BUILD, "*", NLMISC::CPath::standardizePath(context.Settings.SourceFilePath, false).c_str()); // Base input file
+ context.ToolLogger.writeDepend(NLPIPELINE::BUILD, "*", NLMISC::CPath::standardizePath(context.Settings.SourceFilePath, false).c_str()); // Base input file
// Apply database configuration
- if (!CDatabaseConfig::init(settings.SourceFilePath))
+ if (!NLPIPELINE::CProjectConfig::init(settings.SourceFilePath,
+ NLPIPELINE::CProjectConfig::DatabaseTextureSearchPaths,
+ true))
{
tlerror(context.ToolLogger, context.Settings.SourceFilePath.c_str(), "Unable to find database.cfg in input path or any of its parents.");
- return EXIT_FAILURE;
+ // return EXIT_FAILURE; We can continue but the output will not be guaranteed...
}
- CDatabaseConfig::initTextureSearchDirectories();
-
Assimp::Importer importer;
const aiScene *scene = importer.ReadFile(settings.SourceFilePath, 0
| aiProcess_Triangulate
@@ -321,7 +321,7 @@ int exportScene(const CMeshUtilsSettings &settings)
context.InternalScene = scene;
if (context.SceneMeta.load(context.Settings.SourceFilePath))
- context.ToolLogger.writeDepend(NLMISC::BUILD, "*", context.SceneMeta.metaFilePath().c_str()); // Meta input file
+ context.ToolLogger.writeDepend(NLPIPELINE::BUILD, "*", context.SceneMeta.metaFilePath().c_str()); // Meta input file
validateInternalNodeNames(context, context.InternalScene->mRootNode);
diff --git a/code/nel/tools/3d/mesh_utils/scene_context.cpp b/code/nel/tools/3d/mesh_utils/scene_context.cpp
index 6812a312a..243f13482 100644
--- a/code/nel/tools/3d/mesh_utils/scene_context.cpp
+++ b/code/nel/tools/3d/mesh_utils/scene_context.cpp
@@ -20,7 +20,7 @@
#include
#include
-#include
+#include
using namespace std;
using namespace NLMISC;
diff --git a/code/nel/tools/3d/mesh_utils/scene_context.h b/code/nel/tools/3d/mesh_utils/scene_context.h
index 714e3ff54..10fa55e46 100644
--- a/code/nel/tools/3d/mesh_utils/scene_context.h
+++ b/code/nel/tools/3d/mesh_utils/scene_context.h
@@ -23,7 +23,7 @@
#include "scene_meta.h"
#include
-#include
+#include
#include
#include
@@ -67,7 +67,7 @@ struct CMeshUtilsContext
const CMeshUtilsSettings &Settings;
- NLMISC::CToolLogger ToolLogger;
+ NLPIPELINE::CToolLogger ToolLogger;
const NL_SCENE_INTERNAL_TYPE *InternalScene;
CSceneMeta SceneMeta;
diff --git a/code/nel/tools/3d/tile_edit_qt/tiles_model.cpp b/code/nel/tools/3d/tile_edit_qt/tiles_model.cpp
index d05495eb7..cabd810d7 100644
--- a/code/nel/tools/3d/tile_edit_qt/tiles_model.cpp
+++ b/code/nel/tools/3d/tile_edit_qt/tiles_model.cpp
@@ -53,32 +53,31 @@ tiles_model::tiles_model(QObject *parent)
QVariant tiles_model::data(const QModelIndex &index, int role) const
{
- if (!index.isValid())
- return QVariant();
+ if (!index.isValid())
+ return QVariant();
- if (role == Qt::DecorationRole || role == Qt::UserRole)
+ if (role == Qt::DecorationRole || role == Qt::UserRole)
{
CTile_Widget wiwi;
wiwi.initWidget(tiles.value(index.row()).getPixmap(), tiles.value(index.row()).getPixmapSide(), tiles.value(index.row()).getTileLabel());
#ifdef USE_QT5
QPixmap pixpix = wiwi.grab(wiwi.contentsRect());
#else
- QPixmap::grabWidget(wiwi, wiwi.contentsRect());
+ QPixmap pixpix = QPixmap::grabWidget(&wiwi, wiwi.contentsRect());
#endif
return pixpix;
}
- else if (role == Qt::UserRole + 1)
+ else if (role == Qt::UserRole + 1)
{
- return tiles.value(index.row()).getIndex();
+ return tiles.value(index.row()).getIndex();
}
- return QVariant();
+ return QVariant();
}
void tiles_model::sort ( int column, Qt::SortOrder order)
{
qSort(tiles.begin(), tiles.end(), caseInsensitiveLessThan);
-
}
diff --git a/code/nel/tools/nel_unit_test/ut_ligo_primitive.h b/code/nel/tools/nel_unit_test/ut_ligo_primitive.h
index 8df4db877..d4ba5df5a 100644
--- a/code/nel/tools/nel_unit_test/ut_ligo_primitive.h
+++ b/code/nel/tools/nel_unit_test/ut_ligo_primitive.h
@@ -72,7 +72,7 @@ private:
+ " \n"
+ "";
- FILE *fp = fopen(CLASS_FILE_NAME, "wt");
+ FILE *fp = NLMISC::nlfopen(CLASS_FILE_NAME, "wt");
nlassert(fp != NULL);
size_t s = fwrite(classfile.data(), 1, classfile.size(), fp);
nlassert(s == classfile.size());
diff --git a/code/nel/tools/nel_unit_test/ut_misc_file.h b/code/nel/tools/nel_unit_test/ut_misc_file.h
index 34de2d569..486320269 100644
--- a/code/nel/tools/nel_unit_test/ut_misc_file.h
+++ b/code/nel/tools/nel_unit_test/ut_misc_file.h
@@ -19,6 +19,7 @@
#include
#include
+#include
// Test suite for NLMISC::CFile behavior
struct CUTMiscFile : public Test::Suite
@@ -49,7 +50,7 @@ private:
void copyFileSize(uint fileSize)
{
// create a source file (using standard c code)
- FILE *fp = fopen(_SrcFile.c_str(), "wb");
+ FILE *fp = NLMISC::nlfopen(_SrcFile, "wb");
nlverify(fp != NULL);
for (uint i=0; iwrite(id,f);
- fclose(f);
+ FILE * f = nlfopen(fileName, "w");
+ if (f)
+ {
+ ICDBNode::CTextId id;
+ _Database->write(id,f);
+ fclose(f);
+
+ res = true;
+ }
}
- else
+
+ if (!res)
{
nlwarning(" can't write %s : the database has not been initialized",fileName.c_str());
}
diff --git a/code/ryzom/client/src/client.cpp b/code/ryzom/client/src/client.cpp
index 83f8881f5..3e6f73b80 100644
--- a/code/ryzom/client/src/client.cpp
+++ b/code/ryzom/client/src/client.cpp
@@ -175,7 +175,7 @@ int main(int argc, char **argv)
Args.setVersion(getDisplayVersion());
Args.setDescription("Ryzom client");
- Args.addArg("c", "config", "id", "Use this configuration to determine what directory to use by default");
+ Args.addArg("p", "profile", "id", "Use this profile to determine what directory to use by default");
Args.addAdditionalArg("login", "Login to use", true, false);
Args.addAdditionalArg("password", "Password to use", true, false);
Args.addAdditionalArg("shard_id", "Shard ID to use", true, false);
@@ -210,13 +210,13 @@ int main(int argc, char **argv)
LoginShardId = std::numeric_limits::max();
// if client_default.cfg is not in current directory, use application default directory
- if (Args.haveArg("c") || !CFile::isExists("client_default.cfg"))
+ if (Args.haveArg("p") || !CFile::isExists("client_default.cfg"))
{
std::string currentPath = CPath::getApplicationDirectory("Ryzom");
- // append config ID to directory
- if (Args.haveArg("c"))
- currentPath = NLMISC::CPath::standardizePath(currentPath) + Args.getArg("c").front();
+ // append profile ID to directory
+ if (Args.haveArg("p"))
+ currentPath = NLMISC::CPath::standardizePath(currentPath) + Args.getArg("p").front();
if (!CFile::isExists(currentPath)) CFile::createDirectory(currentPath);
diff --git a/code/ryzom/client/src/client_cfg.cpp b/code/ryzom/client/src/client_cfg.cpp
index ac5314ac4..99f425f8a 100644
--- a/code/ryzom/client/src/client_cfg.cpp
+++ b/code/ryzom/client/src/client_cfg.cpp
@@ -877,6 +877,7 @@ void CClientConfig::setValues()
// defined in client_default.cfg
READ_STRING_FV(ConditionsTermsURL)
+ READ_STRING_FV(NamingPolicyURL)
READ_STRING_FV(LoginSupportURL)
#ifndef RZ_NO_CLIENT
@@ -1921,7 +1922,7 @@ void CClientConfig::init(const string &configFileName)
if(!CFile::fileExists(configFileName))
{
// create the basic .cfg
- FILE *fp = fopen(configFileName.c_str(), "w");
+ FILE *fp = nlfopen(configFileName, "w");
if (fp == NULL)
nlerror("CFG::init: Can't create config file '%s'", configFileName.c_str());
diff --git a/code/ryzom/client/src/client_cfg.h b/code/ryzom/client/src/client_cfg.h
index 75c7698da..5fe0cfa1c 100644
--- a/code/ryzom/client/src/client_cfg.h
+++ b/code/ryzom/client/src/client_cfg.h
@@ -160,6 +160,7 @@ struct CClientConfig
string CreateAccountURL;
string EditAccountURL;
string ConditionsTermsURL;
+ string NamingPolicyURL;
string BetaAccountURL;
string ForgetPwdURL;
string FreeTrialURL;
diff --git a/code/ryzom/client/src/commands.cpp b/code/ryzom/client/src/commands.cpp
index f958869f5..3308ee7ad 100644
--- a/code/ryzom/client/src/commands.cpp
+++ b/code/ryzom/client/src/commands.cpp
@@ -695,7 +695,7 @@ NLMISC_COMMAND(bugReport, "Call the bug report tool with dump", "
if (ClientCfg.Local)
sys += "ShardName OFFLINE ";
- FILE *fp = fopen (std::string(getLogDirectory() + "bug_report.txt").c_str(), "wb");
+ FILE *fp = nlfopen (getLogDirectory() + "bug_report.txt", "wb");
if (fp != NULL)
{
string res = addSlashR(getDebugInformation());
diff --git a/code/ryzom/client/src/http_client_curl.cpp b/code/ryzom/client/src/http_client_curl.cpp
index 008bef19a..c8452c02e 100644
--- a/code/ryzom/client/src/http_client_curl.cpp
+++ b/code/ryzom/client/src/http_client_curl.cpp
@@ -15,9 +15,12 @@
// along with this program. If not, see .
#include "stdpch.h"
-#include
#include "http_client_curl.h"
+#include
+
+#include
+
using namespace NLMISC;
using namespace NLNET;
using namespace std;
@@ -58,16 +61,73 @@ bool CCurlHttpClient::authenticate(const std::string &user, const std::string &p
const char *CAFilename = "ssl_ca_cert.pem"; // this is the certificate "Thawte Server CA"
+static CURLcode sslctx_function(CURL *curl, void *sslctx, void *parm)
+{
+ string path = CPath::lookup(CAFilename);
+ nldebug("Cert path '%s'", path.c_str());
+
+ CIFile file;
+
+ if (!file.open(CAFilename))
+ {
+ nlwarning("Unable to open %s", CAFilename.c_str());
+ return CURLE_SSL_CACERT;
+ }
+
+ CURLcode res = CURLE_OK;
+
+ std::vector buffer(file.getFileSize());
+ file.serialBuffer(&buffer[0], file.getFileSize());
+
+ // get a BIO
+ BIO *bio = BIO_new_mem_buf(&buffer[0], file.getFileSize());
+
+ if (bio)
+ {
+ // use it to read the PEM formatted certificate from memory into an X509
+ // structure that SSL can use
+ X509 *cert = NULL;
+ PEM_read_bio_X509(bio, &cert, 0, NULL);
+
+ if (cert)
+ {
+ // get a pointer to the X509 certificate store (which may be empty!)
+ X509_STORE *store = SSL_CTX_get_cert_store((SSL_CTX *)sslctx);
+
+ // add our certificate to this store
+ if (X509_STORE_add_cert(store, cert) == 0)
+ {
+ nlwarning("Error adding certificate");
+ res = CURLE_SSL_CACERT;
+ }
+
+ // decrease reference counts
+ X509_free(cert);
+ }
+ else
+ {
+ nlwarning("PEM_read_bio_X509 failed...");
+ res = CURLE_SSL_CACERT;
+ }
+
+ // decrease reference counts
+ BIO_free(bio);
+ }
+
+ // all set to go
+ return CURLE_OK ;
+}
+
// ***************************************************************************
bool CCurlHttpClient::verifyServer(bool verify)
{
curl_easy_setopt(_Curl, CURLOPT_SSL_VERIFYHOST, verify ? 2 : 0);
curl_easy_setopt(_Curl, CURLOPT_SSL_VERIFYPEER, verify ? 1 : 0);
curl_easy_setopt(_Curl, CURLOPT_SSLCERTTYPE, "PEM");
- //curl_easy_setopt(_Curl, CURLOPT_SSL_CTX_FUNCTION, *sslctx_function); // would allow to provide the CA in memory instead of using CURLOPT_CAINFO, but needs to include and link OpenSSL
- string path = CPath::lookup(CAFilename);
- nldebug("cert path '%s'", path.c_str());
- curl_easy_setopt(_Curl, CURLOPT_CAINFO, path.c_str());
+ // would allow to provide the CA in memory instead of using CURLOPT_CAINFO, but needs to include and link OpenSSL
+ curl_easy_setopt(_Curl, CURLOPT_SSL_CTX_FUNCTION, *sslctx_function);
+ // don't use that anymore, because CA can't be loaded from BNP and doesn't support UTF-8 under Windows
+ // curl_easy_setopt(_Curl, CURLOPT_CAINFO, path.c_str());
curl_easy_setopt(_Curl, CURLOPT_CAPATH, NULL);
return true;
}
diff --git a/code/ryzom/client/src/init.cpp b/code/ryzom/client/src/init.cpp
index a203614e4..864451718 100644
--- a/code/ryzom/client/src/init.cpp
+++ b/code/ryzom/client/src/init.cpp
@@ -271,7 +271,7 @@ static INT_PTR CALLBACK ExitClientErrorDialogProc(HWND hwndDlg, UINT uMsg, WPARA
GetWindowRect (GetDesktopWindow (), &rectDesktop);
SetWindowPos (hwndDlg, HWND_TOPMOST, (rectDesktop.right-rectDesktop.left-rect.right+rect.left)/2, (rectDesktop.bottom-rectDesktop.top-rect.bottom+rect.top)/2, 0, 0, SWP_NOSIZE);
HICON exitClientDlgIcon = LoadIcon(HInstance, MAKEINTRESOURCE(IDI_MAIN_ICON));
- ::SendMessage(hwndDlg, WM_SETICON, (WPARAM) ICON_BIG, (LPARAM) exitClientDlgIcon);
+ ::SendMessageA(hwndDlg, WM_SETICON, (WPARAM) ICON_BIG, (LPARAM) exitClientDlgIcon);
}
break;
case WM_COMMAND:
diff --git a/code/ryzom/client/src/interface_v3/action_handler_help.cpp b/code/ryzom/client/src/interface_v3/action_handler_help.cpp
index ed2b34ce3..072d53591 100644
--- a/code/ryzom/client/src/interface_v3/action_handler_help.cpp
+++ b/code/ryzom/client/src/interface_v3/action_handler_help.cpp
@@ -3937,13 +3937,15 @@ public:
s += getSystemInformation();
string progname;
- char name[1024] = "";
+ std::string moduleName;
#ifdef NL_OS_WINDOWS
- GetModuleFileName (NULL, name, 1023);
+ wchar_t name[1024];
+ GetModuleFileNameW(NULL, name, 1023);
+ moduleName = wideToUtf8(name);
#else
// TODO for Linux
#endif
- progname = CFile::getFilename(name);
+ progname = CFile::getFilename(moduleName);
progname += " ";
progname += "Statistic Report";
diff --git a/code/ryzom/client/src/interface_v3/interface_manager.cpp b/code/ryzom/client/src/interface_v3/interface_manager.cpp
index b8721ffdd..4d2248249 100644
--- a/code/ryzom/client/src/interface_v3/interface_manager.cpp
+++ b/code/ryzom/client/src/interface_v3/interface_manager.cpp
@@ -2704,7 +2704,7 @@ void CInterfaceManager::log(const ucstring &str, const std::string &cat)
{
// Open file with the name of the player
const string fileName= "save/log_" + PlayerSelectedFileName + ".txt";
- FILE *f = fopen(fileName.c_str(), "at");
+ FILE *f = nlfopen(fileName, "at");
if (f != NULL)
{
const string finalString = string(NLMISC::IDisplayer::dateToHumanString()) + " (" + NLMISC::toUpper(cat) + ") * " + str.toUtf8();
diff --git a/code/ryzom/client/src/interface_v3/music_player.cpp b/code/ryzom/client/src/interface_v3/music_player.cpp
index 39aeea825..ece6f0d43 100644
--- a/code/ryzom/client/src/interface_v3/music_player.cpp
+++ b/code/ryzom/client/src/interface_v3/music_player.cpp
@@ -196,162 +196,176 @@ public:
InitMouseWithCursor (true);
Driver->showCursor (true);
- if (false) //supportUnicode())
+ bool oggSupported = false;
+ bool mp3Supported = false;
+
+ for(uint i = 0; i < extensions.size(); ++i)
{
+ if (extensions[i] == "ogg")
+ {
+ oggSupported = true;
+ }
+ else if (extensions[i] == "mp3")
+ {
+ mp3Supported = true;
+ }
}
- else
+
+ std::vector filters;
+
+ // supported formats
+ filters.push_back("All Supported Files"); // TODO: translate
+
+ std::string filter;
+ if (mp3Supported) filter += "*.mp3;*.mp2;*.mp1;";
+ if (oggSupported) filter += "*.ogg;";
+ filter += "*.m3u;*.m3u8";
+
+ filters.push_back(filter);
+
+ // mp3 format
+ if (mp3Supported)
{
- bool oggSupported = false;
- bool mp3Supported = false;
+ filters.push_back("MPEG Audio Files (*.mp3;*.mp2;*.mp1)");
+ filters.push_back("*.mp3;*.mp2;*.mp1");
+ }
- for(uint i = 0; i < extensions.size(); ++i)
+ // ogg format
+ if (oggSupported)
+ {
+ filters.push_back("Vorbis Files (*.ogg)");
+ filters.push_back("*.ogg");
+ }
+
+ // playlist
+ filters.push_back("Playlist Files (*.m3u;*.m3u8)");
+ filters.push_back("*.m3u;*.m3u8");
+
+ // all files
+ filters.push_back("All Files (*.*)");
+ filters.push_back("*.*");
+
+ filters.push_back("");
+
+ static wchar_t szFilter[1024] = { '\0' };
+
+ uint offset = 0;
+
+ for(uint i = 0; i < filters.size(); ++i)
+ {
+ wcscpy(szFilter + offset, utf8ToWide(filters[i]));
+
+ // move offset to string length + 1 for \0
+ offset += filters[i].length() + 1;
+ }
+
+ // Filename buffer
+ wchar_t buffer[1024];
+ buffer[0]=0;
+
+ OPENFILENAMEW ofn;
+ memset (&ofn, 0, sizeof(OPENFILENAME));
+ ofn.lStructSize = sizeof(OPENFILENAME);
+ ofn.hwndOwner = Driver ? Driver->getDisplay():NULL;
+ ofn.hInstance = HInstance;
+ ofn.lpstrFilter = szFilter;
+ ofn.nFilterIndex = 0;
+ ofn.lpstrFile = buffer;
+ ofn.nMaxFile = sizeof(buffer);
+ ofn.lpstrTitle = (wchar_t*)NLMISC::CI18N::get("uiPlaySongs").c_str();
+ ofn.Flags = OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT|OFN_ENABLESIZING|OFN_EXPLORER;
+
+ if (Driver)
+ Driver->beginDialogMode();
+
+ if (GetOpenFileNameW (&ofn))
+ {
+ bool useUtf8 = false;
+
+ // Skip the directory name
+ const wchar_t *bufferPtr = buffer;
+
+ // Multi filename ?
+ string path;
+ if (ofn.nFileOffset>wcslen(buffer))
{
- if (extensions[i] == "ogg")
- {
- oggSupported = true;
- }
- else if (extensions[i] == "mp3")
- {
- mp3Supported = true;
- }
+ // Backup the path and point to the next filename
+ path = wideToUtf8(buffer);
+ path += "\\";
+ bufferPtr += wcslen(bufferPtr)+1;
}
- std::vector filters;
-
- // supported formats
- filters.push_back("All Supported Files");
-
- std::string filter;
- if (mp3Supported) filter += "*.mp3;*.mp2;*.mp1;";
- if (oggSupported) filter += "*.ogg;";
- filter += "*.m3u";
-
- filters.push_back(filter);
-
- // mp3 format
- if (mp3Supported)
+ // Get selected files and playlists
+ std::vector filenames;
+ std::vector playlists;
+ while (*bufferPtr)
{
- filters.push_back("MPEG Audio Files (*.mp3;*.mp2;*.mp1)");
- filters.push_back("*.mp3;*.mp2;*.mp1");
- }
-
- // ogg format
- if (oggSupported)
- {
- filters.push_back("Vorbis Files (*.ogg)");
- filters.push_back("*.ogg");
- }
-
- // playlist
- filters.push_back("Playlist Files (*.m3u)");
- filters.push_back("*.m3u");
-
- // all files
- filters.push_back("All Files (*.*)");
- filters.push_back("*.*");
-
- filters.push_back("");
-
- static char szFilter[1024] = { '\0' };
-
- uint offset = 0;
-
- for(uint i = 0; i < filters.size(); ++i)
- {
- strcpy(szFilter + offset, filters[i].c_str());
-
- // move offset to string length + 1 for \0
- offset += filters[i].length() + 1;
- }
-
- // Filename buffer
- char buffer[65535];
- buffer[0]=0;
-
- OPENFILENAME ofn;
- memset (&ofn, 0, sizeof(OPENFILENAME));
- ofn.lStructSize = sizeof(OPENFILENAME);
- ofn.hwndOwner = Driver ? Driver->getDisplay():NULL;
- ofn.hInstance = HInstance;
- ofn.lpstrFilter = szFilter;
- ofn.nFilterIndex = 0;
- ofn.lpstrFile = buffer;
- ofn.nMaxFile = sizeof(buffer);
- ofn.lpstrTitle = "Play songs";
- ofn.Flags = OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT|OFN_ENABLESIZING|OFN_EXPLORER;
-
- if (Driver)
- Driver->beginDialogMode();
-
- if (GetOpenFileName (&ofn))
- {
- // Skip the directory name
- const char *bufferPtr = buffer;
-
- // Multi filename ?
- string path;
- if (ofn.nFileOffset>strlen(buffer))
+ // Concat the directory name with the filename
+ std::string ext = toLower(CFile::getExtension(wideToUtf8(bufferPtr)));
+ if (ext == "m3u" || ext == "m3u8")
{
- // Backup the path and point to the next filename
- path = buffer;
- path += "\\";
- bufferPtr+=strlen(bufferPtr)+1;
+ playlists.push_back (path + wideToUtf8(bufferPtr));
+ }
+ else
+ {
+ filenames.push_back (path + wideToUtf8(bufferPtr));
}
- // Get selected files and playlists
- std::vector filenames;
- std::vector playlists;
- while (*bufferPtr)
- {
- // Concat the directory name with the filename
- if (toLower(CFile::getExtension(bufferPtr)) == "m3u")
- playlists.push_back (path+bufferPtr);
- else
- filenames.push_back (path+bufferPtr);
- bufferPtr+=strlen(bufferPtr)+1;
- }
+ bufferPtr += wcslen(bufferPtr) + 1;
+ }
- // Sort songs by filename
- sort (filenames.begin(), filenames.end());
+ // Sort songs by filename
+ sort (filenames.begin(), filenames.end());
- // Add playlist
- uint i;
- for (i=0; i= 3 && memcmp(line, utf8Header, 3) == 0)
+ useUtf8 = true;
+
+ if (!useUtf8) lineStr = ucstring(line).toUtf8();
+
+ if (lineStr[0] != '#')
+ filenames.push_back (CPath::makePathAbsolute(lineStr, basePlaylist));
}
+ fclose (file);
}
-
- // Build the songs array
- std::vector songs;
- for (i=0; igetMixer()->getSongTitle(filenames[i], song.Title);
- songs.push_back (song);
- }
-
- MusicPlayer.playSongs(songs);
}
- if (Driver)
- Driver->endDialogMode();
+ // Build the songs array
+ std::vector songs;
+ for (i=0; igetMixer()->getSongTitle(filenames[i], song.Title);
+ songs.push_back (song);
+ }
+
+ MusicPlayer.playSongs(songs);
}
+ if (Driver)
+ Driver->endDialogMode();
+
// Restore mouse
InitMouseWithCursor (wasHardware);
Driver->showCursor (wasHardware);
diff --git a/code/ryzom/client/src/login.cpp b/code/ryzom/client/src/login.cpp
index b4dc7ff42..80e184efe 100644
--- a/code/ryzom/client/src/login.cpp
+++ b/code/ryzom/client/src/login.cpp
@@ -1787,7 +1787,7 @@ class CAHReboot : public IActionHandler
}
catch (const std::exception &e)
{
- im->messageBoxWithHelp(ucstring(e.what()), "ui:login", "login_quit");
+ im->messageBoxWithHelp(ucstring::makeFromUtf8(e.what()), "ui:login", "login_quit");
}
}
};
@@ -1857,17 +1857,7 @@ class CAHOpenURL : public IActionHandler
// TODO: for Linux and Mac OS
#endif
- /*
- if (sParams == "cfg_CreateAccountURL")
- {
- url = ClientCfg.CreateAccountURL;
-
- if (!installTag.empty())
- {
- url += string("/?from=")+installTag;
- }
- }
- else */if (sParams == "cfg_EditAccountURL")
+ if (sParams == "cfg_EditAccountURL")
{
url = ClientCfg.EditAccountURL;
}
@@ -1896,6 +1886,10 @@ class CAHOpenURL : public IActionHandler
{
url = ClientCfg.ConditionsTermsURL;
}
+ else if (sParams == "cfg_NamingPolicyURL")
+ {
+ url = ClientCfg.NamingPolicyURL;
+ }
else
{
nlwarning("no URL found");
diff --git a/code/ryzom/client/src/login_patch.cpp b/code/ryzom/client/src/login_patch.cpp
index 0c4abc207..3d73635f9 100644
--- a/code/ryzom/client/src/login_patch.cpp
+++ b/code/ryzom/client/src/login_patch.cpp
@@ -119,14 +119,20 @@ CPatchManager::CPatchManager() : State("t_state"), DataScanState("t_data_scan_st
#ifdef NL_OS_WINDOWS
UpdateBatchFilename = "updt_nl.bat";
+ UpgradeBatchFilename = "upgd_nl.bat";
#else
UpdateBatchFilename = "updt_nl.sh";
+ UpgradeBatchFilename = "upgd_nl.sh";
#endif
- // use application directory by default
- std::string rootPath = Args.getProgramPath();
+ std::string rootPath;
- if (!CFile::fileExists(rootPath + "client_default.cfg"))
+ if (ClientCfg.getDefaultConfigLocation(rootPath))
+ {
+ // use same directory as client_default.cfg
+ rootPath = CFile::getPath(rootPath);
+ }
+ else
{
// use current directory
rootPath = CPath::getCurrentPath();
@@ -698,7 +704,7 @@ bool CPatchManager::getThreadState (ucstring &stateOut, vector &stateL
// verbose log
if (isVerboseLog() && !stateLogOut.empty())
for (uint32 i = 0; i < stateLogOut.size(); ++i)
- nlinfo("%s", stateLogOut[i].toString().c_str());
+ nlinfo("%s", stateLogOut[i].toUtf8().c_str());
return changed;
}
@@ -733,6 +739,18 @@ void CPatchManager::createBatchFile(CProductDescriptionForClient &descFile, bool
const CBNPCategorySet &rDescCats = descFile.getCategories();
OptionalCat.clear();
+ string SrcPath = ClientPatchPath;
+ string DstPath = ClientRootPath;
+
+#ifdef NL_OS_WINDOWS
+ // only fix backslashes for .bat
+ string batchSrcPath = CPath::standardizeDosPath(SrcPath);
+ string batchDstPath = CPath::standardizeDosPath(DstPath);
+#else
+ string batchSrcPath = SrcPath;
+ string batchDstPath = DstPath;
+#endif
+
for (uint32 i = 0; i < rDescCats.categoryCount(); ++i)
{
// For all optional categories check if there is a 'file to patch' in it
@@ -741,14 +759,14 @@ void CPatchManager::createBatchFile(CProductDescriptionForClient &descFile, bool
if (!rCat.getUnpackTo().empty())
for (uint32 j = 0; j < rCat.fileCount(); ++j)
{
- string rFilename = ClientPatchPath + rCat.getFile(j);
+ string rFilename = SrcPath + rCat.getFile(j);
nlwarning("\tFileName = %s", rFilename.c_str());
// Extract to patch
vector vFilenames;
bool result = false;
try
{
- result = bnpUnpack(rFilename, ClientPatchPath, vFilenames);
+ result = bnpUnpack(rFilename, SrcPath, vFilenames);
}
catch(...)
{
@@ -766,45 +784,59 @@ void CPatchManager::createBatchFile(CProductDescriptionForClient &descFile, bool
{
for (uint32 fff = 0; fff < vFilenames.size (); fff++)
{
- string SrcPath = ClientPatchPath;
- string DstPath = CPath::standardizePath(rCat.getUnpackTo()); // to be sure there is a / at the end
- NLMISC::CFile::createDirectoryTree(DstPath);
-
// this file must be moved
-#ifdef NL_OS_WINDOWS
- SrcPath = CPath::standardizeDosPath(SrcPath);
- DstPath = CPath::standardizeDosPath(DstPath);
-#endif
+ string fullDstPath = CPath::standardizePath(rCat.getUnpackTo()); // to be sure there is a / at the end
+ NLMISC::CFile::createDirectoryTree(fullDstPath);
- std::string SrcName = SrcPath + vFilenames[fff];
- std::string DstName = DstPath + vFilenames[fff];
+ std::string FileName = vFilenames[fff];
bool succeeded = false;
if (!useBatchFile)
{
// don't check result, because it's possible the olk file doesn't exist
- CFile::deleteFile(DstName);
+ CFile::deleteFile(fullDstPath + FileName);
// try to move it, if fails move it later in a script
- if (CFile::moveFile(DstName, SrcName))
+ if (CFile::moveFile(fullDstPath + FileName, SrcPath + FileName))
succeeded = true;
}
// if we didn't succeed to delete or move the file, create a batch file anyway
if (!succeeded)
{
+ string batchRelativeDstPath;
+
+ if (fullDstPath.compare(0, DstPath.length(), DstPath) == 0)
+ {
+ batchRelativeDstPath = fullDstPath.substr(DstPath.length()) + FileName;
+ }
+ else
+ {
+ batchRelativeDstPath = fullDstPath + FileName;
+ }
+#ifdef NL_OS_WINDOWS
+ // only fix backslashes for .bat
+ batchRelativeDstPath = CPath::standardizeDosPath(batchRelativeDstPath);
+#endif
+
// write windows .bat format else write sh format
#ifdef NL_OS_WINDOWS
+ string realDstPath = toString("\"%%DSTPATH%%\\%s\"", batchRelativeDstPath.c_str());
+ string realSrcPath = toString("\"%%SRCPATH%%\\%s\"", FileName.c_str());
+
content += toString(":loop%u\n", nblab);
- content += toString("attrib -r -a -s -h \"%s\"\n", DstName.c_str());
- content += toString("del \"%s\"\n", DstName.c_str());
- content += toString("if exist \"%s\" goto loop%u\n", DstName.c_str(), nblab);
- content += toString("move \"%s\" \"%s\"\n", SrcName.c_str(), DstPath.c_str());
+ content += toString("attrib -r -a -s -h %s\n", realDstPath.c_str());
+ content += toString("del %s\n", realDstPath.c_str());
+ content += toString("if exist %s goto loop%u\n", realDstPath.c_str(), nblab);
+ content += toString("move %s %s\n", realSrcPath.c_str(), realDstPath.c_str());
#else
- content += toString("rm -rf \"%s\"\n", DstName.c_str());
- content += toString("mv %s \"%s\"\n", SrcName.c_str(), DstPath.c_str());
+ content += toString("rm -rf %s\n", realDstPath.c_str());
+ // TODO: add test of returned $?
+ content += toString("mv %s %s\n", realSrcPath.c_str(), realDstPath.c_str());
#endif
+
+ content += "\n";
}
nblab++;
@@ -851,10 +883,10 @@ void CPatchManager::createBatchFile(CProductDescriptionForClient &descFile, bool
content += patchContent;
- content += toString("rd /Q /S \"" + patchDirectory + "\"\n");
- content += toString("if exist \"" + patchDirectory + "\" goto looppatch\n");
+ content += toString("rd /Q /S \"%s\"\n", patchDirectory.c_str());
+ content += toString("if exist \"%s\" goto looppatch\n", patchDirectory.c_str());
#else
- content += toString("rm -rf \"" + patchDirectory + "\"\n");
+ content += toString("rm -rf \"%s\"\n", patchDirectory.c_str());
#endif
}
else
@@ -869,7 +901,7 @@ void CPatchManager::createBatchFile(CProductDescriptionForClient &descFile, bool
std::string batchFilename = ClientRootPath + UpdateBatchFilename;
- FILE *fp = fopen (batchFilename.c_str(), "wt");
+ FILE *fp = nlfopen (batchFilename, "wt");
if (fp == NULL)
{
@@ -877,30 +909,70 @@ void CPatchManager::createBatchFile(CProductDescriptionForClient &descFile, bool
throw Exception (err);
}
+ string contentPrefix;
+
//use bat if windows if not use sh
#ifdef NL_OS_WINDOWS
- fprintf(fp, "@echo off\n");
+ contentPrefix += "@echo off\n";
+ contentPrefix += "set RYZOM_CLIENT=%1\n";
+ contentPrefix += "set SRCPATH=%2\n";
+ contentPrefix += "set DSTPATH=%3\n";
+ contentPrefix += "set LOGIN=%4\n";
+ contentPrefix += "set PASSWORD=%5\n";
+ contentPrefix += "set SHARDID=%6\n";
+ contentPrefix += toString("set UPGRADE_FILE=%%DSTPATH%%\\%s\n", UpgradeBatchFilename.c_str());
#else
- fprintf(fp, "#!/bin/sh\n");
+ contentPrefix += "#!/bin/sh\n";
+ contentPrefix += "RYZOM_CLIENT=$1\n";
+ contentPrefix += "SRCPATH=$2\n";
+ contentPrefix += "DSTPATH=$3\n";
+ contentPrefix += "LOGIN=$4\n";
+ contentPrefix += "PASSWORD=$5\n";
+ contentPrefix += "SHARDID=$6\n";
+ contentPrefix += toString("UPGRADE_FILE=$DSTPATH\\%s\n", UpgradeBatchFilename.c_str());
#endif
+ contentPrefix += "\n";
+
// append content of script
- fprintf(fp, content.c_str());
+ fputs(contentPrefix.c_str(), fp);
+ fputs(content.c_str(), fp);
+
+ std::string additionalParams;
+
+ if (Args.haveLongArg("profile"))
+ {
+ additionalParams = "--profile " + Args.getLongArg("profile").front();
+ }
if (wantRyzomRestart)
{
+ string contentSuffix;
+
#ifdef NL_OS_WINDOWS
- fprintf(fp, "start \"\" \"%s\" %%1 %%2 %%3\n", CPath::standardizeDosPath(RyzomFilename).c_str());
+ // launch upgrade script if present (it'll execute additional steps like moving or deleting files)
+ contentSuffix += "if exist \"%UPGRADE_FILE%\" call \"%UPGRADE_FILE%\"\n";
+
+ // client shouldn't be in memory anymore else it couldn't be overwritten
+ contentSuffix += toString("start \"\" /D \"%%DSTPATH%%\" \"%%RYZOM_CLIENT%%\" %s %%LOGIN%% %%PASSWORD%% %%SHARDID%%\n", additionalParams.c_str());
#else
- // wait until client is not in memory
- fprintf(fp, "until ! pgrep %s > /dev/null; do sleep 1; done\n", CFile::getFilename(RyzomFilename).c_str());
+ // wait until client not in memory anymore
+ contentSuffix += toString("until ! pgrep %s > /dev/null; do sleep 1; done\n", CFile::getFilename(RyzomFilename).c_str());
+
+ // launch upgrade script if present (it'll execute additional steps like moving or deleting files)
+ contentSuffix += "if [ -e \"$UPGRADE_FILE\" ]; then chmod +x \"$UPGRADE_FILE\" && \"$UPGRADE_FILE\"; fi\n";
// be sure file is executable
- fprintf(fp, "chmod +x \"%s\"\n", RyzomFilename.c_str());
+ contentSuffix += "chmod +x \"$RYZOM_CLIENT\"\n");
+
+ // change to previous client directory
+ contentSuffix += "cd \"$DSTPATH\"\n");
// launch new client
- fprintf(fp, "\"%s\" $1 $2 $3\n", RyzomFilename.c_str());
+ contentSuffix += toString("\"$RYZOM_CLIENT\" %s $LOGIN $PASSWORD $SHARDID\n", additionalParams.c_str());
#endif
+
+ fputs(contentSuffix.c_str(), fp);
}
bool writeError = ferror(fp) != 0;
@@ -940,12 +1012,20 @@ void CPatchManager::executeBatchFile()
batchFilename += UpdateBatchFilename;
-#ifdef NL_OS_UNIX
- // make script executable under UNIX
- chmod(batchFilename.c_str(), S_IRWXU);
+ // make script executable
+ CFile::setRWAccess(batchFilename);
+
+ std::string arguments;
+
+ // 3 first parameters are Ryzom client full path, patch directory full path and client root directory full path
+#ifdef NL_OS_WINDOWS
+ arguments += "\"" + CPath::standardizeDosPath(RyzomFilename) + "\" \"" + CPath::standardizeDosPath(ClientPatchPath) + "\" \"" + CPath::standardizeDosPath(ClientRootPath) + "\"";
+#else
+ arguments += "\"" + RyzomFilename + "\" \"" + ClientPatchPath + "\" " + ClientRootPath + "\"";
#endif
- std::string arguments = LoginLogin + " " + LoginPassword;
+ // append login and password
+ arguments += " " + LoginLogin + " " + LoginPassword;
if (!r2Mode)
{
@@ -1025,7 +1105,7 @@ void CPatchManager::setRWAccess (const string &filename, bool bThrowException)
{
s = CI18N::get("uiAttribErr") + " " + CFile::getFilename(filename) + " (" + toString(errno) + "," + strerror(errno) + ")";
setState(true, s);
- throw Exception (s.toString());
+ throw Exception (s.toUtf8());
}
}
@@ -1039,7 +1119,7 @@ string CPatchManager::deleteFile (const string &filename, bool bThrowException,
{
s = CI18N::get("uiDelNoFile");
setState(true, s);
- return s.toString();
+ return s.toUtf8();
}
if (!NLMISC::CFile::deleteFile(filename))
@@ -1048,8 +1128,8 @@ string CPatchManager::deleteFile (const string &filename, bool bThrowException,
if(bWarning)
setState(true, s);
if(bThrowException)
- throw Exception (s.toString());
- return s.toString();
+ throw Exception (s.toUtf8());
+ return s.toUtf8();
}
return "";
}
@@ -1064,7 +1144,7 @@ void CPatchManager::renameFile (const string &src, const string &dst)
{
s = CI18N::get("uiRenameErr") + " " + src + " -> " + dst + " (" + toString(errno) + "," + strerror(errno) + ")";
setState(true, s);
- throw Exception (s.toString());
+ throw Exception (s.toUtf8());
}
}
@@ -1302,7 +1382,7 @@ void CPatchManager::downloadFileWithCurl (const string &source, const string &de
setRWAccess(dest, false);
NLMISC::CFile::deleteFile(dest.c_str());
}
- FILE *fp = fopen (dest.c_str(), "wb");
+ FILE *fp = nlfopen (dest, "wb");
if (fp == NULL)
{
curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, NULL);
@@ -1441,8 +1521,8 @@ void CPatchManager::decompressFile (const string &filename)
string dest = filename.substr(0, filename.size ()-4);
setRWAccess(dest, false);
- //if(isVerboseLog()) nlinfo("Calling fopen('%s','wb')", dest.c_str());
- FILE *fp = fopen (dest.c_str(), "wb");
+ //if(isVerboseLog()) nlinfo("Calling nlfopen('%s','wb')", dest.c_str());
+ FILE *fp = nlfopen (dest, "wb");
if (fp == NULL)
{
string err = toString("Can't open file '%s' : code=%d %s, (error code 32)", dest.c_str(), errno, strerror(errno));
@@ -1512,21 +1592,18 @@ void CPatchManager::applyDate (const string &sFilename, uint32 nDate)
// change the file time
if(nDate != 0)
{
-// _utimbuf utb;
-// utb.actime = utb.modtime = nDate;
setRWAccess(sFilename, false);
- ucstring s = CI18N::get("uiChangeDate") + " " + NLMISC::CFile::getFilename(sFilename) + " " + toString(NLMISC::CFile::getFileModificationDate (sFilename)) +
- " -> " + toString(nDate);
+ ucstring s = CI18N::get("uiChangeDate") + " " + NLMISC::CFile::getFilename(sFilename) + " " + timestampToHumanReadable(NLMISC::CFile::getFileModificationDate (sFilename)) +
+ " -> " + timestampToHumanReadable(nDate);
setState(true,s);
if (!NLMISC::CFile::setFileModificationDate(sFilename, nDate))
-// if (_utime (sFilename.c_str (), &utb) == -1)
{
int err = NLMISC::getLastError();
- s = CI18N::get("uiChgDateErr") + " " + sFilename + " (" + toString(err) + ", " + formatErrorMessage(err) + ")";
+ s = CI18N::get("uiChgDateErr") + " " + CFile::getFilename(sFilename) + " (" + toString(err) + ", " + formatErrorMessage(err) + ")";
setState(true,s);
}
- s = CI18N::get("uiNowDate") + " " + sFilename + " " + toString(NLMISC::CFile::getFileModificationDate (sFilename));
+ s = CI18N::get("uiNowDate") + " " + CFile::getFilename(sFilename) + " " + timestampToHumanReadable(NLMISC::CFile::getFileModificationDate (sFilename));
setState(true,s);
}
}
@@ -1744,7 +1821,7 @@ bool CPatchManager::bnpUnpack(const string &srcBigfile, const string &dstPath, v
if (!bnpFile.readHeader())
{
- ucstring s = CI18N::get("uiUnpackErrHead") + " " + SourceName;
+ ucstring s = CI18N::get("uiUnpackErrHead") + " " + CFile::getFilename(SourceName);
setState(true,s);
return false;
}
@@ -1783,14 +1860,14 @@ int CPatchManager::validateProgress(void *foo, double t, double d, double /* ult
if (units.empty())
{
- units.push_back("B"); // there is no translation for byte unit...
+ units.push_back(CI18N::get("uiByte").toUtf8());
units.push_back(CI18N::get("uiKb").toUtf8());
units.push_back(CI18N::get("uiMb").toUtf8());
}
CPatchManager *pPM = CPatchManager::getInstance();
double pour1 = t!=0.0?d*100.0/t:0.0;
- ucstring sTranslate = CI18N::get("uiLoginGetFile") + ucstring::makeFromUtf8(toString(" %s : %s / %s (%5.02f %%)", NLMISC::CFile::getFilename(pPM->CurrentFile).c_str(),
+ ucstring sTranslate = CI18N::get("uiLoginGetFile") + ucstring::makeFromUtf8(toString(" %s : %s / %s (%.02f %%)", NLMISC::CFile::getFilename(pPM->CurrentFile).c_str(),
NLMISC::bytesToHumanReadableUnits((uint64)d, units).c_str(), NLMISC::bytesToHumanReadableUnits((uint64)t, units).c_str(), pour1));
pPM->setState(false, sTranslate);
if (foo)
@@ -1805,7 +1882,7 @@ void CPatchManager::MyPatchingCB::progress(float f)
{
CPatchManager *pPM = CPatchManager::getInstance();
double p = 100.0*f;
- ucstring sTranslate = CI18N::get("uiApplyingDelta") + toString(" %s (%5.02f %%)", CFile::getFilename(patchFilename).c_str(), p);
+ ucstring sTranslate = CI18N::get("uiApplyingDelta") + ucstring::makeFromUtf8(toString(" %s (%.02f %%)", CFile::getFilename(patchFilename).c_str(), p));
pPM->setState(false, sTranslate);
}
@@ -1981,7 +2058,7 @@ void CPatchManager::clearDataScanLog()
// ***************************************************************************
void CPatchManager::getCorruptedFileInfo(const SFileToPatch &ftp, ucstring &sTranslate)
{
- sTranslate = CI18N::get("uiCorruptedFile") + " " + ftp.FileName + " (" +
+ sTranslate = CI18N::get("uiCorruptedFile") + " " + ucstring::makeFromUtf8(ftp.FileName) + " (" +
toString("%.1f ", (float)ftp.FinalFileSize/1000000.f) + CI18N::get("uiMb") + ")";
}
@@ -2068,7 +2145,7 @@ void CCheckThread::run ()
for (i = 0; i < rDescFiles.fileCount(); ++i)
{
CPatchManager::SFileToPatch ftp;
- sTranslate = CI18N::get("uiCheckingFile") + " " + rDescFiles.getFile(i).getFileName();
+ sTranslate = CI18N::get("uiCheckingFile") + " " + ucstring::makeFromUtf8(rDescFiles.getFile(i).getFileName());
pPM->setState(true, sTranslate);
// get list of patch to apply to this file. don't to a full checksum test if possible
nlwarning(rDescFiles.getFile(i).getFileName().c_str());
@@ -2192,7 +2269,7 @@ void CCheckThread::run ()
if (bnpFile.readHeader())
{
// read the file inside the bnp and calculate the sha1
- FILE *bnp = fopen (sBNPFilename.c_str(), "rb");
+ FILE *bnp = nlfopen (sBNPFilename, "rb");
if (bnp != NULL)
{
for (uint32 k = 0; k < bnpFile.SFiles.size(); ++k)
@@ -3068,7 +3145,7 @@ bool CPatchManager::extract(const std::string& patchPath,
uint nblab = 0;
pPM->deleteFile(updateBatchFilename, false, false);
- FILE *fp = fopen (updateBatchFilename.c_str(), "wt");
+ FILE *fp = nlfopen (updateBatchFilename, "wt");
if (fp == 0)
{
diff --git a/code/ryzom/client/src/login_patch.h b/code/ryzom/client/src/login_patch.h
index c7f0f4509..9407290e9 100644
--- a/code/ryzom/client/src/login_patch.h
+++ b/code/ryzom/client/src/login_patch.h
@@ -433,6 +433,7 @@ private:
/// Now deprecated : the launcher is the client ryzom
std::string RyzomFilename;
std::string UpdateBatchFilename;
+ std::string UpgradeBatchFilename;
// Where the client get all delta and desc file
std::string ClientPatchPath; // Temporary path
diff --git a/code/ryzom/client/src/login_xdelta.cpp b/code/ryzom/client/src/login_xdelta.cpp
index f8e733b68..5cb1ddc7d 100644
--- a/code/ryzom/client/src/login_xdelta.cpp
+++ b/code/ryzom/client/src/login_xdelta.cpp
@@ -95,7 +95,7 @@ bool CXDPFileReader::init(const std::string &sFilename, sint32 nLowerBound, sint
{
// First open the file with a normal function
#ifdef NL_OS_WINDOWS
- int fd = _open(sFilename.c_str(), _O_BINARY | _O_RDONLY);
+ int fd = _wopen(utf8ToWide(sFilename), _O_BINARY | _O_RDONLY);
#else
int fd = open(sFilename.c_str(), O_RDONLY);
#endif
@@ -143,7 +143,7 @@ bool CXDPFileReader::init(const std::string &sFilename, sint32 nLowerBound, sint
}
else
{
- _File = fopen(sFilename.c_str(), "rb");
+ _File = nlfopen(sFilename, "rb");
if (_File == NULL)
return false;
fseek(_File, nLowerBound, SEEK_SET);
@@ -560,7 +560,7 @@ CXDeltaPatch::TApplyResult CXDeltaPatch::apply(const std::string &sFileToPatch,
errorMsg = toString("output file %s already exists", sFileOutput.c_str());
return ApplyResult_Error;
}
- FILE *outFILE = fopen(sFileOutput.c_str(), "wb");
+ FILE *outFILE = nlfopen(sFileOutput, "wb");
if (outFILE == NULL)
{
errorMsg = toString("cant create %s", sFileOutput.c_str());
@@ -572,7 +572,7 @@ CXDeltaPatch::TApplyResult CXDeltaPatch::apply(const std::string &sFileToPatch,
bool ftpPresent = false;
if (pFromSource)
{
- ftpFILE = fopen(sFileToPatch.c_str(), "rb");
+ ftpFILE = nlfopen(sFileToPatch, "rb");
if (ftpFILE == NULL)
{
errorMsg = toString("expecting file %s", sFileToPatch.c_str());
diff --git a/code/ryzom/client/src/permanent_ban.cpp b/code/ryzom/client/src/permanent_ban.cpp
index fe56446d2..cbd39d93f 100644
--- a/code/ryzom/client/src/permanent_ban.cpp
+++ b/code/ryzom/client/src/permanent_ban.cpp
@@ -84,7 +84,7 @@ static void setPermanentBanFileMarker(const std::string &path, bool on)
// simply touch a file
COFile f(path);
#ifdef NL_OS_WINDOWS
- SetFileAttributes(path.c_str(), FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM);
+ SetFileAttributesW(utf8ToWide(path), FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM);
#endif
}
catch(const EStream &e)
@@ -141,7 +141,7 @@ static void markBNPFile(std::string &path)
uint32 nFileSize=CFile::getFileSize(path);
if (!nFileSize) return;
- FILE *f = fopen(path.c_str(), "rb+");
+ FILE *f = nlfopen(path, "rb+");
if (!f) return;
// Result
if (nlfseek64 (f, nFileSize-4, SEEK_SET) != 0)
diff --git a/code/ryzom/client/src/r2/dmc/client_edition_module.cpp b/code/ryzom/client/src/r2/dmc/client_edition_module.cpp
index 073be77cc..d47093c5d 100644
--- a/code/ryzom/client/src/r2/dmc/client_edition_module.cpp
+++ b/code/ryzom/client/src/r2/dmc/client_edition_module.cpp
@@ -1384,7 +1384,7 @@ bool CClientEditionModule::loadUserComponent(const std::string& filename, bool m
uint32 timeStamp = 0;
if (! compressed)
{
- FILE* file = fopen(filename.c_str(),"rb");
+ FILE* file = nlfopen(filename, "rb");
if (!file)
{
nlwarning("Try to open an invalid file %s (access error)", filename.c_str());
@@ -1491,7 +1491,7 @@ bool CClientEditionModule::loadUserComponent(const std::string& filename, bool m
else
{
// Get Uncompressed File length (4 last byte of a gz)
- FILE* file = fopen(filename.c_str(),"rb");
+ FILE* file = nlfopen(filename, "rb");
if (!file)
{
nlwarning("Try to open an invalid file %s (access error)", filename.c_str());
@@ -1653,7 +1653,7 @@ void CClientEditionModule::saveUserComponentFile(const std::string& filename, bo
if (!mustCompress)
{
{
- FILE* output = fopen(uncompressedName.c_str(), "wb");
+ FILE* output = nlfopen(uncompressedName, "wb");
if (output)
{
fwrite(component->UncompressedData, sizeof(char) , component->UncompressedDataLength, output);
diff --git a/code/ryzom/client/src/seven_zip/seven_zip.cpp b/code/ryzom/client/src/seven_zip/seven_zip.cpp
index 28ae2d0f7..765500deb 100644
--- a/code/ryzom/client/src/seven_zip/seven_zip.cpp
+++ b/code/ryzom/client/src/seven_zip/seven_zip.cpp
@@ -154,7 +154,7 @@ bool unpack7Zip(const std::string &sevenZipFile, const std::string &destFileName
SzArEx_GetFileNameUtf16(&db, 0, &filename[0]);
// write the extracted file
- FILE *outputHandle = fopen(destFileName.c_str(), "wb+");
+ FILE *outputHandle = nlfopen(destFileName, "wb+");
if (outputHandle == 0)
{
diff --git a/code/ryzom/client/src/sheet_manager.cpp b/code/ryzom/client/src/sheet_manager.cpp
index cdb9b4ff1..3c902ed74 100644
--- a/code/ryzom/client/src/sheet_manager.cpp
+++ b/code/ryzom/client/src/sheet_manager.cpp
@@ -1020,7 +1020,7 @@ void CSheetManager::dumpVisualSlots()
// ***************************************************************************
void CSheetManager::dumpVisualSlotsIndex()
{
- FILE * vsIndexFile = fopen(std::string(getLogDirectory() + "vs_index.txt").c_str(),"w");
+ FILE * vsIndexFile = nlfopen(getLogDirectory() + "vs_index.txt", "w");
if( vsIndexFile )
{
for (uint i=0; i < SLOTTYPE::NB_SLOT; ++i)
diff --git a/code/ryzom/client/src/sound_manager.cpp b/code/ryzom/client/src/sound_manager.cpp
index 4a981366d..5c1f49b1c 100644
--- a/code/ryzom/client/src/sound_manager.cpp
+++ b/code/ryzom/client/src/sound_manager.cpp
@@ -1028,17 +1028,18 @@ void CSoundManager::loadProperties(const string &soundName, USource *source)
// Search for the file.
string filePath = CPath::lookup(soundName+".sdf");
- ifstream file(filePath.c_str(), ios::in);
+
+ CIFile file;
// Try to open the file.
- if(file.is_open())
+ if (file.open(filePath))
{
char tmpBuff[260];
char delimiterBox[] = "\t ";
// While the end of the file is not reached.
while(!file.eof())
{
- // Get a line (teh line should not be more than _MAX_LINE_SIZE).
+ // Get a line (the line should not be more than _MAX_LINE_SIZE).
file.getline(tmpBuff, 260);
char *token = strtok(tmpBuff, delimiterBox);
while(token != NULL)
diff --git a/code/ryzom/common/src/game_share/bmp4image.h b/code/ryzom/common/src/game_share/bmp4image.h
index 542fc4200..4ecbd79f5 100644
--- a/code/ryzom/common/src/game_share/bmp4image.h
+++ b/code/ryzom/common/src/game_share/bmp4image.h
@@ -65,7 +65,7 @@ public:
/*bool write(char *filename)
{
- FILE *outf=fopen(filename,"wb");
+ FILE *outf=nlfopen(filename, "wb");
if (outf==NULL)
return false;
diff --git a/code/ryzom/common/src/game_share/cst_loader.cpp b/code/ryzom/common/src/game_share/cst_loader.cpp
index b957d7f34..87e587ba1 100644
--- a/code/ryzom/common/src/game_share/cst_loader.cpp
+++ b/code/ryzom/common/src/game_share/cst_loader.cpp
@@ -26,11 +26,11 @@ using namespace NLMISC;
/****************************************************************\
buildTableFormat()
\****************************************************************/
-void CSTLoader::buildTableFormat( string fileName, list >& tableFormat )
+void CSTLoader::buildTableFormat(const string &fileName, list >& tableFormat )
{
- _File = new ifstream(fileName.c_str(), ios::in);
+ _File = nlfopen(fileName, "rb");
- if( !_File->is_open() )
+ if (!_File)
{
nlerror("can't open file : %s\n", fileName.c_str());
}
@@ -40,7 +40,7 @@ void CSTLoader::buildTableFormat( string fileName, list >
//================
char readBuffer[4096];
char * token;
- _File->getline(readBuffer, 4096);
+ if (fgets(readBuffer, 4096, _File) == NULL) return;
// extract first token
//====================
@@ -102,13 +102,17 @@ void CSTLoader::readData( list >& data )
char * token;
bool firstToken = true;
- while( !_File->eof() )
+ while( !feof(_File) )
{
// list of current object values
list lineData;
// read a line
- _File->getline(readBuffer, 4096);
+ if (fgets(readBuffer, 4096, _File) == NULL)
+ {
+ // EOF
+ break;
+ }
// check all tokens of the current line
do
@@ -146,74 +150,44 @@ void CSTLoader::readData( list >& data )
/****************************************************************\
generateDerivedClasses()
\****************************************************************/
-void CSTLoader::generateDerivedClasses(ofstream &file, std::list< std::pair > &format, std::list< std::list< std::string> > &data )
+void CSTLoader::generateDerivedClasses(const std::list< std::pair > &format, const std::list< std::list< std::string> > &data )
{
+ std::string content;
-
- std::list< std::list< std::string> >::iterator it_dl = data.begin();
+ std::list< std::list< std::string> >::const_iterator it_dl = data.begin();
while ( it_dl != data.end() )
{
- std::list< std::pair >::iterator it_def = format.begin();
- std::list::iterator it_val = (*it_dl).begin();
+ std::list< std::pair >::const_iterator it_def = format.begin();
+ std::list::const_iterator it_val = (*it_dl).begin();
// sint32 size = data.size();
// sint32 size2 = (*it_dl).size();
-// std::string name = convertName( *it_val );
+// std::string name = convertName( *it_val );
-// std::string test = *it_val;
+// std::string test = *it_val;
if ( (*it_dl).size() )
{
- file << "From Item : Define " << convertName( *it_val ) << endl;
+ content += "From Item : Define " + convertName( *it_val ) + "\n";
it_val++;
it_def++;
- file << "{" << endl;
- file << "\tComponent:" << endl;
+ content += "{\n";
+ content += "\tComponent:\n";
}
- std::list< std::pair >::iterator it_obj = format.begin();
+ std::list< std::pair >::const_iterator it_obj = format.begin();
it_obj++;
while ( it_obj != format.end() )
{
- file << "\t\t";
- switch ( (*it_obj).second )
- {
- case UINT8:
- file << "uint8";
- break;
- case SINT8:
- file << "sint8";
- break;
- case UINT16:
- file << "uint16";
- break;
- case SINT16:
- file << "sint16";
- break;
- case UINT32:
- file << "uint32";
- break;
- case SINT32:
- file << "sint32";
- break;
- case FLOAT:
- file << "Float";
- break;
- case STRING:
- file << "String";
- break;
- case BOOL:
- file << "Bool";
- break;
- }
- file << "<'" << (*it_obj).first << "', Static>;" << endl;
+ content += "\t\t" + convertFromType((*it_obj).second);
+ content += "<'" + (*it_obj).first + "', Static>;\n";
it_obj++;
}
- file << "\tEnd" << endl << endl;
+ content += "\tEnd\n";
- file << "\t StaticInit()" << endl;
+ content += "\t StaticInit()\n";
while ( it_def != format.end() && it_val != (*it_dl).end() )
{
@@ -222,50 +196,52 @@ void CSTLoader::generateDerivedClasses(ofstream &file, std::list< std::pair& fileFormat)
+void CSTLoader::init(const string &fileName, const map& fileFormat)
{
_FileFormat = fileFormat;
_FileName = fileName;
- _File = new ifstream(fileName.c_str(), ios::in);
+ _File = nlfopen(fileName, "rb");
- if( !_File->is_open() )
+ if (!_File)
{
nlerror("can't open file : %s\n", fileName.c_str());
}
@@ -291,7 +267,8 @@ void CSTLoader::init(string fileName, const map& fileFormat)
// read first line
char readBuffer[4096];
char * token;
- _File->getline(readBuffer, 4096);
+
+ if (fgets(readBuffer, 4096, _File) == NULL) return;
// extract first token
token = strtok(readBuffer, _Seps.c_str());
@@ -316,7 +293,7 @@ void CSTLoader::init(string fileName, const map& fileFormat)
\****************************************************************/
bool CSTLoader::readLine()
{
- if( _File->eof() )
+ if (feof(_File))
{
return false;
}
@@ -333,7 +310,7 @@ bool CSTLoader::readLine()
_Tokens.clear();
// read a line
- _File->getline(readBuffer, 4096);
+ if (fgets(readBuffer, 4096, _File) == NULL) return false;
// if the line is empty we consider we are at end of file
if( strlen(readBuffer) == 0)
@@ -429,3 +406,21 @@ bool CSTLoader::readLine()
return true;
}
+std::string CSTLoader::convertFromType(TDataType type)
+{
+ switch (type)
+ {
+ case UINT8: return "uint8";
+ case SINT8: return "sint8";
+ case UINT16: return "uint16";
+ case SINT16: return "sint16";
+ case UINT32: return "uint32";
+ case SINT32: return "sint32";
+ case FLOAT: return "Float";
+ case STRING: return "String";
+ case BOOL: return "Bool";
+ default: break;
+ }
+
+ return "";
+}
diff --git a/code/ryzom/common/src/game_share/cst_loader.h b/code/ryzom/common/src/game_share/cst_loader.h
index b80cad107..51fa6e9aa 100644
--- a/code/ryzom/common/src/game_share/cst_loader.h
+++ b/code/ryzom/common/src/game_share/cst_loader.h
@@ -25,7 +25,6 @@
#include