Fixed: #1449 Added missing header, fixed CMake configuration, fixed iterators. GUS builds fine without MFC extensions.
This commit is contained in:
parent
cce95ffdfb
commit
3d7b89f77b
8 changed files with 300 additions and 99 deletions
174
code/ryzom/common/src/game_share/txt_command.h
Normal file
174
code/ryzom/common/src/game_share/txt_command.h
Normal file
|
@ -0,0 +1,174 @@
|
||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#ifndef TXT_COMMAND_H
|
||||||
|
#define TXT_COMMAND_H
|
||||||
|
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------------------
|
||||||
|
// includes
|
||||||
|
//-------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
#include "nel/misc/common.h"
|
||||||
|
#include "nel/misc/debug.h"
|
||||||
|
#include "nel/misc/sstring.h"
|
||||||
|
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------------------
|
||||||
|
// MACRO TXT_COMMAND_SET
|
||||||
|
//-------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#define TXT_COMMAND_SET(setName,CONTEXT_CLASS)\
|
||||||
|
class __CTxtCommandSet_##setName: public ITxtCommandSet<CONTEXT_CLASS>\
|
||||||
|
{\
|
||||||
|
public:\
|
||||||
|
static __CTxtCommandSet_##setName* getInstance()\
|
||||||
|
{\
|
||||||
|
static __CTxtCommandSet_##setName *p=NULL;\
|
||||||
|
if (p==NULL) p= new __CTxtCommandSet_##setName;\
|
||||||
|
return p;\
|
||||||
|
}\
|
||||||
|
};\
|
||||||
|
static CTxtCommandSetPtr<__CTxtCommandSet_##setName> setName;
|
||||||
|
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------------------
|
||||||
|
// MACRO TXT_COMMAND
|
||||||
|
//-------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#define TXT_COMMAND(cmdName,setName,CONTEXT_CLASS)\
|
||||||
|
struct __CTxtCommand_##cmdName: public ITxtCommand<CONTEXT_CLASS>\
|
||||||
|
{\
|
||||||
|
static __CTxtCommand_##cmdName* getInstance()\
|
||||||
|
{\
|
||||||
|
static __CTxtCommand_##cmdName *p=NULL;\
|
||||||
|
if (p==NULL) p= new __CTxtCommand_##cmdName;\
|
||||||
|
return p;\
|
||||||
|
}\
|
||||||
|
virtual const char* getName() const {return #cmdName;}\
|
||||||
|
virtual CTxtCommandResult execute(CONTEXT_CLASS& context,const NLMISC::CVectorSString& args,const NLMISC::CSString& rawArgs,const NLMISC::CSString& fullCmdLine);\
|
||||||
|
private:\
|
||||||
|
__CTxtCommand_##cmdName() {}\
|
||||||
|
};\
|
||||||
|
static ITxtCommandRegisterer<__CTxtCommand_##cmdName,__CTxtCommandSet_##setName> __CTxtCommand_##cmdName##_Registerer;\
|
||||||
|
CTxtCommandResult __CTxtCommand_##cmdName::execute(CONTEXT_CLASS& context,const NLMISC::CVectorSString& args,const NLMISC::CSString& rawArgs,const NLMISC::CSString& fullCmdLine)
|
||||||
|
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------------------
|
||||||
|
// class CTxtCommandResult
|
||||||
|
//-------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class CTxtCommandResult
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum TType
|
||||||
|
{
|
||||||
|
SUCCESS, // command execution was successful
|
||||||
|
SYNTAX_ERROR, // there was a syntax error in the command line
|
||||||
|
BAD_PERMISSION, // the user doesn't have the right to run the given command
|
||||||
|
UNKNOWN_COMMAND, // behave as if the command was not recognised
|
||||||
|
EXECUTION_ERROR // there was an error during execution of the command
|
||||||
|
};
|
||||||
|
CTxtCommandResult(const bool& success): _Type(success?SUCCESS:SYNTAX_ERROR) {}
|
||||||
|
CTxtCommandResult(const TType& type): _Type(type) {}
|
||||||
|
CTxtCommandResult(const TType& type,const NLMISC::CSString& reason): _Type(type), _Reason(reason) {}
|
||||||
|
TType getType() const { return _Type; }
|
||||||
|
const NLMISC::CSString& getReason() const { return _Reason; }
|
||||||
|
private:
|
||||||
|
TType _Type;
|
||||||
|
NLMISC::CSString _Reason;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------------------
|
||||||
|
// class ITxtCommand
|
||||||
|
//-------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
template <class CONTEXT_CLASS> class ITxtCommand
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual const char* getName() const =0;
|
||||||
|
virtual CTxtCommandResult execute(CONTEXT_CLASS& context,const NLMISC::CVectorSString& args,const NLMISC::CSString& rawArgs,const NLMISC::CSString& fullCmdLine) =0;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------------------
|
||||||
|
// class ITxtCommandRegisterer
|
||||||
|
//-------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
template <class CMD,class SET> struct ITxtCommandRegisterer
|
||||||
|
{
|
||||||
|
ITxtCommandRegisterer()
|
||||||
|
{
|
||||||
|
SET::getInstance()->registerTxtCommand(CMD::getInstance());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------------------
|
||||||
|
// class ITxtCommandSet
|
||||||
|
//-------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
template <class CONTEXT_CLASS> class ITxtCommandSet
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void registerTxtCommand(ITxtCommand<CONTEXT_CLASS>* txtCommand)
|
||||||
|
{
|
||||||
|
nlassert(_TxtCommands.find(txtCommand->getName())==_TxtCommands.end());
|
||||||
|
_TxtCommands[txtCommand->getName()]= txtCommand;
|
||||||
|
}
|
||||||
|
CTxtCommandResult execute(CONTEXT_CLASS& context,const NLMISC::CSString& cmdLine)
|
||||||
|
{
|
||||||
|
NLMISC::CSString cmdTail=cmdLine;
|
||||||
|
NLMISC::CSString keyword=cmdTail.firstWord(true);
|
||||||
|
typename TTxtCommands::iterator it= _TxtCommands.find(keyword);
|
||||||
|
if (it==_TxtCommands.end()) return CTxtCommandResult::UNKNOWN_COMMAND;
|
||||||
|
NLMISC::CVectorSString args;
|
||||||
|
cmdTail.splitWords(args);
|
||||||
|
return it->second->execute(context,args,cmdTail,cmdLine);
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
typedef ITxtCommand<CONTEXT_CLASS> TTxtCommand;
|
||||||
|
typedef std::map<NLMISC::CSString,TTxtCommand*> TTxtCommands;
|
||||||
|
TTxtCommands _TxtCommands;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------------------
|
||||||
|
// class ITxtCommandRegisterer
|
||||||
|
//-------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
template <class SET> struct CTxtCommandSetPtr
|
||||||
|
{
|
||||||
|
CTxtCommandSetPtr()
|
||||||
|
{
|
||||||
|
SET::getInstance();
|
||||||
|
}
|
||||||
|
|
||||||
|
SET& operator*()
|
||||||
|
{
|
||||||
|
return *SET::getInstance();
|
||||||
|
}
|
||||||
|
|
||||||
|
SET* operator->()
|
||||||
|
{
|
||||||
|
return SET::getInstance();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------------------
|
||||||
|
#endif
|
|
@ -34,7 +34,7 @@ ADD_SUBDIRECTORY(patchman_service)
|
||||||
#ADD_SUBDIRECTORY(ags_test)
|
#ADD_SUBDIRECTORY(ags_test)
|
||||||
#ADD_SUBDIRECTORY(ai_data_service)
|
#ADD_SUBDIRECTORY(ai_data_service)
|
||||||
#ADD_SUBDIRECTORY(entity_view_service)
|
#ADD_SUBDIRECTORY(entity_view_service)
|
||||||
#ADD_SUBDIRECTORY(general_utilities_service)
|
ADD_SUBDIRECTORY(general_utilities_service)
|
||||||
|
|
||||||
# Not sure, no longer used maybe?
|
# Not sure, no longer used maybe?
|
||||||
#sabrina
|
#sabrina
|
||||||
|
|
|
@ -11,9 +11,120 @@ LIST(REMOVE_ITEM SRC
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/re_repository_emitter.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/re_repository_emitter.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/rr_module_itf.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/rr_module_itf.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/rr_module_itf.h
|
${CMAKE_CURRENT_SOURCE_DIR}/rr_module_itf.h
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/rr_repository_reciever.cpp)
|
${CMAKE_CURRENT_SOURCE_DIR}/rr_repository_reciever.cpp
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/mfc/*)
|
||||||
|
|
||||||
ADD_EXECUTABLE(ryzom_general_utilities_service ${SRC})
|
|
||||||
|
|
||||||
|
SOURCE_GROUP("Documentation" FILES ss_notes.txt
|
||||||
|
ce_notes.txt
|
||||||
|
ec_notes.txt
|
||||||
|
ee_notes.txt
|
||||||
|
em_notes.txt
|
||||||
|
merge_notes.txt
|
||||||
|
gus_module_notes.txt
|
||||||
|
gus_net_notes.txt
|
||||||
|
saves_notes.txt
|
||||||
|
rs_notes.txt
|
||||||
|
rsaves_notes.txt
|
||||||
|
stats_notes.txt
|
||||||
|
server control module notes.txt)
|
||||||
|
|
||||||
|
SOURCE_GROUP("GUS Modules\\Contest Control (CC)" FILES cc_commands.cpp cc_contest_ctrl_script.cpp cc_contest_ctrl_script.h cc_module_messages.h)
|
||||||
|
|
||||||
|
SOURCE_GROUP("GUS Modules\\Contest Executor (CE)" FILES ce_commands.cpp ce_contest_executor.cpp ce_module_messages.h ce_contest_executor.h)
|
||||||
|
|
||||||
|
SOURCE_GROUP("GUS Modules\\Contest Logger (CL)" FILES cl_contest_logger.cpp cl_module_messages.h)
|
||||||
|
|
||||||
|
SOURCE_GROUP("GUS Modules\\Event Chat (EC)" FILES ec_channel.cpp
|
||||||
|
ec_channel.h
|
||||||
|
ec_ctrl_channel.cpp
|
||||||
|
ec_ctrl_channel.h
|
||||||
|
ec_event_chat.cpp
|
||||||
|
ec_event_chat_module.cpp
|
||||||
|
ec_event_chat_module.h
|
||||||
|
ec_faction_channel.cpp
|
||||||
|
ec_faction_channel.h
|
||||||
|
ec_party_channel.cpp
|
||||||
|
ec_party_channel.h
|
||||||
|
ec_types.h)
|
||||||
|
|
||||||
|
SOURCE_GROUP("GUS Modules\\Event Executor (EE)" FILES ee_event_executor.cpp ee_event_executor.h ee_module_messages.h)
|
||||||
|
|
||||||
|
SOURCE_GROUP("GUS Modules\\Event Executor (EE)" FILES em_commands.cpp em_event_manager.cpp em_event_manager.h em_module_messages.h)
|
||||||
|
|
||||||
|
SOURCE_GROUP("GUS Modules\\Shard Merge (MERGE)" FILES merge_commands.cpp merge_shard_merger.cpp)
|
||||||
|
|
||||||
|
SOURCE_GROUP("GUS Modules\\Remote Saves (RSAVES)" FILES remote_saves_interface.cpp remote_saves_interface.h rs_remote_saves.cpp rs_remote_saves.h rs_module_messages.h)
|
||||||
|
|
||||||
|
SOURCE_GROUP("GUS Modules\\Shard Saves (SAVES)" FILES saves_module_messages.h saves_shard_saves.cpp saves_unit.cpp saves_unit.h)
|
||||||
|
|
||||||
|
SOURCE_GROUP("GUS Modules\\Shard Script (SS)" FILES ss_command_executor.cpp
|
||||||
|
ss_command_executor.h
|
||||||
|
ss_script_manager.cpp
|
||||||
|
ss_commands.cpp
|
||||||
|
ss_script_manager.h
|
||||||
|
ss_service_comms_manager.cpp
|
||||||
|
ss_service_comms_manager.h
|
||||||
|
ss_state_manager.cpp
|
||||||
|
ss_state_manager.h)
|
||||||
|
|
||||||
|
|
||||||
|
SOURCE_GROUP("GUS Modules\\Stats Scan (STATS)" FILES stats_guild_commands.cpp
|
||||||
|
stats_guild_scan_job.cpp
|
||||||
|
stats_guild_scan_job.h
|
||||||
|
stat_character.cpp
|
||||||
|
stat_character.h
|
||||||
|
stat_character_scan_job.cpp
|
||||||
|
stat_character_scan_job.h
|
||||||
|
stat_char_commands.cpp
|
||||||
|
stat_char_filter_factory.cpp
|
||||||
|
stat_char_filter_factory.h
|
||||||
|
stat_char_info_extractor_factory.cpp
|
||||||
|
stat_char_info_extractor_factory.h
|
||||||
|
stat_char_scan_script.cpp
|
||||||
|
stat_char_scan_script.h
|
||||||
|
stat_file_list_builder_factory.cpp
|
||||||
|
stat_file_list_builder_factory.h
|
||||||
|
stat_globals.cpp stat_globals.h
|
||||||
|
stat_guild_container.cp
|
||||||
|
stat_guild_container.h
|
||||||
|
stat_job_manager.cpp
|
||||||
|
stat_job_manager.h
|
||||||
|
stat_user_char_filters.cpp
|
||||||
|
stat_user_char_info_extractors.cpp
|
||||||
|
stat_user_file_list_builders.cpp)
|
||||||
|
|
||||||
|
SOURCE_GROUP("GUS Modules\\GUS Networking" FILES gus_net.cpp
|
||||||
|
gus_net.h
|
||||||
|
gus_net_commands.cpp
|
||||||
|
gus_net_connection.cpp
|
||||||
|
gus_net_connection.h
|
||||||
|
gus_net_hub.cpp
|
||||||
|
gus_net_hub.h
|
||||||
|
gus_net_implementation.cpp
|
||||||
|
gus_net_implementation.h
|
||||||
|
gus_net_messages.cpp
|
||||||
|
gus_net_messages.h
|
||||||
|
gus_net_remote_module.cpp
|
||||||
|
gus_net_remote_module.h
|
||||||
|
gus_net_types.h)
|
||||||
|
|
||||||
|
SOURCE_GROUP("GUS Modules" FILES gus_module.cpp gus_module.h gus_module_commands.cpp gus_module_factory.cpp gus_module_factory.h gus_module_manager.cpp gus_module_manager.h)
|
||||||
|
|
||||||
|
SOURCE_GROUP("GUS Core" FILES gus_chat.cpp
|
||||||
|
gus_chat.h
|
||||||
|
gus_client_manager.cpp
|
||||||
|
gus_client_manager.h
|
||||||
|
gus_mirror.cpp
|
||||||
|
gus_mirror.h
|
||||||
|
gus_text.cpp
|
||||||
|
gus_text.h
|
||||||
|
gus_utils.cpp
|
||||||
|
gus_utils.h
|
||||||
|
gus_util_commands.cpp)
|
||||||
|
|
||||||
|
ADD_EXECUTABLE(ryzom_general_utilities_service WIN32 ${SRC})
|
||||||
|
|
||||||
INCLUDE_DIRECTORIES(${RZ_SERVER_SRC_DIR} ${LIBXML2_INCLUDE_DIR} ${ZLIB_INCLUDE_DIR} ${NEL_INCLUDE_DIR})
|
INCLUDE_DIRECTORIES(${RZ_SERVER_SRC_DIR} ${LIBXML2_INCLUDE_DIR} ${ZLIB_INCLUDE_DIR} ${NEL_INCLUDE_DIR})
|
||||||
|
|
||||||
|
@ -26,7 +137,7 @@ TARGET_LINK_LIBRARIES(ryzom_general_utilities_service
|
||||||
${ZLIB_LIBRARIES}
|
${ZLIB_LIBRARIES}
|
||||||
nelmisc
|
nelmisc
|
||||||
nelnet
|
nelnet
|
||||||
nelgeorges}
|
nelgeorges
|
||||||
nelligo)
|
nelligo)
|
||||||
|
|
||||||
NL_DEFAULT_PROPS(ryzom_general_utilities_service "Ryzom, Services: General Utilities Service (GUS)")
|
NL_DEFAULT_PROPS(ryzom_general_utilities_service "Ryzom, Services: General Utilities Service (GUS)")
|
||||||
|
|
|
@ -312,7 +312,8 @@ NLMISC_CATEGORISED_COMMAND(EventManager,emUpdateTools,"update tools installed on
|
||||||
// Extra commands that open MFC windows
|
// Extra commands that open MFC windows
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
#ifdef _WINDOWS
|
//#ifdef _WINDOWS
|
||||||
|
#if 0
|
||||||
|
|
||||||
#include "mfc/stdafx.h"
|
#include "mfc/stdafx.h"
|
||||||
#include "nel/misc/win_displayer.h"
|
#include "nel/misc/win_displayer.h"
|
||||||
|
|
|
@ -358,7 +358,7 @@ void CEventManagerImplementation::displayModule() const
|
||||||
for (TShards::const_iterator it=_Shards.begin(); it!=_Shards.end(); ++it)
|
for (TShards::const_iterator it=_Shards.begin(); it!=_Shards.end(); ++it)
|
||||||
{
|
{
|
||||||
CSString s= (*it).first+ ": ";
|
CSString s= (*it).first+ ": ";
|
||||||
for (TShardsMapEntry::iterator it2= (*it).second.begin(); it2!=(*it).second.end(); ++it2)
|
for (TShardsMapEntry::const_iterator it2= (*it).second.begin(); it2!=(*it).second.end(); ++it2)
|
||||||
{
|
{
|
||||||
s+= NLMISC::toString((*it2))+" ";
|
s+= NLMISC::toString((*it2))+" ";
|
||||||
}
|
}
|
||||||
|
@ -478,7 +478,7 @@ void CEventManagerImplementation::startEvent(const NLMISC::CSString& shardName)
|
||||||
|
|
||||||
// build vector of destinations to send the module message to
|
// build vector of destinations to send the module message to
|
||||||
TModuleIdVector moduleIds;
|
TModuleIdVector moduleIds;
|
||||||
for (TShardsMapEntry::iterator it= (*shard).second.begin(); it!= (*shard).second.end(); ++it)
|
for (TShardsMapEntry::const_iterator it= (*shard).second.begin(); it!= (*shard).second.end(); ++it)
|
||||||
{
|
{
|
||||||
nlinfo("Sending event start request to event executor: %d",(*it));
|
nlinfo("Sending event start request to event executor: %d",(*it));
|
||||||
moduleIds.push_back(*it);
|
moduleIds.push_back(*it);
|
||||||
|
@ -502,7 +502,7 @@ void CEventManagerImplementation::stopEvent(const NLMISC::CSString& shardName)
|
||||||
|
|
||||||
// build vector of destinations to send the module message to
|
// build vector of destinations to send the module message to
|
||||||
TModuleIdVector moduleIds;
|
TModuleIdVector moduleIds;
|
||||||
for (TShardsMapEntry::iterator it= (*shard).second.begin(); it!= (*shard).second.end(); ++it)
|
for (TShardsMapEntry::const_iterator it= (*shard).second.begin(); it!= (*shard).second.end(); ++it)
|
||||||
{
|
{
|
||||||
nlinfo("Sending event stop request to event executor: %d",(*it));
|
nlinfo("Sending event stop request to event executor: %d",(*it));
|
||||||
moduleIds.push_back(*it);
|
moduleIds.push_back(*it);
|
||||||
|
@ -569,7 +569,7 @@ void CEventManagerImplementation::peekInstalledEvent(const NLMISC::CSString& sha
|
||||||
|
|
||||||
// build vector of destinations to send the module message to
|
// build vector of destinations to send the module message to
|
||||||
TModuleIdVector moduleIds;
|
TModuleIdVector moduleIds;
|
||||||
for (TShardsMapEntry::iterator it= (*shard).second.begin(); it!= (*shard).second.end(); ++it)
|
for (TShardsMapEntry::const_iterator it= (*shard).second.begin(); it!= (*shard).second.end(); ++it)
|
||||||
{
|
{
|
||||||
nlinfo("Sending history request to event executor: %d",(*it));
|
nlinfo("Sending history request to event executor: %d",(*it));
|
||||||
moduleIds.push_back(*it);
|
moduleIds.push_back(*it);
|
||||||
|
|
|
@ -45,74 +45,6 @@ using namespace NLNET;
|
||||||
|
|
||||||
namespace GUS
|
namespace GUS
|
||||||
{
|
{
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
// cleanPath - convert a path to standardised format
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
CSString cleanPath(const CSString& path,bool addTrailingSlash)
|
|
||||||
{
|
|
||||||
CSString result;
|
|
||||||
|
|
||||||
// split the path up into its component elements
|
|
||||||
CVectorSString pathComponents;
|
|
||||||
path.unquoteIfQuoted().splitByOneOfSeparators("/\\",pathComponents,false,false,true,false,true);
|
|
||||||
|
|
||||||
// iterate over path components collapsing '.' and '..' entries
|
|
||||||
for (uint32 i=0;i<pathComponents.size();++i)
|
|
||||||
{
|
|
||||||
// skip "." entries
|
|
||||||
if (pathComponents[i]==".")
|
|
||||||
{
|
|
||||||
pathComponents[i].clear();
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// deal with ".."
|
|
||||||
if (pathComponents[i]=="..")
|
|
||||||
{
|
|
||||||
// run back through our component list looking for an element to remove
|
|
||||||
uint32 j;
|
|
||||||
for (j=i;j--;)
|
|
||||||
{
|
|
||||||
if (!pathComponents[j].empty())
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
// if we found an element then remove it and the '..' as well
|
|
||||||
if (j!=~0u)
|
|
||||||
{
|
|
||||||
pathComponents[j].clear();
|
|
||||||
pathComponents[i].clear();
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// treat the special case where oriinal path started with a '/' or '//'
|
|
||||||
if (path.left(1)=="/" || path.left(1)=="\\")
|
|
||||||
{
|
|
||||||
result= (path.left(2).right(1)=="/" || path.left(2).right(1)=="\\")? "//": "/";
|
|
||||||
}
|
|
||||||
|
|
||||||
// concatenate the path bits
|
|
||||||
for (uint32 i=0;i<pathComponents.size();++i)
|
|
||||||
{
|
|
||||||
if (!pathComponents[i].empty())
|
|
||||||
{
|
|
||||||
result+= pathComponents[i];
|
|
||||||
result+= '/';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// if we're not supposed to have a trailing slash then get rid of the one that's added by default
|
|
||||||
if (addTrailingSlash==false && path.right(1)!='/' && path.right(1)!='\\')
|
|
||||||
{
|
|
||||||
result.resize(result.size()-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// private routines for layer 5 service tracking
|
// private routines for layer 5 service tracking
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
|
@ -39,27 +39,6 @@ namespace GUS
|
||||||
// handy utilities
|
// handy utilities
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
// Clean a path performing the following operations:
|
|
||||||
// - convert '\\' characters to '/'
|
|
||||||
// - replace '//' strings in the middle of the path with '/'
|
|
||||||
// - remove '.' directory entries
|
|
||||||
// - colapse '..' directory entries (removing parent entries)
|
|
||||||
// - append a final '/' (optionally)
|
|
||||||
//
|
|
||||||
// examples:
|
|
||||||
// - a:/bcd/efg/ => a:/bcd/efg/ (no change)
|
|
||||||
// - a:\bcd\efg => a:/bcd/efg/
|
|
||||||
// - \bcd\\efg => /bcd/efg/
|
|
||||||
// - \\bcd\efg => //bcd/efg/
|
|
||||||
// - \bcd\.\efg => /bcd/efg/
|
|
||||||
// - \bcd\..\efg => /efg/
|
|
||||||
// - bcd\..\efg => efg/
|
|
||||||
// - bcd\..\..\efg => ../efg/
|
|
||||||
// - \bcd\..\..\efg => /efg/ (NOTE: the redundant '..' entry is lost due to leading '\')
|
|
||||||
//
|
|
||||||
NLMISC::CSString cleanPath(const NLMISC::CSString& path,bool addTrailingSlash);
|
|
||||||
|
|
||||||
|
|
||||||
// execute a command on a remote service
|
// execute a command on a remote service
|
||||||
void executeRemoteCommand(NLNET::TServiceId sid,const NLMISC::CSString& cmdLine);
|
void executeRemoteCommand(NLNET::TServiceId sid,const NLMISC::CSString& cmdLine);
|
||||||
void executeRemoteCommand(const char* serviceName,const NLMISC::CSString& cmdLine);
|
void executeRemoteCommand(const char* serviceName,const NLMISC::CSString& cmdLine);
|
||||||
|
|
|
@ -28,11 +28,15 @@
|
||||||
#include "game_share/ryzom_version.h"
|
#include "game_share/ryzom_version.h"
|
||||||
#include "game_share/tick_event_handler.h"
|
#include "game_share/tick_event_handler.h"
|
||||||
#include "game_share/singleton_registry.h"
|
#include "game_share/singleton_registry.h"
|
||||||
#include "game_share/handy_commands.h"
|
#include "server_share/handy_commands.h"
|
||||||
|
|
||||||
// local
|
// local
|
||||||
#include "service_main.h"
|
#include "service_main.h"
|
||||||
|
|
||||||
|
#ifdef NL_OS_WINDOWS
|
||||||
|
# define NOMINMAX
|
||||||
|
# include <windows.h>
|
||||||
|
#endif // NL_OS_WINDOWS
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// namespaces
|
// namespaces
|
||||||
|
|
Loading…
Reference in a new issue