Compare commits

...

15 Commits

93 changed files with 1775 additions and 2203 deletions
+12
View File
@@ -31,6 +31,7 @@
#EQEMU_SANITIZE_LUA_LIBS #EQEMU_SANITIZE_LUA_LIBS
#EQEMU_BUILD_CLIENT_FILES #EQEMU_BUILD_CLIENT_FILES
#EQEMU_MAP_DIR #EQEMU_MAP_DIR
#EQEMU_ENABLE_PROFILING
#We set a fairly new version (as of 2013) because I found finding perl was a bit... buggy on older ones #We set a fairly new version (as of 2013) because I found finding perl was a bit... buggy on older ones
#Can change this if you really want but you should upgrade! #Can change this if you really want but you should upgrade!
@@ -257,6 +258,7 @@ OPTION(EQEMU_BUILD_TESTS "Build utility tests." OFF)
OPTION(EQEMU_BUILD_PERL "Build Perl parser." ON) OPTION(EQEMU_BUILD_PERL "Build Perl parser." ON)
OPTION(EQEMU_BUILD_LUA "Build Lua parser." ON) OPTION(EQEMU_BUILD_LUA "Build Lua parser." ON)
OPTION(EQEMU_BUILD_CLIENT_FILES "Build Client Import/Export Data Programs." ON) OPTION(EQEMU_BUILD_CLIENT_FILES "Build Client Import/Export Data Programs." ON)
OPTION(EQEMU_ENABLE_PROFILING "Enable CPU profiler. Note: will slow down execution time." OFF)
#C++11 stuff #C++11 stuff
IF(NOT MSVC) IF(NOT MSVC)
@@ -331,6 +333,16 @@ IF(EQEMU_BUILD_LUA)
ADD_SUBDIRECTORY(luabind) ADD_SUBDIRECTORY(luabind)
ENDIF(EQEMU_BUILD_LUA) ENDIF(EQEMU_BUILD_LUA)
IF(EQEMU_ENABLE_PROFILING)
ADD_DEFINITIONS(-DEQPERF_ENABLED)
ADD_DEFINITIONS(-DEQP_MULTITHREAD)
INCLUDE_DIRECTORIES("eqperf")
ADD_SUBDIRECTORY(eqperf)
SET(PERF_LIBS eqperf)
ELSE(EQEMU_ENABLE_PROFILING)
SET(PERF_LIBS "")
ENDIF(EQEMU_ENABLE_PROFILING)
IF(EQEMU_BUILD_SERVER OR EQEMU_BUILD_LOGIN OR EQEMU_BUILD_TESTS) IF(EQEMU_BUILD_SERVER OR EQEMU_BUILD_LOGIN OR EQEMU_BUILD_TESTS)
ADD_SUBDIRECTORY(common) ADD_SUBDIRECTORY(common)
ENDIF(EQEMU_BUILD_SERVER OR EQEMU_BUILD_LOGIN OR EQEMU_BUILD_TESTS) ENDIF(EQEMU_BUILD_SERVER OR EQEMU_BUILD_LOGIN OR EQEMU_BUILD_TESTS)
+4 -1
View File
@@ -11,15 +11,17 @@ ADD_EXECUTABLE(export_client_files ${export_sources} ${export_headers})
INSTALL(TARGETS export_client_files RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}) INSTALL(TARGETS export_client_files RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX})
TARGET_LINK_LIBRARIES(export_client_files common debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE} ${ZLIB_LIBRARY}) TARGET_LINK_LIBRARIES(export_client_files common ${PERF_LIBS} debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE} ${ZLIB_LIBRARY})
IF(MSVC) IF(MSVC)
SET_TARGET_PROPERTIES(export_client_files PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF") SET_TARGET_PROPERTIES(export_client_files PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF")
TARGET_LINK_LIBRARIES(export_client_files "Ws2_32.lib") TARGET_LINK_LIBRARIES(export_client_files "Ws2_32.lib")
TARGET_LINK_LIBRARIES(export_client_files "rpcrt4")
ENDIF(MSVC) ENDIF(MSVC)
IF(MINGW) IF(MINGW)
TARGET_LINK_LIBRARIES(export_client_files "WS2_32") TARGET_LINK_LIBRARIES(export_client_files "WS2_32")
TARGET_LINK_LIBRARIES(export_client_files "rpcrt4")
ENDIF(MINGW) ENDIF(MINGW)
IF(UNIX) IF(UNIX)
@@ -30,6 +32,7 @@ IF(UNIX)
TARGET_LINK_LIBRARIES(export_client_files "rt") TARGET_LINK_LIBRARIES(export_client_files "rt")
ENDIF(NOT DARWIN) ENDIF(NOT DARWIN)
TARGET_LINK_LIBRARIES(export_client_files "pthread") TARGET_LINK_LIBRARIES(export_client_files "pthread")
TARGET_LINK_LIBRARIES(export_client_files "uuid")
ADD_DEFINITIONS(-fPIC) ADD_DEFINITIONS(-fPIC)
ENDIF(UNIX) ENDIF(UNIX)
+4 -1
View File
@@ -11,15 +11,17 @@ ADD_EXECUTABLE(import_client_files ${import_sources} ${import_headers})
INSTALL(TARGETS import_client_files RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}) INSTALL(TARGETS import_client_files RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX})
TARGET_LINK_LIBRARIES(import_client_files common debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE} ${ZLIB_LIBRARY}) TARGET_LINK_LIBRARIES(import_client_files common ${PERF_LIBS} debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE} ${ZLIB_LIBRARY})
IF(MSVC) IF(MSVC)
SET_TARGET_PROPERTIES(import_client_files PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF") SET_TARGET_PROPERTIES(import_client_files PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF")
TARGET_LINK_LIBRARIES(import_client_files "Ws2_32.lib") TARGET_LINK_LIBRARIES(import_client_files "Ws2_32.lib")
TARGET_LINK_LIBRARIES(import_client_files "rpcrt4")
ENDIF(MSVC) ENDIF(MSVC)
IF(MINGW) IF(MINGW)
TARGET_LINK_LIBRARIES(import_client_files "WS2_32") TARGET_LINK_LIBRARIES(import_client_files "WS2_32")
TARGET_LINK_LIBRARIES(import_client_files "rpcrt4")
ENDIF(MINGW) ENDIF(MINGW)
IF(UNIX) IF(UNIX)
@@ -30,6 +32,7 @@ IF(UNIX)
TARGET_LINK_LIBRARIES(import_client_files "rt") TARGET_LINK_LIBRARIES(import_client_files "rt")
ENDIF(NOT DARWIN) ENDIF(NOT DARWIN)
TARGET_LINK_LIBRARIES(import_client_files "pthread") TARGET_LINK_LIBRARIES(import_client_files "pthread")
TARGET_LINK_LIBRARIES(import_client_files "uuid")
ADD_DEFINITIONS(-fPIC) ADD_DEFINITIONS(-fPIC)
ENDIF(UNIX) ENDIF(UNIX)
+2 -4
View File
@@ -39,7 +39,6 @@ SET(common_sources
mutex.cpp mutex.cpp
mysql_request_result.cpp mysql_request_result.cpp
mysql_request_row.cpp mysql_request_row.cpp
opcode_map.cpp
opcodemgr.cpp opcodemgr.cpp
packet_dump.cpp packet_dump.cpp
packet_dump_file.cpp packet_dump_file.cpp
@@ -49,7 +48,6 @@ SET(common_sources
proc_launcher.cpp proc_launcher.cpp
ptimer.cpp ptimer.cpp
races.cpp races.cpp
rdtsc.cpp
rulesys.cpp rulesys.cpp
serverinfo.cpp serverinfo.cpp
shareddb.cpp shareddb.cpp
@@ -62,6 +60,7 @@ SET(common_sources
timeoutmgr.cpp timeoutmgr.cpp
timer.cpp timer.cpp
unix.cpp unix.cpp
uuid.cpp
worldconn.cpp worldconn.cpp
xml_parser.cpp xml_parser.cpp
platform.cpp platform.cpp
@@ -158,12 +157,10 @@ SET(common_headers
packet_functions.h packet_functions.h
platform.h platform.h
proc_launcher.h proc_launcher.h
profiler.h
ptimer.h ptimer.h
queue.h queue.h
races.h races.h
random.h random.h
rdtsc.h
rulesys.h rulesys.h
ruletypes.h ruletypes.h
seperator.h seperator.h
@@ -182,6 +179,7 @@ SET(common_headers
types.h types.h
unix.h unix.h
useperl.h useperl.h
uuid.h
version.h version.h
worldconn.h worldconn.h
xml_parser.h xml_parser.h
+90 -20
View File
@@ -57,11 +57,13 @@ Establish a connection to a mysql database with the supplied parameters
Database::Database(const char* host, const char* user, const char* passwd, const char* database, uint32 port) Database::Database(const char* host, const char* user, const char* passwd, const char* database, uint32 port)
{ {
_eqp
DBInitVars(); DBInitVars();
Connect(host, user, passwd, database, port); Connect(host, user, passwd, database, port);
} }
bool Database::Connect(const char* host, const char* user, const char* passwd, const char* database, uint32 port) { bool Database::Connect(const char* host, const char* user, const char* passwd, const char* database, uint32 port) {
_eqp
uint32 errnum= 0; uint32 errnum= 0;
char errbuf[MYSQL_ERRMSG_SIZE]; char errbuf[MYSQL_ERRMSG_SIZE];
if (!Open(host, user, passwd, database, port, &errnum, errbuf)) { if (!Open(host, user, passwd, database, port, &errnum, errbuf)) {
@@ -75,6 +77,7 @@ bool Database::Connect(const char* host, const char* user, const char* passwd, c
} }
void Database::DBInitVars() { void Database::DBInitVars() {
_eqp
varcache_array = 0; varcache_array = 0;
varcache_max = 0; varcache_max = 0;
varcache_lastupdate = 0; varcache_lastupdate = 0;
@@ -86,6 +89,7 @@ void Database::DBInitVars() {
Database::~Database() Database::~Database()
{ {
_eqp
unsigned int x; unsigned int x;
if (varcache_array) { if (varcache_array) {
for (x=0; x<varcache_max; x++) { for (x=0; x<varcache_max; x++) {
@@ -101,7 +105,7 @@ Database::~Database()
Zero will also be returned if there is a database error. Zero will also be returned if there is a database error.
*/ */
uint32 Database::CheckLogin(const char* name, const char* password, int16* oStatus) { uint32 Database::CheckLogin(const char* name, const char* password, int16* oStatus) {
_eqp
if(strlen(name) >= 50 || strlen(password) >= 50) if(strlen(name) >= 50 || strlen(password) >= 50)
return(0); return(0);
@@ -137,6 +141,7 @@ uint32 Database::CheckLogin(const char* name, const char* password, int16* oStat
//Get Banned IP Address List - Only return false if the incoming connection's IP address is not present in the banned_ips table. //Get Banned IP Address List - Only return false if the incoming connection's IP address is not present in the banned_ips table.
bool Database::CheckBannedIPs(const char* loginIP) bool Database::CheckBannedIPs(const char* loginIP)
{ {
_eqp
std::string query = StringFormat("SELECT ip_address FROM Banned_IPs WHERE ip_address='%s'", loginIP); std::string query = StringFormat("SELECT ip_address FROM Banned_IPs WHERE ip_address='%s'", loginIP);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
@@ -153,6 +158,7 @@ bool Database::CheckBannedIPs(const char* loginIP)
} }
bool Database::AddBannedIP(char* bannedIP, const char* notes) { bool Database::AddBannedIP(char* bannedIP, const char* notes) {
_eqp
std::string query = StringFormat("INSERT into Banned_IPs SET ip_address='%s', notes='%s'", bannedIP, notes); std::string query = StringFormat("INSERT into Banned_IPs SET ip_address='%s', notes='%s'", bannedIP, notes);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
if (!results.Success()) { if (!results.Success()) {
@@ -162,6 +168,7 @@ bool Database::AddBannedIP(char* bannedIP, const char* notes) {
} }
bool Database::CheckGMIPs(const char* ip_address, uint32 account_id) { bool Database::CheckGMIPs(const char* ip_address, uint32 account_id) {
_eqp
std::string query = StringFormat("SELECT * FROM `gm_ips` WHERE `ip_address` = '%s' AND `account_id` = %i", ip_address, account_id); std::string query = StringFormat("SELECT * FROM `gm_ips` WHERE `ip_address` = '%s' AND `account_id` = %i", ip_address, account_id);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
@@ -175,17 +182,20 @@ bool Database::AddBannedIP(char* bannedIP, const char* notes) {
} }
bool Database::AddGMIP(char* ip_address, char* name) { bool Database::AddGMIP(char* ip_address, char* name) {
_eqp
std::string query = StringFormat("INSERT into `gm_ips` SET `ip_address` = '%s', `name` = '%s'", ip_address, name); std::string query = StringFormat("INSERT into `gm_ips` SET `ip_address` = '%s', `name` = '%s'", ip_address, name);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
return results.Success(); return results.Success();
} }
void Database::LoginIP(uint32 AccountID, const char* LoginIP) { void Database::LoginIP(uint32 AccountID, const char* LoginIP) {
_eqp
std::string query = StringFormat("INSERT INTO account_ip SET accid=%i, ip='%s' ON DUPLICATE KEY UPDATE count=count+1, lastused=now()", AccountID, LoginIP); std::string query = StringFormat("INSERT INTO account_ip SET accid=%i, ip='%s' ON DUPLICATE KEY UPDATE count=count+1, lastused=now()", AccountID, LoginIP);
QueryDatabase(query); QueryDatabase(query);
} }
int16 Database::CheckStatus(uint32 account_id) { int16 Database::CheckStatus(uint32 account_id) {
_eqp
std::string query = StringFormat("SELECT `status`, UNIX_TIMESTAMP(`suspendeduntil`) as `suspendeduntil`, UNIX_TIMESTAMP() as `current`" std::string query = StringFormat("SELECT `status`, UNIX_TIMESTAMP(`suspendeduntil`) as `suspendeduntil`, UNIX_TIMESTAMP() as `current`"
" FROM `account` WHERE `id` = %i", account_id); " FROM `account` WHERE `id` = %i", account_id);
@@ -215,6 +225,7 @@ int16 Database::CheckStatus(uint32 account_id) {
} }
uint32 Database::CreateAccount(const char* name, const char* password, int16 status, uint32 lsaccount_id) { uint32 Database::CreateAccount(const char* name, const char* password, int16 status, uint32 lsaccount_id) {
_eqp
std::string query; std::string query;
if (password) if (password)
@@ -238,6 +249,7 @@ uint32 Database::CreateAccount(const char* name, const char* password, int16 sta
} }
bool Database::DeleteAccount(const char* name) { bool Database::DeleteAccount(const char* name) {
_eqp
std::string query = StringFormat("DELETE FROM account WHERE name='%s';",name); std::string query = StringFormat("DELETE FROM account WHERE name='%s';",name);
Log.Out(Logs::General, Logs::World_Server, "Account Attempting to be deleted:'%s'", name); Log.Out(Logs::General, Logs::World_Server, "Account Attempting to be deleted:'%s'", name);
@@ -250,6 +262,7 @@ bool Database::DeleteAccount(const char* name) {
} }
bool Database::SetLocalPassword(uint32 accid, const char* password) { bool Database::SetLocalPassword(uint32 accid, const char* password) {
_eqp
std::string query = StringFormat("UPDATE account SET password=MD5('%s') where id=%i;", EscapeString(password).c_str(), accid); std::string query = StringFormat("UPDATE account SET password=MD5('%s') where id=%i;", EscapeString(password).c_str(), accid);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
@@ -262,6 +275,7 @@ bool Database::SetLocalPassword(uint32 accid, const char* password) {
} }
bool Database::SetAccountStatus(const char* name, int16 status) { bool Database::SetAccountStatus(const char* name, int16 status) {
_eqp
std::string query = StringFormat("UPDATE account SET status=%i WHERE name='%s';", status, name); std::string query = StringFormat("UPDATE account SET status=%i WHERE name='%s';", status, name);
std::cout << "Account being GM Flagged:" << name << ", Level: " << (int16) status << std::endl; std::cout << "Account being GM Flagged:" << name << ", Level: " << (int16) status << std::endl;
@@ -282,6 +296,7 @@ bool Database::SetAccountStatus(const char* name, int16 status) {
/* This initially creates the character during character create */ /* This initially creates the character during character create */
bool Database::ReserveName(uint32 account_id, char* name) { bool Database::ReserveName(uint32 account_id, char* name) {
_eqp
std::string query = StringFormat("SELECT `account_id`, `name` FROM `character_data` WHERE `name` = '%s'", name); std::string query = StringFormat("SELECT `account_id`, `name` FROM `character_data` WHERE `name` = '%s'", name);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
for (auto row = results.begin(); row != results.end(); ++row) { for (auto row = results.begin(); row != results.end(); ++row) {
@@ -302,6 +317,7 @@ bool Database::ReserveName(uint32 account_id, char* name) {
returns false on failure, true otherwise returns false on failure, true otherwise
*/ */
bool Database::DeleteCharacter(char *name) { bool Database::DeleteCharacter(char *name) {
_eqp
uint32 charid = 0; uint32 charid = 0;
if(!name || !strlen(name)) { if(!name || !strlen(name)) {
Log.Out(Logs::General, Logs::World_Server, "DeleteCharacter: request to delete without a name (empty char slot)"); Log.Out(Logs::General, Logs::World_Server, "DeleteCharacter: request to delete without a name (empty char slot)");
@@ -359,6 +375,7 @@ bool Database::DeleteCharacter(char *name) {
} }
bool Database::SaveCharacterCreate(uint32 character_id, uint32 account_id, PlayerProfile_Struct* pp){ bool Database::SaveCharacterCreate(uint32 character_id, uint32 account_id, PlayerProfile_Struct* pp){
_eqp
std::string query = StringFormat( std::string query = StringFormat(
"REPLACE INTO `character_data` (" "REPLACE INTO `character_data` ("
"id," "id,"
@@ -678,6 +695,7 @@ bool Database::SaveCharacterCreate(uint32 character_id, uint32 account_id, Playe
/* This only for new Character creation storing */ /* This only for new Character creation storing */
bool Database::StoreCharacter(uint32 account_id, PlayerProfile_Struct* pp, Inventory* inv) { bool Database::StoreCharacter(uint32 account_id, PlayerProfile_Struct* pp, Inventory* inv) {
_eqp
uint32 charid = 0; uint32 charid = 0;
char zone[50]; char zone[50];
float x, y, z; float x, y, z;
@@ -732,6 +750,7 @@ bool Database::StoreCharacter(uint32 account_id, PlayerProfile_Struct* pp, Inven
} }
uint32 Database::GetCharacterID(const char *name) { uint32 Database::GetCharacterID(const char *name) {
_eqp
std::string query = StringFormat("SELECT `id` FROM `character_data` WHERE `name` = '%s'", name); std::string query = StringFormat("SELECT `id` FROM `character_data` WHERE `name` = '%s'", name);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
auto row = results.begin(); auto row = results.begin();
@@ -748,6 +767,7 @@ uint32 Database::GetCharacterID(const char *name) {
Zero will also be returned if there is a database error. Zero will also be returned if there is a database error.
*/ */
uint32 Database::GetAccountIDByChar(const char* charname, uint32* oCharID) { uint32 Database::GetAccountIDByChar(const char* charname, uint32* oCharID) {
_eqp
std::string query = StringFormat("SELECT `account_id`, `id` FROM `character_data` WHERE name='%s'", EscapeString(charname).c_str()); std::string query = StringFormat("SELECT `account_id`, `id` FROM `character_data` WHERE name='%s'", EscapeString(charname).c_str());
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
@@ -772,6 +792,7 @@ uint32 Database::GetAccountIDByChar(const char* charname, uint32* oCharID) {
// Retrieve account_id for a given char_id // Retrieve account_id for a given char_id
uint32 Database::GetAccountIDByChar(uint32 char_id) { uint32 Database::GetAccountIDByChar(uint32 char_id) {
_eqp
std::string query = StringFormat("SELECT `account_id` FROM `character_data` WHERE `id` = %i LIMIT 1", char_id); std::string query = StringFormat("SELECT `account_id` FROM `character_data` WHERE `id` = %i LIMIT 1", char_id);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
if (!results.Success()) { if (!results.Success()) {
@@ -786,6 +807,7 @@ uint32 Database::GetAccountIDByChar(uint32 char_id) {
} }
uint32 Database::GetAccountIDByName(const char* accname, int16* status, uint32* lsid) { uint32 Database::GetAccountIDByName(const char* accname, int16* status, uint32* lsid) {
_eqp
if (!isAlphaNumeric(accname)) if (!isAlphaNumeric(accname))
return 0; return 0;
@@ -817,6 +839,7 @@ uint32 Database::GetAccountIDByName(const char* accname, int16* status, uint32*
} }
void Database::GetAccountName(uint32 accountid, char* name, uint32* oLSAccountID) { void Database::GetAccountName(uint32 accountid, char* name, uint32* oLSAccountID) {
_eqp
std::string query = StringFormat("SELECT `name`, `lsaccount_id` FROM `account` WHERE `id` = '%i'", accountid); std::string query = StringFormat("SELECT `name`, `lsaccount_id` FROM `account` WHERE `id` = '%i'", accountid);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
@@ -837,6 +860,7 @@ void Database::GetAccountName(uint32 accountid, char* name, uint32* oLSAccountID
} }
void Database::GetCharName(uint32 char_id, char* name) { void Database::GetCharName(uint32 char_id, char* name) {
_eqp
std::string query = StringFormat("SELECT `name` FROM `character_data` WHERE id='%i'", char_id); std::string query = StringFormat("SELECT `name` FROM `character_data` WHERE id='%i'", char_id);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
@@ -851,6 +875,7 @@ void Database::GetCharName(uint32 char_id, char* name) {
} }
bool Database::LoadVariables() { bool Database::LoadVariables() {
_eqp
char *query = nullptr; char *query = nullptr;
auto results = QueryDatabase(query, LoadVariables_MQ(&query)); auto results = QueryDatabase(query, LoadVariables_MQ(&query));
@@ -867,12 +892,14 @@ bool Database::LoadVariables() {
uint32 Database::LoadVariables_MQ(char** query) uint32 Database::LoadVariables_MQ(char** query)
{ {
_eqp
return MakeAnyLenString(query, "SELECT varname, value, unix_timestamp() FROM variables where unix_timestamp(ts) >= %d", varcache_lastupdate); return MakeAnyLenString(query, "SELECT varname, value, unix_timestamp() FROM variables where unix_timestamp(ts) >= %d", varcache_lastupdate);
} }
// always returns true? not sure about this. // always returns true? not sure about this.
bool Database::LoadVariables_result(MySQLRequestResult results) bool Database::LoadVariables_result(MySQLRequestResult results)
{ {
_eqp
uint32 i = 0; uint32 i = 0;
LockMutex lock(&Mvarcache); LockMutex lock(&Mvarcache);
@@ -935,6 +962,7 @@ bool Database::LoadVariables_result(MySQLRequestResult results)
// Gets variable from 'variables' table // Gets variable from 'variables' table
bool Database::GetVariable(const char* varname, char* varvalue, uint16 varvalue_len) { bool Database::GetVariable(const char* varname, char* varvalue, uint16 varvalue_len) {
_eqp
varvalue[0] = '\0'; varvalue[0] = '\0';
LockMutex lock(&Mvarcache); LockMutex lock(&Mvarcache);
@@ -956,7 +984,7 @@ bool Database::GetVariable(const char* varname, char* varvalue, uint16 varvalue_
} }
bool Database::SetVariable(const char* varname_in, const char* varvalue_in) { bool Database::SetVariable(const char* varname_in, const char* varvalue_in) {
_eqp
char *varname,*varvalue; char *varname,*varvalue;
varname=(char *)malloc(strlen(varname_in)*2+1); varname=(char *)malloc(strlen(varname_in)*2+1);
@@ -996,6 +1024,7 @@ bool Database::SetVariable(const char* varname_in, const char* varvalue_in) {
uint32 Database::GetMiniLoginAccount(char* ip) uint32 Database::GetMiniLoginAccount(char* ip)
{ {
_eqp
std::string query = StringFormat("SELECT `id` FROM `account` WHERE `minilogin_ip` = '%s'", ip); std::string query = StringFormat("SELECT `id` FROM `account` WHERE `minilogin_ip` = '%s'", ip);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
@@ -1008,7 +1037,7 @@ uint32 Database::GetMiniLoginAccount(char* ip)
// Get zone starting points from DB // Get zone starting points from DB
bool Database::GetSafePoints(const char* short_name, uint32 version, float* safe_x, float* safe_y, float* safe_z, int16* minstatus, uint8* minlevel, char *flag_needed) { bool Database::GetSafePoints(const char* short_name, uint32 version, float* safe_x, float* safe_y, float* safe_z, int16* minstatus, uint8* minlevel, char *flag_needed) {
_eqp
std::string query = StringFormat("SELECT safe_x, safe_y, safe_z, min_status, min_level, flag_needed FROM zone " std::string query = StringFormat("SELECT safe_x, safe_y, safe_z, min_status, min_level, flag_needed FROM zone "
" WHERE short_name='%s' AND (version=%i OR version=0) ORDER BY version DESC", short_name, version); " WHERE short_name='%s' AND (version=%i OR version=0) ORDER BY version DESC", short_name, version);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
@@ -1038,7 +1067,7 @@ bool Database::GetSafePoints(const char* short_name, uint32 version, float* safe
} }
bool Database::GetZoneLongName(const char* short_name, char** long_name, char* file_name, float* safe_x, float* safe_y, float* safe_z, uint32* graveyard_id, uint32* maxclients) { bool Database::GetZoneLongName(const char* short_name, char** long_name, char* file_name, float* safe_x, float* safe_y, float* safe_z, uint32* graveyard_id, uint32* maxclients) {
_eqp
std::string query = StringFormat("SELECT long_name, file_name, safe_x, safe_y, safe_z, graveyard_id, maxclients FROM zone WHERE short_name='%s' AND version=0", short_name); std::string query = StringFormat("SELECT long_name, file_name, safe_x, safe_y, safe_z, graveyard_id, maxclients FROM zone WHERE short_name='%s' AND version=0", short_name);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
@@ -1076,7 +1105,7 @@ bool Database::GetZoneLongName(const char* short_name, char** long_name, char* f
} }
uint32 Database::GetZoneGraveyardID(uint32 zone_id, uint32 version) { uint32 Database::GetZoneGraveyardID(uint32 zone_id, uint32 version) {
_eqp
std::string query = StringFormat("SELECT graveyard_id FROM zone WHERE zoneidnumber='%u' AND (version=%i OR version=0) ORDER BY version DESC", zone_id, version); std::string query = StringFormat("SELECT graveyard_id FROM zone WHERE zoneidnumber='%u' AND (version=%i OR version=0) ORDER BY version DESC", zone_id, version);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
@@ -1091,7 +1120,7 @@ uint32 Database::GetZoneGraveyardID(uint32 zone_id, uint32 version) {
} }
bool Database::GetZoneGraveyard(const uint32 graveyard_id, uint32* graveyard_zoneid, float* graveyard_x, float* graveyard_y, float* graveyard_z, float* graveyard_heading) { bool Database::GetZoneGraveyard(const uint32 graveyard_id, uint32* graveyard_zoneid, float* graveyard_x, float* graveyard_y, float* graveyard_z, float* graveyard_heading) {
_eqp
std::string query = StringFormat("SELECT zone_id, x, y, z, heading FROM graveyard WHERE id=%i", graveyard_id); std::string query = StringFormat("SELECT zone_id, x, y, z, heading FROM graveyard WHERE id=%i", graveyard_id);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
@@ -1119,6 +1148,7 @@ bool Database::GetZoneGraveyard(const uint32 graveyard_id, uint32* graveyard_zon
} }
bool Database::LoadZoneNames() { bool Database::LoadZoneNames() {
_eqp
std::string query("SELECT zoneidnumber, short_name FROM zone"); std::string query("SELECT zoneidnumber, short_name FROM zone");
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
@@ -1139,7 +1169,7 @@ bool Database::LoadZoneNames() {
} }
uint32 Database::GetZoneID(const char* zonename) { uint32 Database::GetZoneID(const char* zonename) {
_eqp
if (zonename == nullptr) if (zonename == nullptr)
return 0; return 0;
@@ -1151,6 +1181,7 @@ uint32 Database::GetZoneID(const char* zonename) {
} }
const char* Database::GetZoneName(uint32 zoneID, bool ErrorUnknown) { const char* Database::GetZoneName(uint32 zoneID, bool ErrorUnknown) {
_eqp
auto iter = zonename_array.find(zoneID); auto iter = zonename_array.find(zoneID);
if (iter != zonename_array.end()) if (iter != zonename_array.end())
@@ -1163,7 +1194,7 @@ const char* Database::GetZoneName(uint32 zoneID, bool ErrorUnknown) {
} }
uint8 Database::GetPEQZone(uint32 zoneID, uint32 version){ uint8 Database::GetPEQZone(uint32 zoneID, uint32 version){
_eqp
std::string query = StringFormat("SELECT peqzone from zone where zoneidnumber='%i' AND (version=%i OR version=0) ORDER BY version DESC", zoneID, version); std::string query = StringFormat("SELECT peqzone from zone where zoneidnumber='%i' AND (version=%i OR version=0) ORDER BY version DESC", zoneID, version);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
@@ -1181,6 +1212,7 @@ uint8 Database::GetPEQZone(uint32 zoneID, uint32 version){
bool Database::CheckNameFilter(const char* name, bool surname) bool Database::CheckNameFilter(const char* name, bool surname)
{ {
_eqp
std::string str_name = name; std::string str_name = name;
if(surname) if(surname)
@@ -1257,7 +1289,7 @@ bool Database::CheckNameFilter(const char* name, bool surname)
} }
bool Database::AddToNameFilter(const char* name) { bool Database::AddToNameFilter(const char* name) {
_eqp
std::string query = StringFormat("INSERT INTO name_filter (name) values ('%s')", name); std::string query = StringFormat("INSERT INTO name_filter (name) values ('%s')", name);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
@@ -1273,6 +1305,7 @@ bool Database::AddToNameFilter(const char* name) {
} }
uint32 Database::GetAccountIDFromLSID(uint32 iLSID, char* oAccountName, int16* oStatus) { uint32 Database::GetAccountIDFromLSID(uint32 iLSID, char* oAccountName, int16* oStatus) {
_eqp
uint32 account_id = 0; uint32 account_id = 0;
std::string query = StringFormat("SELECT id, name, status FROM account WHERE lsaccount_id=%i", iLSID); std::string query = StringFormat("SELECT id, name, status FROM account WHERE lsaccount_id=%i", iLSID);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
@@ -1297,7 +1330,7 @@ uint32 Database::GetAccountIDFromLSID(uint32 iLSID, char* oAccountName, int16* o
} }
void Database::GetAccountFromID(uint32 id, char* oAccountName, int16* oStatus) { void Database::GetAccountFromID(uint32 id, char* oAccountName, int16* oStatus) {
_eqp
std::string query = StringFormat("SELECT name, status FROM account WHERE id=%i", id); std::string query = StringFormat("SELECT name, status FROM account WHERE id=%i", id);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
@@ -1317,10 +1350,12 @@ void Database::GetAccountFromID(uint32 id, char* oAccountName, int16* oStatus) {
} }
void Database::ClearMerchantTemp(){ void Database::ClearMerchantTemp(){
_eqp
QueryDatabase("DELETE FROM merchantlist_temp"); QueryDatabase("DELETE FROM merchantlist_temp");
} }
bool Database::UpdateName(const char* oldname, const char* newname) { bool Database::UpdateName(const char* oldname, const char* newname) {
_eqp
std::cout << "Renaming " << oldname << " to " << newname << "..." << std::endl; std::cout << "Renaming " << oldname << " to " << newname << "..." << std::endl;
std::string query = StringFormat("UPDATE `character_data` SET `name` = '%s' WHERE `name` = '%s';", newname, oldname); std::string query = StringFormat("UPDATE `character_data` SET `name` = '%s' WHERE `name` = '%s';", newname, oldname);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
@@ -1336,6 +1371,7 @@ bool Database::UpdateName(const char* oldname, const char* newname) {
// If the name is used or an error occurs, it returns false, otherwise it returns true // If the name is used or an error occurs, it returns false, otherwise it returns true
bool Database::CheckUsedName(const char* name) { bool Database::CheckUsedName(const char* name) {
_eqp
std::string query = StringFormat("SELECT `id` FROM `character_data` WHERE `name` = '%s'", name); std::string query = StringFormat("SELECT `id` FROM `character_data` WHERE `name` = '%s'", name);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
if (!results.Success()) { if (!results.Success()) {
@@ -1349,6 +1385,7 @@ bool Database::CheckUsedName(const char* name) {
} }
uint8 Database::GetServerType() { uint8 Database::GetServerType() {
_eqp
std::string query("SELECT `value` FROM `variables` WHERE `varname` = 'ServerType' LIMIT 1"); std::string query("SELECT `value` FROM `variables` WHERE `varname` = 'ServerType' LIMIT 1");
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
if (!results.Success()) { if (!results.Success()) {
@@ -1363,6 +1400,7 @@ uint8 Database::GetServerType() {
} }
bool Database::MoveCharacterToZone(const char* charname, const char* zonename, uint32 zoneid) { bool Database::MoveCharacterToZone(const char* charname, const char* zonename, uint32 zoneid) {
_eqp
if(zonename == nullptr || strlen(zonename) == 0) if(zonename == nullptr || strlen(zonename) == 0)
return false; return false;
@@ -1380,10 +1418,12 @@ bool Database::MoveCharacterToZone(const char* charname, const char* zonename, u
} }
bool Database::MoveCharacterToZone(const char* charname, const char* zonename) { bool Database::MoveCharacterToZone(const char* charname, const char* zonename) {
_eqp
return MoveCharacterToZone(charname, zonename, GetZoneID(zonename)); return MoveCharacterToZone(charname, zonename, GetZoneID(zonename));
} }
bool Database::MoveCharacterToZone(uint32 iCharID, const char* iZonename) { bool Database::MoveCharacterToZone(uint32 iCharID, const char* iZonename) {
_eqp
std::string query = StringFormat("UPDATE `character_data` SET `zone_id` = %i, `x` = -1, `y` = -1, `z` = -1 WHERE `id` = %i", iZonename, GetZoneID(iZonename), iCharID); std::string query = StringFormat("UPDATE `character_data` SET `zone_id` = %i, `x` = -1, `y` = -1, `z` = -1 WHERE `id` = %i", iZonename, GetZoneID(iZonename), iCharID);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
@@ -1395,6 +1435,7 @@ bool Database::MoveCharacterToZone(uint32 iCharID, const char* iZonename) {
} }
bool Database::SetHackerFlag(const char* accountname, const char* charactername, const char* hacked) { bool Database::SetHackerFlag(const char* accountname, const char* charactername, const char* hacked) {
_eqp
std::string query = StringFormat("INSERT INTO `hackers` (account, name, hacked) values('%s','%s','%s')", accountname, charactername, hacked); std::string query = StringFormat("INSERT INTO `hackers` (account, name, hacked) values('%s','%s','%s')", accountname, charactername, hacked);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
@@ -1406,6 +1447,7 @@ bool Database::SetHackerFlag(const char* accountname, const char* charactername,
} }
bool Database::SetMQDetectionFlag(const char* accountname, const char* charactername, const char* hacked, const char* zone) { bool Database::SetMQDetectionFlag(const char* accountname, const char* charactername, const char* hacked, const char* zone) {
_eqp
//Utilize the "hacker" table, but also give zone information. //Utilize the "hacker" table, but also give zone information.
std::string query = StringFormat("INSERT INTO hackers(account,name,hacked,zone) values('%s','%s','%s','%s')", accountname, charactername, hacked, zone); std::string query = StringFormat("INSERT INTO hackers(account,name,hacked,zone) values('%s','%s','%s','%s')", accountname, charactername, hacked, zone);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
@@ -1420,6 +1462,7 @@ bool Database::SetMQDetectionFlag(const char* accountname, const char* character
uint8 Database::GetRaceSkill(uint8 skillid, uint8 in_race) uint8 Database::GetRaceSkill(uint8 skillid, uint8 in_race)
{ {
_eqp
uint16 race_cap = 0; uint16 race_cap = 0;
//Check for a racial cap! //Check for a racial cap!
@@ -1438,6 +1481,7 @@ uint8 Database::GetRaceSkill(uint8 skillid, uint8 in_race)
uint8 Database::GetSkillCap(uint8 skillid, uint8 in_race, uint8 in_class, uint16 in_level) uint8 Database::GetSkillCap(uint8 skillid, uint8 in_race, uint8 in_class, uint16 in_level)
{ {
_eqp
uint8 skill_level = 0, skill_formula = 0; uint8 skill_level = 0, skill_formula = 0;
uint16 base_cap = 0, skill_cap = 0, skill_cap2 = 0, skill_cap3 = 0; uint16 base_cap = 0, skill_cap = 0, skill_cap2 = 0, skill_cap3 = 0;
@@ -1487,6 +1531,7 @@ uint8 Database::GetSkillCap(uint8 skillid, uint8 in_race, uint8 in_class, uint16
} }
uint32 Database::GetCharacterInfo(const char* iName, uint32* oAccID, uint32* oZoneID, uint32* oInstanceID, float* oX, float* oY, float* oZ) { uint32 Database::GetCharacterInfo(const char* iName, uint32* oAccID, uint32* oZoneID, uint32* oInstanceID, float* oX, float* oY, float* oZ) {
_eqp
std::string query = StringFormat("SELECT `id`, `account_id`, `zone_id`, `zone_instance`, `x`, `y`, `z` FROM `character_data` WHERE `name` = '%s'", iName); std::string query = StringFormat("SELECT `id`, `account_id`, `zone_id`, `zone_instance`, `x`, `y`, `z` FROM `character_data` WHERE `name` = '%s'", iName);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
@@ -1510,7 +1555,7 @@ uint32 Database::GetCharacterInfo(const char* iName, uint32* oAccID, uint32* oZo
} }
bool Database::UpdateLiveChar(char* charname,uint32 lsaccount_id) { bool Database::UpdateLiveChar(char* charname,uint32 lsaccount_id) {
_eqp
std::string query = StringFormat("UPDATE account SET charname='%s' WHERE id=%i;",charname, lsaccount_id); std::string query = StringFormat("UPDATE account SET charname='%s' WHERE id=%i;",charname, lsaccount_id);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
@@ -1522,7 +1567,7 @@ bool Database::UpdateLiveChar(char* charname,uint32 lsaccount_id) {
} }
bool Database::GetLiveChar(uint32 account_id, char* cname) { bool Database::GetLiveChar(uint32 account_id, char* cname) {
_eqp
std::string query = StringFormat("SELECT charname FROM account WHERE id=%i", account_id); std::string query = StringFormat("SELECT charname FROM account WHERE id=%i", account_id);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
@@ -1541,26 +1586,31 @@ bool Database::GetLiveChar(uint32 account_id, char* cname) {
} }
void Database::SetLFP(uint32 CharID, bool LFP) { void Database::SetLFP(uint32 CharID, bool LFP) {
_eqp
std::string query = StringFormat("UPDATE `character_data` SET `lfp` = %i WHERE `id` = %i",LFP, CharID); std::string query = StringFormat("UPDATE `character_data` SET `lfp` = %i WHERE `id` = %i",LFP, CharID);
QueryDatabase(query); QueryDatabase(query);
} }
void Database::SetLoginFlags(uint32 CharID, bool LFP, bool LFG, uint8 firstlogon) { void Database::SetLoginFlags(uint32 CharID, bool LFP, bool LFG, uint8 firstlogon) {
_eqp
std::string query = StringFormat("update `character_data` SET `lfp` = %i, `lfg` = %i, `firstlogon` = %i WHERE `id` = %i",LFP, LFG, firstlogon, CharID); std::string query = StringFormat("update `character_data` SET `lfp` = %i, `lfg` = %i, `firstlogon` = %i WHERE `id` = %i",LFP, LFG, firstlogon, CharID);
QueryDatabase(query); QueryDatabase(query);
} }
void Database::SetLFG(uint32 CharID, bool LFG) { void Database::SetLFG(uint32 CharID, bool LFG) {
_eqp
std::string query = StringFormat("update `character_data` SET `lfg` = %i WHERE `id` = %i",LFG, CharID); std::string query = StringFormat("update `character_data` SET `lfg` = %i WHERE `id` = %i",LFG, CharID);
QueryDatabase(query); QueryDatabase(query);
} }
void Database::SetFirstLogon(uint32 CharID, uint8 firstlogon) { void Database::SetFirstLogon(uint32 CharID, uint8 firstlogon) {
_eqp
std::string query = StringFormat( "UPDATE `character_data` SET `firstlogon` = %i WHERE `id` = %i",firstlogon, CharID); std::string query = StringFormat( "UPDATE `character_data` SET `firstlogon` = %i WHERE `id` = %i",firstlogon, CharID);
QueryDatabase(query); QueryDatabase(query);
} }
void Database::AddReport(std::string who, std::string against, std::string lines) { void Database::AddReport(std::string who, std::string against, std::string lines) {
_eqp
char *escape_str = new char[lines.size()*2+1]; char *escape_str = new char[lines.size()*2+1];
DoEscapeString(escape_str, lines.c_str(), lines.size()); DoEscapeString(escape_str, lines.c_str(), lines.size());
@@ -1570,6 +1620,7 @@ void Database::AddReport(std::string who, std::string against, std::string lines
} }
void Database::SetGroupID(const char* name, uint32 id, uint32 charid, uint32 ismerc) { void Database::SetGroupID(const char* name, uint32 id, uint32 charid, uint32 ismerc) {
_eqp
std::string query; std::string query;
if (id == 0) { if (id == 0) {
// removing from group // removing from group
@@ -1589,12 +1640,14 @@ void Database::SetGroupID(const char* name, uint32 id, uint32 charid, uint32 ism
void Database::ClearAllGroups(void) void Database::ClearAllGroups(void)
{ {
_eqp
std::string query("DELETE FROM `group_id`"); std::string query("DELETE FROM `group_id`");
QueryDatabase(query); QueryDatabase(query);
return; return;
} }
void Database::ClearGroup(uint32 gid) { void Database::ClearGroup(uint32 gid) {
_eqp
ClearGroupLeader(gid); ClearGroupLeader(gid);
if(gid == 0) if(gid == 0)
@@ -1610,6 +1663,7 @@ void Database::ClearGroup(uint32 gid) {
} }
uint32 Database::GetGroupID(const char* name){ uint32 Database::GetGroupID(const char* name){
_eqp
std::string query = StringFormat("SELECT groupid from group_id where name='%s'", name); std::string query = StringFormat("SELECT groupid from group_id where name='%s'", name);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
@@ -1620,7 +1674,7 @@ uint32 Database::GetGroupID(const char* name){
if (results.RowCount() == 0) if (results.RowCount() == 0)
{ {
// Commenting this out until logging levels can prevent this from going to console // Commenting this out until logging levels can prevent this from going to console
//Log.Out(Logs::General, Logs::None,, "Character not in a group: %s", name); //Log.Out(Logs::General, Logs::None, "Character not in a group: %s", name);
return 0; return 0;
} }
@@ -1631,6 +1685,7 @@ uint32 Database::GetGroupID(const char* name){
/* Is this really getting used properly... A half implementation ? Akkadius */ /* Is this really getting used properly... A half implementation ? Akkadius */
char* Database::GetGroupLeaderForLogin(const char* name, char* leaderbuf) { char* Database::GetGroupLeaderForLogin(const char* name, char* leaderbuf) {
_eqp
strcpy(leaderbuf, ""); strcpy(leaderbuf, "");
uint32 group_id = 0; uint32 group_id = 0;
@@ -1655,6 +1710,7 @@ char* Database::GetGroupLeaderForLogin(const char* name, char* leaderbuf) {
} }
void Database::SetGroupLeaderName(uint32 gid, const char* name) { void Database::SetGroupLeaderName(uint32 gid, const char* name) {
_eqp
std::string query = StringFormat("UPDATE group_leaders SET leadername = '%s' WHERE gid = %u", EscapeString(name).c_str(), gid); std::string query = StringFormat("UPDATE group_leaders SET leadername = '%s' WHERE gid = %u", EscapeString(name).c_str(), gid);
auto result = QueryDatabase(query); auto result = QueryDatabase(query);
@@ -1673,6 +1729,7 @@ void Database::SetGroupLeaderName(uint32 gid, const char* name) {
char *Database::GetGroupLeadershipInfo(uint32 gid, char* leaderbuf, char* maintank, char* assist, char* puller, char *marknpc, char *mentoree, int *mentor_percent, GroupLeadershipAA_Struct* GLAA) char *Database::GetGroupLeadershipInfo(uint32 gid, char* leaderbuf, char* maintank, char* assist, char* puller, char *marknpc, char *mentoree, int *mentor_percent, GroupLeadershipAA_Struct* GLAA)
{ {
_eqp
std::string query = StringFormat("SELECT `leadername`, `maintank`, `assist`, `puller`, `marknpc`, `mentoree`, `mentor_percent`, `leadershipaa` FROM `group_leaders` WHERE `gid` = %lu",(unsigned long)gid); std::string query = StringFormat("SELECT `leadername`, `maintank`, `assist`, `puller`, `marknpc`, `mentoree`, `mentor_percent`, `leadershipaa` FROM `group_leaders` WHERE `gid` = %lu",(unsigned long)gid);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
@@ -1732,6 +1789,7 @@ char *Database::GetGroupLeadershipInfo(uint32 gid, char* leaderbuf, char* mainta
// Clearing all group leaders // Clearing all group leaders
void Database::ClearAllGroupLeaders(void) { void Database::ClearAllGroupLeaders(void) {
_eqp
std::string query("DELETE from group_leaders"); std::string query("DELETE from group_leaders");
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
@@ -1742,7 +1800,7 @@ void Database::ClearAllGroupLeaders(void) {
} }
void Database::ClearGroupLeader(uint32 gid) { void Database::ClearGroupLeader(uint32 gid) {
_eqp
if(gid == 0) if(gid == 0)
{ {
ClearAllGroupLeaders(); ClearAllGroupLeaders();
@@ -1757,7 +1815,7 @@ void Database::ClearGroupLeader(uint32 gid) {
} }
uint8 Database::GetAgreementFlag(uint32 acctid) { uint8 Database::GetAgreementFlag(uint32 acctid) {
_eqp
std::string query = StringFormat("SELECT rulesflag FROM account WHERE id=%i",acctid); std::string query = StringFormat("SELECT rulesflag FROM account WHERE id=%i",acctid);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
@@ -1773,11 +1831,13 @@ uint8 Database::GetAgreementFlag(uint32 acctid) {
} }
void Database::SetAgreementFlag(uint32 acctid) { void Database::SetAgreementFlag(uint32 acctid) {
_eqp
std::string query = StringFormat("UPDATE account SET rulesflag=1 where id=%i", acctid); std::string query = StringFormat("UPDATE account SET rulesflag=1 where id=%i", acctid);
QueryDatabase(query); QueryDatabase(query);
} }
void Database::ClearRaid(uint32 rid) { void Database::ClearRaid(uint32 rid) {
_eqp
if(rid == 0) if(rid == 0)
{ {
//clear all raids //clear all raids
@@ -1794,7 +1854,7 @@ void Database::ClearRaid(uint32 rid) {
} }
void Database::ClearAllRaids(void) { void Database::ClearAllRaids(void) {
_eqp
std::string query("delete from raid_members"); std::string query("delete from raid_members");
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
@@ -1804,7 +1864,7 @@ void Database::ClearAllRaids(void) {
void Database::ClearAllRaidDetails(void) void Database::ClearAllRaidDetails(void)
{ {
_eqp
std::string query("delete from raid_details"); std::string query("delete from raid_details");
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
@@ -1813,7 +1873,7 @@ void Database::ClearAllRaidDetails(void)
} }
void Database::ClearRaidDetails(uint32 rid) { void Database::ClearRaidDetails(uint32 rid) {
_eqp
if(rid == 0) if(rid == 0)
{ {
//clear all raids //clear all raids
@@ -1832,7 +1892,8 @@ void Database::ClearRaidDetails(uint32 rid) {
// returns 0 on error or no raid for that character, or // returns 0 on error or no raid for that character, or
// the raid id that the character is a member of. // the raid id that the character is a member of.
uint32 Database::GetRaidID(const char* name) uint32 Database::GetRaidID(const char* name)
{ {
_eqp
std::string query = StringFormat("SELECT `raidid` FROM `raid_members` WHERE `name` = '%s'", name); std::string query = StringFormat("SELECT `raidid` FROM `raid_members` WHERE `name` = '%s'", name);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
@@ -1853,6 +1914,7 @@ uint32 Database::GetRaidID(const char* name)
const char* Database::GetRaidLeaderName(uint32 raid_id) const char* Database::GetRaidLeaderName(uint32 raid_id)
{ {
_eqp
// Would be a good idea to fix this to be a passed in variable and // Would be a good idea to fix this to be a passed in variable and
// make the caller responsible. static local variables like this are // make the caller responsible. static local variables like this are
// not guaranteed to be thread safe (nor is the internal guard // not guaranteed to be thread safe (nor is the internal guard
@@ -1884,6 +1946,7 @@ const char* Database::GetRaidLeaderName(uint32 raid_id)
void Database::GetGroupLeadershipInfo(uint32 gid, uint32 rid, char *maintank, void Database::GetGroupLeadershipInfo(uint32 gid, uint32 rid, char *maintank,
char *assist, char *puller, char *marknpc, char *mentoree, int *mentor_percent, GroupLeadershipAA_Struct *GLAA) char *assist, char *puller, char *marknpc, char *mentoree, int *mentor_percent, GroupLeadershipAA_Struct *GLAA)
{ {
_eqp
std::string query = StringFormat( std::string query = StringFormat(
"SELECT maintank, assist, puller, marknpc, mentoree, mentor_percent, leadershipaa FROM raid_leaders WHERE gid = %lu AND rid = %lu", "SELECT maintank, assist, puller, marknpc, mentoree, mentor_percent, leadershipaa FROM raid_leaders WHERE gid = %lu AND rid = %lu",
(unsigned long)gid, (unsigned long)rid); (unsigned long)gid, (unsigned long)rid);
@@ -1941,6 +2004,7 @@ void Database::GetGroupLeadershipInfo(uint32 gid, uint32 rid, char *maintank,
void Database::GetRaidLeadershipInfo(uint32 rid, char *maintank, void Database::GetRaidLeadershipInfo(uint32 rid, char *maintank,
char *assist, char *puller, char *marknpc, RaidLeadershipAA_Struct *RLAA) char *assist, char *puller, char *marknpc, RaidLeadershipAA_Struct *RLAA)
{ {
_eqp
std::string query = StringFormat( std::string query = StringFormat(
"SELECT maintank, assist, puller, marknpc, leadershipaa FROM raid_leaders WHERE gid = %lu AND rid = %lu", "SELECT maintank, assist, puller, marknpc, leadershipaa FROM raid_leaders WHERE gid = %lu AND rid = %lu",
(unsigned long)0xFFFFFFFF, (unsigned long)rid); (unsigned long)0xFFFFFFFF, (unsigned long)rid);
@@ -1984,6 +2048,7 @@ void Database::GetRaidLeadershipInfo(uint32 rid, char *maintank,
void Database::SetRaidGroupLeaderInfo(uint32 gid, uint32 rid) void Database::SetRaidGroupLeaderInfo(uint32 gid, uint32 rid)
{ {
_eqp
std::string query = StringFormat("UPDATE raid_leaders SET leadershipaa = '' WHERE gid = %lu AND rid = %lu", std::string query = StringFormat("UPDATE raid_leaders SET leadershipaa = '' WHERE gid = %lu AND rid = %lu",
(unsigned long)gid, (unsigned long)rid); (unsigned long)gid, (unsigned long)rid);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
@@ -2001,6 +2066,7 @@ void Database::SetRaidGroupLeaderInfo(uint32 gid, uint32 rid)
// Clearing all raid leaders // Clearing all raid leaders
void Database::ClearAllRaidLeaders(void) void Database::ClearAllRaidLeaders(void)
{ {
_eqp
std::string query("DELETE from raid_leaders"); std::string query("DELETE from raid_leaders");
QueryDatabase(query); QueryDatabase(query);
return; return;
@@ -2008,6 +2074,7 @@ void Database::ClearAllRaidLeaders(void)
void Database::ClearRaidLeader(uint32 gid, uint32 rid) void Database::ClearRaidLeader(uint32 gid, uint32 rid)
{ {
_eqp
if (rid == 0) { if (rid == 0) {
ClearAllRaidLeaders(); ClearAllRaidLeaders();
return; return;
@@ -2019,7 +2086,7 @@ void Database::ClearRaidLeader(uint32 gid, uint32 rid)
void Database::UpdateAdventureStatsEntry(uint32 char_id, uint8 theme, bool win) void Database::UpdateAdventureStatsEntry(uint32 char_id, uint8 theme, bool win)
{ {
_eqp
std::string field; std::string field;
switch(theme) switch(theme)
@@ -2072,6 +2139,7 @@ void Database::UpdateAdventureStatsEntry(uint32 char_id, uint8 theme, bool win)
bool Database::GetAdventureStats(uint32 char_id, AdventureStats_Struct *as) bool Database::GetAdventureStats(uint32 char_id, AdventureStats_Struct *as)
{ {
_eqp
std::string query = StringFormat( std::string query = StringFormat(
"SELECT " "SELECT "
"`guk_wins`, " "`guk_wins`, "
@@ -2118,6 +2186,7 @@ bool Database::GetAdventureStats(uint32 char_id, AdventureStats_Struct *as)
uint32 Database::GetGuildIDByCharID(uint32 character_id) uint32 Database::GetGuildIDByCharID(uint32 character_id)
{ {
_eqp
std::string query = StringFormat("SELECT guild_id FROM guild_members WHERE char_id='%i'", character_id); std::string query = StringFormat("SELECT guild_id FROM guild_members WHERE char_id='%i'", character_id);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
@@ -2133,6 +2202,7 @@ uint32 Database::GetGuildIDByCharID(uint32 character_id)
void Database::LoadLogSettings(EQEmuLogSys::LogSettings* log_settings) void Database::LoadLogSettings(EQEmuLogSys::LogSettings* log_settings)
{ {
_eqp
std::string query = std::string query =
"SELECT " "SELECT "
"log_category_id, " "log_category_id, "
+22
View File
@@ -50,6 +50,7 @@ EmuTCPConnection::EmuTCPConnection(uint32 ID, EmuTCPServer* iServer, SOCKET in_s
keepalive_timer(SERVER_TIMEOUT), keepalive_timer(SERVER_TIMEOUT),
timeout_timer(SERVER_TIMEOUT * 2) timeout_timer(SERVER_TIMEOUT * 2)
{ {
_eqp
id = 0; id = 0;
Server = nullptr; Server = nullptr;
pOldFormat = iOldFormat; pOldFormat = iOldFormat;
@@ -76,6 +77,7 @@ EmuTCPConnection::EmuTCPConnection(bool iOldFormat, EmuTCPServer* iRelayServer,
keepalive_timer(SERVER_TIMEOUT), keepalive_timer(SERVER_TIMEOUT),
timeout_timer(SERVER_TIMEOUT * 2) timeout_timer(SERVER_TIMEOUT * 2)
{ {
_eqp
Server = iRelayServer; Server = iRelayServer;
if (Server) if (Server)
RelayServer = true; RelayServer = true;
@@ -98,6 +100,7 @@ EmuTCPConnection::EmuTCPConnection(uint32 ID, EmuTCPServer* iServer, EmuTCPConne
keepalive_timer(SERVER_TIMEOUT), keepalive_timer(SERVER_TIMEOUT),
timeout_timer(SERVER_TIMEOUT * 2) timeout_timer(SERVER_TIMEOUT * 2)
{ {
_eqp
Server = iServer; Server = iServer;
RelayLink = iRelayLink; RelayLink = iRelayLink;
RelayServer = true; RelayServer = true;
@@ -117,6 +120,7 @@ EmuTCPConnection::~EmuTCPConnection() {
} }
EmuTCPNetPacket_Struct* EmuTCPConnection::MakePacket(ServerPacket* pack, uint32 iDestination) { EmuTCPNetPacket_Struct* EmuTCPConnection::MakePacket(ServerPacket* pack, uint32 iDestination) {
_eqp
int32 size = sizeof(EmuTCPNetPacket_Struct) + pack->size; int32 size = sizeof(EmuTCPNetPacket_Struct) + pack->size;
if (pack->compressed) { if (pack->compressed) {
size += 4; size += 4;
@@ -144,6 +148,7 @@ EmuTCPNetPacket_Struct* EmuTCPConnection::MakePacket(ServerPacket* pack, uint32
} }
SPackSendQueue* EmuTCPConnection::MakeOldPacket(ServerPacket* pack) { SPackSendQueue* EmuTCPConnection::MakeOldPacket(ServerPacket* pack) {
_eqp
SPackSendQueue* spsq = (SPackSendQueue*) new uchar[sizeof(SPackSendQueue) + pack->size + 4]; SPackSendQueue* spsq = (SPackSendQueue*) new uchar[sizeof(SPackSendQueue) + pack->size + 4];
if (pack->pBuffer != 0 && pack->size != 0) if (pack->pBuffer != 0 && pack->size != 0)
memcpy((char *) &spsq->buffer[4], (char *) pack->pBuffer, pack->size); memcpy((char *) &spsq->buffer[4], (char *) pack->pBuffer, pack->size);
@@ -154,6 +159,7 @@ SPackSendQueue* EmuTCPConnection::MakeOldPacket(ServerPacket* pack) {
} }
bool EmuTCPConnection::SendPacket(ServerPacket* pack, uint32 iDestination) { bool EmuTCPConnection::SendPacket(ServerPacket* pack, uint32 iDestination) {
_eqp
if (!Connected()) if (!Connected())
return false; return false;
eTCPMode tmp = GetMode(); eTCPMode tmp = GetMode();
@@ -214,6 +220,7 @@ bool EmuTCPConnection::SendPacket(ServerPacket* pack, uint32 iDestination) {
} }
bool EmuTCPConnection::SendPacket(EmuTCPNetPacket_Struct* tnps) { bool EmuTCPConnection::SendPacket(EmuTCPNetPacket_Struct* tnps) {
_eqp
if (RemoteID) if (RemoteID)
return false; return false;
if (!Connected()) if (!Connected())
@@ -254,6 +261,7 @@ bool EmuTCPConnection::SendPacket(EmuTCPNetPacket_Struct* tnps) {
} }
ServerPacket* EmuTCPConnection::PopPacket() { ServerPacket* EmuTCPConnection::PopPacket() {
_eqp
ServerPacket* ret; ServerPacket* ret;
if (!MOutQueueLock.trylock()) if (!MOutQueueLock.trylock())
return nullptr; return nullptr;
@@ -263,12 +271,14 @@ ServerPacket* EmuTCPConnection::PopPacket() {
} }
void EmuTCPConnection::InModeQueuePush(EmuTCPNetPacket_Struct* tnps) { void EmuTCPConnection::InModeQueuePush(EmuTCPNetPacket_Struct* tnps) {
_eqp
MSendQueue.lock(); MSendQueue.lock();
InModeQueue.push(tnps); InModeQueue.push(tnps);
MSendQueue.unlock(); MSendQueue.unlock();
} }
void EmuTCPConnection::OutQueuePush(ServerPacket* pack) { void EmuTCPConnection::OutQueuePush(ServerPacket* pack) {
_eqp
MOutQueueLock.lock(); MOutQueueLock.lock();
OutQueue.push(pack); OutQueue.push(pack);
MOutQueueLock.unlock(); MOutQueueLock.unlock();
@@ -276,6 +286,7 @@ void EmuTCPConnection::OutQueuePush(ServerPacket* pack) {
bool EmuTCPConnection::LineOutQueuePush(char* line) { bool EmuTCPConnection::LineOutQueuePush(char* line) {
_eqp
#if defined(GOTFRAGS) && 0 #if defined(GOTFRAGS) && 0
if (strcmp(line, "**CRASHME**") == 0) { if (strcmp(line, "**CRASHME**") == 0) {
int i = 0; int i = 0;
@@ -369,6 +380,7 @@ bool EmuTCPConnection::LineOutQueuePush(char* line) {
} }
void EmuTCPConnection::Disconnect(bool iSendRelayDisconnect) { void EmuTCPConnection::Disconnect(bool iSendRelayDisconnect) {
_eqp
TCPConnection::Disconnect(); TCPConnection::Disconnect();
if (RelayLink) { if (RelayLink) {
@@ -378,6 +390,7 @@ void EmuTCPConnection::Disconnect(bool iSendRelayDisconnect) {
} }
bool EmuTCPConnection::ConnectIP(uint32 irIP, uint16 irPort, char* errbuf) { bool EmuTCPConnection::ConnectIP(uint32 irIP, uint16 irPort, char* errbuf) {
_eqp
if(!TCPConnection::ConnectIP(irIP, irPort, errbuf)) if(!TCPConnection::ConnectIP(irIP, irPort, errbuf))
return(false); return(false);
@@ -432,6 +445,7 @@ bool EmuTCPConnection::ConnectIP(uint32 irIP, uint16 irPort, char* errbuf) {
} }
void EmuTCPConnection::ClearBuffers() { void EmuTCPConnection::ClearBuffers() {
_eqp
TCPConnection::ClearBuffers(); TCPConnection::ClearBuffers();
LockMutex lock2(&MOutQueueLock); LockMutex lock2(&MOutQueueLock);
@@ -448,6 +462,7 @@ void EmuTCPConnection::ClearBuffers() {
} }
void EmuTCPConnection::SendNetErrorPacket(const char* reason) { void EmuTCPConnection::SendNetErrorPacket(const char* reason) {
_eqp
#if TCPC_DEBUG >= 1 #if TCPC_DEBUG >= 1
struct in_addr in; struct in_addr in;
in.s_addr = GetrIP(); in.s_addr = GetrIP();
@@ -469,6 +484,7 @@ void EmuTCPConnection::SendNetErrorPacket(const char* reason) {
} }
void EmuTCPConnection::RemoveRelay(EmuTCPConnection* relay, bool iSendRelayDisconnect) { void EmuTCPConnection::RemoveRelay(EmuTCPConnection* relay, bool iSendRelayDisconnect) {
_eqp
if (iSendRelayDisconnect) { if (iSendRelayDisconnect) {
ServerPacket* pack = new ServerPacket(0, 5); ServerPacket* pack = new ServerPacket(0, 5);
pack->pBuffer[0] = 3; pack->pBuffer[0] = 3;
@@ -482,6 +498,7 @@ void EmuTCPConnection::RemoveRelay(EmuTCPConnection* relay, bool iSendRelayDisco
bool EmuTCPConnection::ProcessReceivedData(char* errbuf) { bool EmuTCPConnection::ProcessReceivedData(char* errbuf) {
_eqp
if (errbuf) if (errbuf)
errbuf[0] = 0; errbuf[0] = 0;
timeout_timer.Start(); timeout_timer.Start();
@@ -505,6 +522,7 @@ bool EmuTCPConnection::ProcessReceivedData(char* errbuf) {
bool EmuTCPConnection::ProcessReceivedDataAsPackets(char* errbuf) { bool EmuTCPConnection::ProcessReceivedDataAsPackets(char* errbuf) {
_eqp
if (errbuf) if (errbuf)
errbuf[0] = 0; errbuf[0] = 0;
int32 base = 0; int32 base = 0;
@@ -621,6 +639,7 @@ bool EmuTCPConnection::ProcessReceivedDataAsPackets(char* errbuf) {
} }
bool EmuTCPConnection::ProcessReceivedDataAsOldPackets(char* errbuf) { bool EmuTCPConnection::ProcessReceivedDataAsOldPackets(char* errbuf) {
_eqp
int32 base = 0; int32 base = 0;
int32 size = 4; int32 size = 4;
uchar* buffer; uchar* buffer;
@@ -695,6 +714,7 @@ bool EmuTCPConnection::ProcessReceivedDataAsOldPackets(char* errbuf) {
} }
void EmuTCPConnection::ProcessNetworkLayerPacket(ServerPacket* pack) { void EmuTCPConnection::ProcessNetworkLayerPacket(ServerPacket* pack) {
_eqp
uint8 opcode = pack->pBuffer[0]; uint8 opcode = pack->pBuffer[0];
uint8* data = &pack->pBuffer[1]; uint8* data = &pack->pBuffer[1];
switch (opcode) { switch (opcode) {
@@ -780,6 +800,7 @@ void EmuTCPConnection::ProcessNetworkLayerPacket(ServerPacket* pack) {
} }
bool EmuTCPConnection::SendData(bool &sent_something, char* errbuf) { bool EmuTCPConnection::SendData(bool &sent_something, char* errbuf) {
_eqp
sent_something = false; sent_something = false;
if(!TCPConnection::SendData(sent_something, errbuf)) if(!TCPConnection::SendData(sent_something, errbuf))
return(false); return(false);
@@ -799,6 +820,7 @@ bool EmuTCPConnection::SendData(bool &sent_something, char* errbuf) {
} }
bool EmuTCPConnection::RecvData(char* errbuf) { bool EmuTCPConnection::RecvData(char* errbuf) {
_eqp
if(!TCPConnection::RecvData(errbuf)) { if(!TCPConnection::RecvData(errbuf)) {
if (OutQueue.count()) if (OutQueue.count())
return(true); return(true);
+8
View File
@@ -9,6 +9,7 @@ EmuTCPServer::EmuTCPServer(uint16 iPort, bool iOldFormat)
} }
EmuTCPServer::~EmuTCPServer() { EmuTCPServer::~EmuTCPServer() {
_eqp
MInQueue.lock(); MInQueue.lock();
while(!m_InQueue.empty()) { while(!m_InQueue.empty()) {
delete m_InQueue.front(); delete m_InQueue.front();
@@ -18,23 +19,27 @@ EmuTCPServer::~EmuTCPServer() {
} }
void EmuTCPServer::Process() { void EmuTCPServer::Process() {
_eqp
CheckInQueue(); CheckInQueue();
TCPServer<EmuTCPConnection>::Process(); TCPServer<EmuTCPConnection>::Process();
} }
void EmuTCPServer::CreateNewConnection(uint32 ID, SOCKET in_socket, uint32 irIP, uint16 irPort) void EmuTCPServer::CreateNewConnection(uint32 ID, SOCKET in_socket, uint32 irIP, uint16 irPort)
{ {
_eqp
EmuTCPConnection *conn = new EmuTCPConnection(ID, this, in_socket, irIP, irPort, pOldFormat); EmuTCPConnection *conn = new EmuTCPConnection(ID, this, in_socket, irIP, irPort, pOldFormat);
AddConnection(conn); AddConnection(conn);
} }
void EmuTCPServer::SendPacket(ServerPacket* pack) { void EmuTCPServer::SendPacket(ServerPacket* pack) {
_eqp
EmuTCPNetPacket_Struct* tnps = EmuTCPConnection::MakePacket(pack); EmuTCPNetPacket_Struct* tnps = EmuTCPConnection::MakePacket(pack);
SendPacket(&tnps); SendPacket(&tnps);
} }
void EmuTCPServer::SendPacket(EmuTCPNetPacket_Struct** tnps) { void EmuTCPServer::SendPacket(EmuTCPNetPacket_Struct** tnps) {
_eqp
MInQueue.lock(); MInQueue.lock();
m_InQueue.push(*tnps); m_InQueue.push(*tnps);
MInQueue.unlock(); MInQueue.unlock();
@@ -42,6 +47,7 @@ void EmuTCPServer::SendPacket(EmuTCPNetPacket_Struct** tnps) {
} }
void EmuTCPServer::CheckInQueue() { void EmuTCPServer::CheckInQueue() {
_eqp
EmuTCPNetPacket_Struct* tnps = 0; EmuTCPNetPacket_Struct* tnps = 0;
while (( tnps = InQueuePop() )) { while (( tnps = InQueuePop() )) {
@@ -57,6 +63,7 @@ void EmuTCPServer::CheckInQueue() {
} }
EmuTCPNetPacket_Struct* EmuTCPServer::InQueuePop() { EmuTCPNetPacket_Struct* EmuTCPServer::InQueuePop() {
_eqp
EmuTCPNetPacket_Struct* ret = nullptr; EmuTCPNetPacket_Struct* ret = nullptr;
MInQueue.lock(); MInQueue.lock();
if(!m_InQueue.empty()) { if(!m_InQueue.empty()) {
@@ -69,6 +76,7 @@ EmuTCPNetPacket_Struct* EmuTCPServer::InQueuePop() {
EmuTCPConnection *EmuTCPServer::FindConnection(uint32 iID) { EmuTCPConnection *EmuTCPServer::FindConnection(uint32 iID) {
_eqp
vitr cur, end; vitr cur, end;
cur = m_list.begin(); cur = m_list.begin();
end = m_list.end(); end = m_list.end();
+38 -77
View File
@@ -40,9 +40,11 @@ EQPacket::EQPacket(EmuOpcode op, const unsigned char *buf, uint32 len)
: BasePacket(buf, len), : BasePacket(buf, len),
emu_opcode(op) emu_opcode(op)
{ {
_eqp
} }
void EQPacket::build_raw_header_dump(char *buffer, uint16 seq) const { void EQPacket::build_raw_header_dump(char *buffer, uint16 seq) const {
_eqp
BasePacket::build_raw_header_dump(buffer, seq); BasePacket::build_raw_header_dump(buffer, seq);
buffer += strlen(buffer); buffer += strlen(buffer);
@@ -51,17 +53,20 @@ void EQPacket::build_raw_header_dump(char *buffer, uint16 seq) const {
void EQPacket::DumpRawHeader(uint16 seq, FILE *to) const void EQPacket::DumpRawHeader(uint16 seq, FILE *to) const
{ {
_eqp
char buff[196]; char buff[196];
build_raw_header_dump(buff, seq); build_raw_header_dump(buff, seq);
fprintf(to, "%s", buff); fprintf(to, "%s", buff);
} }
void EQPacket::build_header_dump(char *buffer) const { void EQPacket::build_header_dump(char *buffer) const {
_eqp
sprintf(buffer, "[EmuOpCode 0x%04x Size=%u]", emu_opcode, size); sprintf(buffer, "[EmuOpCode 0x%04x Size=%u]", emu_opcode, size);
} }
void EQPacket::DumpRawHeaderNoTime(uint16 seq, FILE *to) const void EQPacket::DumpRawHeaderNoTime(uint16 seq, FILE *to) const
{ {
_eqp
if (src_ip) { if (src_ip) {
std::string sIP,dIP;; std::string sIP,dIP;;
sIP=long2ip(src_ip); sIP=long2ip(src_ip);
@@ -76,6 +81,7 @@ void EQPacket::DumpRawHeaderNoTime(uint16 seq, FILE *to) const
void EQProtocolPacket::build_raw_header_dump(char *buffer, uint16 seq) const void EQProtocolPacket::build_raw_header_dump(char *buffer, uint16 seq) const
{ {
_eqp
BasePacket::build_raw_header_dump(buffer, seq); BasePacket::build_raw_header_dump(buffer, seq);
buffer += strlen(buffer); buffer += strlen(buffer);
@@ -84,6 +90,7 @@ void EQProtocolPacket::build_raw_header_dump(char *buffer, uint16 seq) const
void EQProtocolPacket::DumpRawHeader(uint16 seq, FILE *to) const void EQProtocolPacket::DumpRawHeader(uint16 seq, FILE *to) const
{ {
_eqp
char buff[196]; char buff[196];
build_raw_header_dump(buff, seq); build_raw_header_dump(buff, seq);
fprintf(to, "%s", buff); fprintf(to, "%s", buff);
@@ -91,11 +98,13 @@ void EQProtocolPacket::DumpRawHeader(uint16 seq, FILE *to) const
void EQProtocolPacket::build_header_dump(char *buffer) const void EQProtocolPacket::build_header_dump(char *buffer) const
{ {
_eqp
sprintf(buffer, "[ProtoOpCode 0x%04x Size=%u]",opcode,size); sprintf(buffer, "[ProtoOpCode 0x%04x Size=%u]",opcode,size);
} }
void EQProtocolPacket::DumpRawHeaderNoTime(uint16 seq, FILE *to) const void EQProtocolPacket::DumpRawHeaderNoTime(uint16 seq, FILE *to) const
{ {
_eqp
if (src_ip) { if (src_ip) {
std::string sIP,dIP;; std::string sIP,dIP;;
sIP=long2ip(src_ip); sIP=long2ip(src_ip);
@@ -110,6 +119,7 @@ void EQProtocolPacket::DumpRawHeaderNoTime(uint16 seq, FILE *to) const
void EQApplicationPacket::build_raw_header_dump(char *buffer, uint16 seq) const void EQApplicationPacket::build_raw_header_dump(char *buffer, uint16 seq) const
{ {
_eqp
BasePacket::build_raw_header_dump(buffer, seq); BasePacket::build_raw_header_dump(buffer, seq);
buffer += strlen(buffer); buffer += strlen(buffer);
@@ -122,6 +132,7 @@ void EQApplicationPacket::build_raw_header_dump(char *buffer, uint16 seq) const
void EQApplicationPacket::DumpRawHeader(uint16 seq, FILE *to) const void EQApplicationPacket::DumpRawHeader(uint16 seq, FILE *to) const
{ {
_eqp
char buff[196]; char buff[196];
build_raw_header_dump(buff, seq); build_raw_header_dump(buff, seq);
fprintf(to, "%s", buff); fprintf(to, "%s", buff);
@@ -129,6 +140,7 @@ void EQApplicationPacket::DumpRawHeader(uint16 seq, FILE *to) const
void EQApplicationPacket::build_header_dump(char *buffer) const void EQApplicationPacket::build_header_dump(char *buffer) const
{ {
_eqp
#ifdef STATIC_OPCODE #ifdef STATIC_OPCODE
sprintf(buffer, "[OpCode 0x%04x Size=%u]\n", emu_opcode,size); sprintf(buffer, "[OpCode 0x%04x Size=%u]\n", emu_opcode,size);
#else #else
@@ -138,6 +150,7 @@ void EQApplicationPacket::build_header_dump(char *buffer) const
void EQApplicationPacket::DumpRawHeaderNoTime(uint16 seq, FILE *to) const void EQApplicationPacket::DumpRawHeaderNoTime(uint16 seq, FILE *to) const
{ {
_eqp
if (src_ip) { if (src_ip) {
std::string sIP,dIP;; std::string sIP,dIP;;
sIP=long2ip(src_ip); sIP=long2ip(src_ip);
@@ -156,6 +169,7 @@ void EQApplicationPacket::DumpRawHeaderNoTime(uint16 seq, FILE *to) const
void EQRawApplicationPacket::build_raw_header_dump(char *buffer, uint16 seq) const void EQRawApplicationPacket::build_raw_header_dump(char *buffer, uint16 seq) const
{ {
_eqp
BasePacket::build_raw_header_dump(buffer, seq); BasePacket::build_raw_header_dump(buffer, seq);
buffer += strlen(buffer); buffer += strlen(buffer);
@@ -168,6 +182,7 @@ void EQRawApplicationPacket::build_raw_header_dump(char *buffer, uint16 seq) con
void EQRawApplicationPacket::DumpRawHeader(uint16 seq, FILE *to) const void EQRawApplicationPacket::DumpRawHeader(uint16 seq, FILE *to) const
{ {
_eqp
char buff[196]; char buff[196];
build_raw_header_dump(buff, seq); build_raw_header_dump(buff, seq);
fprintf(to, "%s", buff); fprintf(to, "%s", buff);
@@ -175,6 +190,7 @@ void EQRawApplicationPacket::DumpRawHeader(uint16 seq, FILE *to) const
void EQRawApplicationPacket::build_header_dump(char *buffer) const void EQRawApplicationPacket::build_header_dump(char *buffer) const
{ {
_eqp
#ifdef STATIC_OPCODE #ifdef STATIC_OPCODE
sprintf(buffer, "[OpCode 0x%04x (0x%04x) Size=%u]\n", emu_opcode, opcode,size); sprintf(buffer, "[OpCode 0x%04x (0x%04x) Size=%u]\n", emu_opcode, opcode,size);
#else #else
@@ -184,6 +200,7 @@ void EQRawApplicationPacket::build_header_dump(char *buffer) const
void EQRawApplicationPacket::DumpRawHeaderNoTime(uint16 seq, FILE *to) const void EQRawApplicationPacket::DumpRawHeaderNoTime(uint16 seq, FILE *to) const
{ {
_eqp
if (src_ip) { if (src_ip) {
std::string sIP,dIP;; std::string sIP,dIP;;
sIP=long2ip(src_ip); sIP=long2ip(src_ip);
@@ -202,6 +219,7 @@ void EQRawApplicationPacket::DumpRawHeaderNoTime(uint16 seq, FILE *to) const
uint32 EQProtocolPacket::serialize(unsigned char *dest) const uint32 EQProtocolPacket::serialize(unsigned char *dest) const
{ {
_eqp
if (opcode>0xff) { if (opcode>0xff) {
*(uint16 *)dest=opcode; *(uint16 *)dest=opcode;
} else { } else {
@@ -215,6 +233,7 @@ uint32 EQProtocolPacket::serialize(unsigned char *dest) const
uint32 EQApplicationPacket::serialize(uint16 opcode, unsigned char *dest) const uint32 EQApplicationPacket::serialize(uint16 opcode, unsigned char *dest) const
{ {
_eqp
uint8 OpCodeBytes = app_opcode_size; uint8 OpCodeBytes = app_opcode_size;
if (app_opcode_size==1) if (app_opcode_size==1)
@@ -236,29 +255,10 @@ uint32 EQApplicationPacket::serialize(uint16 opcode, unsigned char *dest) const
return size+OpCodeBytes; return size+OpCodeBytes;
} }
/*EQProtocolPacket::EQProtocolPacket(uint16 op, const unsigned char *buf, uint32 len)
: BasePacket(buf, len),
opcode(op)
{
uint32 offset;
opcode=ntohs(*(const uint16 *)buf);
offset=2;
if (len-offset) {
pBuffer= new unsigned char[len-offset];
memcpy(pBuffer,buf+offset,len-offset);
size=len-offset;
} else {
pBuffer=nullptr;
size=0;
}
OpMgr=&RawOpcodeManager;
}*/
bool EQProtocolPacket::combine(const EQProtocolPacket *rhs) bool EQProtocolPacket::combine(const EQProtocolPacket *rhs)
{ {
bool result=false; _eqp
bool result=false;
if (opcode==OP_Combined && size+rhs->size+5<256) { if (opcode==OP_Combined && size+rhs->size+5<256) {
unsigned char *tmpbuffer=new unsigned char [size+rhs->size+3]; unsigned char *tmpbuffer=new unsigned char [size+rhs->size+3];
memcpy(tmpbuffer,pBuffer,size); memcpy(tmpbuffer,pBuffer,size);
@@ -284,61 +284,12 @@ bool result=false;
} }
return result; return result;
} }
/*
this is the code to do app-layer combining, instead of protocol layer.
this was taken out due to complex interactions with the opcode manager,
and will require a bit more thinking (likely moving into EQStream) to
get running again... but might be a good thing some day.
bool EQApplicationPacket::combine(const EQApplicationPacket *rhs)
{
uint32 newsize=0, offset=0;
unsigned char *tmpbuffer=nullptr;
if (opcode!=OP_AppCombined) {
newsize=app_opcode_size+size+(size>254?3:1)+app_opcode_size+rhs->size+(rhs->size>254?3:1);
tmpbuffer=new unsigned char [newsize];
offset=0;
if (size>254) {
tmpbuffer[offset++]=0xff;
*(uint16 *)(tmpbuffer+offset)=htons(size);
offset+=1;
} else {
tmpbuffer[offset++]=size;
}
offset+=serialize(tmpbuffer+offset);
} else {
newsize=size+app_opcode_size+rhs->size+(rhs->size>254?3:1);
tmpbuffer=new unsigned char [newsize];
memcpy(tmpbuffer,pBuffer,size);
offset=size;
}
if (rhs->size>254) {
tmpbuffer[offset++]=0xff;
*(uint16 *)(tmpbuffer+offset)=htons(rhs->size);
offset+=1;
} else {
tmpbuffer[offset++]=rhs->size;
}
offset+=rhs->serialize(tmpbuffer+offset);
size=offset;
opcode=OP_AppCombined;
delete[] pBuffer;
pBuffer=tmpbuffer;
return true;
}
*/
bool EQProtocolPacket::ValidateCRC(const unsigned char *buffer, int length, uint32 Key) bool EQProtocolPacket::ValidateCRC(const unsigned char *buffer, int length, uint32 Key)
{ {
bool valid=false; _eqp
bool valid=false;
// OP_SessionRequest, OP_SessionResponse, OP_OutOfSession are not CRC'd // OP_SessionRequest, OP_SessionResponse, OP_OutOfSession are not CRC'd
if (buffer[0]==0x00 && (buffer[1]==OP_SessionRequest || buffer[1]==OP_SessionResponse || buffer[1]==OP_OutOfSession)) { if (buffer[0]==0x00 && (buffer[1]==OP_SessionRequest || buffer[1]==OP_SessionResponse || buffer[1]==OP_OutOfSession)) {
valid=true; valid=true;
@@ -357,8 +308,9 @@ bool valid=false;
uint32 EQProtocolPacket::Decompress(const unsigned char *buffer, const uint32 length, unsigned char *newbuf, uint32 newbufsize) uint32 EQProtocolPacket::Decompress(const unsigned char *buffer, const uint32 length, unsigned char *newbuf, uint32 newbufsize)
{ {
uint32 newlen=0; _eqp
uint32 flag_offset=0; uint32 newlen=0;
uint32 flag_offset=0;
newbuf[0]=buffer[0]; newbuf[0]=buffer[0];
if (buffer[0]==0x00) { if (buffer[0]==0x00) {
flag_offset=2; flag_offset=2;
@@ -382,7 +334,8 @@ uint32 flag_offset=0;
} }
uint32 EQProtocolPacket::Compress(const unsigned char *buffer, const uint32 length, unsigned char *newbuf, uint32 newbufsize) { uint32 EQProtocolPacket::Compress(const unsigned char *buffer, const uint32 length, unsigned char *newbuf, uint32 newbufsize) {
uint32 flag_offset=1,newlength; _eqp
uint32 flag_offset=1,newlength;
//dump_message_column(buffer,length,"Before: "); //dump_message_column(buffer,length,"Before: ");
newbuf[0]=buffer[0]; newbuf[0]=buffer[0];
if (buffer[0]==0) { if (buffer[0]==0) {
@@ -405,6 +358,7 @@ uint32 flag_offset=1,newlength;
void EQProtocolPacket::ChatDecode(unsigned char *buffer, int size, int DecodeKey) void EQProtocolPacket::ChatDecode(unsigned char *buffer, int size, int DecodeKey)
{ {
_eqp
if ((size >= 2) && buffer[1]!=0x01 && buffer[0]!=0x02 && buffer[0]!=0x1d) { if ((size >= 2) && buffer[1]!=0x01 && buffer[0]!=0x02 && buffer[0]!=0x1d) {
int Key=DecodeKey; int Key=DecodeKey;
unsigned char *test=(unsigned char *)malloc(size); unsigned char *test=(unsigned char *)malloc(size);
@@ -430,6 +384,7 @@ void EQProtocolPacket::ChatDecode(unsigned char *buffer, int size, int DecodeKey
void EQProtocolPacket::ChatEncode(unsigned char *buffer, int size, int EncodeKey) void EQProtocolPacket::ChatEncode(unsigned char *buffer, int size, int EncodeKey)
{ {
_eqp
if (buffer[1]!=0x01 && buffer[0]!=0x02 && buffer[0]!=0x1d) { if (buffer[1]!=0x01 && buffer[0]!=0x02 && buffer[0]!=0x1d) {
int Key=EncodeKey; int Key=EncodeKey;
char *test=(char*)malloc(size); char *test=(char*)malloc(size);
@@ -453,10 +408,12 @@ void EQProtocolPacket::ChatEncode(unsigned char *buffer, int size, int EncodeKey
} }
EQApplicationPacket *EQApplicationPacket::Copy() const { EQApplicationPacket *EQApplicationPacket::Copy() const {
_eqp
return(new EQApplicationPacket(*this)); return(new EQApplicationPacket(*this));
} }
EQRawApplicationPacket *EQProtocolPacket::MakeAppPacket() const { EQRawApplicationPacket *EQProtocolPacket::MakeAppPacket() const {
_eqp
EQRawApplicationPacket *res = new EQRawApplicationPacket(opcode, pBuffer, size); EQRawApplicationPacket *res = new EQRawApplicationPacket(opcode, pBuffer, size);
res->copyInfo(this); res->copyInfo(this);
return(res); return(res);
@@ -466,10 +423,13 @@ EQRawApplicationPacket::EQRawApplicationPacket(uint16 opcode, const unsigned cha
: EQApplicationPacket(OP_Unknown, buf, len), : EQApplicationPacket(OP_Unknown, buf, len),
opcode(opcode) opcode(opcode)
{ {
_eqp
} }
EQRawApplicationPacket::EQRawApplicationPacket(const unsigned char *buf, const uint32 len) EQRawApplicationPacket::EQRawApplicationPacket(const unsigned char *buf, const uint32 len)
: EQApplicationPacket(OP_Unknown, buf+sizeof(uint16), len-sizeof(uint16)) : EQApplicationPacket(OP_Unknown, buf+sizeof(uint16), len-sizeof(uint16))
{ {
_eqp
if(GetExecutablePlatform() != ExePlatformUCS) { if(GetExecutablePlatform() != ExePlatformUCS) {
opcode = *((const uint16 *) buf); opcode = *((const uint16 *) buf);
if(opcode == 0x0000) if(opcode == 0x0000)
@@ -503,16 +463,17 @@ EQRawApplicationPacket::EQRawApplicationPacket(const unsigned char *buf, const u
} }
void DumpPacket(const EQApplicationPacket* app, bool iShowInfo) { void DumpPacket(const EQApplicationPacket* app, bool iShowInfo) {
_eqp
if (iShowInfo) { if (iShowInfo) {
std::cout << "Dumping Applayer: 0x" << std::hex << std::setfill('0') << std::setw(4) << app->GetOpcode() << std::dec; std::cout << "Dumping Applayer: 0x" << std::hex << std::setfill('0') << std::setw(4) << app->GetOpcode() << std::dec;
std::cout << " size:" << app->size << std::endl; std::cout << " size:" << app->size << std::endl;
} }
DumpPacketHex(app->pBuffer, app->size); DumpPacketHex(app->pBuffer, app->size);
// DumpPacketAscii(app->pBuffer, app->size);
} }
std::string DumpPacketToString(const EQApplicationPacket* app){ std::string DumpPacketToString(const EQApplicationPacket* app){
_eqp
std::ostringstream out; std::ostringstream out;
out << DumpPacketHexToString(app->pBuffer, app->size); out << DumpPacketHexToString(app->pBuffer, app->size);
return out.str(); return out.str();
} }
+90 -50
View File
@@ -50,6 +50,7 @@
uint16 EQStream::MaxWindowSize=2048; uint16 EQStream::MaxWindowSize=2048;
void EQStream::init(bool resetSession) { void EQStream::init(bool resetSession) {
_eqp
// we only reset these statistics if it is a 'new' connection // we only reset these statistics if it is a 'new' connection
if ( resetSession ) if ( resetSession )
{ {
@@ -92,6 +93,7 @@ void EQStream::init(bool resetSession) {
EQRawApplicationPacket *EQStream::MakeApplicationPacket(EQProtocolPacket *p) EQRawApplicationPacket *EQStream::MakeApplicationPacket(EQProtocolPacket *p)
{ {
_eqp
EQRawApplicationPacket *ap=nullptr; EQRawApplicationPacket *ap=nullptr;
Log.Out(Logs::Detail, Logs::Netcode, _L "Creating new application packet, length %d" __L, p->size); Log.Out(Logs::Detail, Logs::Netcode, _L "Creating new application packet, length %d" __L, p->size);
// _raw(NET__APP_CREATE_HEX, 0xFFFF, p); // _raw(NET__APP_CREATE_HEX, 0xFFFF, p);
@@ -101,6 +103,7 @@ EQRawApplicationPacket *EQStream::MakeApplicationPacket(EQProtocolPacket *p)
EQRawApplicationPacket *EQStream::MakeApplicationPacket(const unsigned char *buf, uint32 len) EQRawApplicationPacket *EQStream::MakeApplicationPacket(const unsigned char *buf, uint32 len)
{ {
_eqp
EQRawApplicationPacket *ap=nullptr; EQRawApplicationPacket *ap=nullptr;
Log.Out(Logs::Detail, Logs::Netcode, _L "Creating new application packet, length %d" __L, len); Log.Out(Logs::Detail, Logs::Netcode, _L "Creating new application packet, length %d" __L, len);
ap = new EQRawApplicationPacket(buf, len); ap = new EQRawApplicationPacket(buf, len);
@@ -108,6 +111,7 @@ EQRawApplicationPacket *EQStream::MakeApplicationPacket(const unsigned char *buf
} }
EQProtocolPacket *EQStream::MakeProtocolPacket(const unsigned char *buf, uint32 len) { EQProtocolPacket *EQStream::MakeProtocolPacket(const unsigned char *buf, uint32 len) {
_eqp
uint16 proto_opcode = ntohs(*(const uint16 *)buf); uint16 proto_opcode = ntohs(*(const uint16 *)buf);
//advance over opcode. //advance over opcode.
@@ -119,6 +123,7 @@ EQProtocolPacket *EQStream::MakeProtocolPacket(const unsigned char *buf, uint32
void EQStream::ProcessPacket(EQProtocolPacket *p) void EQStream::ProcessPacket(EQProtocolPacket *p)
{ {
_eqp
uint32 processed=0, subpacket_length=0; uint32 processed=0, subpacket_length=0;
if (p == nullptr) if (p == nullptr)
return; return;
@@ -516,6 +521,7 @@ void EQStream::ProcessPacket(EQProtocolPacket *p)
void EQStream::QueuePacket(const EQApplicationPacket *p, bool ack_req) void EQStream::QueuePacket(const EQApplicationPacket *p, bool ack_req)
{ {
_eqp
if(p == nullptr) if(p == nullptr)
return; return;
@@ -527,6 +533,7 @@ void EQStream::QueuePacket(const EQApplicationPacket *p, bool ack_req)
void EQStream::FastQueuePacket(EQApplicationPacket **p, bool ack_req) void EQStream::FastQueuePacket(EQApplicationPacket **p, bool ack_req)
{ {
_eqp
EQApplicationPacket *pack=*p; EQApplicationPacket *pack=*p;
*p = nullptr; //clear caller's pointer.. effectively takes ownership *p = nullptr; //clear caller's pointer.. effectively takes ownership
@@ -556,6 +563,7 @@ void EQStream::FastQueuePacket(EQApplicationPacket **p, bool ack_req)
void EQStream::SendPacket(uint16 opcode, EQApplicationPacket *p) void EQStream::SendPacket(uint16 opcode, EQApplicationPacket *p)
{ {
_eqp
uint32 chunksize, used; uint32 chunksize, used;
uint32 length; uint32 length;
@@ -612,34 +620,36 @@ void EQStream::SendPacket(uint16 opcode, EQApplicationPacket *p)
void EQStream::SequencedPush(EQProtocolPacket *p) void EQStream::SequencedPush(EQProtocolPacket *p)
{ {
_eqp
#ifdef COLLECTOR #ifdef COLLECTOR
delete p; delete p;
#else #else
MOutboundQueue.lock(); MOutboundQueue.lock();
if(uint16(SequencedBase + SequencedQueue.size()) != NextOutSeq) { if(uint16(SequencedBase + SequencedQueue.size()) != NextOutSeq) {
Log.Out(Logs::Detail, Logs::Netcode, _L "Pre-Push Invalid Sequenced queue: BS %d + SQ %d != NOS %d" __L, SequencedBase, SequencedQueue.size(), NextOutSeq); Log.Out(Logs::Detail, Logs::Netcode, _L "Pre-Push Invalid Sequenced queue: BS %d + SQ %d != NOS %d" __L, SequencedBase, SequencedQueue.size(), NextOutSeq);
} }
if(NextSequencedSend > SequencedQueue.size()) { if(NextSequencedSend > SequencedQueue.size()) {
Log.Out(Logs::Detail, Logs::Netcode, _L "Pre-Push Next Send Sequence is beyond the end of the queue NSS %d > SQ %d" __L, NextSequencedSend, SequencedQueue.size()); Log.Out(Logs::Detail, Logs::Netcode, _L "Pre-Push Next Send Sequence is beyond the end of the queue NSS %d > SQ %d" __L, NextSequencedSend, SequencedQueue.size());
} }
Log.Out(Logs::Detail, Logs::Netcode, _L "Pushing sequenced packet %d of length %d. Base Seq is %d." __L, NextOutSeq, p->size, SequencedBase); Log.Out(Logs::Detail, Logs::Netcode, _L "Pushing sequenced packet %d of length %d. Base Seq is %d." __L, NextOutSeq, p->size, SequencedBase);
*(uint16 *)(p->pBuffer)=htons(NextOutSeq); *(uint16 *)(p->pBuffer)=htons(NextOutSeq);
SequencedQueue.push_back(p); SequencedQueue.push_back(p);
NextOutSeq++; NextOutSeq++;
if(uint16(SequencedBase + SequencedQueue.size()) != NextOutSeq) { if(uint16(SequencedBase + SequencedQueue.size()) != NextOutSeq) {
Log.Out(Logs::Detail, Logs::Netcode, _L "Push Invalid Sequenced queue: BS %d + SQ %d != NOS %d" __L, SequencedBase, SequencedQueue.size(), NextOutSeq); Log.Out(Logs::Detail, Logs::Netcode, _L "Push Invalid Sequenced queue: BS %d + SQ %d != NOS %d" __L, SequencedBase, SequencedQueue.size(), NextOutSeq);
} }
if(NextSequencedSend > SequencedQueue.size()) { if(NextSequencedSend > SequencedQueue.size()) {
Log.Out(Logs::Detail, Logs::Netcode, _L "Push Next Send Sequence is beyond the end of the queue NSS %d > SQ %d" __L, NextSequencedSend, SequencedQueue.size()); Log.Out(Logs::Detail, Logs::Netcode, _L "Push Next Send Sequence is beyond the end of the queue NSS %d > SQ %d" __L, NextSequencedSend, SequencedQueue.size());
} }
MOutboundQueue.unlock(); MOutboundQueue.unlock();
#endif #endif
} }
void EQStream::NonSequencedPush(EQProtocolPacket *p) void EQStream::NonSequencedPush(EQProtocolPacket *p)
{ {
_eqp
#ifdef COLLECTOR #ifdef COLLECTOR
delete p; delete p;
#else #else
@@ -652,7 +662,8 @@ void EQStream::NonSequencedPush(EQProtocolPacket *p)
void EQStream::SendAck(uint16 seq) void EQStream::SendAck(uint16 seq)
{ {
uint16 Seq=htons(seq); _eqp
uint16 Seq=htons(seq);
Log.Out(Logs::Detail, Logs::Netcode, _L "Sending ack with sequence %d" __L, seq); Log.Out(Logs::Detail, Logs::Netcode, _L "Sending ack with sequence %d" __L, seq);
SetLastAckSent(seq); SetLastAckSent(seq);
NonSequencedPush(new EQProtocolPacket(OP_Ack,(unsigned char *)&Seq,sizeof(uint16))); NonSequencedPush(new EQProtocolPacket(OP_Ack,(unsigned char *)&Seq,sizeof(uint16)));
@@ -660,8 +671,9 @@ uint16 Seq=htons(seq);
void EQStream::SendOutOfOrderAck(uint16 seq) void EQStream::SendOutOfOrderAck(uint16 seq)
{ {
_eqp
Log.Out(Logs::Detail, Logs::Netcode, _L "Sending out of order ack with sequence %d" __L, seq); Log.Out(Logs::Detail, Logs::Netcode, _L "Sending out of order ack with sequence %d" __L, seq);
uint16 Seq=htons(seq); uint16 Seq=htons(seq);
NonSequencedPush(new EQProtocolPacket(OP_OutOfOrderAck,(unsigned char *)&Seq,sizeof(uint16))); NonSequencedPush(new EQProtocolPacket(OP_OutOfOrderAck,(unsigned char *)&Seq,sizeof(uint16)));
} }
@@ -862,8 +874,9 @@ void EQStream::Write(int eq_fd)
void EQStream::WritePacket(int eq_fd, EQProtocolPacket *p) void EQStream::WritePacket(int eq_fd, EQProtocolPacket *p)
{ {
uint32 length; _eqp
sockaddr_in address; uint32 length;
sockaddr_in address;
address.sin_family = AF_INET; address.sin_family = AF_INET;
address.sin_addr.s_addr=remote_ip; address.sin_addr.s_addr=remote_ip;
address.sin_port=remote_port; address.sin_port=remote_port;
@@ -900,7 +913,8 @@ sockaddr_in address;
void EQStream::SendSessionResponse() void EQStream::SendSessionResponse()
{ {
EQProtocolPacket *out=new EQProtocolPacket(OP_SessionResponse,nullptr,sizeof(SessionResponse)); _eqp
EQProtocolPacket *out=new EQProtocolPacket(OP_SessionResponse,nullptr,sizeof(SessionResponse));
SessionResponse *Response=(SessionResponse *)out->pBuffer; SessionResponse *Response=(SessionResponse *)out->pBuffer;
Response->Session=htonl(Session); Response->Session=htonl(Session);
Response->MaxLength=htonl(MaxLen); Response->MaxLength=htonl(MaxLen);
@@ -922,7 +936,8 @@ EQProtocolPacket *out=new EQProtocolPacket(OP_SessionResponse,nullptr,sizeof(Ses
void EQStream::SendSessionRequest() void EQStream::SendSessionRequest()
{ {
EQProtocolPacket *out=new EQProtocolPacket(OP_SessionRequest,nullptr,sizeof(SessionRequest)); _eqp
EQProtocolPacket *out=new EQProtocolPacket(OP_SessionRequest,nullptr,sizeof(SessionRequest));
SessionRequest *Request=(SessionRequest *)out->pBuffer; SessionRequest *Request=(SessionRequest *)out->pBuffer;
memset(Request,0,sizeof(SessionRequest)); memset(Request,0,sizeof(SessionRequest));
Request->Session=htonl(time(nullptr)); Request->Session=htonl(time(nullptr));
@@ -935,6 +950,7 @@ EQProtocolPacket *out=new EQProtocolPacket(OP_SessionRequest,nullptr,sizeof(Sess
void EQStream::_SendDisconnect() void EQStream::_SendDisconnect()
{ {
_eqp
if(GetState() == CLOSED) if(GetState() == CLOSED)
return; return;
@@ -947,6 +963,7 @@ void EQStream::_SendDisconnect()
void EQStream::InboundQueuePush(EQRawApplicationPacket *p) void EQStream::InboundQueuePush(EQRawApplicationPacket *p)
{ {
_eqp
MInboundQueue.lock(); MInboundQueue.lock();
InboundQueue.push_back(p); InboundQueue.push_back(p);
MInboundQueue.unlock(); MInboundQueue.unlock();
@@ -954,7 +971,8 @@ void EQStream::InboundQueuePush(EQRawApplicationPacket *p)
EQApplicationPacket *EQStream::PopPacket() EQApplicationPacket *EQStream::PopPacket()
{ {
EQRawApplicationPacket *p=nullptr; _eqp
EQRawApplicationPacket *p=nullptr;
MInboundQueue.lock(); MInboundQueue.lock();
if (InboundQueue.size()) { if (InboundQueue.size()) {
@@ -979,7 +997,8 @@ EQRawApplicationPacket *p=nullptr;
EQRawApplicationPacket *EQStream::PopRawPacket() EQRawApplicationPacket *EQStream::PopRawPacket()
{ {
EQRawApplicationPacket *p=nullptr; _eqp
EQRawApplicationPacket *p=nullptr;
MInboundQueue.lock(); MInboundQueue.lock();
if (InboundQueue.size()) { if (InboundQueue.size()) {
@@ -1006,7 +1025,8 @@ EQRawApplicationPacket *p=nullptr;
EQRawApplicationPacket *EQStream::PeekPacket() EQRawApplicationPacket *EQStream::PeekPacket()
{ {
EQRawApplicationPacket *p=nullptr; _eqp
EQRawApplicationPacket *p=nullptr;
MInboundQueue.lock(); MInboundQueue.lock();
if (InboundQueue.size()) { if (InboundQueue.size()) {
@@ -1020,7 +1040,8 @@ EQRawApplicationPacket *p=nullptr;
void EQStream::InboundQueueClear() void EQStream::InboundQueueClear()
{ {
EQApplicationPacket *p=nullptr; _eqp
EQApplicationPacket *p=nullptr;
Log.Out(Logs::Detail, Logs::Netcode, _L "Clearing inbound queue" __L); Log.Out(Logs::Detail, Logs::Netcode, _L "Clearing inbound queue" __L);
@@ -1038,7 +1059,8 @@ EQApplicationPacket *p=nullptr;
bool EQStream::HasOutgoingData() bool EQStream::HasOutgoingData()
{ {
bool flag; _eqp
bool flag;
//once closed, we have nothing more to say //once closed, we have nothing more to say
if(CheckClosed()) if(CheckClosed())
@@ -1063,7 +1085,8 @@ bool flag;
void EQStream::OutboundQueueClear() void EQStream::OutboundQueueClear()
{ {
EQProtocolPacket *p=nullptr; _eqp
EQProtocolPacket *p=nullptr;
Log.Out(Logs::Detail, Logs::Netcode, _L "Clearing outbound queue" __L); Log.Out(Logs::Detail, Logs::Netcode, _L "Clearing outbound queue" __L);
@@ -1085,7 +1108,8 @@ EQProtocolPacket *p=nullptr;
void EQStream::PacketQueueClear() void EQStream::PacketQueueClear()
{ {
EQProtocolPacket *p=nullptr; _eqp
EQProtocolPacket *p=nullptr;
Log.Out(Logs::Detail, Logs::Netcode, _L "Clearing future packet queue" __L); Log.Out(Logs::Detail, Logs::Netcode, _L "Clearing future packet queue" __L);
@@ -1101,8 +1125,9 @@ EQProtocolPacket *p=nullptr;
void EQStream::Process(const unsigned char *buffer, const uint32 length) void EQStream::Process(const unsigned char *buffer, const uint32 length)
{ {
static unsigned char newbuffer[2048]; _eqp
uint32 newlength=0; static unsigned char newbuffer[2048];
uint32 newlength=0;
if (EQProtocolPacket::ValidateCRC(buffer,length,Key)) { if (EQProtocolPacket::ValidateCRC(buffer,length,Key)) {
if (compressed) { if (compressed) {
newlength=EQProtocolPacket::Decompress(buffer,length,newbuffer,2048); newlength=EQProtocolPacket::Decompress(buffer,length,newbuffer,2048);
@@ -1125,6 +1150,7 @@ uint32 newlength=0;
long EQStream::GetNextAckToSend() long EQStream::GetNextAckToSend()
{ {
_eqp
MAcks.lock(); MAcks.lock();
long l=NextAckToSend; long l=NextAckToSend;
MAcks.unlock(); MAcks.unlock();
@@ -1134,6 +1160,7 @@ long EQStream::GetNextAckToSend()
long EQStream::GetLastAckSent() long EQStream::GetLastAckSent()
{ {
_eqp
MAcks.lock(); MAcks.lock();
long l=LastAckSent; long l=LastAckSent;
MAcks.unlock(); MAcks.unlock();
@@ -1143,16 +1170,17 @@ long EQStream::GetLastAckSent()
void EQStream::AckPackets(uint16 seq) void EQStream::AckPackets(uint16 seq)
{ {
std::deque<EQProtocolPacket *>::iterator itr, tmp; _eqp
std::deque<EQProtocolPacket *>::iterator itr, tmp;
MOutboundQueue.lock(); MOutboundQueue.lock();
//do a bit of sanity checking. //do a bit of sanity checking.
if(uint16(SequencedBase + SequencedQueue.size()) != NextOutSeq) { if(uint16(SequencedBase + SequencedQueue.size()) != NextOutSeq) {
Log.Out(Logs::Detail, Logs::Netcode, _L "Pre-Ack Invalid Sequenced queue: BS %d + SQ %d != NOS %d" __L, SequencedBase, SequencedQueue.size(), NextOutSeq); Log.Out(Logs::Detail, Logs::Netcode, _L "Pre-Ack Invalid Sequenced queue: BS %d + SQ %d != NOS %d" __L, SequencedBase, SequencedQueue.size(), NextOutSeq);
} }
if(NextSequencedSend > SequencedQueue.size()) { if(NextSequencedSend > SequencedQueue.size()) {
Log.Out(Logs::Detail, Logs::Netcode, _L "Pre-Ack Next Send Sequence is beyond the end of the queue NSS %d > SQ %d" __L, NextSequencedSend, SequencedQueue.size()); Log.Out(Logs::Detail, Logs::Netcode, _L "Pre-Ack Next Send Sequence is beyond the end of the queue NSS %d > SQ %d" __L, NextSequencedSend, SequencedQueue.size());
} }
SeqOrder ord = CompareSequence(SequencedBase, seq); SeqOrder ord = CompareSequence(SequencedBase, seq);
if(ord == SeqInOrder) { if(ord == SeqInOrder) {
@@ -1168,12 +1196,12 @@ if(NextSequencedSend > SequencedQueue.size()) {
//this is a good ack, we get to ack some blocks. //this is a good ack, we get to ack some blocks.
seq++; //we stop at the block right after their ack, counting on the wrap of both numbers. seq++; //we stop at the block right after their ack, counting on the wrap of both numbers.
while(SequencedBase != seq) { while(SequencedBase != seq) {
if(SequencedQueue.empty()) { if(SequencedQueue.empty()) {
Log.Out(Logs::Detail, Logs::Netcode, _L "OUT OF PACKETS acked packet with sequence %lu. Next send is %d before this." __L, (unsigned long)SequencedBase, NextSequencedSend); Log.Out(Logs::Detail, Logs::Netcode, _L "OUT OF PACKETS acked packet with sequence %lu. Next send is %d before this." __L, (unsigned long)SequencedBase, NextSequencedSend);
SequencedBase = NextOutSeq; SequencedBase = NextOutSeq;
NextSequencedSend = 0; NextSequencedSend = 0;
break; break;
} }
Log.Out(Logs::Detail, Logs::Netcode, _L "Removing acked packet with sequence %lu. Next send is %d before this." __L, (unsigned long)SequencedBase, NextSequencedSend); Log.Out(Logs::Detail, Logs::Netcode, _L "Removing acked packet with sequence %lu. Next send is %d before this." __L, (unsigned long)SequencedBase, NextSequencedSend);
//clean out the acked packet //clean out the acked packet
delete SequencedQueue.front(); delete SequencedQueue.front();
@@ -1184,12 +1212,12 @@ Log.Out(Logs::Detail, Logs::Netcode, _L "OUT OF PACKETS acked packet with sequen
//advance the base sequence number to the seq of the block after the one we just got rid of. //advance the base sequence number to the seq of the block after the one we just got rid of.
SequencedBase++; SequencedBase++;
} }
if(uint16(SequencedBase + SequencedQueue.size()) != NextOutSeq) { if(uint16(SequencedBase + SequencedQueue.size()) != NextOutSeq) {
Log.Out(Logs::Detail, Logs::Netcode, _L "Post-Ack on %d Invalid Sequenced queue: BS %d + SQ %d != NOS %d" __L, seq, SequencedBase, SequencedQueue.size(), NextOutSeq); Log.Out(Logs::Detail, Logs::Netcode, _L "Post-Ack on %d Invalid Sequenced queue: BS %d + SQ %d != NOS %d" __L, seq, SequencedBase, SequencedQueue.size(), NextOutSeq);
} }
if(NextSequencedSend > SequencedQueue.size()) { if(NextSequencedSend > SequencedQueue.size()) {
Log.Out(Logs::Detail, Logs::Netcode, _L "Post-Ack Next Send Sequence is beyond the end of the queue NSS %d > SQ %d" __L, NextSequencedSend, SequencedQueue.size()); Log.Out(Logs::Detail, Logs::Netcode, _L "Post-Ack Next Send Sequence is beyond the end of the queue NSS %d > SQ %d" __L, NextSequencedSend, SequencedQueue.size());
} }
} }
MOutboundQueue.unlock(); MOutboundQueue.unlock();
@@ -1197,6 +1225,7 @@ if(NextSequencedSend > SequencedQueue.size()) {
void EQStream::SetNextAckToSend(uint32 seq) void EQStream::SetNextAckToSend(uint32 seq)
{ {
_eqp
MAcks.lock(); MAcks.lock();
Log.Out(Logs::Detail, Logs::Netcode, _L "Set Next Ack To Send to %lu" __L, (unsigned long)seq); Log.Out(Logs::Detail, Logs::Netcode, _L "Set Next Ack To Send to %lu" __L, (unsigned long)seq);
NextAckToSend=seq; NextAckToSend=seq;
@@ -1205,6 +1234,7 @@ void EQStream::SetNextAckToSend(uint32 seq)
void EQStream::SetLastAckSent(uint32 seq) void EQStream::SetLastAckSent(uint32 seq)
{ {
_eqp
MAcks.lock(); MAcks.lock();
Log.Out(Logs::Detail, Logs::Netcode, _L "Set Last Ack Sent to %lu" __L, (unsigned long)seq); Log.Out(Logs::Detail, Logs::Netcode, _L "Set Last Ack Sent to %lu" __L, (unsigned long)seq);
LastAckSent=seq; LastAckSent=seq;
@@ -1213,6 +1243,7 @@ void EQStream::SetLastAckSent(uint32 seq)
void EQStream::ProcessQueue() void EQStream::ProcessQueue()
{ {
_eqp
if(PacketQueue.empty()) { if(PacketQueue.empty()) {
return; return;
} }
@@ -1228,8 +1259,9 @@ void EQStream::ProcessQueue()
EQProtocolPacket *EQStream::RemoveQueue(uint16 seq) EQProtocolPacket *EQStream::RemoveQueue(uint16 seq)
{ {
std::map<unsigned short,EQProtocolPacket *>::iterator itr; _eqp
EQProtocolPacket *qp=nullptr; std::map<unsigned short,EQProtocolPacket *>::iterator itr;
EQProtocolPacket *qp=nullptr;
if ((itr=PacketQueue.find(seq))!=PacketQueue.end()) { if ((itr=PacketQueue.find(seq))!=PacketQueue.end()) {
qp=itr->second; qp=itr->second;
PacketQueue.erase(itr); PacketQueue.erase(itr);
@@ -1240,6 +1272,7 @@ EQProtocolPacket *qp=nullptr;
void EQStream::SetStreamType(EQStreamType type) void EQStream::SetStreamType(EQStreamType type)
{ {
_eqp
Log.Out(Logs::Detail, Logs::Netcode, _L "Changing stream type from %s to %s" __L, StreamTypeString(StreamType), StreamTypeString(type)); Log.Out(Logs::Detail, Logs::Netcode, _L "Changing stream type from %s to %s" __L, StreamTypeString(StreamType), StreamTypeString(type));
StreamType=type; StreamType=type;
switch (StreamType) { switch (StreamType) {
@@ -1270,6 +1303,7 @@ void EQStream::SetStreamType(EQStreamType type)
const char *EQStream::StreamTypeString(EQStreamType t) const char *EQStream::StreamTypeString(EQStreamType t)
{ {
_eqp
switch (t) { switch (t) {
case LoginStream: case LoginStream:
return "Login"; return "Login";
@@ -1299,6 +1333,7 @@ const char *EQStream::StreamTypeString(EQStreamType t)
//returns SeqFuture if `seq` is later than `expected_seq` //returns SeqFuture if `seq` is later than `expected_seq`
EQStream::SeqOrder EQStream::CompareSequence(uint16 expected_seq , uint16 seq) EQStream::SeqOrder EQStream::CompareSequence(uint16 expected_seq , uint16 seq)
{ {
_eqp
if (expected_seq==seq) { if (expected_seq==seq) {
// Curent // Curent
return SeqInOrder; return SeqInOrder;
@@ -1312,6 +1347,7 @@ EQStream::SeqOrder EQStream::CompareSequence(uint16 expected_seq , uint16 seq)
} }
void EQStream::SetState(EQStreamState state) { void EQStream::SetState(EQStreamState state) {
_eqp
MState.lock(); MState.lock();
Log.Out(Logs::Detail, Logs::Netcode, _L "Changing state from %d to %d" __L, State, state); Log.Out(Logs::Detail, Logs::Netcode, _L "Changing state from %d to %d" __L, State, state);
State=state; State=state;
@@ -1320,7 +1356,7 @@ void EQStream::SetState(EQStreamState state) {
void EQStream::CheckTimeout(uint32 now, uint32 timeout) { void EQStream::CheckTimeout(uint32 now, uint32 timeout) {
_eqp
bool outgoing_data = HasOutgoingData(); //up here to avoid recursive locking bool outgoing_data = HasOutgoingData(); //up here to avoid recursive locking
EQStreamState orig_state = GetState(); EQStreamState orig_state = GetState();
@@ -1359,6 +1395,7 @@ void EQStream::CheckTimeout(uint32 now, uint32 timeout) {
void EQStream::Decay() void EQStream::Decay()
{ {
_eqp
MRate.lock(); MRate.lock();
uint32 rate=DecayRate; uint32 rate=DecayRate;
MRate.unlock(); MRate.unlock();
@@ -1371,6 +1408,7 @@ void EQStream::Decay()
void EQStream::AdjustRates(uint32 average_delta) void EQStream::AdjustRates(uint32 average_delta)
{ {
_eqp
if(GetExecutablePlatform() == ExePlatformWorld || GetExecutablePlatform() == ExePlatformZone) { if(GetExecutablePlatform() == ExePlatformWorld || GetExecutablePlatform() == ExePlatformZone) {
if (average_delta && (average_delta <= AVERAGE_DELTA_MAX)) { if (average_delta && (average_delta <= AVERAGE_DELTA_MAX)) {
MRate.lock(); MRate.lock();
@@ -1396,6 +1434,7 @@ void EQStream::AdjustRates(uint32 average_delta)
} }
void EQStream::Close() { void EQStream::Close() {
_eqp
if(HasOutgoingData()) { if(HasOutgoingData()) {
//there is pending data, wait for it to go out. //there is pending data, wait for it to go out.
Log.Out(Logs::Detail, Logs::Netcode, _L "Stream requested to Close(), but there is pending data, waiting for it." __L); Log.Out(Logs::Detail, Logs::Netcode, _L "Stream requested to Close(), but there is pending data, waiting for it." __L);
@@ -1412,6 +1451,7 @@ void EQStream::Close() {
//this could be expanded to check more than the fitst opcode if //this could be expanded to check more than the fitst opcode if
//we needed more complex matching //we needed more complex matching
EQStream::MatchState EQStream::CheckSignature(const Signature *sig) { EQStream::MatchState EQStream::CheckSignature(const Signature *sig) {
_eqp
EQRawApplicationPacket *p = nullptr; EQRawApplicationPacket *p = nullptr;
MatchState res = MatchNotReady; MatchState res = MatchNotReady;
+13 -3
View File
@@ -23,7 +23,8 @@
ThreadReturnType EQStreamFactoryReaderLoop(void *eqfs) ThreadReturnType EQStreamFactoryReaderLoop(void *eqfs)
{ {
EQStreamFactory *fs=(EQStreamFactory *)eqfs; _eqp
EQStreamFactory *fs = (EQStreamFactory*)eqfs;
#ifndef WIN32 #ifndef WIN32
Log.Out(Logs::Detail, Logs::None, "Starting EQStreamFactoryReaderLoop with thread ID %d", pthread_self()); Log.Out(Logs::Detail, Logs::None, "Starting EQStreamFactoryReaderLoop with thread ID %d", pthread_self());
@@ -40,7 +41,8 @@ EQStreamFactory *fs=(EQStreamFactory *)eqfs;
ThreadReturnType EQStreamFactoryWriterLoop(void *eqfs) ThreadReturnType EQStreamFactoryWriterLoop(void *eqfs)
{ {
EQStreamFactory *fs=(EQStreamFactory *)eqfs; _eqp
EQStreamFactory *fs = (EQStreamFactory*)eqfs;
#ifndef WIN32 #ifndef WIN32
Log.Out(Logs::Detail, Logs::None, "Starting EQStreamFactoryWriterLoop with thread ID %d", pthread_self()); Log.Out(Logs::Detail, Logs::None, "Starting EQStreamFactoryWriterLoop with thread ID %d", pthread_self());
@@ -58,6 +60,7 @@ ThreadReturnType EQStreamFactoryWriterLoop(void *eqfs)
EQStreamFactory::EQStreamFactory(EQStreamType type, int port, uint32 timeout) EQStreamFactory::EQStreamFactory(EQStreamType type, int port, uint32 timeout)
: Timeoutable(5000), stream_timeout(timeout) : Timeoutable(5000), stream_timeout(timeout)
{ {
_eqp
StreamType=type; StreamType=type;
Port=port; Port=port;
sock=-1; sock=-1;
@@ -65,6 +68,7 @@ EQStreamFactory::EQStreamFactory(EQStreamType type, int port, uint32 timeout)
void EQStreamFactory::Close() void EQStreamFactory::Close()
{ {
_eqp
Stop(); Stop();
#ifdef _WINDOWS #ifdef _WINDOWS
@@ -77,7 +81,8 @@ void EQStreamFactory::Close()
bool EQStreamFactory::Open() bool EQStreamFactory::Open()
{ {
struct sockaddr_in address; _eqp
struct sockaddr_in address;
#ifndef WIN32 #ifndef WIN32
pthread_t t1,t2; pthread_t t1,t2;
#endif #endif
@@ -118,6 +123,7 @@ struct sockaddr_in address;
std::shared_ptr<EQStream> EQStreamFactory::Pop() std::shared_ptr<EQStream> EQStreamFactory::Pop()
{ {
_eqp
std::shared_ptr<EQStream> s = nullptr; std::shared_ptr<EQStream> s = nullptr;
MNewStreams.lock(); MNewStreams.lock();
if (NewStreams.size()) { if (NewStreams.size()) {
@@ -132,6 +138,7 @@ std::shared_ptr<EQStream> EQStreamFactory::Pop()
void EQStreamFactory::Push(std::shared_ptr<EQStream> s) void EQStreamFactory::Push(std::shared_ptr<EQStream> s)
{ {
_eqp
MNewStreams.lock(); MNewStreams.lock();
NewStreams.push(s); NewStreams.push(s);
MNewStreams.unlock(); MNewStreams.unlock();
@@ -139,6 +146,7 @@ void EQStreamFactory::Push(std::shared_ptr<EQStream> s)
void EQStreamFactory::ReaderLoop() void EQStreamFactory::ReaderLoop()
{ {
_eqp
fd_set readset; fd_set readset;
std::map<std::pair<uint32, uint16>, std::shared_ptr<EQStream>>::iterator stream_itr; std::map<std::pair<uint32, uint16>, std::shared_ptr<EQStream>>::iterator stream_itr;
int num; int num;
@@ -216,6 +224,7 @@ void EQStreamFactory::ReaderLoop()
void EQStreamFactory::CheckTimeout() void EQStreamFactory::CheckTimeout()
{ {
_eqp
//lock streams the entire time were checking timeouts, it should be fast. //lock streams the entire time were checking timeouts, it should be fast.
MStreams.lock(); MStreams.lock();
@@ -250,6 +259,7 @@ void EQStreamFactory::CheckTimeout()
void EQStreamFactory::WriterLoop() void EQStreamFactory::WriterLoop()
{ {
_eqp
std::map<std::pair<uint32, uint16>, std::shared_ptr<EQStream>>::iterator stream_itr; std::map<std::pair<uint32, uint16>, std::shared_ptr<EQStream>>::iterator stream_itr;
bool havework=true; bool havework=true;
std::vector<std::shared_ptr<EQStream>> wants_write; std::vector<std::shared_ptr<EQStream>> wants_write;
+11
View File
@@ -28,6 +28,7 @@ EQEmuConfig *EQEmuConfig::_config = nullptr;
void EQEmuConfig::do_world(TiXmlElement *ele) void EQEmuConfig::do_world(TiXmlElement *ele)
{ {
_eqp
const char *text; const char *text;
TiXmlElement * sub_ele;; TiXmlElement * sub_ele;;
text = ParseTextBlock(ele, "shortname"); text = ParseTextBlock(ele, "shortname");
@@ -145,6 +146,7 @@ void EQEmuConfig::do_world(TiXmlElement *ele)
void EQEmuConfig::do_chatserver(TiXmlElement *ele) void EQEmuConfig::do_chatserver(TiXmlElement *ele)
{ {
_eqp
const char *text; const char *text;
text = ParseTextBlock(ele, "host", true); text = ParseTextBlock(ele, "host", true);
if (text) { if (text) {
@@ -158,6 +160,7 @@ void EQEmuConfig::do_chatserver(TiXmlElement *ele)
void EQEmuConfig::do_mailserver(TiXmlElement *ele) void EQEmuConfig::do_mailserver(TiXmlElement *ele)
{ {
_eqp
const char *text; const char *text;
text = ParseTextBlock(ele, "host", true); text = ParseTextBlock(ele, "host", true);
if (text) { if (text) {
@@ -171,6 +174,7 @@ void EQEmuConfig::do_mailserver(TiXmlElement *ele)
void EQEmuConfig::do_database(TiXmlElement *ele) void EQEmuConfig::do_database(TiXmlElement *ele)
{ {
_eqp
const char *text; const char *text;
text = ParseTextBlock(ele, "host", true); text = ParseTextBlock(ele, "host", true);
if (text) { if (text) {
@@ -197,6 +201,7 @@ void EQEmuConfig::do_database(TiXmlElement *ele)
void EQEmuConfig::do_qsdatabase(TiXmlElement *ele) void EQEmuConfig::do_qsdatabase(TiXmlElement *ele)
{ {
_eqp
const char *text; const char *text;
text = ParseTextBlock(ele, "host", true); text = ParseTextBlock(ele, "host", true);
if (text) { if (text) {
@@ -222,6 +227,7 @@ void EQEmuConfig::do_qsdatabase(TiXmlElement *ele)
void EQEmuConfig::do_zones(TiXmlElement *ele) void EQEmuConfig::do_zones(TiXmlElement *ele)
{ {
_eqp
const char *text; const char *text;
TiXmlElement *sub_ele; TiXmlElement *sub_ele;
// TiXmlNode *node,*sub_node; // TiXmlNode *node,*sub_node;
@@ -245,6 +251,7 @@ void EQEmuConfig::do_zones(TiXmlElement *ele)
void EQEmuConfig::do_files(TiXmlElement *ele) void EQEmuConfig::do_files(TiXmlElement *ele)
{ {
_eqp
const char *text; const char *text;
text = ParseTextBlock(ele, "spells", true); text = ParseTextBlock(ele, "spells", true);
if (text) { if (text) {
@@ -262,6 +269,7 @@ void EQEmuConfig::do_files(TiXmlElement *ele)
void EQEmuConfig::do_directories(TiXmlElement *ele) void EQEmuConfig::do_directories(TiXmlElement *ele)
{ {
_eqp
const char *text; const char *text;
text = ParseTextBlock(ele, "maps", true); text = ParseTextBlock(ele, "maps", true);
if (text) { if (text) {
@@ -279,6 +287,7 @@ void EQEmuConfig::do_directories(TiXmlElement *ele)
void EQEmuConfig::do_launcher(TiXmlElement *ele) void EQEmuConfig::do_launcher(TiXmlElement *ele)
{ {
_eqp
const char *text; const char *text;
TiXmlElement *sub_ele; TiXmlElement *sub_ele;
text = ParseTextBlock(ele, "logprefix", true); text = ParseTextBlock(ele, "logprefix", true);
@@ -318,6 +327,7 @@ void EQEmuConfig::do_launcher(TiXmlElement *ele)
std::string EQEmuConfig::GetByName(const std::string &var_name) const std::string EQEmuConfig::GetByName(const std::string &var_name) const
{ {
_eqp
if (var_name == "ShortName") { if (var_name == "ShortName") {
return (ShortName); return (ShortName);
} }
@@ -445,6 +455,7 @@ std::string EQEmuConfig::GetByName(const std::string &var_name) const
void EQEmuConfig::Dump() const void EQEmuConfig::Dump() const
{ {
_eqp
std::cout << "ShortName = " << ShortName << std::endl; std::cout << "ShortName = " << ShortName << std::endl;
std::cout << "LongName = " << LongName << std::endl; std::cout << "LongName = " << LongName << std::endl;
std::cout << "WorldAddress = " << WorldAddress << std::endl; std::cout << "WorldAddress = " << WorldAddress << std::endl;
+5 -2
View File
@@ -96,6 +96,7 @@ void EQEmuLogSys::LoadLogSettingsDefaults()
memset(log_settings, 0, sizeof(LogSettings) * Logs::LogCategory::MaxCategoryID); memset(log_settings, 0, sizeof(LogSettings) * Logs::LogCategory::MaxCategoryID);
/* Set Defaults */ /* Set Defaults */
log_settings[Logs::LoginServer].log_to_console = Logs::General;
log_settings[Logs::World_Server].log_to_console = Logs::General; log_settings[Logs::World_Server].log_to_console = Logs::General;
log_settings[Logs::Zone_Server].log_to_console = Logs::General; log_settings[Logs::Zone_Server].log_to_console = Logs::General;
log_settings[Logs::QS_Server].log_to_console = Logs::General; log_settings[Logs::QS_Server].log_to_console = Logs::General;
@@ -116,7 +117,7 @@ void EQEmuLogSys::LoadLogSettingsDefaults()
platform_file_name = "ucs"; platform_file_name = "ucs";
else if (EQEmuLogSys::log_platform == EQEmuExePlatform::ExePlatformLogin) else if (EQEmuLogSys::log_platform == EQEmuExePlatform::ExePlatformLogin)
platform_file_name = "login"; platform_file_name = "login";
else if (EQEmuLogSys::log_platform == EQEmuExePlatform::ExePlatformLogin) else if (EQEmuLogSys::log_platform == EQEmuExePlatform::ExePlatformLaunch)
platform_file_name = "launcher"; platform_file_name = "launcher";
} }
@@ -272,12 +273,14 @@ void EQEmuLogSys::ProcessConsoleMessage(uint16 debug_level, uint16 log_category,
void EQEmuLogSys::Out(Logs::DebugLevel debug_level, uint16 log_category, std::string message, ...) void EQEmuLogSys::Out(Logs::DebugLevel debug_level, uint16 log_category, std::string message, ...)
{ {
_eqp
const bool log_to_console = log_settings[log_category].log_to_console > 0; const bool log_to_console = log_settings[log_category].log_to_console > 0;
const bool log_to_file = log_settings[log_category].log_to_file > 0; const bool log_to_file = log_settings[log_category].log_to_file > 0;
const bool log_to_gmsay = log_settings[log_category].log_to_gmsay > 0; const bool log_to_gmsay = log_settings[log_category].log_to_gmsay > 0;
const bool nothing_to_log = !log_to_console && !log_to_file && !log_to_gmsay; const bool nothing_to_log = !log_to_console && !log_to_file && !log_to_gmsay;
if (nothing_to_log) return; if (nothing_to_log)
return;
va_list args; va_list args;
va_start(args, message); va_start(args, message);
+6 -2
View File
@@ -48,12 +48,14 @@ namespace Logs {
Combat, Combat,
Commands, Commands,
Crash, Crash,
Database,
Debug, Debug,
Doors, Doors,
Error, Error,
Guilds, Guilds,
Inventory, Inventory,
Launcher, Launcher,
LoginServer,
Netcode, Netcode,
Normal, Normal,
Object, Object,
@@ -96,12 +98,14 @@ namespace Logs {
"Combat", "Combat",
"Commands", "Commands",
"Crash", "Crash",
"Database",
"Debug", "Debug",
"Doors", "Doors",
"Error", "Error",
"Guilds", "Guilds",
"Inventory", "Inventory",
"Launcher", "Launcher",
"LoginServer",
"Netcode", "Netcode",
"Normal", "Normal",
"Object", "Object",
@@ -122,8 +126,8 @@ namespace Logs {
"WebInterface Server", "WebInterface Server",
"World Server", "World Server",
"Zone Server", "Zone Server",
"MySQL Error", "MySQLError",
"MySQL Query", "MySQLQuery",
"Mercenaries", "Mercenaries",
"Quest Debug", "Quest Debug",
"Packet :: Server -> Client", "Packet :: Server -> Client",
+1
View File
@@ -26,6 +26,7 @@ void InitExtendedProfile(ExtendedProfile_Struct *p) {
} }
bool SetExtendedProfile(ExtendedProfile_Struct *to, char *old, unsigned int len) { bool SetExtendedProfile(ExtendedProfile_Struct *to, char *old, unsigned int len) {
_eqp
if(len == 0 || old == nullptr) { if(len == 0 || old == nullptr) {
//handle old chars without an extended profile... //handle old chars without an extended profile...
InitExtendedProfile(to); InitExtendedProfile(to);
+4
View File
@@ -21,6 +21,7 @@
const char *FactionValueToString(FACTION_VALUE fv) const char *FactionValueToString(FACTION_VALUE fv)
{ {
_eqp
switch (fv) { switch (fv) {
case FACTION_ALLY: case FACTION_ALLY:
return ("Ally"); return ("Ally");
@@ -55,6 +56,7 @@ const char *FactionValueToString(FACTION_VALUE fv)
//o-------------------------------------------------------------- //o--------------------------------------------------------------
FACTION_VALUE CalculateFaction(FactionMods* fm, int32 tmpCharacter_value) FACTION_VALUE CalculateFaction(FactionMods* fm, int32 tmpCharacter_value)
{ {
_eqp
int32 character_value = tmpCharacter_value; int32 character_value = tmpCharacter_value;
if (fm) { if (fm) {
character_value += fm->base + fm->class_mod + fm->race_mod + fm->deity_mod; character_value += fm->base + fm->class_mod + fm->race_mod + fm->deity_mod;
@@ -92,6 +94,7 @@ FACTION_VALUE CalculateFaction(FactionMods* fm, int32 tmpCharacter_value)
// this function should check if some races have more than one race define // this function should check if some races have more than one race define
bool IsOfEqualRace(int r1, int r2) bool IsOfEqualRace(int r1, int r2)
{ {
_eqp
if (r1 == r2) { if (r1 == r2) {
return true; return true;
} }
@@ -113,6 +116,7 @@ bool IsOfEqualRace(int r1, int r2)
// trolls endure ogres, dark elves, ... // trolls endure ogres, dark elves, ...
bool IsOfIndiffRace(int r1, int r2) bool IsOfIndiffRace(int r1, int r2)
{ {
_eqp
if (r1 == r2) { if (r1 == r2) {
return true; return true;
} }
+57 -3
View File
@@ -39,10 +39,8 @@ BaseGuildManager::~BaseGuildManager() {
ClearGuilds(); ClearGuilds();
} }
bool BaseGuildManager::LoadGuilds() { bool BaseGuildManager::LoadGuilds() {
_eqp
ClearGuilds(); ClearGuilds();
if(m_db == nullptr) { if(m_db == nullptr) {
@@ -104,6 +102,7 @@ bool BaseGuildManager::LoadGuilds() {
} }
bool BaseGuildManager::RefreshGuild(uint32 guild_id) { bool BaseGuildManager::RefreshGuild(uint32 guild_id) {
_eqp
if(m_db == nullptr) { if(m_db == nullptr) {
Log.Out(Logs::Detail, Logs::Guilds, "Requested to refresh guild %d when we have no database object.", guild_id); Log.Out(Logs::Detail, Logs::Guilds, "Requested to refresh guild %d when we have no database object.", guild_id);
return(false); return(false);
@@ -169,6 +168,7 @@ bool BaseGuildManager::RefreshGuild(uint32 guild_id) {
BaseGuildManager::GuildInfo *BaseGuildManager::_CreateGuild(uint32 guild_id, const char *guild_name, uint32 leader_char_id, uint8 minstatus, const char *guild_motd, const char *motd_setter, const char *Channel, const char *URL) BaseGuildManager::GuildInfo *BaseGuildManager::_CreateGuild(uint32 guild_id, const char *guild_name, uint32 leader_char_id, uint8 minstatus, const char *guild_motd, const char *motd_setter, const char *Channel, const char *URL)
{ {
_eqp
std::map<uint32, GuildInfo *>::iterator res; std::map<uint32, GuildInfo *>::iterator res;
//remove any old entry. //remove any old entry.
@@ -213,6 +213,7 @@ BaseGuildManager::GuildInfo *BaseGuildManager::_CreateGuild(uint32 guild_id, con
} }
bool BaseGuildManager::_StoreGuildDB(uint32 guild_id) { bool BaseGuildManager::_StoreGuildDB(uint32 guild_id) {
_eqp
if(m_db == nullptr) { if(m_db == nullptr) {
Log.Out(Logs::Detail, Logs::Guilds, "Requested to store guild %d when we have no database object.", guild_id); Log.Out(Logs::Detail, Logs::Guilds, "Requested to store guild %d when we have no database object.", guild_id);
return(false); return(false);
@@ -295,6 +296,7 @@ bool BaseGuildManager::_StoreGuildDB(uint32 guild_id) {
} }
uint32 BaseGuildManager::_GetFreeGuildID() { uint32 BaseGuildManager::_GetFreeGuildID() {
_eqp
if(m_db == nullptr) { if(m_db == nullptr) {
Log.Out(Logs::Detail, Logs::Guilds, "Requested find a free guild ID when we have no database object."); Log.Out(Logs::Detail, Logs::Guilds, "Requested find a free guild ID when we have no database object.");
return(GUILD_NONE); return(GUILD_NONE);
@@ -342,6 +344,7 @@ uint32 BaseGuildManager::_GetFreeGuildID() {
uint32 BaseGuildManager::CreateGuild(const char* name, uint32 leader_char_id) { uint32 BaseGuildManager::CreateGuild(const char* name, uint32 leader_char_id) {
_eqp
uint32 gid = DBCreateGuild(name, leader_char_id); uint32 gid = DBCreateGuild(name, leader_char_id);
if(gid == GUILD_NONE) if(gid == GUILD_NONE)
return(GUILD_NONE); return(GUILD_NONE);
@@ -353,6 +356,7 @@ uint32 BaseGuildManager::CreateGuild(const char* name, uint32 leader_char_id) {
} }
bool BaseGuildManager::DeleteGuild(uint32 guild_id) { bool BaseGuildManager::DeleteGuild(uint32 guild_id) {
_eqp
if(!DBDeleteGuild(guild_id)) if(!DBDeleteGuild(guild_id))
return(false); return(false);
@@ -362,6 +366,7 @@ bool BaseGuildManager::DeleteGuild(uint32 guild_id) {
} }
bool BaseGuildManager::RenameGuild(uint32 guild_id, const char* name) { bool BaseGuildManager::RenameGuild(uint32 guild_id, const char* name) {
_eqp
if(!DBRenameGuild(guild_id, name)) if(!DBRenameGuild(guild_id, name))
return(false); return(false);
@@ -371,6 +376,7 @@ bool BaseGuildManager::RenameGuild(uint32 guild_id, const char* name) {
} }
bool BaseGuildManager::SetGuildLeader(uint32 guild_id, uint32 leader_char_id) { bool BaseGuildManager::SetGuildLeader(uint32 guild_id, uint32 leader_char_id) {
_eqp
//get old leader first. //get old leader first.
std::map<uint32, GuildInfo *>::const_iterator res; std::map<uint32, GuildInfo *>::const_iterator res;
res = m_guilds.find(guild_id); res = m_guilds.find(guild_id);
@@ -390,6 +396,7 @@ bool BaseGuildManager::SetGuildLeader(uint32 guild_id, uint32 leader_char_id) {
} }
bool BaseGuildManager::SetGuildMOTD(uint32 guild_id, const char* motd, const char *setter) { bool BaseGuildManager::SetGuildMOTD(uint32 guild_id, const char* motd, const char *setter) {
_eqp
if(!DBSetGuildMOTD(guild_id, motd, setter)) if(!DBSetGuildMOTD(guild_id, motd, setter))
return(false); return(false);
@@ -400,6 +407,7 @@ bool BaseGuildManager::SetGuildMOTD(uint32 guild_id, const char* motd, const cha
bool BaseGuildManager::SetGuildURL(uint32 GuildID, const char* URL) bool BaseGuildManager::SetGuildURL(uint32 GuildID, const char* URL)
{ {
_eqp
if(!DBSetGuildURL(GuildID, URL)) if(!DBSetGuildURL(GuildID, URL))
return(false); return(false);
@@ -410,6 +418,7 @@ bool BaseGuildManager::SetGuildURL(uint32 GuildID, const char* URL)
bool BaseGuildManager::SetGuildChannel(uint32 GuildID, const char* Channel) bool BaseGuildManager::SetGuildChannel(uint32 GuildID, const char* Channel)
{ {
_eqp
if(!DBSetGuildChannel(GuildID, Channel)) if(!DBSetGuildChannel(GuildID, Channel))
return(false); return(false);
@@ -419,6 +428,7 @@ bool BaseGuildManager::SetGuildChannel(uint32 GuildID, const char* Channel)
} }
bool BaseGuildManager::SetGuild(uint32 charid, uint32 guild_id, uint8 rank) { bool BaseGuildManager::SetGuild(uint32 charid, uint32 guild_id, uint8 rank) {
_eqp
if(rank > GUILD_MAX_RANK && guild_id != GUILD_NONE) if(rank > GUILD_MAX_RANK && guild_id != GUILD_NONE)
return(false); return(false);
@@ -439,6 +449,7 @@ bool BaseGuildManager::SetGuild(uint32 charid, uint32 guild_id, uint8 rank) {
//changes rank, but not guild. //changes rank, but not guild.
bool BaseGuildManager::SetGuildRank(uint32 charid, uint8 rank) { bool BaseGuildManager::SetGuildRank(uint32 charid, uint8 rank) {
_eqp
if(rank > GUILD_MAX_RANK) if(rank > GUILD_MAX_RANK)
return(false); return(false);
@@ -452,6 +463,7 @@ bool BaseGuildManager::SetGuildRank(uint32 charid, uint8 rank) {
bool BaseGuildManager::SetBankerFlag(uint32 charid, bool is_banker) { bool BaseGuildManager::SetBankerFlag(uint32 charid, bool is_banker) {
_eqp
if(!DBSetBankerFlag(charid, is_banker)) if(!DBSetBankerFlag(charid, is_banker))
return(false); return(false);
@@ -461,12 +473,14 @@ bool BaseGuildManager::SetBankerFlag(uint32 charid, bool is_banker) {
} }
bool BaseGuildManager::ForceRankUpdate(uint32 charid) { bool BaseGuildManager::ForceRankUpdate(uint32 charid) {
_eqp
SendRankUpdate(charid); SendRankUpdate(charid);
return(true); return(true);
} }
bool BaseGuildManager::SetAltFlag(uint32 charid, bool is_alt) bool BaseGuildManager::SetAltFlag(uint32 charid, bool is_alt)
{ {
_eqp
if(!DBSetAltFlag(charid, is_alt)) if(!DBSetAltFlag(charid, is_alt))
return(false); return(false);
@@ -476,6 +490,7 @@ bool BaseGuildManager::SetAltFlag(uint32 charid, bool is_alt)
} }
bool BaseGuildManager::SetTributeFlag(uint32 charid, bool enabled) { bool BaseGuildManager::SetTributeFlag(uint32 charid, bool enabled) {
_eqp
if(!DBSetTributeFlag(charid, enabled)) if(!DBSetTributeFlag(charid, enabled))
return(false); return(false);
@@ -485,6 +500,7 @@ bool BaseGuildManager::SetTributeFlag(uint32 charid, bool enabled) {
} }
bool BaseGuildManager::SetPublicNote(uint32 charid, const char *note) { bool BaseGuildManager::SetPublicNote(uint32 charid, const char *note) {
_eqp
if(!DBSetPublicNote(charid, note)) if(!DBSetPublicNote(charid, note))
return(false); return(false);
@@ -494,6 +510,7 @@ bool BaseGuildManager::SetPublicNote(uint32 charid, const char *note) {
} }
uint32 BaseGuildManager::DBCreateGuild(const char* name, uint32 leader) { uint32 BaseGuildManager::DBCreateGuild(const char* name, uint32 leader) {
_eqp
//first try to find a free ID. //first try to find a free ID.
uint32 new_id = _GetFreeGuildID(); uint32 new_id = _GetFreeGuildID();
if(new_id == GUILD_NONE) if(new_id == GUILD_NONE)
@@ -515,6 +532,7 @@ uint32 BaseGuildManager::DBCreateGuild(const char* name, uint32 leader) {
} }
bool BaseGuildManager::DBDeleteGuild(uint32 guild_id) { bool BaseGuildManager::DBDeleteGuild(uint32 guild_id) {
_eqp
//remove the local entry //remove the local entry
std::map<uint32, GuildInfo *>::iterator res; std::map<uint32, GuildInfo *>::iterator res;
@@ -551,6 +569,7 @@ bool BaseGuildManager::DBDeleteGuild(uint32 guild_id) {
} }
bool BaseGuildManager::DBRenameGuild(uint32 guild_id, const char* name) { bool BaseGuildManager::DBRenameGuild(uint32 guild_id, const char* name) {
_eqp
if(m_db == nullptr) { if(m_db == nullptr) {
Log.Out(Logs::Detail, Logs::Guilds, "Requested to rename guild %d when we have no database object.", guild_id); Log.Out(Logs::Detail, Logs::Guilds, "Requested to rename guild %d when we have no database object.", guild_id);
return false; return false;
@@ -587,6 +606,7 @@ bool BaseGuildManager::DBRenameGuild(uint32 guild_id, const char* name) {
} }
bool BaseGuildManager::DBSetGuildLeader(uint32 guild_id, uint32 leader) { bool BaseGuildManager::DBSetGuildLeader(uint32 guild_id, uint32 leader) {
_eqp
if(m_db == nullptr) { if(m_db == nullptr) {
Log.Out(Logs::Detail, Logs::Guilds, "Requested to set the leader for guild %d when we have no database object.", guild_id); Log.Out(Logs::Detail, Logs::Guilds, "Requested to set the leader for guild %d when we have no database object.", guild_id);
return false; return false;
@@ -622,6 +642,7 @@ bool BaseGuildManager::DBSetGuildLeader(uint32 guild_id, uint32 leader) {
} }
bool BaseGuildManager::DBSetGuildMOTD(uint32 guild_id, const char* motd, const char *setter) { bool BaseGuildManager::DBSetGuildMOTD(uint32 guild_id, const char* motd, const char *setter) {
_eqp
if(m_db == nullptr) { if(m_db == nullptr) {
Log.Out(Logs::Detail, Logs::Guilds, "Requested to set the MOTD for guild %d when we have no database object.", guild_id); Log.Out(Logs::Detail, Logs::Guilds, "Requested to set the MOTD for guild %d when we have no database object.", guild_id);
return(false); return(false);
@@ -664,6 +685,7 @@ bool BaseGuildManager::DBSetGuildMOTD(uint32 guild_id, const char* motd, const c
bool BaseGuildManager::DBSetGuildURL(uint32 GuildID, const char* URL) bool BaseGuildManager::DBSetGuildURL(uint32 GuildID, const char* URL)
{ {
_eqp
if(m_db == nullptr) if(m_db == nullptr)
return false; return false;
@@ -697,6 +719,7 @@ bool BaseGuildManager::DBSetGuildURL(uint32 GuildID, const char* URL)
bool BaseGuildManager::DBSetGuildChannel(uint32 GuildID, const char* Channel) bool BaseGuildManager::DBSetGuildChannel(uint32 GuildID, const char* Channel)
{ {
_eqp
if(m_db == nullptr) if(m_db == nullptr)
return(false); return(false);
@@ -730,6 +753,7 @@ bool BaseGuildManager::DBSetGuildChannel(uint32 GuildID, const char* Channel)
} }
bool BaseGuildManager::DBSetGuild(uint32 charid, uint32 guild_id, uint8 rank) { bool BaseGuildManager::DBSetGuild(uint32 charid, uint32 guild_id, uint8 rank) {
_eqp
if(m_db == nullptr) { if(m_db == nullptr) {
Log.Out(Logs::Detail, Logs::Guilds, "Requested to set char to guild %d when we have no database object.", guild_id); Log.Out(Logs::Detail, Logs::Guilds, "Requested to set char to guild %d when we have no database object.", guild_id);
return(false); return(false);
@@ -758,11 +782,13 @@ bool BaseGuildManager::DBSetGuild(uint32 charid, uint32 guild_id, uint8 rank) {
} }
bool BaseGuildManager::DBSetGuildRank(uint32 charid, uint8 rank) { bool BaseGuildManager::DBSetGuildRank(uint32 charid, uint8 rank) {
_eqp
std::string query = StringFormat("UPDATE guild_members SET rank=%d WHERE char_id=%d", rank, charid); std::string query = StringFormat("UPDATE guild_members SET rank=%d WHERE char_id=%d", rank, charid);
return(QueryWithLogging(query, "setting a guild member's rank")); return(QueryWithLogging(query, "setting a guild member's rank"));
} }
bool BaseGuildManager::DBSetBankerFlag(uint32 charid, bool is_banker) { bool BaseGuildManager::DBSetBankerFlag(uint32 charid, bool is_banker) {
_eqp
std::string query = StringFormat("UPDATE guild_members SET banker=%d WHERE char_id=%d", std::string query = StringFormat("UPDATE guild_members SET banker=%d WHERE char_id=%d",
is_banker? 1: 0, charid); is_banker? 1: 0, charid);
return(QueryWithLogging(query, "setting a guild member's banker flag")); return(QueryWithLogging(query, "setting a guild member's banker flag"));
@@ -770,6 +796,7 @@ bool BaseGuildManager::DBSetBankerFlag(uint32 charid, bool is_banker) {
bool BaseGuildManager::GetBankerFlag(uint32 CharID) bool BaseGuildManager::GetBankerFlag(uint32 CharID)
{ {
_eqp
if(!m_db) if(!m_db)
return false; return false;
@@ -792,6 +819,7 @@ bool BaseGuildManager::GetBankerFlag(uint32 CharID)
bool BaseGuildManager::DBSetAltFlag(uint32 charid, bool is_alt) bool BaseGuildManager::DBSetAltFlag(uint32 charid, bool is_alt)
{ {
_eqp
std::string query = StringFormat("UPDATE guild_members SET alt=%d WHERE char_id=%d", std::string query = StringFormat("UPDATE guild_members SET alt=%d WHERE char_id=%d",
is_alt ? 1: 0, charid); is_alt ? 1: 0, charid);
@@ -800,6 +828,7 @@ bool BaseGuildManager::DBSetAltFlag(uint32 charid, bool is_alt)
bool BaseGuildManager::GetAltFlag(uint32 CharID) bool BaseGuildManager::GetAltFlag(uint32 CharID)
{ {
_eqp
if(!m_db) if(!m_db)
return false; return false;
@@ -821,12 +850,14 @@ bool BaseGuildManager::GetAltFlag(uint32 CharID)
} }
bool BaseGuildManager::DBSetTributeFlag(uint32 charid, bool enabled) { bool BaseGuildManager::DBSetTributeFlag(uint32 charid, bool enabled) {
_eqp
std::string query = StringFormat("UPDATE guild_members SET tribute_enable=%d WHERE char_id=%d", std::string query = StringFormat("UPDATE guild_members SET tribute_enable=%d WHERE char_id=%d",
enabled ? 1: 0, charid); enabled ? 1: 0, charid);
return(QueryWithLogging(query, "setting a guild member's tribute flag")); return(QueryWithLogging(query, "setting a guild member's tribute flag"));
} }
bool BaseGuildManager::DBSetPublicNote(uint32 charid, const char* note) { bool BaseGuildManager::DBSetPublicNote(uint32 charid, const char* note) {
_eqp
if(m_db == nullptr) if(m_db == nullptr)
return(false); return(false);
@@ -851,6 +882,7 @@ bool BaseGuildManager::DBSetPublicNote(uint32 charid, const char* note) {
} }
bool BaseGuildManager::QueryWithLogging(std::string query, const char *errmsg) { bool BaseGuildManager::QueryWithLogging(std::string query, const char *errmsg) {
_eqp
if(m_db == nullptr) if(m_db == nullptr)
return(false); return(false);
@@ -879,6 +911,7 @@ bool BaseGuildManager::QueryWithLogging(std::string query, const char *errmsg) {
" FROM `character_data` AS c LEFT JOIN guild_members AS g ON c.id=g.char_id " " FROM `character_data` AS c LEFT JOIN guild_members AS g ON c.id=g.char_id "
#endif #endif
static void ProcessGuildMember(MySQLRequestRow row, CharGuildInfo &into) { static void ProcessGuildMember(MySQLRequestRow row, CharGuildInfo &into) {
_eqp
//fields from `characer_` //fields from `characer_`
into.char_id = atoi(row[0]); into.char_id = atoi(row[0]);
into.char_name = row[1]; into.char_name = row[1];
@@ -906,6 +939,7 @@ static void ProcessGuildMember(MySQLRequestRow row, CharGuildInfo &into) {
bool BaseGuildManager::GetEntireGuild(uint32 guild_id, std::vector<CharGuildInfo *> &members) { bool BaseGuildManager::GetEntireGuild(uint32 guild_id, std::vector<CharGuildInfo *> &members) {
_eqp
members.clear(); members.clear();
if(m_db == nullptr) if(m_db == nullptr)
@@ -930,6 +964,7 @@ bool BaseGuildManager::GetEntireGuild(uint32 guild_id, std::vector<CharGuildInfo
} }
bool BaseGuildManager::GetCharInfo(const char *char_name, CharGuildInfo &into) { bool BaseGuildManager::GetCharInfo(const char *char_name, CharGuildInfo &into) {
_eqp
if(m_db == nullptr) { if(m_db == nullptr) {
Log.Out(Logs::Detail, Logs::Guilds, "Requested char info on %s when we have no database object.", char_name); Log.Out(Logs::Detail, Logs::Guilds, "Requested char info on %s when we have no database object.", char_name);
return(false); return(false);
@@ -961,6 +996,7 @@ bool BaseGuildManager::GetCharInfo(const char *char_name, CharGuildInfo &into) {
} }
bool BaseGuildManager::GetCharInfo(uint32 char_id, CharGuildInfo &into) { bool BaseGuildManager::GetCharInfo(uint32 char_id, CharGuildInfo &into) {
_eqp
if(m_db == nullptr) { if(m_db == nullptr) {
Log.Out(Logs::Detail, Logs::Guilds, "Requested char info on %d when we have no database object.", char_id); Log.Out(Logs::Detail, Logs::Guilds, "Requested char info on %d when we have no database object.", char_id);
return false; return false;
@@ -991,6 +1027,7 @@ bool BaseGuildManager::GetCharInfo(uint32 char_id, CharGuildInfo &into) {
//returns ownership of the buffer. //returns ownership of the buffer.
uint8 *BaseGuildManager::MakeGuildList(const char *head_name, uint32 &length) const { uint8 *BaseGuildManager::MakeGuildList(const char *head_name, uint32 &length) const {
_eqp
//dynamic structs will make this a lot less painful. //dynamic structs will make this a lot less painful.
length = sizeof(GuildsList_Struct); length = sizeof(GuildsList_Struct);
@@ -1018,6 +1055,7 @@ uint8 *BaseGuildManager::MakeGuildList(const char *head_name, uint32 &length) co
} }
const char *BaseGuildManager::GetRankName(uint32 guild_id, uint8 rank) const { const char *BaseGuildManager::GetRankName(uint32 guild_id, uint8 rank) const {
_eqp
if(rank > GUILD_MAX_RANK) if(rank > GUILD_MAX_RANK)
return("Invalid Rank"); return("Invalid Rank");
std::map<uint32, GuildInfo *>::const_iterator res; std::map<uint32, GuildInfo *>::const_iterator res;
@@ -1028,6 +1066,7 @@ const char *BaseGuildManager::GetRankName(uint32 guild_id, uint8 rank) const {
} }
const char *BaseGuildManager::GetGuildName(uint32 guild_id) const { const char *BaseGuildManager::GetGuildName(uint32 guild_id) const {
_eqp
if(guild_id == GUILD_NONE) if(guild_id == GUILD_NONE)
return(""); return("");
std::map<uint32, GuildInfo *>::const_iterator res; std::map<uint32, GuildInfo *>::const_iterator res;
@@ -1038,6 +1077,7 @@ const char *BaseGuildManager::GetGuildName(uint32 guild_id) const {
} }
bool BaseGuildManager::GetGuildNameByID(uint32 guild_id, std::string &into) const { bool BaseGuildManager::GetGuildNameByID(uint32 guild_id, std::string &into) const {
_eqp
std::map<uint32, GuildInfo *>::const_iterator res; std::map<uint32, GuildInfo *>::const_iterator res;
res = m_guilds.find(guild_id); res = m_guilds.find(guild_id);
if(res == m_guilds.end()) if(res == m_guilds.end())
@@ -1048,6 +1088,7 @@ bool BaseGuildManager::GetGuildNameByID(uint32 guild_id, std::string &into) cons
uint32 BaseGuildManager::GetGuildIDByName(const char *GuildName) uint32 BaseGuildManager::GetGuildIDByName(const char *GuildName)
{ {
_eqp
std::map<uint32, GuildInfo *>::iterator Iterator; std::map<uint32, GuildInfo *>::iterator Iterator;
for(Iterator = m_guilds.begin(); Iterator != m_guilds.end(); ++Iterator) for(Iterator = m_guilds.begin(); Iterator != m_guilds.end(); ++Iterator)
@@ -1060,6 +1101,7 @@ uint32 BaseGuildManager::GetGuildIDByName(const char *GuildName)
} }
bool BaseGuildManager::GetGuildMOTD(uint32 guild_id, char *motd_buffer, char *setter_buffer) const { bool BaseGuildManager::GetGuildMOTD(uint32 guild_id, char *motd_buffer, char *setter_buffer) const {
_eqp
std::map<uint32, GuildInfo *>::const_iterator res; std::map<uint32, GuildInfo *>::const_iterator res;
res = m_guilds.find(guild_id); res = m_guilds.find(guild_id);
if(res == m_guilds.end()) if(res == m_guilds.end())
@@ -1071,6 +1113,7 @@ bool BaseGuildManager::GetGuildMOTD(uint32 guild_id, char *motd_buffer, char *se
bool BaseGuildManager::GetGuildURL(uint32 GuildID, char *URLBuffer) const bool BaseGuildManager::GetGuildURL(uint32 GuildID, char *URLBuffer) const
{ {
_eqp
std::map<uint32, GuildInfo *>::const_iterator res; std::map<uint32, GuildInfo *>::const_iterator res;
res = m_guilds.find(GuildID); res = m_guilds.find(GuildID);
if(res == m_guilds.end()) if(res == m_guilds.end())
@@ -1082,6 +1125,7 @@ bool BaseGuildManager::GetGuildURL(uint32 GuildID, char *URLBuffer) const
bool BaseGuildManager::GetGuildChannel(uint32 GuildID, char *ChannelBuffer) const bool BaseGuildManager::GetGuildChannel(uint32 GuildID, char *ChannelBuffer) const
{ {
_eqp
std::map<uint32, GuildInfo *>::const_iterator res; std::map<uint32, GuildInfo *>::const_iterator res;
res = m_guilds.find(GuildID); res = m_guilds.find(GuildID);
if(res == m_guilds.end()) if(res == m_guilds.end())
@@ -1091,12 +1135,14 @@ bool BaseGuildManager::GetGuildChannel(uint32 GuildID, char *ChannelBuffer) cons
} }
bool BaseGuildManager::GuildExists(uint32 guild_id) const { bool BaseGuildManager::GuildExists(uint32 guild_id) const {
_eqp
if(guild_id == GUILD_NONE) if(guild_id == GUILD_NONE)
return(false); return(false);
return(m_guilds.find(guild_id) != m_guilds.end()); return(m_guilds.find(guild_id) != m_guilds.end());
} }
bool BaseGuildManager::IsGuildLeader(uint32 guild_id, uint32 char_id) const { bool BaseGuildManager::IsGuildLeader(uint32 guild_id, uint32 char_id) const {
_eqp
if(guild_id == GUILD_NONE) { if(guild_id == GUILD_NONE) {
Log.Out(Logs::Detail, Logs::Guilds, "Check leader for char %d: not a guild.", char_id); Log.Out(Logs::Detail, Logs::Guilds, "Check leader for char %d: not a guild.", char_id);
return(false); return(false);
@@ -1112,6 +1158,7 @@ bool BaseGuildManager::IsGuildLeader(uint32 guild_id, uint32 char_id) const {
} }
uint32 BaseGuildManager::FindGuildByLeader(uint32 leader) const { uint32 BaseGuildManager::FindGuildByLeader(uint32 leader) const {
_eqp
std::map<uint32, GuildInfo *>::const_iterator cur, end; std::map<uint32, GuildInfo *>::const_iterator cur, end;
cur = m_guilds.begin(); cur = m_guilds.begin();
end = m_guilds.end(); end = m_guilds.end();
@@ -1124,6 +1171,7 @@ uint32 BaseGuildManager::FindGuildByLeader(uint32 leader) const {
//returns the rank to be sent to the client for display purposes, given their eqemu rank. //returns the rank to be sent to the client for display purposes, given their eqemu rank.
uint8 BaseGuildManager::GetDisplayedRank(uint32 guild_id, uint8 rank, uint32 char_id) const { uint8 BaseGuildManager::GetDisplayedRank(uint32 guild_id, uint8 rank, uint32 char_id) const {
_eqp
std::map<uint32, GuildInfo *>::const_iterator res; std::map<uint32, GuildInfo *>::const_iterator res;
res = m_guilds.find(guild_id); res = m_guilds.find(guild_id);
if(res == m_guilds.end()) if(res == m_guilds.end())
@@ -1136,6 +1184,7 @@ uint8 BaseGuildManager::GetDisplayedRank(uint32 guild_id, uint8 rank, uint32 cha
} }
bool BaseGuildManager::CheckGMStatus(uint32 guild_id, uint8 status) const { bool BaseGuildManager::CheckGMStatus(uint32 guild_id, uint8 status) const {
_eqp
if(status >= 250) { if(status >= 250) {
Log.Out(Logs::Detail, Logs::Guilds, "Check permission on guild %d with user status %d > 250, granted.", guild_id, status); Log.Out(Logs::Detail, Logs::Guilds, "Check permission on guild %d with user status %d > 250, granted.", guild_id, status);
return(true); //250+ as allowed anything return(true); //250+ as allowed anything
@@ -1157,6 +1206,7 @@ bool BaseGuildManager::CheckGMStatus(uint32 guild_id, uint8 status) const {
} }
bool BaseGuildManager::CheckPermission(uint32 guild_id, uint8 rank, GuildAction act) const { bool BaseGuildManager::CheckPermission(uint32 guild_id, uint8 rank, GuildAction act) const {
_eqp
if(rank > GUILD_MAX_RANK) { if(rank > GUILD_MAX_RANK) {
Log.Out(Logs::Detail, Logs::Guilds, "Check permission on guild %d and rank %d for action %s (%d): Invalid rank, denied.", Log.Out(Logs::Detail, Logs::Guilds, "Check permission on guild %d and rank %d for action %s (%d): Invalid rank, denied.",
guild_id, rank, GuildActionNames[act], act); guild_id, rank, GuildActionNames[act], act);
@@ -1182,6 +1232,7 @@ bool BaseGuildManager::CheckPermission(uint32 guild_id, uint8 rank, GuildAction
} }
bool BaseGuildManager::LocalDeleteGuild(uint32 guild_id) { bool BaseGuildManager::LocalDeleteGuild(uint32 guild_id) {
_eqp
std::map<uint32, GuildInfo *>::iterator res; std::map<uint32, GuildInfo *>::iterator res;
res = m_guilds.find(guild_id); res = m_guilds.find(guild_id);
if(res == m_guilds.end()) if(res == m_guilds.end())
@@ -1201,18 +1252,21 @@ void BaseGuildManager::ClearGuilds() {
} }
BaseGuildManager::RankInfo::RankInfo() { BaseGuildManager::RankInfo::RankInfo() {
_eqp
uint8 r; uint8 r;
for(r = 0; r < _MaxGuildAction; r++) for(r = 0; r < _MaxGuildAction; r++)
permissions[r] = false; permissions[r] = false;
} }
BaseGuildManager::GuildInfo::GuildInfo() { BaseGuildManager::GuildInfo::GuildInfo() {
_eqp
leader_char_id = 0; leader_char_id = 0;
minstatus = 0; minstatus = 0;
} }
uint32 BaseGuildManager::DoesAccountContainAGuildLeader(uint32 AccountID) uint32 BaseGuildManager::DoesAccountContainAGuildLeader(uint32 AccountID)
{ {
_eqp
std::string query = StringFormat("SELECT guild_id FROM guild_members WHERE char_id IN " std::string query = StringFormat("SELECT guild_id FROM guild_members WHERE char_id IN "
"(SELECT id FROM `character_data` WHERE account_id = %i) AND rank = 2", "(SELECT id FROM `character_data` WHERE account_id = %i) AND rank = 2",
AccountID); AccountID);
+34 -64
View File
@@ -24,36 +24,6 @@
std::map<int,std::string> DBFieldNames; std::map<int,std::string> DBFieldNames;
#ifndef WIN32
#if defined(FREEBSD) || defined(__CYGWIN__)
int print_stacktrace()
{
printf("Insert stack trace here...\n");
return(0);
}
#else //!WIN32 && !FREEBSD == linux
#include <execinfo.h>
int print_stacktrace()
{
void *ba[20];
int n = backtrace (ba, 20);
if (n != 0)
{
char **names = backtrace_symbols (ba, n);
if (names != nullptr)
{
int i;
std::cerr << "called from " << (char*)names[0] << std::endl;
for (i = 1; i < n; ++i)
std::cerr << " " << (char*)names[i] << std::endl;
free (names);
}
}
return(0);
}
#endif //!FREEBSD
#endif //!WIN32
void Unprotect(std::string &s, char what) void Unprotect(std::string &s, char what)
{ {
if (s.length()) { if (s.length()) {
@@ -78,12 +48,12 @@ void Protect(std::string &s, char what)
*/ */
bool ItemParse(const char *data, int length, std::map<int,std::map<int,std::string> > &items, int id_pos, int name_pos, int max_field, int level) bool ItemParse(const char *data, int length, std::map<int,std::map<int,std::string> > &items, int id_pos, int name_pos, int max_field, int level)
{ {
int i; int i;
char *end,*ptr; char *end,*ptr;
std::map<int,std::string> field; std::map<int,std::string> field;
static char *buffer=nullptr; static char *buffer=nullptr;
static int buffsize=0; static int buffsize=0;
static char *temp=nullptr; static char *temp=nullptr;
if (!buffsize || buffsize<(length+1)) { if (!buffsize || buffsize<(length+1)) {
buffer=(char *)realloc(buffer,length+1); buffer=(char *)realloc(buffer,length+1);
temp=(char *)realloc(temp,length+1); temp=(char *)realloc(temp,length+1);
@@ -186,10 +156,10 @@ static char *temp=nullptr;
int Tokenize(std::string s,std::map<int,std::string> & tokens, char delim) int Tokenize(std::string s,std::map<int,std::string> & tokens, char delim)
{ {
int i,len; int i,len;
std::string::size_type end; std::string::size_type end;
//char temp[1024]; //char temp[1024];
std::string x; std::string x;
tokens.clear(); tokens.clear();
i=0; i=0;
while(s.length()) { while(s.length()) {
@@ -335,14 +305,14 @@ void LoadItemDBFieldNames() {
void encode_length(unsigned long length, char *out) void encode_length(unsigned long length, char *out)
{ {
char buf[4]; char buf[4];
memcpy(buf,&length,sizeof(unsigned long)); memcpy(buf,&length,sizeof(unsigned long));
encode_chunk(buf,3,out); encode_chunk(buf,3,out);
} }
unsigned long encode(char *in, unsigned long length, char *out) unsigned long encode(char *in, unsigned long length, char *out)
{ {
unsigned long used=0,len=0; unsigned long used=0,len=0;
while(used<length) { while(used<length) {
encode_chunk(in+used,length-used,out+len); encode_chunk(in+used,length-used,out+len);
used+=3; used+=3;
@@ -355,8 +325,8 @@ unsigned long used=0,len=0;
unsigned long decode_length(char *in) unsigned long decode_length(char *in)
{ {
int length; int length;
char buf[4]; char buf[4];
decode_chunk(in,&buf[0]); decode_chunk(in,&buf[0]);
buf[3]=0; buf[3]=0;
memcpy(&length,buf,sizeof(unsigned long)); memcpy(&length,buf,sizeof(unsigned long));
@@ -366,8 +336,8 @@ char buf[4];
void decode(char *in, char *out) void decode(char *in, char *out)
{ {
char *ptr=in; char *ptr=in;
char *outptr=out; char *outptr=out;
while(*ptr) { while(*ptr) {
decode_chunk(ptr,outptr); decode_chunk(ptr,outptr);
ptr+=4; ptr+=4;
@@ -393,8 +363,8 @@ void decode_chunk(char *in, char *out)
void dump_message_column(unsigned char *buffer, unsigned long length, std::string leader, FILE *to) void dump_message_column(unsigned char *buffer, unsigned long length, std::string leader, FILE *to)
{ {
unsigned long i,j; unsigned long i,j;
unsigned long rows,offset=0; unsigned long rows,offset=0;
rows=(length/16)+1; rows=(length/16)+1;
for(i=0;i<rows;i++) { for(i=0;i<rows;i++) {
fprintf(to, "%s%05ld: ",leader.c_str(),i*16); fprintf(to, "%s%05ld: ",leader.c_str(),i*16);
@@ -419,8 +389,8 @@ unsigned long rows,offset=0;
std::string long2ip(unsigned long ip) std::string long2ip(unsigned long ip)
{ {
char temp[16]; char temp[16];
union { unsigned long ip; struct { unsigned char a,b,c,d; } octet;} ipoctet; union { unsigned long ip; struct { unsigned char a,b,c,d; } octet;} ipoctet;
ipoctet.ip=ip; ipoctet.ip=ip;
sprintf(temp,"%d.%d.%d.%d",ipoctet.octet.a,ipoctet.octet.b,ipoctet.octet.c,ipoctet.octet.d); sprintf(temp,"%d.%d.%d.%d",ipoctet.octet.a,ipoctet.octet.b,ipoctet.octet.c,ipoctet.octet.d);
@@ -430,8 +400,8 @@ union { unsigned long ip; struct { unsigned char a,b,c,d; } octet;} ipoctet;
std::string string_from_time(std::string pattern, time_t now) std::string string_from_time(std::string pattern, time_t now)
{ {
struct tm *now_tm; struct tm *now_tm;
char time_string[51]; char time_string[51];
if (!now) if (!now)
time(&now); time(&now);
@@ -450,9 +420,9 @@ std::string timestamp(time_t now)
std::string pop_arg(std::string &s, std::string seps, bool obey_quotes) std::string pop_arg(std::string &s, std::string seps, bool obey_quotes)
{ {
std::string ret; std::string ret;
unsigned long i; unsigned long i;
bool in_quote=false; bool in_quote=false;
unsigned long length=s.length(); unsigned long length=s.length();
for(i=0;i<length;i++) { for(i=0;i<length;i++) {
@@ -481,8 +451,8 @@ bool in_quote=false;
int EQsprintf(char *buffer, const char *pattern, const char *arg1, const char *arg2, const char *arg3, const char *arg4, const char *arg5, const char *arg6, const char *arg7, const char *arg8, const char *arg9) int EQsprintf(char *buffer, const char *pattern, const char *arg1, const char *arg2, const char *arg3, const char *arg4, const char *arg5, const char *arg6, const char *arg7, const char *arg8, const char *arg9)
{ {
const char *args[9],*ptr; const char *args[9],*ptr;
char *bptr; char *bptr;
args[0]=arg1; args[0]=arg1;
args[1]=arg2; args[1]=arg2;
args[2]=arg3; args[2]=arg3;
@@ -524,11 +494,11 @@ char *bptr;
std::string generate_key(int length) std::string generate_key(int length)
{ {
std::string key; std::string key;
//TODO: write this for win32... //TODO: write this for win32...
#ifndef WIN32 #ifndef WIN32
int i; int i;
timeval now; timeval now;
static const char *chars="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; static const char *chars="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
for(i=0;i<length;i++) { for(i=0;i<length;i++) {
gettimeofday(&now,nullptr); gettimeofday(&now,nullptr);
@@ -550,9 +520,9 @@ void print_hex(const char *data, unsigned long length) {
void build_hex_line(const char *buffer, unsigned long length, unsigned long offset, char *out_buffer, unsigned char padding) void build_hex_line(const char *buffer, unsigned long length, unsigned long offset, char *out_buffer, unsigned char padding)
{ {
char *ptr=out_buffer; char *ptr=out_buffer;
int i; int i;
char printable[17]; char printable[17];
ptr+=sprintf(ptr,"%0*lu:",padding,offset); ptr+=sprintf(ptr,"%0*lu:",padding,offset);
for(i=0;i<16; i++) { for(i=0;i<16; i++) {
if (i==8) { if (i==8) {
-4
View File
@@ -24,10 +24,6 @@ void decode(char *in, char *out);
void encode_chunk(char *in, int len, char *out); void encode_chunk(char *in, int len, char *out);
void decode_chunk(char *in, char *out); void decode_chunk(char *in, char *out);
#ifndef WIN32
int print_stacktrace();
#endif
void dump_message_column(unsigned char *buffer, unsigned long length, std::string leader="", FILE *to = stdout); void dump_message_column(unsigned char *buffer, unsigned long length, std::string leader="", FILE *to = stdout);
std::string string_from_time(std::string pattern, time_t now=0); std::string string_from_time(std::string pattern, time_t now=0);
std::string timestamp(time_t now=0); std::string timestamp(time_t now=0);
-1
View File
@@ -32,7 +32,6 @@ MySQLRequestResult::MySQLRequestResult(MYSQL_RES* result, uint32 rowsAffected, u
void MySQLRequestResult::FreeInternals() void MySQLRequestResult::FreeInternals()
{ {
safe_delete_array(m_ErrorBuffer); safe_delete_array(m_ErrorBuffer);
if (m_Result != nullptr) if (m_Result != nullptr)
-307
View File
@@ -1,307 +0,0 @@
#include "global_define.h"
#include <map>
#include <string>
std::map<unsigned long, std::string> opcode_map;
std::string get_opcode_name(unsigned long opcode)
{
std::map<unsigned long, std::string>::iterator itr;;
return (itr = opcode_map.find(opcode)) != opcode_map.end() ? itr->second : "OP_Unknown";
}
void load_opcode_names()
{
opcode_map[0x0176] = "LiveOP_Heartbeat";
opcode_map[0x02d7] = "LiveOP_ReloadUI";
opcode_map[0x01eb] = "LiveOP_IncreaseStats";
opcode_map[0x0134] = "LiveOP_ApproveZone";
opcode_map[0x01d5] = "LiveOP_Dye";
opcode_map[0x0168] = "LiveOP_Stamina";
opcode_map[0x014d] = "LiveOP_ControlBoat";
opcode_map[0x003e] = "LiveOP_MobUpdate";
opcode_map[0x0027] = "LiveOP_ClientUpdate";
opcode_map[0x0024] = "LiveOP_ChannelMessage";
opcode_map[0x01d7] = "LiveOP_SimpleMessage";
opcode_map[0x01d8] = "LiveOP_FormattedMessage";
opcode_map[0x01c6] = "LiveOP_TGB";
opcode_map[0x0285] = "LiveOP_TestBuff";
opcode_map[0x012d] = "LiveOP_Bind_Wound";
opcode_map[0x01ab] = "LiveOP_Charm";
opcode_map[0x014c] = "LiveOP_Begging";
opcode_map[0x0152] = "LiveOP_MoveCoin";
opcode_map[0x0292] = "LiveOP_SpawnDoor";
opcode_map[0x009d] = "LiveOP_Sneak";
opcode_map[0x0079] = "LiveOP_ExpUpdate";
opcode_map[0x027d] = "LiveOP_DumpName";
opcode_map[0x01ea] = "LiveOP_RespondAA";
opcode_map[0x01c9] = "LiveOP_SendAAStats";
opcode_map[0x0366] = "LiveOP_SendAATable";
opcode_map[0x01e9] = "LiveOP_AAAction";
opcode_map[0x00bb] = "LiveOP_BoardBoat";
opcode_map[0x00bc] = "LiveOP_LeaveBoat";
opcode_map[0x02b8] = "LiveOP_AdventureInfoRequest";
opcode_map[0x02b9] = "LiveOP_AdventureInfo";
opcode_map[0x02a6] = "LiveOP_AdventureRequest";
opcode_map[0x02a8] = "LiveOP_AdventureDetails";
opcode_map[0x02a9] = "LiveOP_LDoNButton";
opcode_map[0x02ba] = "LiveOP_AdventureData";
opcode_map[0x02c9] = "LiveOP_AdventureFinish";
opcode_map[0x02c6] = "LiveOP_LeaveAdventure";
opcode_map[0x02ce] = "LiveOP_AdventureUpdate";
opcode_map[0x002b] = "LiveOP_SendExpZonein";
opcode_map[0x01e4] = "LiveOP_ZoneInSendName";
opcode_map[0x01bf] = "LiveOP_GuildLeader";
opcode_map[0x009a] = "LiveOP_GuildPeace";
opcode_map[0x0132] = "LiveOP_GuildRemove";
opcode_map[0x0059] = "LiveOP_GuildMemberList";
opcode_map[0x026e] = "LiveOP_GuildMemberUpdate";
opcode_map[0x0130] = "LiveOP_GuildInvite";
opcode_map[0x01c0] = "LiveOP_GuildMOTD";
opcode_map[0x003c] = "LiveOP_GuildPublicNote";
opcode_map[0x027e] = "LiveOP_GetGuildMOTD";
opcode_map[0x0277] = "LiveOP_GuildDemote";
opcode_map[0x0131] = "LiveOP_GuildInviteAccept";
opcode_map[0x00a4] = "LiveOP_GuildWar";
opcode_map[0x0133] = "LiveOP_GuildDelete";
opcode_map[0x0233] = "LiveOP_GuildManageRemove";
opcode_map[0x022d] = "LiveOP_GuildManageAdd";
opcode_map[0x0039] = "LiveOP_GuildManageStatus";
opcode_map[0x01e8] = "LiveOP_Trader";
opcode_map[0x01e7] = "LiveOP_Bazaar";
opcode_map[0x01c4] = "LiveOP_BecomeTrader";
opcode_map[0x01f4] = "LiveOP_BazaarInspect";
opcode_map[0x006e] = "LiveOP_TraderItemUpdate";
opcode_map[0x017c] = "LiveOP_TraderDelItem";
opcode_map[0x01eb] = "LiveOP_TraderShop";
opcode_map[0x01ca] = "LiveOP_TraderBuy";
opcode_map[0x01ac] = "LiveOP_PetCommands";
opcode_map[0x0042] = "LiveOP_TradeSkillCombine";
opcode_map[0x02e5] = "LiveOP_AugmentItem";
opcode_map[0x0367] = "LiveOP_ItemName";
opcode_map[0x02cd] = "LiveOP_ShopItem";
opcode_map[0x0065] = "LiveOP_ShopPlayerBuy";
opcode_map[0x006a] = "LiveOP_ShopPlayerSell";
opcode_map[0x006d] = "LiveOP_ShopDelItem";
opcode_map[0x0f6d] = "LiveOP_ShopEndConfirm";
opcode_map[0x00f7] = "LiveOP_ShopRequest";
opcode_map[0x006c] = "LiveOP_ShopEnd";
opcode_map[0x02d1] = "LiveOP_AdventureMerchantRequest";
opcode_map[0x02d2] = "LiveOP_AdventureMerchantResponse";
opcode_map[0x02d3] = "LiveOP_AdventureMerchantPurchase";
opcode_map[0x02e3] = "LiveOP_AdventurePointsUpdate";
opcode_map[0x0270] = "LiveOP_LFGCommand";
opcode_map[0x01d0] = "LiveOP_LFGAppearance";
opcode_map[0x01b5] = "LiveOP_MoneyUpdate";
opcode_map[0x0721] = "LiveOP_GroupDelete";
opcode_map[0x0272] = "LiveOP_GroupAcknowledge";
opcode_map[0x024a] = "LiveOP_GroupUpdate";
opcode_map[0x025f] = "LiveOP_GroupInvite";
opcode_map[0x00ff] = "LiveOP_GroupDisband";
opcode_map[0x00d5] = "LiveOP_GroupInvite2";
opcode_map[0x025e] = "LiveOP_GroupFollow";
opcode_map[0x00d7] = "LiveOP_GroupFollow2";
opcode_map[0x00d6] = "LiveOP_GroupCancelInvite";
opcode_map[0x0156] = "LiveOP_Split";
opcode_map[0x00d8] = "LiveOP_Jump";
opcode_map[0x01d6] = "LiveOP_ConsiderCorpse";
opcode_map[0x0064] = "LiveOP_SkillUpdate";
opcode_map[0x0178] = "LiveOP_GMEndTrainingResponse";
opcode_map[0x013c] = "LiveOP_GMEndTraining";
opcode_map[0x0175] = "LiveOP_GMTrainSkill";
opcode_map[0x013b] = "LiveOP_GMTraining";
opcode_map[0x017b] = "LiveOP_ConsumeAmmo";
opcode_map[0x0171] = "LiveOP_CombatAbility";
opcode_map[0x009c] = "LiveOP_TrackUnknown";
opcode_map[0x0234] = "LiveOP_TrackTarget";
opcode_map[0x0286] = "LiveOP_Track";
opcode_map[0x0297] = "LiveOP_ReadBook";
opcode_map[0x001f] = "LiveOP_ItemLinkClick";
opcode_map[0x01f4] = "LiveOP_ItemLinkResponse";
opcode_map[0x01d9] = "LiveOP_ItemLinkText";
opcode_map[0x0a41] = "LiveOP_RezzRequest";
opcode_map[0x00e5] = "LiveOP_RezzAnswer";
opcode_map[0x019b] = "LiveOP_RezzComplete";
opcode_map[0x0128] = "LiveOP_MoveDoor";
opcode_map[0x0127] = "LiveOP_ClickDoor";
opcode_map[0x0247] = "LiveOP_SendZonepoints";
opcode_map[0x008c] = "LiveOP_SetRunMode";
opcode_map[0x0248] = "LiveOP_InspectRequest";
opcode_map[0x0249] = "LiveOP_InspectAnswer";
opcode_map[0x0187] = "LiveOP_SenseTraps";
opcode_map[0x018e] = "LiveOP_DisarmTraps";
opcode_map[0x01bc] = "LiveOP_Assist";
opcode_map[0x0240] = "LiveOP_PickPocket";
opcode_map[0x0119] = "LiveOP_LootRequest";
opcode_map[0x011a] = "LiveOP_EndLootRequest";
opcode_map[0x011b] = "LiveOP_MoneyOnCorpse";
opcode_map[0x0179] = "LiveOP_LootComplete";
opcode_map[0x013f] = "LiveOP_LootItem";
opcode_map[0x0151] = "LiveOP_MoveItem";
opcode_map[0x0056] = "LiveOP_WhoAllRequest";
opcode_map[0x0229] = "LiveOP_WhoAllResponse";
opcode_map[0x0167] = "LiveOP_Consume";
opcode_map[0x0172] = "LiveOP_AutoAttack";
opcode_map[0x0186] = "LiveOP_AutoAttack2";
opcode_map[0x0173] = "LiveOP_TargetMouse";
opcode_map[0x01ba] = "LiveOP_TargetCommand";
opcode_map[0x01d8] = "LiveOP_TargetReject";
opcode_map[0x009e] = "LiveOP_Hide";
opcode_map[0x012e] = "LiveOP_Forage";
opcode_map[0x0077] = "LiveOP_Fishing";
opcode_map[0x0246] = "LiveOP_Bug";
opcode_map[0x00f2] = "LiveOP_Emote";
opcode_map[0x0140] = "LiveOP_EmoteAnim";
opcode_map[0x015c] = "LiveOP_Consider";
opcode_map[0x01cb] = "LiveOP_FaceChange";
opcode_map[0x0197] = "LiveOP_RandomReq";
opcode_map[0x0087] = "LiveOP_RandomReply";
opcode_map[0x01c3] = "LiveOP_Camp";
opcode_map[0x0192] = "LiveOP_YellForHelp";
opcode_map[0x00ef] = "LiveOP_SafePoint";
opcode_map[0x0157] = "LiveOP_Buff";
opcode_map[0x00c0] = "LiveOP_ColoredText";
opcode_map[0x0440] = "LiveOP_MultiLineMsg";
opcode_map[0x021c] = "LiveOP_SpecialMesg";
opcode_map[0x0013] = "LiveOP_Consent";
opcode_map[0x029d] = "LiveOP_ConsentResponse";
opcode_map[0x02d4] = "LiveOP_Deny";
opcode_map[0x016c] = "LiveOP_Stun";
opcode_map[0x0021] = "LiveOP_BeginCast";
opcode_map[0x00be] = "LiveOP_CastSpell";
opcode_map[0x01a8] = "LiveOP_InterruptCast";
opcode_map[0x0105] = "LiveOP_Death";
opcode_map[0x023f] = "LiveOP_FeignDeath";
opcode_map[0x012b] = "LiveOP_Illusion";
opcode_map[0x0078] = "LiveOP_LevelUpdate";
opcode_map[0x0371] = "LiveOP_LevelAppearance";
opcode_map[0x00c2] = "LiveOP_MemorizeSpell";
opcode_map[0x0244] = "LiveOP_HPUpdate";
opcode_map[0x022e] = "LiveOP_SendHPTarget";
opcode_map[0x007d] = "LiveOP_Mend";
opcode_map[0x0160] = "LiveOP_Taunt";
opcode_map[0x0199] = "LiveOP_GMDelCorpse";
opcode_map[0x0047] = "LiveOP_GMFind";
opcode_map[0x0020] = "LiveOP_GMServers";
opcode_map[0x010b] = "LiveOP_GMGoto";
opcode_map[0x028c] = "LiveOP_GMSummon";
opcode_map[0x010a] = "LiveOP_GMKick";
opcode_map[0x0109] = "LiveOP_GMKill";
opcode_map[0x0b40] = "LiveOP_GMNameChange";
opcode_map[0x00a3] = "LiveOP_GMLastName";
opcode_map[0x01b3] = "LiveOP_GMToggle";
opcode_map[0x028f] = "LiveOP_GMEmoteZone";
opcode_map[0x0074] = "LiveOP_GMBecomeNPC";
opcode_map[0x00de] = "LiveOP_GMHideMe";
opcode_map[0x0184] = "LiveOP_GMZoneRequest";
opcode_map[0x0239] = "LiveOP_GMZoneRequest2";
opcode_map[0x0068] = "LiveOP_Petition";
opcode_map[0x0085] = "LiveOP_PetitionRefresh";
opcode_map[0x01ee] = "LiveOP_PDeletePetition";
opcode_map[0x0092] = "LiveOP_PetitionBug";
opcode_map[0x0069] = "LiveOP_PetitionUpdate";
opcode_map[0x0076] = "LiveOP_PetitionCheckout";
opcode_map[0x0056] = "LiveOP_PetitionCheckout2";
opcode_map[0x0091] = "LiveOP_PetitionDelete";
opcode_map[0x02b4] = "LiveOP_PetitionResolve";
opcode_map[0x007e] = "LiveOP_PetitionCheckIn";
opcode_map[0x0090] = "LiveOP_PetitionUnCheckout";
opcode_map[0x01ec] = "LiveOP_PetitionQue";
opcode_map[0x01bb] = "LiveOP_SetServerFilter";
opcode_map[0x0218] = "LiveOP_NewSpawn";
opcode_map[0x0140] = "LiveOP_Animation";
opcode_map[0x0142] = "LiveOP_ZoneChange";
opcode_map[0x00f3] = "LiveOP_DeleteSpawn";
opcode_map[0x0265] = "LiveOP_CrashDump";
opcode_map[0x00e8] = "LiveOP_EnvDamage";
opcode_map[0x0101] = "LiveOP_Action";
opcode_map[0x00e2] = "LiveOP_Damage";
opcode_map[0x00bf] = "LiveOP_ManaChange";
opcode_map[0x027c] = "LiveOP_ClientError";
opcode_map[0x00fb] = "LiveOP_Save";
opcode_map[0x0316] = "LiveOP_LocInfo";
opcode_map[0x0188] = "LiveOP_Surname";
opcode_map[0x018f] = "LiveOP_SwapSpell";
opcode_map[0x01db] = "LiveOP_DeleteSpell";
opcode_map[0x029f] = "LiveOP_CloseContainer";
opcode_map[0x029f] = "LiveOP_ClickObjectAck";
opcode_map[0x00fa] = "LiveOP_CreateObject";
opcode_map[0x00f9] = "LiveOP_ClickObject";
opcode_map[0x01c1] = "LiveOP_ClearObject";
opcode_map[0x0265] = "LiveOP_ZoneUnavail";
opcode_map[0x02e0] = "LiveOP_ItemPacket";
opcode_map[0x029a] = "LiveOP_TradeRequest";
opcode_map[0x0037] = "LiveOP_TradeRequestAck";
opcode_map[0x002d] = "LiveOP_TradeAcceptClick";
opcode_map[0x0162] = "LiveOP_TradeMoneyUpdate";
opcode_map[0x0036] = "LiveOP_TradeCoins";
opcode_map[0x002e] = "LiveOP_CancelTrade";
opcode_map[0x002f] = "LiveOP_FinishTrade";
opcode_map[0x00a1] = "LiveOP_SaveOnZoneReq";
opcode_map[0x0185] = "LiveOP_Logout";
opcode_map[0x0298] = "LiveOP_RequestDuel";
opcode_map[0x0a5d] = "LiveOP_DuelResponse";
opcode_map[0x016e] = "LiveOP_DuelResponse2";
opcode_map[0x007c] = "LiveOP_InstillDoubt";
opcode_map[0x00ac] = "LiveOP_SafeFallSuccess";
opcode_map[0x02fb] = "LiveOP_DisciplineUpdate";
opcode_map[0x02f2] = "LiveOP_TributeUpdate";
opcode_map[0x02f3] = "LiveOP_TributeItem";
opcode_map[0x02f4] = "LiveOP_TributePointUpdate";
opcode_map[0x02f5] = "LiveOP_SendTributes";
opcode_map[0x02f6] = "LiveOP_TributeInfo";
opcode_map[0x02f7] = "LiveOP_SelectTribute";
opcode_map[0x02f8] = "LiveOP_TributeTimer";
opcode_map[0x02f9] = "LiveOP_StartTribute";
opcode_map[0x02fa] = "LiveOP_TributeNPC";
opcode_map[0x02fe] = "LiveOP_TributeMoney";
opcode_map[0x0364] = "LiveOP_TributeToggle";
opcode_map[0x0322] = "LiveOP_RecipesFavorite";
opcode_map[0x01f9] = "LiveOP_RecipesSearch";
opcode_map[0x01fa] = "LiveOP_RecipeReply";
opcode_map[0x01fb] = "LiveOP_RecipeDetails";
opcode_map[0x01fc] = "LiveOP_RecipeAutoCombine";
opcode_map[0x02db] = "LiveOP_FindPersonRequest";
opcode_map[0x02dc] = "LiveOP_FindPersonReply";
opcode_map[0x01dd] = "LiveOP_Shielding";
opcode_map[0x0198] = "LiveOP_SetDataRate";
opcode_map[0x023b] = "LiveOP_ZoneEntry";
opcode_map[0x006b] = "LiveOP_PlayerProfile";
opcode_map[0x0291] = "LiveOP_CharInventory";
opcode_map[0x0170] = "LiveOP_ZoneSpawns";
opcode_map[0x0026] = "LiveOP_TimeOfDay";
opcode_map[0x015b] = "LiveOP_Weather";
opcode_map[0x00ec] = "LiveOP_ReqNewZone";
opcode_map[0x00eb] = "LiveOP_NewZone";
opcode_map[0x00fd] = "LiveOP_ReqClientSpawn";
opcode_map[0x012F] = "LiveOP_SpawnAppearance";
opcode_map[0x0086] = "LiveOP_ClientReady";
opcode_map[0x0086] = "LiveOP_ZoneComplete";
opcode_map[0x02db] = "LiveOP_LoginComplete";
opcode_map[0x0195] = "LiveOP_ApproveWorld";
opcode_map[0x035f] = "LiveOP_LogServer";
opcode_map[0x01b2] = "LiveOP_MOTD";
opcode_map[0x0251] = "LiveOP_SendLoginInfo";
opcode_map[0x00ea] = "LiveOP_DeleteCharacter";
opcode_map[0x0102] = "LiveOP_SendCharInfo";
opcode_map[0x00e1] = "LiveOP_ExpansionInfo";
opcode_map[0x0104] = "LiveOP_CharacterCreate";
opcode_map[0x02ab] = "LiveOP_RandomNameGenerator";
opcode_map[0x005d] = "LiveOP_GuildsList";
opcode_map[0x0125] = "LiveOP_ApproveName";
opcode_map[0x0261] = "LiveOP_EnterWorld";
opcode_map[0x015a] = "LiveOP_World_Client_CRC1";
opcode_map[0x015e] = "LiveOP_World_Client_CRC2";
opcode_map[0x0269] = "LiveOP_SetChatServer";
opcode_map[0x0264] = "LiveOP_ZoneServerInfo";
opcode_map[0x0017] = "LiveOP_AckPacket";
opcode_map[0x012c] = "LiveOP_WearChange";
opcode_map[0x1FA1] = "LiveOP_WorldObjectsSent";
opcode_map[0x39C4] = "LiveOP_BlockedBuffs";
opcode_map[0x4656] = "LiveOP_SpawnPositionUpdate";
opcode_map[0x4b61] = "LiveOP_ManaUpdate";
opcode_map[0x02d6] = "LiveOP_EnduranceUpdate";
opcode_map[0x2ac1] = "LiveOP_MobManaUpdate";
opcode_map[0x6c5f] = "LiveOP_MobEnduranceUpdate";
opcode_map[0x73a8] = "LiveOP_SendMaxCharacters";
}
-438
View File
@@ -1,438 +0,0 @@
#ifndef WIN32
#include <unistd.h>
#else
#include <winsock2.h>
#endif
#include <errno.h>
#include <string.h>
#include <time.h>
#include "packetfile.h"
#include "../common/eq_opcodes.h"
#include "../common/eq_packet_structs.h"
#include "../common/misc.h"
#include <map>
PacketFileWriter::PacketFileWriter(bool _force_flush) {
out = NULL;
force_flush = _force_flush;
}
PacketFileWriter::~PacketFileWriter() {
CloseFile();
}
bool PacketFileWriter::SetPacketStamp(const char *name, uint32 stamp) {
FILE *in;
in = fopen(name, "r+b");
if(in == NULL) {
fprintf(stderr, "Error opening packet file '%s': %s\n", name, strerror(errno));
return(false);
}
unsigned long magic = 0;
if(fread(&magic, sizeof(magic), 1, in) != 1) {
fprintf(stderr, "Error reading header from packet file: %s\n", strerror(errno));
fclose(in);
return(false);
}
PacketFileReader *ret = NULL;
if(magic == OLD_PACKET_FILE_MAGIC) {
OldPacketFileHeader *pos = 0;
uint32 stamp_pos = (uint32) &pos->packet_file_stamp;
fseek(in, stamp_pos, SEEK_SET);
OldPacketFileHeader hdr;
hdr.packet_file_stamp = stamp;
if(fwrite(&hdr.packet_file_stamp, sizeof(hdr.packet_file_stamp), 1, in) != 1) {
fprintf(stderr, "Error writting to packet file: %s\n", strerror(errno));
fclose(in);
return(false);
}
} else if(magic == PACKET_FILE_MAGIC) {
PacketFileHeader *pos = 0;
uint32 stamp_pos = (uint32) &pos->packet_file_stamp;
fseek(in, stamp_pos, SEEK_SET);
PacketFileHeader hdr;
hdr.packet_file_stamp = stamp;
if(fwrite(&hdr.packet_file_stamp, sizeof(hdr.packet_file_stamp), 1, in) != 1) {
fprintf(stderr, "Error writting to packet file: %s\n", strerror(errno));
fclose(in);
return(false);
}
} else {
fprintf(stderr, "Unknown packet file type 0x%.8x\n", magic);
fclose(in);
return(false);
}
fclose(in);
return(true);
}
bool PacketFileWriter::OpenFile(const char *name) {
CloseFile();
printf("Opening packet file: %s\n", name);
out = fopen(name, "wb");
if(out == NULL) {
fprintf(stderr, "Error opening packet file '%s': %s\n", name, strerror(errno));
return(false);
}
PacketFileHeader head;
head.packet_file_magic = PACKET_FILE_MAGIC;
head.packet_file_version = PACKET_FILE_CURRENT_VERSION;
head.packet_file_stamp = time(NULL);
if(fwrite(&head, sizeof(head), 1, out) != 1) {
fprintf(stderr, "Error writting header to packet file: %s\n", strerror(errno));
fclose(out);
return(false);
}
return(true);
}
void PacketFileWriter::CloseFile() {
if(out != NULL) {
fclose(out);
out = NULL;
printf("Closed packet file.\n");
}
}
void PacketFileWriter::WritePacket(uint16 eq_op, uint32 packlen, const unsigned char *packet, bool to_server, const struct timeval &tv) {
if(out == NULL)
return;
_WriteBlock(eq_op, packet, packlen, to_server, tv);
/*
Could log only the packets we care about, but this is most of the stream,
so just log them all...
switch(eq_op) {
case OP_NewZone:
case OP_ZoneSpawns:
case OP_NewSpawn:
case OP_MobUpdate:
case OP_ClientUpdate:
case OP_Death:
case OP_DeleteSpawn:
case OP_CastSpell:
case OP_ShopRequest:
case OP_ShopEndConfirm:
case OP_ItemPacket:
_WriteBlock(eq_op, packet, packlen);
default:
return;
}
*/
}
bool PacketFileWriter::_WriteBlock(uint16 eq_op, const void *d, uint16 len, bool to_server, const struct timeval &tv) {
if(out == NULL)
return(false);
PacketFileSection s;
s.opcode = eq_op;
s.len = len;
s.tv_sec = tv.tv_sec;
s.tv_msec = tv.tv_usec/1000;
if(to_server)
SetToServer(s);
else
SetToClient(s);
if(fwrite(&s, sizeof(s), 1, out) != 1) {
fprintf(stderr, "Error writting block header: %s\n", strerror(errno));
return(false);
}
if(fwrite(d, 1, len, out) != len) {
fprintf(stderr, "Error writting block body: %s\n", strerror(errno));
return(false);
}
if(force_flush)
fflush(out);
return(true);
}
PacketFileReader *PacketFileReader::OpenPacketFile(const char *name) {
FILE *in;
in = fopen(name, "rb");
if(in == NULL) {
fprintf(stderr, "Error opening packet file '%s': %s\n", name, strerror(errno));
return(NULL);
}
unsigned long magic = 0;
if(fread(&magic, sizeof(magic), 1, in) != 1) {
fprintf(stderr, "Error reading header to packet file: %s\n", strerror(errno));
fclose(in);
return(NULL);
}
PacketFileReader *ret = NULL;
if(magic == OLD_PACKET_FILE_MAGIC) {
ret = new OldPacketFileReader();
} else if(magic == PACKET_FILE_MAGIC) {
ret = new NewPacketFileReader();
} else {
fprintf(stderr, "Unknown packet file type 0x%.8x\n", magic);
fclose(in);
return(NULL);
}
if(!ret->OpenFile(name)) {
safe_delete(ret);
return(NULL);
}
return(ret);
}
PacketFileReader::PacketFileReader() {
packet_file_stamp = 0;
}
OldPacketFileReader::OldPacketFileReader()
: PacketFileReader()
{
in = NULL;
}
OldPacketFileReader::~OldPacketFileReader() {
CloseFile();
}
bool OldPacketFileReader::OpenFile(const char *name) {
CloseFile();
in = fopen(name, "rb");
if(in == NULL) {
fprintf(stderr, "Error opening packet file '%s': %s\n", name, strerror(errno));
return(false);
}
OldPacketFileHeader head;
if(fread(&head, sizeof(head), 1, in) != 1) {
fprintf(stderr, "Error reading header to packet file: %s\n", strerror(errno));
fclose(in);
return(false);
}
if(head.packet_file_magic != OLD_PACKET_FILE_MAGIC) {
fclose(in);
if(head.packet_file_magic > (OLD_PACKET_FILE_MAGIC)) {
fprintf(stderr, "Error: this is a build file, not a packet file, its allready processed!\n");
} else {
fprintf(stderr, "Error: this is not a packet file!\n");
}
return(false);
}
uint32 now = time(NULL);
if(head.packet_file_stamp > now) {
fprintf(stderr, "Error: invalid timestamp in file. Your clock or the collector's is wrong (%d sec ahead).\n", head.packet_file_stamp-now);
fclose(in);
return(false);
}
packet_file_stamp = head.packet_file_stamp;
return(true);
}
void OldPacketFileReader::CloseFile() {
if(in != NULL) {
fclose(in);
in = NULL;
}
}
bool OldPacketFileReader::ResetFile() {
if(in == NULL)
return(false);
rewind(in);
//gotta read past the header again
OldPacketFileHeader head;
if(fread(&head, sizeof(head), 1, in) != 1) {
return(false);
}
return(true);
}
bool OldPacketFileReader::ReadPacket(uint16 &eq_op, uint32 &packlen, unsigned char *packet, bool &to_server, struct timeval &tv) {
if(in == NULL)
return(false);
if(feof(in))
return(false);
OldPacketFileSection s;
if(fread(&s, sizeof(s), 1, in) != 1) {
if(!feof(in))
fprintf(stderr, "Error reading section header: %s\n", strerror(errno));
return(false);
}
eq_op = s.opcode;
if(packlen < s.len) {
fprintf(stderr, "Packet buffer is too small! %d < %d, skipping\n", packlen, s.len);
fseek(in, s.len, SEEK_CUR);
return(false);
}
if(fread(packet, 1, s.len, in) != s.len) {
if(feof(in))
fprintf(stderr, "Error: EOF encountered when expecting packet data.\n");
else
fprintf(stderr, "Error reading packet body: %s\n", strerror(errno));
return(false);
}
packlen = s.len;
to_server = false;
tv.tv_sec = 0;
tv.tv_usec = 0;
return(true);
}
NewPacketFileReader::NewPacketFileReader()
: PacketFileReader()
{
in = NULL;
}
NewPacketFileReader::~NewPacketFileReader() {
CloseFile();
}
bool NewPacketFileReader::OpenFile(const char *name) {
CloseFile();
in = fopen(name, "rb");
if(in == NULL) {
fprintf(stderr, "Error opening packet file '%s': %s\n", name, strerror(errno));
return(false);
}
PacketFileHeader head;
if(fread(&head, sizeof(head), 1, in) != 1) {
fprintf(stderr, "Error reading header to packet file: %s\n", strerror(errno));
fclose(in);
return(false);
}
if(head.packet_file_magic != PACKET_FILE_MAGIC) {
fclose(in);
if(head.packet_file_magic == (PACKET_FILE_MAGIC+1)) {
fprintf(stderr, "Error: this is a build file, not a packet file, its allready processed!\n");
} else {
fprintf(stderr, "Error: this is not a packet file!\n");
}
return(false);
}
uint32 now = time(NULL);
if(head.packet_file_stamp > now) {
fprintf(stderr, "Error: invalid timestamp in file. Your clock or the collector's is wrong (%d sec ahead).\n", head.packet_file_stamp-now);
fclose(in);
return(false);
}
packet_file_stamp = head.packet_file_stamp;
return(true);
}
void NewPacketFileReader::CloseFile() {
if(in != NULL) {
fclose(in);
in = NULL;
}
}
bool NewPacketFileReader::ResetFile() {
if(in == NULL)
return(false);
rewind(in);
//gotta read past the header again
PacketFileHeader head;
if(fread(&head, sizeof(head), 1, in) != 1) {
return(false);
}
return(true);
}
bool NewPacketFileReader::ReadPacket(uint16 &eq_op, uint32 &packlen, unsigned char *packet, bool &to_server, struct timeval &tv) {
if(in == NULL)
return(false);
if(feof(in))
return(false);
PacketFileSection s;
if(fread(&s, sizeof(s), 1, in) != 1) {
if(!feof(in))
fprintf(stderr, "Error reading section header: %s\n", strerror(errno));
return(false);
}
eq_op = s.opcode;
if(packlen < s.len) {
fprintf(stderr, "Packet buffer is too small! %d < %d, skipping\n", packlen, s.len);
fseek(in, s.len, SEEK_CUR);
return(false);
}
if(fread(packet, 1, s.len, in) != s.len) {
if(feof(in))
fprintf(stderr, "Error: EOF encountered when expecting packet data.\n");
else
fprintf(stderr, "Error reading packet body: %s\n", strerror(errno));
return(false);
}
packlen = s.len;
to_server = IsToServer(s);
tv.tv_sec = s.tv_sec;
tv.tv_usec = 1000*s.tv_msec;
return(true);
}
-130
View File
@@ -1,130 +0,0 @@
#ifndef PACKET_FILE_H
#define PACKET_FILE_H
#include "../common/types.h"
#include <stdio.h>
#include <time.h>
//#include <zlib.h>
//constants used in the packet file header
#define PACKET_FILE_MAGIC 0x93a7b6f6
#define OLD_PACKET_FILE_MAGIC 0x93a7b6f7
#define PACKET_FILE_CURRENT_VERSION 1
#pragma pack(1)
//old structs from when I forgot to put the version number in
struct OldPacketFileHeader {
uint32 packet_file_magic;
uint32 packet_file_stamp;
};
struct OldPacketFileSection {
uint16 opcode;
uint32 len;
};
struct PacketFileHeader {
uint32 packet_file_magic;
uint16 packet_file_version;
uint32 packet_file_stamp;
};
struct PacketFileSection {
uint16 opcode;
uint8 flags; //mainly for client->server, but others could be added
uint32 tv_sec;
uint16 tv_msec;
uint32 len;
};
#pragma pack()
#define TO_SERVER_FLAG 0x01
#define SetToClient(pfs) pfs.flags = pfs.flags&~TO_SERVER_FLAG
#define SetToServer(pfs) pfs.flags = pfs.flags|TO_SERVER_FLAG
#define IsToClient(pfs) (pfs.flags&TO_SERVER_FLAG == 0)
#define IsToServer(pfs) (pfs.flags&TO_SERVER_FLAG != 0)
class PacketFileWriter {
public:
PacketFileWriter(bool force_flush);
~PacketFileWriter();
bool OpenFile(const char *name);
void CloseFile();
void WritePacket(uint16 eq_op, uint32 packlen, const unsigned char *packet, bool to_server, const struct timeval &tv);
static bool SetPacketStamp(const char *file, uint32 stamp);
protected:
bool _WriteBlock(uint16 eq_op, const void *d, uint16 len, bool to_server, const struct timeval &tv);
//gzFile out;
FILE *out;
bool force_flush;
};
class PacketFileReader {
public:
PacketFileReader();
virtual bool OpenFile(const char *name) = 0;
virtual void CloseFile() = 0;
virtual bool ResetFile() = 0; //aka rewind
virtual bool ReadPacket(uint16 &eq_op, uint32 &packlen, unsigned char *packet, bool &to_server, struct timeval &tv) = 0;
time_t GetStamp() { return(time_t(packet_file_stamp)); }
//factory method to open the right packet file.
static PacketFileReader *OpenPacketFile(const char *name);
protected:
uint32 packet_file_stamp;
};
class OldPacketFileReader : public PacketFileReader {
public:
OldPacketFileReader();
virtual ~OldPacketFileReader();
bool OpenFile(const char *name);
void CloseFile();
bool ResetFile(); //aka rewind
bool ReadPacket(uint16 &eq_op, uint32 &packlen, unsigned char *packet, bool &to_server, struct timeval &tv);
time_t GetStamp() { return(time_t(packet_file_stamp)); }
protected:
//gzFile in;
FILE *in;
};
class NewPacketFileReader: public PacketFileReader {
public:
NewPacketFileReader();
virtual ~NewPacketFileReader();
bool OpenFile(const char *name);
void CloseFile();
bool ResetFile(); //aka rewind
bool ReadPacket(uint16 &eq_op, uint32 &packlen, unsigned char *packet, bool &to_server, struct timeval &tv);
time_t GetStamp() { return(time_t(packet_file_stamp)); }
protected:
//gzFile in;
FILE *in;
};
#endif
+6 -3
View File
@@ -47,6 +47,7 @@ const ProcLauncher::ProcRef ProcLauncher::ProcError = -1;
ProcLauncher::ProcLauncher() ProcLauncher::ProcLauncher()
{ {
_eqp
#ifndef WIN32 #ifndef WIN32
if(signal(SIGCHLD, ProcLauncher::HandleSigChild) == SIG_ERR) if(signal(SIGCHLD, ProcLauncher::HandleSigChild) == SIG_ERR)
fprintf(stderr, "Unable to register child signal handler. Thats bad."); fprintf(stderr, "Unable to register child signal handler. Thats bad.");
@@ -55,6 +56,7 @@ ProcLauncher::ProcLauncher()
} }
void ProcLauncher::Process() { void ProcLauncher::Process() {
_eqp
#ifdef _WINDOWS #ifdef _WINDOWS
std::map<ProcRef, Spec *>::iterator cur, end, tmp; std::map<ProcRef, Spec *>::iterator cur, end, tmp;
cur = m_running.begin(); cur = m_running.begin();
@@ -108,7 +110,7 @@ void ProcLauncher::Process() {
} }
void ProcLauncher::ProcessTerminated(std::map<ProcRef, Spec *>::iterator &it) { void ProcLauncher::ProcessTerminated(std::map<ProcRef, Spec *>::iterator &it) {
_eqp
if(it->second->handler != nullptr) if(it->second->handler != nullptr)
it->second->handler->OnTerminate(it->first, it->second); it->second->handler->OnTerminate(it->first, it->second);
@@ -121,6 +123,7 @@ void ProcLauncher::ProcessTerminated(std::map<ProcRef, Spec *>::iterator &it) {
} }
ProcLauncher::ProcRef ProcLauncher::Launch(Spec *&to_launch) { ProcLauncher::ProcRef ProcLauncher::Launch(Spec *&to_launch) {
_eqp
//consume the pointer //consume the pointer
Spec *it = to_launch; Spec *it = to_launch;
to_launch = nullptr; to_launch = nullptr;
@@ -275,6 +278,7 @@ ProcLauncher::ProcRef ProcLauncher::Launch(Spec *&to_launch) {
//if graceful is true, we try to be nice about it if possible //if graceful is true, we try to be nice about it if possible
bool ProcLauncher::Terminate(const ProcRef &proc, bool graceful) { bool ProcLauncher::Terminate(const ProcRef &proc, bool graceful) {
_eqp
//we are only willing to kill things we started... //we are only willing to kill things we started...
std::map<ProcRef, Spec *>::iterator res = m_running.find(proc); std::map<ProcRef, Spec *>::iterator res = m_running.find(proc);
if(res == m_running.end()) if(res == m_running.end())
@@ -301,6 +305,7 @@ bool ProcLauncher::Terminate(const ProcRef &proc, bool graceful) {
} }
void ProcLauncher::TerminateAll(bool final) { void ProcLauncher::TerminateAll(bool final) {
_eqp
if(!final) { if(!final) {
//send a nice terminate to each process, with intention of waiting for them //send a nice terminate to each process, with intention of waiting for them
std::map<ProcRef, Spec *>::iterator cur, end; std::map<ProcRef, Spec *>::iterator cur, end;
@@ -333,8 +338,6 @@ void ProcLauncher::HandleSigChild(int signum) {
} }
#endif #endif
ProcLauncher::Spec::Spec() { ProcLauncher::Spec::Spec() {
handler = nullptr; handler = nullptr;
} }
-92
View File
@@ -1,92 +0,0 @@
/* EQEMu: Everquest Server Emulator
Copyright (C) 2001-2004 EQEMu Development Team (http://eqemulator.net)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY except by those people which sell it, which
are required to give you total support for your newly bought product;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef PROFILER_H
#define PROFILER_H
#ifdef EQPROFILE
#include "../common/rdtsc.h"
#include "../common/types.h"
class ScopedProfiler;
class GeneralProfiler {
friend class ScopedProfiler;
public:
inline GeneralProfiler(unsigned int _count) {
count = _count;
timers = new RDTSC_Collector[count];
}
inline virtual ~GeneralProfiler() {
safe_delete_array(timers);
}
inline double getTotalDuration(unsigned int id) {
return(id<count? timers[id].getTotalDuration() : 0);
}
inline double getAverage(unsigned int id) {
return(id<count? timers[id].getAverage() : 0);
}
inline unsigned long long getTicks(unsigned int id) {
return(id<count? timers[id].getTicks() : 0);
}
inline unsigned long long getTotalTicks(unsigned int id) {
return(id<count? timers[id].getTotalTicks() : 0);
}
inline unsigned long long getCount(unsigned int id) {
return(id<count? timers[id].getCount() : 0);
}
inline void reset() {
unsigned int r;
RDTSC_Collector *cur = timers;
for(r = 0; r < count; r++, cur++)
cur->reset();
}
RDTSC_Collector *timers;
unsigned int count;
};
class ScopedProfiler {
public:
inline ScopedProfiler(RDTSC_Collector *c) {
_it = c;
c->start();
}
inline ~ScopedProfiler() {
_it->stop();
}
protected:
RDTSC_Collector *_it;
};
#define _GP(obj, pkg, name) ScopedProfiler __eqemu_profiler(&obj.timers[pkg::name])
#else // else !EQPROFILE
//no profiling, dummy functions
#define _GP(obj, pkg, name) ;
#endif
#endif
-3
View File
@@ -175,7 +175,6 @@ bool PersistentTimer::Store(Database *db) {
} }
bool PersistentTimer::Clear(Database *db) { bool PersistentTimer::Clear(Database *db) {
std::string query = StringFormat("DELETE FROM timers " std::string query = StringFormat("DELETE FROM timers "
"WHERE char_id = %lu AND type = %u ", "WHERE char_id = %lu AND type = %u ",
(unsigned long)_char_id, _type); (unsigned long)_char_id, _type);
@@ -416,7 +415,6 @@ PersistentTimer *PTimerList::Get(pTimerType type) {
} }
void PTimerList::ToVector(std::vector< std::pair<pTimerType, PersistentTimer *> > &out) { void PTimerList::ToVector(std::vector< std::pair<pTimerType, PersistentTimer *> > &out) {
std::pair<pTimerType, PersistentTimer *> p; std::pair<pTimerType, PersistentTimer *> p;
std::map<pTimerType, PersistentTimer *>::iterator s; std::map<pTimerType, PersistentTimer *>::iterator s;
@@ -432,7 +430,6 @@ void PTimerList::ToVector(std::vector< std::pair<pTimerType, PersistentTimer *>
} }
bool PTimerList::ClearOffline(Database *db, uint32 char_id, pTimerType type) { bool PTimerList::ClearOffline(Database *db, uint32 char_id, pTimerType type) {
std::string query = StringFormat("DELETE FROM timers WHERE char_id=%lu AND type=%u ",(unsigned long)char_id, type); std::string query = StringFormat("DELETE FROM timers WHERE char_id=%lu AND type=%u ",(unsigned long)char_id, type);
#ifdef DEBUG_PTIMERS #ifdef DEBUG_PTIMERS
-167
View File
@@ -1,167 +0,0 @@
/* EQEMu: Everquest Server Emulator
Copyright (C) 2001-2006 EQEMu Development Team (http://eqemulator.net)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY except by those people which sell it, which
are required to give you total support for your newly bought product;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "rdtsc.h"
#include "types.h"
#ifdef _WINDOWS
#include <sys/timeb.h>
#include "../common/timer.h"
#else
#include <unistd.h>
#include <sys/time.h>
#endif
#ifdef i386
#define USE_RDTSC
#endif
bool RDTSC_Timer::_inited = false;
int64 RDTSC_Timer::_ticsperms = 0;
RDTSC_Timer::RDTSC_Timer() {
if(!_inited) {
//find our clock rate
RDTSC_Timer::init();
}
_start = 0;
_end = 0;
}
RDTSC_Timer::RDTSC_Timer(bool start_it) {
if(!_inited) {
//find our clock rate
RDTSC_Timer::init();
}
if(start_it)
start();
else {
_start = 0;
_end = 0;
}
}
int64 RDTSC_Timer::rdtsc() {
int64 res = 0;
#ifdef USE_RDTSC
#ifndef WIN64
#ifdef WIN32
//untested!
unsigned long highw, loww;
__asm {
push eax
push edx
rdtsc
mov highw, eax
mov loww, edx
pop edx
pop eax
}
res = ((int64)highw)<<32 | loww;
#else
//gnu version
__asm__ __volatile__ ("rdtsc" : "=A" (res));
#endif
#else
//fall back to get time of day
timeval t;
gettimeofday(&t, nullptr);
res = ((int64)t.tv_sec) * 1000 + t.tv_usec;
#endif
#endif
return(res);
}
void RDTSC_Timer::init() {
#ifdef USE_RDTSC
int64 before, after, sum;
int r;
sum = 0;
// run an average to increase accuracy of clock rate
for(r = 0; r < CALIBRATE_LOOPS; r++) {
before = rdtsc();
//sleep a know duration to figure out clock rate
#ifdef _WINDOWS
Sleep(SLEEP_TIME);
#else
usleep(SLEEP_TIME * 1000); //ms * 1000
#endif
after = rdtsc();
sum += after - before;
}
//ticks per sleep / ms per sleep
_ticsperms = (sum / CALIBRATE_LOOPS) / SLEEP_TIME;
#else
//if using gettimeofday, this is fixed at 1000
_ticsperms = 1000;
#endif
// printf("Tics per milisecond: %llu \n", _ticsperms);
_inited = true; //only want to do this once
}
//start the timer
void RDTSC_Timer::start() {
_start = rdtsc();
_end = 0;
}
//stop the timer
void RDTSC_Timer::stop() {
_end = rdtsc();
}
//calculate the elapsed duration
double RDTSC_Timer::getDuration() {
return(((double)(getTicks())) / double(_ticsperms));
}
RDTSC_Collector::RDTSC_Collector() : RDTSC_Timer() {
reset();
}
RDTSC_Collector::RDTSC_Collector(bool start_it) : RDTSC_Timer(start_it) {
reset();
}
void RDTSC_Collector::stop() {
RDTSC_Timer::stop();
_sum += RDTSC_Timer::getTicks();
_count++;
}
//calculate the elapsed duration
double RDTSC_Collector::getTotalDuration() {
return(((double)(getTotalTicks())) / double(_ticsperms));
}
double RDTSC_Collector::getAverage() {
return(((double)(getTotalTicks())) / double(_ticsperms * _count));
}
void RDTSC_Collector::reset() {
_sum = 0;
_count = 0;
}
-86
View File
@@ -1,86 +0,0 @@
/* EQEMu: Everquest Server Emulator
Copyright (C) 2001-2006 EQEMu Development Team (http://eqemulator.net)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY except by those people which sell it, which
are required to give you total support for your newly bought product;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef RDTSC_H
#define RDTSC_H
#define CALIBRATE_LOOPS 3
#define SLEEP_TIME 10 //in ms
/*
This class implementes the highest possibly prescision timer
which is avaliable on the current archetecture.
On intel, this uses the rdtsc instruction to get the actual
clock cycle count, and elsewhere it falls back to gettimeofday
All calculations are carried out in 64 bit integers.
*/
#include "types.h"
class RDTSC_Timer {
public:
RDTSC_Timer();
RDTSC_Timer(bool start_it);
void start(); //start the timer
virtual void stop(); //stop the timer
double getDuration(); //returns the number of miliseconds elapsed
//access functions
int64 getTicks() { return(_end - _start); }
static int64 ticksPerMS() { return(_ticsperms); }
protected:
static int64 rdtsc();
int64 _start;
int64 _end;
protected:
static void init();
static bool _inited;
static int64 _ticsperms;
};
//this is a timer which can be started and stoped many times.
//each time it contributes its counter to a sum, whic is used
//to find net duration.
class RDTSC_Collector : public RDTSC_Timer {
public:
RDTSC_Collector();
RDTSC_Collector(bool start_it);
void reset();
void stop(); //stop the timer
double getTotalDuration(); //returns the number of miliseconds elapsed
double getAverage();
int64 getTotalTicks() { return(_sum); }
int64 getCount() { return(_count); }
protected:
int64 _sum;
int64 _count;
};
#endif
+59 -3
View File
@@ -43,6 +43,7 @@ SharedDatabase::~SharedDatabase() {
bool SharedDatabase::SetHideMe(uint32 account_id, uint8 hideme) bool SharedDatabase::SetHideMe(uint32 account_id, uint8 hideme)
{ {
_eqp
std::string query = StringFormat("UPDATE account SET hideme = %i WHERE id = %i", hideme, account_id); std::string query = StringFormat("UPDATE account SET hideme = %i WHERE id = %i", hideme, account_id);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
if (!results.Success()) { if (!results.Success()) {
@@ -54,6 +55,7 @@ bool SharedDatabase::SetHideMe(uint32 account_id, uint8 hideme)
uint8 SharedDatabase::GetGMSpeed(uint32 account_id) uint8 SharedDatabase::GetGMSpeed(uint32 account_id)
{ {
_eqp
std::string query = StringFormat("SELECT gmspeed FROM account WHERE id = '%i'", account_id); std::string query = StringFormat("SELECT gmspeed FROM account WHERE id = '%i'", account_id);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
if (!results.Success()) { if (!results.Success()) {
@@ -70,6 +72,7 @@ uint8 SharedDatabase::GetGMSpeed(uint32 account_id)
bool SharedDatabase::SetGMSpeed(uint32 account_id, uint8 gmspeed) bool SharedDatabase::SetGMSpeed(uint32 account_id, uint8 gmspeed)
{ {
_eqp
std::string query = StringFormat("UPDATE account SET gmspeed = %i WHERE id = %i", gmspeed, account_id); std::string query = StringFormat("UPDATE account SET gmspeed = %i WHERE id = %i", gmspeed, account_id);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
if (!results.Success()) { if (!results.Success()) {
@@ -80,6 +83,7 @@ bool SharedDatabase::SetGMSpeed(uint32 account_id, uint8 gmspeed)
} }
uint32 SharedDatabase::GetTotalTimeEntitledOnAccount(uint32 AccountID) { uint32 SharedDatabase::GetTotalTimeEntitledOnAccount(uint32 AccountID) {
_eqp
uint32 EntitledTime = 0; uint32 EntitledTime = 0;
std::string query = StringFormat("SELECT `time_played` FROM `character_data` WHERE `account_id` = %u", AccountID); std::string query = StringFormat("SELECT `time_played` FROM `character_data` WHERE `account_id` = %u", AccountID);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
@@ -91,6 +95,7 @@ uint32 SharedDatabase::GetTotalTimeEntitledOnAccount(uint32 AccountID) {
bool SharedDatabase::SaveCursor(uint32 char_id, std::list<ItemInst*>::const_iterator &start, std::list<ItemInst*>::const_iterator &end) bool SharedDatabase::SaveCursor(uint32 char_id, std::list<ItemInst*>::const_iterator &start, std::list<ItemInst*>::const_iterator &end)
{ {
_eqp
// Delete cursor items // Delete cursor items
std::string query = StringFormat("DELETE FROM inventory WHERE charid = %i " std::string query = StringFormat("DELETE FROM inventory WHERE charid = %i "
"AND ((slotid >= 8000 AND slotid <= 8999) " "AND ((slotid >= 8000 AND slotid <= 8999) "
@@ -118,6 +123,7 @@ bool SharedDatabase::SaveCursor(uint32 char_id, std::list<ItemInst*>::const_iter
bool SharedDatabase::VerifyInventory(uint32 account_id, int16 slot_id, const ItemInst* inst) bool SharedDatabase::VerifyInventory(uint32 account_id, int16 slot_id, const ItemInst* inst)
{ {
_eqp
// Delete cursor items // Delete cursor items
std::string query = StringFormat("SELECT itemid, charges FROM sharedbank " std::string query = StringFormat("SELECT itemid, charges FROM sharedbank "
"WHERE acctid = %d AND slotid = %d", "WHERE acctid = %d AND slotid = %d",
@@ -150,7 +156,7 @@ bool SharedDatabase::VerifyInventory(uint32 account_id, int16 slot_id, const Ite
} }
bool SharedDatabase::SaveInventory(uint32 char_id, const ItemInst* inst, int16 slot_id) { bool SharedDatabase::SaveInventory(uint32 char_id, const ItemInst* inst, int16 slot_id) {
_eqp
// If we never save tribute slots..how are we to ever benefit from them!!? The client // If we never save tribute slots..how are we to ever benefit from them!!? The client
// object is destroyed upon zoning - including its inventory object..and if tributes // object is destroyed upon zoning - including its inventory object..and if tributes
// don't exist in the database, then they will never be loaded when the new client // don't exist in the database, then they will never be loaded when the new client
@@ -177,6 +183,7 @@ bool SharedDatabase::SaveInventory(uint32 char_id, const ItemInst* inst, int16 s
} }
bool SharedDatabase::UpdateInventorySlot(uint32 char_id, const ItemInst* inst, int16 slot_id) { bool SharedDatabase::UpdateInventorySlot(uint32 char_id, const ItemInst* inst, int16 slot_id) {
_eqp
// need to check 'inst' argument for valid pointer // need to check 'inst' argument for valid pointer
uint32 augslot[EmuConstants::ITEM_COMMON_SIZE] = { NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM }; uint32 augslot[EmuConstants::ITEM_COMMON_SIZE] = { NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM };
@@ -222,6 +229,7 @@ bool SharedDatabase::UpdateInventorySlot(uint32 char_id, const ItemInst* inst, i
} }
bool SharedDatabase::UpdateSharedBankSlot(uint32 char_id, const ItemInst* inst, int16 slot_id) { bool SharedDatabase::UpdateSharedBankSlot(uint32 char_id, const ItemInst* inst, int16 slot_id) {
_eqp
// need to check 'inst' argument for valid pointer // need to check 'inst' argument for valid pointer
uint32 augslot[EmuConstants::ITEM_COMMON_SIZE] = { NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM }; uint32 augslot[EmuConstants::ITEM_COMMON_SIZE] = { NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM };
@@ -267,6 +275,7 @@ bool SharedDatabase::UpdateSharedBankSlot(uint32 char_id, const ItemInst* inst,
} }
bool SharedDatabase::DeleteInventorySlot(uint32 char_id, int16 slot_id) { bool SharedDatabase::DeleteInventorySlot(uint32 char_id, int16 slot_id) {
_eqp
// Delete item // Delete item
std::string query = StringFormat("DELETE FROM inventory WHERE charid = %i AND slotid = %i", char_id, slot_id); std::string query = StringFormat("DELETE FROM inventory WHERE charid = %i AND slotid = %i", char_id, slot_id);
@@ -292,6 +301,7 @@ bool SharedDatabase::DeleteInventorySlot(uint32 char_id, int16 slot_id) {
} }
bool SharedDatabase::DeleteSharedBankSlot(uint32 char_id, int16 slot_id) { bool SharedDatabase::DeleteSharedBankSlot(uint32 char_id, int16 slot_id) {
_eqp
// Delete item // Delete item
uint32 account_id = GetAccountIDByChar(char_id); uint32 account_id = GetAccountIDByChar(char_id);
@@ -321,6 +331,7 @@ bool SharedDatabase::DeleteSharedBankSlot(uint32 char_id, int16 slot_id) {
int32 SharedDatabase::GetSharedPlatinum(uint32 account_id) int32 SharedDatabase::GetSharedPlatinum(uint32 account_id)
{ {
_eqp
std::string query = StringFormat("SELECT sharedplat FROM account WHERE id = '%i'", account_id); std::string query = StringFormat("SELECT sharedplat FROM account WHERE id = '%i'", account_id);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
if (!results.Success()) { if (!results.Success()) {
@@ -336,6 +347,7 @@ int32 SharedDatabase::GetSharedPlatinum(uint32 account_id)
} }
bool SharedDatabase::SetSharedPlatinum(uint32 account_id, int32 amount_to_add) { bool SharedDatabase::SetSharedPlatinum(uint32 account_id, int32 amount_to_add) {
_eqp
std::string query = StringFormat("UPDATE account SET sharedplat = sharedplat + %i WHERE id = %i", amount_to_add, account_id); std::string query = StringFormat("UPDATE account SET sharedplat = sharedplat + %i WHERE id = %i", amount_to_add, account_id);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
if (!results.Success()) { if (!results.Success()) {
@@ -346,7 +358,7 @@ bool SharedDatabase::SetSharedPlatinum(uint32 account_id, int32 amount_to_add) {
} }
bool SharedDatabase::SetStartingItems(PlayerProfile_Struct* pp, Inventory* inv, uint32 si_race, uint32 si_class, uint32 si_deity, uint32 si_current_zone, char* si_name, int admin_level) { bool SharedDatabase::SetStartingItems(PlayerProfile_Struct* pp, Inventory* inv, uint32 si_race, uint32 si_class, uint32 si_deity, uint32 si_current_zone, char* si_name, int admin_level) {
_eqp
const Item_Struct* myitem; const Item_Struct* myitem;
std::string query = StringFormat("SELECT itemid, item_charges, slot FROM starting_items " std::string query = StringFormat("SELECT itemid, item_charges, slot FROM starting_items "
@@ -384,6 +396,7 @@ bool SharedDatabase::SetStartingItems(PlayerProfile_Struct* pp, Inventory* inv,
// Retrieve shared bank inventory based on either account or character // Retrieve shared bank inventory based on either account or character
bool SharedDatabase::GetSharedBank(uint32 id, Inventory *inv, bool is_charid) bool SharedDatabase::GetSharedBank(uint32 id, Inventory *inv, bool is_charid)
{ {
_eqp
std::string query; std::string query;
if (is_charid) if (is_charid)
@@ -484,6 +497,7 @@ bool SharedDatabase::GetSharedBank(uint32 id, Inventory *inv, bool is_charid)
// Overloaded: Retrieve character inventory based on character id // Overloaded: Retrieve character inventory based on character id
bool SharedDatabase::GetInventory(uint32 char_id, Inventory *inv) bool SharedDatabase::GetInventory(uint32 char_id, Inventory *inv)
{ {
_eqp
// Retrieve character inventory // Retrieve character inventory
std::string query = std::string query =
StringFormat("SELECT slotid, itemid, charges, color, augslot1, augslot2, augslot3, augslot4, augslot5, " StringFormat("SELECT slotid, itemid, charges, color, augslot1, augslot2, augslot3, augslot4, augslot5, "
@@ -627,6 +641,7 @@ bool SharedDatabase::GetInventory(uint32 char_id, Inventory *inv)
// Overloaded: Retrieve character inventory based on account_id and character name // Overloaded: Retrieve character inventory based on account_id and character name
bool SharedDatabase::GetInventory(uint32 account_id, char *name, Inventory *inv) bool SharedDatabase::GetInventory(uint32 account_id, char *name, Inventory *inv)
{ {
_eqp
// Retrieve character inventory // Retrieve character inventory
std::string query = std::string query =
StringFormat("SELECT slotid, itemid, charges, color, augslot1, " StringFormat("SELECT slotid, itemid, charges, color, augslot1, "
@@ -736,6 +751,7 @@ bool SharedDatabase::GetInventory(uint32 account_id, char *name, Inventory *inv)
std::map<uint32, uint32> SharedDatabase::GetItemRecastTimestamps(uint32 char_id) std::map<uint32, uint32> SharedDatabase::GetItemRecastTimestamps(uint32 char_id)
{ {
_eqp
std::map<uint32, uint32> timers; std::map<uint32, uint32> timers;
std::string query = StringFormat("SELECT recast_type,timestamp FROM character_item_recast WHERE id=%u", char_id); std::string query = StringFormat("SELECT recast_type,timestamp FROM character_item_recast WHERE id=%u", char_id);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
@@ -749,6 +765,7 @@ std::map<uint32, uint32> SharedDatabase::GetItemRecastTimestamps(uint32 char_id)
uint32 SharedDatabase::GetItemRecastTimestamp(uint32 char_id, uint32 recast_type) uint32 SharedDatabase::GetItemRecastTimestamp(uint32 char_id, uint32 recast_type)
{ {
_eqp
std::string query = StringFormat("SELECT timestamp FROM character_item_recast WHERE id=%u AND recast_type=%u", std::string query = StringFormat("SELECT timestamp FROM character_item_recast WHERE id=%u AND recast_type=%u",
char_id, recast_type); char_id, recast_type);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
@@ -761,6 +778,7 @@ uint32 SharedDatabase::GetItemRecastTimestamp(uint32 char_id, uint32 recast_type
void SharedDatabase::ClearOldRecastTimestamps(uint32 char_id) void SharedDatabase::ClearOldRecastTimestamps(uint32 char_id)
{ {
_eqp
// This actually isn't strictly live-like. Live your recast timestamps are forever // This actually isn't strictly live-like. Live your recast timestamps are forever
std::string query = std::string query =
StringFormat("DELETE FROM character_item_recast WHERE id = %u and timestamp < UNIX_TIMESTAMP()", char_id); StringFormat("DELETE FROM character_item_recast WHERE id = %u and timestamp < UNIX_TIMESTAMP()", char_id);
@@ -769,6 +787,7 @@ void SharedDatabase::ClearOldRecastTimestamps(uint32 char_id)
void SharedDatabase::GetItemsCount(int32 &item_count, uint32 &max_id) void SharedDatabase::GetItemsCount(int32 &item_count, uint32 &max_id)
{ {
_eqp
item_count = -1; item_count = -1;
max_id = 0; max_id = 0;
@@ -791,6 +810,7 @@ void SharedDatabase::GetItemsCount(int32 &item_count, uint32 &max_id)
} }
bool SharedDatabase::LoadItems() { bool SharedDatabase::LoadItems() {
_eqp
if(items_mmf) { if(items_mmf) {
return true; return true;
} }
@@ -822,6 +842,7 @@ bool SharedDatabase::LoadItems() {
} }
void SharedDatabase::LoadItems(void *data, uint32 size, int32 items, uint32 max_item_id) { void SharedDatabase::LoadItems(void *data, uint32 size, int32 items, uint32 max_item_id) {
_eqp
EQEmu::FixedMemoryHashSet<Item_Struct> hash(reinterpret_cast<uint8*>(data), size, items, max_item_id); EQEmu::FixedMemoryHashSet<Item_Struct> hash(reinterpret_cast<uint8*>(data), size, items, max_item_id);
char ndbuffer[4]; char ndbuffer[4];
@@ -1079,6 +1100,7 @@ void SharedDatabase::LoadItems(void *data, uint32 size, int32 items, uint32 max_
} }
const Item_Struct* SharedDatabase::GetItem(uint32 id) { const Item_Struct* SharedDatabase::GetItem(uint32 id) {
_eqp
if (id == 0) if (id == 0)
{ {
return nullptr; return nullptr;
@@ -1098,6 +1120,7 @@ const Item_Struct* SharedDatabase::GetItem(uint32 id) {
} }
const Item_Struct* SharedDatabase::IterateItems(uint32* id) { const Item_Struct* SharedDatabase::IterateItems(uint32* id) {
_eqp
if(!items_hash || !id) { if(!items_hash || !id) {
return nullptr; return nullptr;
} }
@@ -1119,6 +1142,7 @@ const Item_Struct* SharedDatabase::IterateItems(uint32* id) {
std::string SharedDatabase::GetBook(const char *txtfile) std::string SharedDatabase::GetBook(const char *txtfile)
{ {
_eqp
char txtfile2[20]; char txtfile2[20];
std::string txtout; std::string txtout;
strcpy(txtfile2, txtfile); strcpy(txtfile2, txtfile);
@@ -1143,6 +1167,7 @@ std::string SharedDatabase::GetBook(const char *txtfile)
} }
void SharedDatabase::GetFactionListInfo(uint32 &list_count, uint32 &max_lists) { void SharedDatabase::GetFactionListInfo(uint32 &list_count, uint32 &max_lists) {
_eqp
list_count = 0; list_count = 0;
max_lists = 0; max_lists = 0;
@@ -1162,6 +1187,7 @@ void SharedDatabase::GetFactionListInfo(uint32 &list_count, uint32 &max_lists) {
} }
const NPCFactionList* SharedDatabase::GetNPCFactionEntry(uint32 id) { const NPCFactionList* SharedDatabase::GetNPCFactionEntry(uint32 id) {
_eqp
if(!faction_hash) { if(!faction_hash) {
return nullptr; return nullptr;
} }
@@ -1174,6 +1200,7 @@ const NPCFactionList* SharedDatabase::GetNPCFactionEntry(uint32 id) {
} }
void SharedDatabase::LoadNPCFactionLists(void *data, uint32 size, uint32 list_count, uint32 max_lists) { void SharedDatabase::LoadNPCFactionLists(void *data, uint32 size, uint32 list_count, uint32 max_lists) {
_eqp
EQEmu::FixedMemoryHashSet<NPCFactionList> hash(reinterpret_cast<uint8*>(data), size, list_count, max_lists); EQEmu::FixedMemoryHashSet<NPCFactionList> hash(reinterpret_cast<uint8*>(data), size, list_count, max_lists);
NPCFactionList faction; NPCFactionList faction;
@@ -1223,6 +1250,7 @@ void SharedDatabase::LoadNPCFactionLists(void *data, uint32 size, uint32 list_co
} }
bool SharedDatabase::LoadNPCFactionLists() { bool SharedDatabase::LoadNPCFactionLists() {
_eqp
if(faction_hash) { if(faction_hash) {
return true; return true;
} }
@@ -1255,6 +1283,7 @@ bool SharedDatabase::LoadNPCFactionLists() {
// Create appropriate ItemInst class // Create appropriate ItemInst class
ItemInst* SharedDatabase::CreateItem(uint32 item_id, int16 charges, uint32 aug1, uint32 aug2, uint32 aug3, uint32 aug4, uint32 aug5, uint32 aug6, uint8 attuned) ItemInst* SharedDatabase::CreateItem(uint32 item_id, int16 charges, uint32 aug1, uint32 aug2, uint32 aug3, uint32 aug4, uint32 aug5, uint32 aug6, uint8 attuned)
{ {
_eqp
const Item_Struct* item = nullptr; const Item_Struct* item = nullptr;
ItemInst* inst = nullptr; ItemInst* inst = nullptr;
@@ -1284,6 +1313,7 @@ ItemInst* SharedDatabase::CreateItem(uint32 item_id, int16 charges, uint32 aug1,
// Create appropriate ItemInst class // Create appropriate ItemInst class
ItemInst* SharedDatabase::CreateItem(const Item_Struct* item, int16 charges, uint32 aug1, uint32 aug2, uint32 aug3, uint32 aug4, uint32 aug5, uint32 aug6, uint8 attuned) ItemInst* SharedDatabase::CreateItem(const Item_Struct* item, int16 charges, uint32 aug1, uint32 aug2, uint32 aug3, uint32 aug4, uint32 aug5, uint32 aug6, uint8 attuned)
{ {
_eqp
ItemInst* inst = nullptr; ItemInst* inst = nullptr;
if (item) { if (item) {
inst = CreateBaseItem(item, charges); inst = CreateBaseItem(item, charges);
@@ -1307,6 +1337,7 @@ ItemInst* SharedDatabase::CreateItem(const Item_Struct* item, int16 charges, uin
} }
ItemInst* SharedDatabase::CreateBaseItem(const Item_Struct* item, int16 charges) { ItemInst* SharedDatabase::CreateBaseItem(const Item_Struct* item, int16 charges) {
_eqp
ItemInst* inst = nullptr; ItemInst* inst = nullptr;
if (item) { if (item) {
// if maxcharges is -1 that means it is an unlimited use item. // if maxcharges is -1 that means it is an unlimited use item.
@@ -1333,6 +1364,7 @@ ItemInst* SharedDatabase::CreateBaseItem(const Item_Struct* item, int16 charges)
} }
int32 SharedDatabase::DeleteStalePlayerCorpses() { int32 SharedDatabase::DeleteStalePlayerCorpses() {
_eqp
if(RuleB(Zone, EnableShadowrest)) { if(RuleB(Zone, EnableShadowrest)) {
std::string query = StringFormat( std::string query = StringFormat(
"UPDATE `character_corpses` SET `is_buried` = 1 WHERE `is_buried` = 0 AND " "UPDATE `character_corpses` SET `is_buried` = 1 WHERE `is_buried` = 0 AND "
@@ -1355,7 +1387,8 @@ int32 SharedDatabase::DeleteStalePlayerCorpses() {
return results.RowsAffected(); return results.RowsAffected();
} }
bool SharedDatabase::GetCommandSettings(std::map<std::string,uint8> &commands) { bool SharedDatabase::GetCommandSettings(std::map<std::string, uint8> &commands) {
_eqp
const std::string query = "SELECT command, access FROM commands"; const std::string query = "SELECT command, access FROM commands";
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
@@ -1372,6 +1405,7 @@ bool SharedDatabase::GetCommandSettings(std::map<std::string,uint8> &commands) {
} }
bool SharedDatabase::LoadSkillCaps() { bool SharedDatabase::LoadSkillCaps() {
_eqp
if(skill_caps_mmf) if(skill_caps_mmf)
return true; return true;
@@ -1398,6 +1432,7 @@ bool SharedDatabase::LoadSkillCaps() {
} }
void SharedDatabase::LoadSkillCaps(void *data) { void SharedDatabase::LoadSkillCaps(void *data) {
_eqp
uint32 class_count = PLAYER_CLASS_COUNT; uint32 class_count = PLAYER_CLASS_COUNT;
uint32 skill_count = HIGHEST_SKILL + 1; uint32 skill_count = HIGHEST_SKILL + 1;
uint32 level_count = HARD_LEVEL_CAP + 1; uint32 level_count = HARD_LEVEL_CAP + 1;
@@ -1425,6 +1460,7 @@ void SharedDatabase::LoadSkillCaps(void *data) {
} }
uint16 SharedDatabase::GetSkillCap(uint8 Class_, SkillUseTypes Skill, uint8 Level) { uint16 SharedDatabase::GetSkillCap(uint8 Class_, SkillUseTypes Skill, uint8 Level) {
_eqp
if(!skill_caps_mmf) { if(!skill_caps_mmf) {
return 0; return 0;
} }
@@ -1454,6 +1490,7 @@ uint16 SharedDatabase::GetSkillCap(uint8 Class_, SkillUseTypes Skill, uint8 Leve
} }
uint8 SharedDatabase::GetTrainLevel(uint8 Class_, SkillUseTypes Skill, uint8 Level) { uint8 SharedDatabase::GetTrainLevel(uint8 Class_, SkillUseTypes Skill, uint8 Level) {
_eqp
if(!skill_caps_mmf) { if(!skill_caps_mmf) {
return 0; return 0;
} }
@@ -1503,6 +1540,7 @@ uint8 SharedDatabase::GetTrainLevel(uint8 Class_, SkillUseTypes Skill, uint8 Lev
} }
void SharedDatabase::LoadDamageShieldTypes(SPDat_Spell_Struct* sp, int32 iMaxSpellID) { void SharedDatabase::LoadDamageShieldTypes(SPDat_Spell_Struct* sp, int32 iMaxSpellID) {
_eqp
std::string query = StringFormat("SELECT `spellid`, `type` FROM `damageshieldtypes` WHERE `spellid` > 0 " std::string query = StringFormat("SELECT `spellid`, `type` FROM `damageshieldtypes` WHERE `spellid` > 0 "
"AND `spellid` <= %i", iMaxSpellID); "AND `spellid` <= %i", iMaxSpellID);
@@ -1520,10 +1558,12 @@ void SharedDatabase::LoadDamageShieldTypes(SPDat_Spell_Struct* sp, int32 iMaxSpe
} }
const EvolveInfo* SharedDatabase::GetEvolveInfo(uint32 loregroup) { const EvolveInfo* SharedDatabase::GetEvolveInfo(uint32 loregroup) {
_eqp
return nullptr; // nothing here for now... database and/or sharemem pulls later return nullptr; // nothing here for now... database and/or sharemem pulls later
} }
int SharedDatabase::GetMaxSpellID() { int SharedDatabase::GetMaxSpellID() {
_eqp
std::string query = "SELECT MAX(id) FROM spells_new"; std::string query = "SELECT MAX(id) FROM spells_new";
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
if (!results.Success()) { if (!results.Success()) {
@@ -1536,6 +1576,7 @@ int SharedDatabase::GetMaxSpellID() {
} }
void SharedDatabase::LoadSpells(void *data, int max_spells) { void SharedDatabase::LoadSpells(void *data, int max_spells) {
_eqp
SPDat_Spell_Struct *sp = reinterpret_cast<SPDat_Spell_Struct*>(data); SPDat_Spell_Struct *sp = reinterpret_cast<SPDat_Spell_Struct*>(data);
const std::string query = "SELECT * FROM spells_new ORDER BY id ASC"; const std::string query = "SELECT * FROM spells_new ORDER BY id ASC";
@@ -1698,6 +1739,7 @@ void SharedDatabase::LoadSpells(void *data, int max_spells) {
} }
int SharedDatabase::GetMaxBaseDataLevel() { int SharedDatabase::GetMaxBaseDataLevel() {
_eqp
const std::string query = "SELECT MAX(level) FROM base_data"; const std::string query = "SELECT MAX(level) FROM base_data";
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
if (!results.Success()) { if (!results.Success()) {
@@ -1713,6 +1755,7 @@ int SharedDatabase::GetMaxBaseDataLevel() {
} }
bool SharedDatabase::LoadBaseData() { bool SharedDatabase::LoadBaseData() {
_eqp
if(base_data_mmf) { if(base_data_mmf) {
return true; return true;
} }
@@ -1741,6 +1784,7 @@ bool SharedDatabase::LoadBaseData() {
} }
void SharedDatabase::LoadBaseData(void *data, int max_level) { void SharedDatabase::LoadBaseData(void *data, int max_level) {
_eqp
char *base_ptr = reinterpret_cast<char*>(data); char *base_ptr = reinterpret_cast<char*>(data);
const std::string query = "SELECT * FROM base_data ORDER BY level, class ASC"; const std::string query = "SELECT * FROM base_data ORDER BY level, class ASC";
@@ -1790,6 +1834,7 @@ void SharedDatabase::LoadBaseData(void *data, int max_level) {
} }
const BaseDataStruct* SharedDatabase::GetBaseData(int lvl, int cl) { const BaseDataStruct* SharedDatabase::GetBaseData(int lvl, int cl) {
_eqp
if(!base_data_mmf) { if(!base_data_mmf) {
return nullptr; return nullptr;
} }
@@ -1819,6 +1864,7 @@ const BaseDataStruct* SharedDatabase::GetBaseData(int lvl, int cl) {
} }
void SharedDatabase::GetLootTableInfo(uint32 &loot_table_count, uint32 &max_loot_table, uint32 &loot_table_entries) { void SharedDatabase::GetLootTableInfo(uint32 &loot_table_count, uint32 &max_loot_table, uint32 &loot_table_entries) {
_eqp
loot_table_count = 0; loot_table_count = 0;
max_loot_table = 0; max_loot_table = 0;
loot_table_entries = 0; loot_table_entries = 0;
@@ -1839,6 +1885,7 @@ void SharedDatabase::GetLootTableInfo(uint32 &loot_table_count, uint32 &max_loot
} }
void SharedDatabase::GetLootDropInfo(uint32 &loot_drop_count, uint32 &max_loot_drop, uint32 &loot_drop_entries) { void SharedDatabase::GetLootDropInfo(uint32 &loot_drop_count, uint32 &max_loot_drop, uint32 &loot_drop_entries) {
_eqp
loot_drop_count = 0; loot_drop_count = 0;
max_loot_drop = 0; max_loot_drop = 0;
loot_drop_entries = 0; loot_drop_entries = 0;
@@ -1860,6 +1907,7 @@ void SharedDatabase::GetLootDropInfo(uint32 &loot_drop_count, uint32 &max_loot_d
} }
void SharedDatabase::LoadLootTables(void *data, uint32 size) { void SharedDatabase::LoadLootTables(void *data, uint32 size) {
_eqp
EQEmu::FixedMemoryVariableHashSet<LootTable_Struct> hash(reinterpret_cast<uint8*>(data), size); EQEmu::FixedMemoryVariableHashSet<LootTable_Struct> hash(reinterpret_cast<uint8*>(data), size);
uint8 loot_table[sizeof(LootTable_Struct) + (sizeof(LootTableEntries_Struct) * 128)]; uint8 loot_table[sizeof(LootTable_Struct) + (sizeof(LootTableEntries_Struct) * 128)];
@@ -1913,6 +1961,7 @@ void SharedDatabase::LoadLootTables(void *data, uint32 size) {
} }
void SharedDatabase::LoadLootDrops(void *data, uint32 size) { void SharedDatabase::LoadLootDrops(void *data, uint32 size) {
_eqp
EQEmu::FixedMemoryVariableHashSet<LootDrop_Struct> hash(reinterpret_cast<uint8*>(data), size); EQEmu::FixedMemoryVariableHashSet<LootDrop_Struct> hash(reinterpret_cast<uint8*>(data), size);
uint8 loot_drop[sizeof(LootDrop_Struct) + (sizeof(LootDropEntries_Struct) * 1260)]; uint8 loot_drop[sizeof(LootDrop_Struct) + (sizeof(LootDropEntries_Struct) * 1260)];
@@ -1961,6 +2010,7 @@ void SharedDatabase::LoadLootDrops(void *data, uint32 size) {
} }
bool SharedDatabase::LoadLoot() { bool SharedDatabase::LoadLoot() {
_eqp
if(loot_table_mmf || loot_drop_mmf) if(loot_table_mmf || loot_drop_mmf)
return true; return true;
@@ -1985,6 +2035,7 @@ bool SharedDatabase::LoadLoot() {
} }
const LootTable_Struct* SharedDatabase::GetLootTable(uint32 loottable_id) { const LootTable_Struct* SharedDatabase::GetLootTable(uint32 loottable_id) {
_eqp
if(!loot_table_hash) if(!loot_table_hash)
return nullptr; return nullptr;
@@ -1999,6 +2050,7 @@ const LootTable_Struct* SharedDatabase::GetLootTable(uint32 loottable_id) {
} }
const LootDrop_Struct* SharedDatabase::GetLootDrop(uint32 lootdrop_id) { const LootDrop_Struct* SharedDatabase::GetLootDrop(uint32 lootdrop_id) {
_eqp
if(!loot_drop_hash) if(!loot_drop_hash)
return nullptr; return nullptr;
@@ -2013,6 +2065,7 @@ const LootDrop_Struct* SharedDatabase::GetLootDrop(uint32 lootdrop_id) {
} }
void SharedDatabase::LoadCharacterInspectMessage(uint32 character_id, InspectMessage_Struct* message) { void SharedDatabase::LoadCharacterInspectMessage(uint32 character_id, InspectMessage_Struct* message) {
_eqp
std::string query = StringFormat("SELECT `inspect_message` FROM `character_inspect_messages` WHERE `id` = %u LIMIT 1", character_id); std::string query = StringFormat("SELECT `inspect_message` FROM `character_inspect_messages` WHERE `id` = %u LIMIT 1", character_id);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
auto row = results.begin(); auto row = results.begin();
@@ -2023,11 +2076,13 @@ void SharedDatabase::LoadCharacterInspectMessage(uint32 character_id, InspectMes
} }
void SharedDatabase::SaveCharacterInspectMessage(uint32 character_id, const InspectMessage_Struct* message) { void SharedDatabase::SaveCharacterInspectMessage(uint32 character_id, const InspectMessage_Struct* message) {
_eqp
std::string query = StringFormat("REPLACE INTO `character_inspect_messages` (id, inspect_message) VALUES (%u, '%s')", character_id, EscapeString(message->text).c_str()); std::string query = StringFormat("REPLACE INTO `character_inspect_messages` (id, inspect_message) VALUES (%u, '%s')", character_id, EscapeString(message->text).c_str());
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
} }
void SharedDatabase::GetBotInspectMessage(uint32 botid, InspectMessage_Struct* message) { void SharedDatabase::GetBotInspectMessage(uint32 botid, InspectMessage_Struct* message) {
_eqp
std::string query = StringFormat("SELECT BotInspectMessage FROM bots WHERE BotID = %i", botid); std::string query = StringFormat("SELECT BotInspectMessage FROM bots WHERE BotID = %i", botid);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
@@ -2044,6 +2099,7 @@ void SharedDatabase::GetBotInspectMessage(uint32 botid, InspectMessage_Struct* m
} }
void SharedDatabase::SetBotInspectMessage(uint32 botid, const InspectMessage_Struct* message) { void SharedDatabase::SetBotInspectMessage(uint32 botid, const InspectMessage_Struct* message) {
_eqp
std::string msg = EscapeString(message->text); std::string msg = EscapeString(message->text);
std::string query = StringFormat("UPDATE bots SET BotInspectMessage = '%s' WHERE BotID = %i", msg.c_str(), botid); std::string query = StringFormat("UPDATE bots SET BotInspectMessage = '%s' WHERE BotID = %i", msg.c_str(), botid);
QueryDatabase(query); QueryDatabase(query);
+7
View File
@@ -64,6 +64,7 @@ const std::string vStringFormat(const char* format, va_list args)
const std::string StringFormat(const char* format, ...) const std::string StringFormat(const char* format, ...)
{ {
_eqp
va_list args; va_list args;
va_start(args, format); va_start(args, format);
std::string output = vStringFormat(format,args); std::string output = vStringFormat(format,args);
@@ -121,6 +122,7 @@ void MakeLowerString(const char *source, char *target) {
} }
int MakeAnyLenString(char** ret, const char* format, ...) { int MakeAnyLenString(char** ret, const char* format, ...) {
_eqp
int buf_len = 128; int buf_len = 128;
int chars = -1; int chars = -1;
va_list argptr, tmpargptr; va_list argptr, tmpargptr;
@@ -140,6 +142,7 @@ int MakeAnyLenString(char** ret, const char* format, ...) {
} }
uint32 AppendAnyLenString(char** ret, uint32* bufsize, uint32* strlen, const char* format, ...) { uint32 AppendAnyLenString(char** ret, uint32* bufsize, uint32* strlen, const char* format, ...) {
_eqp
if (*bufsize == 0) if (*bufsize == 0)
*bufsize = 256; *bufsize = 256;
if (*ret == 0) if (*ret == 0)
@@ -258,6 +261,7 @@ bool atobool(const char* iBool) {
// removes the crap and turns the underscores into spaces. // removes the crap and turns the underscores into spaces.
char *CleanMobName(const char *in, char *out) char *CleanMobName(const char *in, char *out)
{ {
_eqp
unsigned i, j; unsigned i, j;
for(i = j = 0; i < strlen(in); i++) for(i = j = 0; i < strlen(in); i++)
@@ -312,6 +316,7 @@ const char *ConvertArrayF(float input, char *returnchar)
} }
std::vector<std::string> SplitString(const std::string &str, char delim) { std::vector<std::string> SplitString(const std::string &str, char delim) {
_eqp
std::vector<std::string> ret; std::vector<std::string> ret;
std::stringstream ss(str); std::stringstream ss(str);
std::string item; std::string item;
@@ -324,6 +329,7 @@ std::vector<std::string> SplitString(const std::string &str, char delim) {
} }
std::string EscapeString(const std::string &s) { std::string EscapeString(const std::string &s) {
_eqp
std::string ret; std::string ret;
size_t sz = s.length(); size_t sz = s.length();
@@ -361,6 +367,7 @@ std::string EscapeString(const std::string &s) {
} }
std::string EscapeString(const char *src, size_t sz) { std::string EscapeString(const char *src, size_t sz) {
_eqp
std::string ret; std::string ret;
for(size_t i = 0; i < sz; ++i) { for(size_t i = 0; i < sz; ++i) {
+8
View File
@@ -11,6 +11,7 @@
//note: all encoders and decoders must be valid functions. //note: all encoders and decoders must be valid functions.
//so if you specify set_defaults=false //so if you specify set_defaults=false
StructStrategy::StructStrategy() { StructStrategy::StructStrategy() {
_eqp
int r; int r;
for(r = 0; r < _maxEmuOpcode; r++) { for(r = 0; r < _maxEmuOpcode; r++) {
encoders[r] = PassEncoder; encoders[r] = PassEncoder;
@@ -19,6 +20,7 @@ StructStrategy::StructStrategy() {
} }
void StructStrategy::Encode(EQApplicationPacket **p, std::shared_ptr<EQStream> dest, bool ack_req) const { void StructStrategy::Encode(EQApplicationPacket **p, std::shared_ptr<EQStream> dest, bool ack_req) const {
_eqp
if((*p)->GetOpcodeBypass() != 0) { if((*p)->GetOpcodeBypass() != 0) {
PassEncoder(p, dest, ack_req); PassEncoder(p, dest, ack_req);
return; return;
@@ -30,6 +32,7 @@ void StructStrategy::Encode(EQApplicationPacket **p, std::shared_ptr<EQStream> d
} }
void StructStrategy::Decode(EQApplicationPacket *p) const { void StructStrategy::Decode(EQApplicationPacket *p) const {
_eqp
EmuOpcode op = p->GetOpcode(); EmuOpcode op = p->GetOpcode();
Decoder proc = decoders[op]; Decoder proc = decoders[op];
proc(p); proc(p);
@@ -37,6 +40,7 @@ void StructStrategy::Decode(EQApplicationPacket *p) const {
void StructStrategy::ErrorEncoder(EQApplicationPacket **in_p, std::shared_ptr<EQStream> dest, bool ack_req) { void StructStrategy::ErrorEncoder(EQApplicationPacket **in_p, std::shared_ptr<EQStream> dest, bool ack_req) {
_eqp
EQApplicationPacket *p = *in_p; EQApplicationPacket *p = *in_p;
*in_p = nullptr; *in_p = nullptr;
@@ -46,11 +50,13 @@ void StructStrategy::ErrorEncoder(EQApplicationPacket **in_p, std::shared_ptr<EQ
} }
void StructStrategy::ErrorDecoder(EQApplicationPacket *p) { void StructStrategy::ErrorDecoder(EQApplicationPacket *p) {
_eqp
Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Error decoding opcode %s: no decoder provided. Invalidating.", OpcodeManager::EmuToName(p->GetOpcode())); Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Error decoding opcode %s: no decoder provided. Invalidating.", OpcodeManager::EmuToName(p->GetOpcode()));
p->SetOpcode(OP_Unknown); p->SetOpcode(OP_Unknown);
} }
void StructStrategy::PassEncoder(EQApplicationPacket **p, std::shared_ptr<EQStream> dest, bool ack_req) { void StructStrategy::PassEncoder(EQApplicationPacket **p, std::shared_ptr<EQStream> dest, bool ack_req) {
_eqp
dest->FastQueuePacket(p, ack_req); dest->FastQueuePacket(p, ack_req);
} }
@@ -67,10 +73,12 @@ namespace StructStrategyFactory {
static std::map<EmuOpcode, const StructStrategy *> strategies; static std::map<EmuOpcode, const StructStrategy *> strategies;
void RegisterPatch(EmuOpcode first_opcode, const StructStrategy *structs) { void RegisterPatch(EmuOpcode first_opcode, const StructStrategy *structs) {
_eqp
strategies[first_opcode] = structs; strategies[first_opcode] = structs;
} }
const StructStrategy *FindPatch(EmuOpcode first_opcode) { const StructStrategy *FindPatch(EmuOpcode first_opcode) {
_eqp
std::map<EmuOpcode, const StructStrategy *>::const_iterator res; std::map<EmuOpcode, const StructStrategy *>::const_iterator res;
res = strategies.find(first_opcode); res = strategies.find(first_opcode);
if(res == strategies.end()) if(res == strategies.end())
+33
View File
@@ -75,6 +75,7 @@ TCPConnection::TCPConnection(uint32 ID, SOCKET in_socket, uint32 irIP, uint16 ir
rIP(irIP), rIP(irIP),
rPort(irPort) rPort(irPort)
{ {
_eqp
pState = TCPS_Connected; pState = TCPS_Connected;
pFree = false; pFree = false;
pEcho = false; pEcho = false;
@@ -90,6 +91,7 @@ TCPConnection::TCPConnection(uint32 ID, SOCKET in_socket, uint32 irIP, uint16 ir
} }
TCPConnection::~TCPConnection() { TCPConnection::~TCPConnection() {
_eqp
FinishDisconnect(); FinishDisconnect();
ClearBuffers(); ClearBuffers();
if (ConnectionType == Outgoing) { if (ConnectionType == Outgoing) {
@@ -113,12 +115,14 @@ TCPConnection::~TCPConnection() {
} }
void TCPConnection::SetState(State_t in_state) { void TCPConnection::SetState(State_t in_state) {
_eqp
MState.lock(); MState.lock();
pState = in_state; pState = in_state;
MState.unlock(); MState.unlock();
} }
TCPConnection::State_t TCPConnection::GetState() const { TCPConnection::State_t TCPConnection::GetState() const {
_eqp
State_t ret; State_t ret;
MState.lock(); MState.lock();
ret = pState; ret = pState;
@@ -128,6 +132,7 @@ TCPConnection::State_t TCPConnection::GetState() const {
bool TCPConnection::GetSockName(char *host, uint16 *port) bool TCPConnection::GetSockName(char *host, uint16 *port)
{ {
_eqp
bool result=false; bool result=false;
LockMutex lock(&MState); LockMutex lock(&MState);
if (!Connected()) if (!Connected())
@@ -165,11 +170,13 @@ bool TCPConnection::GetSockName(char *host, uint16 *port)
} }
void TCPConnection::Free() { void TCPConnection::Free() {
_eqp
Disconnect(); Disconnect();
pFree = true; pFree = true;
} }
bool TCPConnection::Send(const uchar* data, int32 size) { bool TCPConnection::Send(const uchar* data, int32 size) {
_eqp
if (!Connected()) if (!Connected())
return false; return false;
if (!size) if (!size)
@@ -179,6 +186,7 @@ bool TCPConnection::Send(const uchar* data, int32 size) {
} }
void TCPConnection::ServerSendQueuePushEnd(const uchar* data, int32 size) { void TCPConnection::ServerSendQueuePushEnd(const uchar* data, int32 size) {
_eqp
MSendQueue.lock(); MSendQueue.lock();
if (sendbuf == nullptr) { if (sendbuf == nullptr) {
sendbuf = new uchar[size]; sendbuf = new uchar[size];
@@ -198,6 +206,7 @@ void TCPConnection::ServerSendQueuePushEnd(const uchar* data, int32 size) {
} }
void TCPConnection::ServerSendQueuePushEnd(uchar** data, int32 size) { void TCPConnection::ServerSendQueuePushEnd(uchar** data, int32 size) {
_eqp
MSendQueue.lock(); MSendQueue.lock();
if (sendbuf == 0) { if (sendbuf == 0) {
sendbuf = *data; sendbuf = *data;
@@ -221,6 +230,7 @@ void TCPConnection::ServerSendQueuePushEnd(uchar** data, int32 size) {
} }
void TCPConnection::ServerSendQueuePushFront(uchar* data, int32 size) { void TCPConnection::ServerSendQueuePushFront(uchar* data, int32 size) {
_eqp
MSendQueue.lock(); MSendQueue.lock();
if (sendbuf == 0) { if (sendbuf == 0) {
sendbuf = new uchar[size]; sendbuf = new uchar[size];
@@ -240,6 +250,7 @@ void TCPConnection::ServerSendQueuePushFront(uchar* data, int32 size) {
} }
bool TCPConnection::ServerSendQueuePop(uchar** data, int32* size) { bool TCPConnection::ServerSendQueuePop(uchar** data, int32* size) {
_eqp
bool ret; bool ret;
if (!MSendQueue.trylock()) if (!MSendQueue.trylock())
return false; return false;
@@ -257,6 +268,7 @@ bool TCPConnection::ServerSendQueuePop(uchar** data, int32* size) {
} }
bool TCPConnection::ServerSendQueuePopForce(uchar** data, int32* size) { bool TCPConnection::ServerSendQueuePopForce(uchar** data, int32* size) {
_eqp
bool ret; bool ret;
MSendQueue.lock(); MSendQueue.lock();
if (sendbuf) { if (sendbuf) {
@@ -273,6 +285,7 @@ bool TCPConnection::ServerSendQueuePopForce(uchar** data, int32* size) {
} }
char* TCPConnection::PopLine() { char* TCPConnection::PopLine() {
_eqp
char* ret; char* ret;
if (!MLineOutQueue.trylock()) if (!MLineOutQueue.trylock())
return 0; return 0;
@@ -282,6 +295,7 @@ char* TCPConnection::PopLine() {
} }
bool TCPConnection::LineOutQueuePush(char* line) { bool TCPConnection::LineOutQueuePush(char* line) {
_eqp
MLineOutQueue.lock(); MLineOutQueue.lock();
LineOutQueue.push(line); LineOutQueue.push(line);
MLineOutQueue.unlock(); MLineOutQueue.unlock();
@@ -290,6 +304,7 @@ bool TCPConnection::LineOutQueuePush(char* line) {
void TCPConnection::FinishDisconnect() { void TCPConnection::FinishDisconnect() {
_eqp
MState.lock(); MState.lock();
if (connection_socket != INVALID_SOCKET && connection_socket != 0) { if (connection_socket != INVALID_SOCKET && connection_socket != 0) {
if (pState == TCPS_Connected || pState == TCPS_Disconnecting || pState == TCPS_Disconnected) { if (pState == TCPS_Connected || pState == TCPS_Disconnecting || pState == TCPS_Disconnected) {
@@ -314,6 +329,7 @@ void TCPConnection::FinishDisconnect() {
} }
void TCPConnection::Disconnect() { void TCPConnection::Disconnect() {
_eqp
MState.lock(); MState.lock();
if(pState == TCPS_Connected || pState == TCPS_Connecting) { if(pState == TCPS_Connected || pState == TCPS_Connecting) {
pState = TCPS_Disconnecting; pState = TCPS_Disconnecting;
@@ -322,6 +338,7 @@ void TCPConnection::Disconnect() {
} }
bool TCPConnection::GetAsyncConnect() { bool TCPConnection::GetAsyncConnect() {
_eqp
bool ret; bool ret;
MAsyncConnect.lock(); MAsyncConnect.lock();
ret = pAsyncConnect; ret = pAsyncConnect;
@@ -330,6 +347,7 @@ bool TCPConnection::GetAsyncConnect() {
} }
bool TCPConnection::SetAsyncConnect(bool iValue) { bool TCPConnection::SetAsyncConnect(bool iValue) {
_eqp
bool ret; bool ret;
MAsyncConnect.lock(); MAsyncConnect.lock();
ret = pAsyncConnect; ret = pAsyncConnect;
@@ -339,6 +357,7 @@ bool TCPConnection::SetAsyncConnect(bool iValue) {
} }
bool TCPConnection::ConnectReady() const { bool TCPConnection::ConnectReady() const {
_eqp
State_t s = GetState(); State_t s = GetState();
if (s != TCPS_Ready && s != TCPS_Disconnected) if (s != TCPS_Ready && s != TCPS_Disconnected)
return(false); return(false);
@@ -346,6 +365,7 @@ bool TCPConnection::ConnectReady() const {
} }
void TCPConnection::AsyncConnect(const char* irAddress, uint16 irPort) { void TCPConnection::AsyncConnect(const char* irAddress, uint16 irPort) {
_eqp
safe_delete_array(charAsyncConnect); safe_delete_array(charAsyncConnect);
charAsyncConnect = new char[strlen(irAddress) + 1]; charAsyncConnect = new char[strlen(irAddress) + 1];
strcpy(charAsyncConnect, irAddress); strcpy(charAsyncConnect, irAddress);
@@ -353,6 +373,7 @@ void TCPConnection::AsyncConnect(const char* irAddress, uint16 irPort) {
} }
void TCPConnection::AsyncConnect(uint32 irIP, uint16 irPort) { void TCPConnection::AsyncConnect(uint32 irIP, uint16 irPort) {
_eqp
if (ConnectionType != Outgoing) { if (ConnectionType != Outgoing) {
// If this code runs, we got serious problems // If this code runs, we got serious problems
// Crash and burn. // Crash and burn.
@@ -394,6 +415,7 @@ void TCPConnection::AsyncConnect(uint32 irIP, uint16 irPort) {
} }
bool TCPConnection::Connect(const char* irAddress, uint16 irPort, char* errbuf) { bool TCPConnection::Connect(const char* irAddress, uint16 irPort, char* errbuf) {
_eqp
if (errbuf) if (errbuf)
errbuf[0] = 0; errbuf[0] = 0;
uint32 tmpIP = ResolveIP(irAddress); uint32 tmpIP = ResolveIP(irAddress);
@@ -411,6 +433,7 @@ bool TCPConnection::Connect(const char* irAddress, uint16 irPort, char* errbuf)
} }
bool TCPConnection::ConnectIP(uint32 in_ip, uint16 in_port, char* errbuf) { bool TCPConnection::ConnectIP(uint32 in_ip, uint16 in_port, char* errbuf) {
_eqp
if (errbuf) if (errbuf)
errbuf[0] = 0; errbuf[0] = 0;
if (ConnectionType != Outgoing) { if (ConnectionType != Outgoing) {
@@ -499,6 +522,7 @@ bool TCPConnection::ConnectIP(uint32 in_ip, uint16 in_port, char* errbuf) {
} }
void TCPConnection::ClearBuffers() { void TCPConnection::ClearBuffers() {
_eqp
LockMutex lock1(&MSendQueue); LockMutex lock1(&MSendQueue);
LockMutex lock3(&MRunLoop); LockMutex lock3(&MRunLoop);
LockMutex lock4(&MState); LockMutex lock4(&MState);
@@ -511,6 +535,7 @@ void TCPConnection::ClearBuffers() {
} }
bool TCPConnection::CheckNetActive() { bool TCPConnection::CheckNetActive() {
_eqp
MState.lock(); MState.lock();
if (pState == TCPS_Connected || pState == TCPS_Disconnecting) { if (pState == TCPS_Connected || pState == TCPS_Disconnecting) {
MState.unlock(); MState.unlock();
@@ -523,6 +548,7 @@ bool TCPConnection::CheckNetActive() {
/* This is always called from an IO thread. Either the server socket's thread, or a /* This is always called from an IO thread. Either the server socket's thread, or a
* special thread we create when we make an outbound connection. */ * special thread we create when we make an outbound connection. */
bool TCPConnection::Process() { bool TCPConnection::Process() {
_eqp
char errbuf[TCPConnection_ErrorBufferSize]; char errbuf[TCPConnection_ErrorBufferSize];
switch(GetState()) { switch(GetState()) {
case TCPS_Ready: case TCPS_Ready:
@@ -594,6 +620,7 @@ bool TCPConnection::Process() {
} }
bool TCPConnection::RecvData(char* errbuf) { bool TCPConnection::RecvData(char* errbuf) {
_eqp
if (errbuf) if (errbuf)
errbuf[0] = 0; errbuf[0] = 0;
if (!Connected()) { if (!Connected()) {
@@ -666,16 +693,19 @@ bool TCPConnection::RecvData(char* errbuf) {
bool TCPConnection::GetEcho() { bool TCPConnection::GetEcho() {
_eqp
bool ret; bool ret;
ret = pEcho; ret = pEcho;
return ret; return ret;
} }
void TCPConnection::SetEcho(bool iValue) { void TCPConnection::SetEcho(bool iValue) {
_eqp
pEcho = iValue; pEcho = iValue;
} }
bool TCPConnection::ProcessReceivedData(char* errbuf) { bool TCPConnection::ProcessReceivedData(char* errbuf) {
_eqp
if (errbuf) if (errbuf)
errbuf[0] = 0; errbuf[0] = 0;
if (!recvbuf) if (!recvbuf)
@@ -810,6 +840,7 @@ bool TCPConnection::ProcessReceivedData(char* errbuf) {
} }
bool TCPConnection::SendData(bool &sent_something, char* errbuf) { bool TCPConnection::SendData(bool &sent_something, char* errbuf) {
_eqp
if (errbuf) if (errbuf)
errbuf[0] = 0; errbuf[0] = 0;
/************ Get first send packet on queue and send it! ************/ /************ Get first send packet on queue and send it! ************/
@@ -891,6 +922,7 @@ bool TCPConnection::SendData(bool &sent_something, char* errbuf) {
} }
ThreadReturnType TCPConnection::TCPConnectionLoop(void* tmp) { ThreadReturnType TCPConnection::TCPConnectionLoop(void* tmp) {
_eqp
#ifdef _WINDOWS #ifdef _WINDOWS
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_ABOVE_NORMAL); SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_ABOVE_NORMAL);
#endif #endif
@@ -933,6 +965,7 @@ ThreadReturnType TCPConnection::TCPConnectionLoop(void* tmp) {
} }
bool TCPConnection::RunLoop() { bool TCPConnection::RunLoop() {
_eqp
bool ret; bool ret;
MRunLoop.lock(); MRunLoop.lock();
ret = pRunLoop; ret = pRunLoop;
+9 -3
View File
@@ -24,18 +24,22 @@
Timeoutable::Timeoutable(uint32 check_frequency) Timeoutable::Timeoutable(uint32 check_frequency)
: next_check(check_frequency) : next_check(check_frequency)
{ {
_eqp
timeout_manager.AddMember(this); timeout_manager.AddMember(this);
} }
Timeoutable::~Timeoutable() { Timeoutable::~Timeoutable() {
_eqp
timeout_manager.DeleteMember(this); timeout_manager.DeleteMember(this);
} }
TimeoutManager::TimeoutManager() { TimeoutManager::TimeoutManager() {
_eqp
} }
void TimeoutManager::CheckTimeouts() { void TimeoutManager::CheckTimeouts() {
_eqp
std::vector<Timeoutable *>::iterator cur,end; std::vector<Timeoutable *>::iterator cur,end;
cur = members.begin(); cur = members.begin();
end = members.end(); end = members.end();
@@ -43,7 +47,7 @@ void TimeoutManager::CheckTimeouts() {
Timeoutable *it = *cur; Timeoutable *it = *cur;
if(it->next_check.Check()) { if(it->next_check.Check()) {
#ifdef TIMEOUT_DEBUG #ifdef TIMEOUT_DEBUG
Log.Out(Logs::General, Logs::None,, "Checking timeout on 0x%x\n", it); Log.Out(Logs::General, Logs::None, "Checking timeout on 0x%x\n", it);
#endif #endif
it->CheckTimeout(); it->CheckTimeout();
} }
@@ -52,19 +56,21 @@ void TimeoutManager::CheckTimeouts() {
//methods called by Timeoutable objects: //methods called by Timeoutable objects:
void TimeoutManager::AddMember(Timeoutable *who) { void TimeoutManager::AddMember(Timeoutable *who) {
_eqp
if(who == nullptr) if(who == nullptr)
return; return;
DeleteMember(who); //just in case... prolly not needed. DeleteMember(who); //just in case... prolly not needed.
members.push_back(who); members.push_back(who);
#ifdef TIMEOUT_DEBUG #ifdef TIMEOUT_DEBUG
Log.Out(Logs::General, Logs::None,, "Adding timeoutable 0x%x\n", who); Log.Out(Logs::General, Logs::None, "Adding timeoutable 0x%x\n", who);
#endif #endif
} }
void TimeoutManager::DeleteMember(Timeoutable *who) { void TimeoutManager::DeleteMember(Timeoutable *who) {
_eqp
#ifdef TIMEOUT_DEBUG #ifdef TIMEOUT_DEBUG
Log.Out(Logs::General, Logs::None,, "Removing timeoutable 0x%x\n", who); Log.Out(Logs::General, Logs::None, "Removing timeoutable 0x%x\n", who);
#endif #endif
std::vector<Timeoutable *>::iterator cur,end; std::vector<Timeoutable *>::iterator cur,end;
cur = members.begin(); cur = members.begin();
+1
View File
@@ -81,6 +81,7 @@ int gettimeofday (timeval *tp, ...)
/* This function checks if the timer triggered */ /* This function checks if the timer triggered */
bool Timer::Check(bool iReset) bool Timer::Check(bool iReset)
{ {
_eqp
if (enabled && current_time-start_time > timer_time) { if (enabled && current_time-start_time > timer_time) {
if (iReset) { if (iReset) {
if (pUseAcurateTiming) if (pUseAcurateTiming)
+1
View File
@@ -18,6 +18,7 @@
#ifndef TYPES_H #ifndef TYPES_H
#define TYPES_H #define TYPES_H
#include <eqp_profiler.h>
#include <stdint.h> #include <stdint.h>
typedef uint8_t byte; typedef uint8_t byte;
typedef uint8_t uint8; typedef uint8_t uint8;
+44
View File
@@ -0,0 +1,44 @@
/*
EQEMu: Everquest Server Emulator
Copyright (C) 2001-2014 EQEMu Development Team (http://eqemulator.net)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY except by those people which sell it, which
are required to give you total support for your newly bought product;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "uuid.h"
#ifdef WIN32
#include <rpc.h>
#else
#include <uuid/uuid.h>
#endif
std::string CreateUUID() {
#ifdef WIN32
UUID uuid;
UuidCreate(&uuid);
unsigned char *str = nullptr;
UuidToStringA(&uuid, &str);
std::string s((char*)str);
RpcStringFreeA(&str);
return s;
#else
char str[64] = { 0 };
uuid_t uuid;
uuid_generate_random(uuid);
uuid_unparse(uuid, str);
return str;
#endif
}
+26
View File
@@ -0,0 +1,26 @@
/*
EQEMu: Everquest Server Emulator
Copyright (C) 2001-2014 EQEMu Development Team (http://eqemulator.net)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY except by those people which sell it, which
are required to give you total support for your newly bought product;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef COMMON_UUID_H
#define COMMON_UUID_H
#include <string>
std::string CreateUUID();
#endif
+8
View File
@@ -28,21 +28,25 @@
WorldConnection::WorldConnection(EmuTCPConnection::ePacketMode mode, const char *password) WorldConnection::WorldConnection(EmuTCPConnection::ePacketMode mode, const char *password)
: m_password(password) : m_password(password)
{ {
_eqp
tcpc.SetPacketMode(mode); tcpc.SetPacketMode(mode);
pTryReconnect = true; pTryReconnect = true;
pConnected = false; pConnected = false;
} }
WorldConnection::~WorldConnection() { WorldConnection::~WorldConnection() {
_eqp
} }
bool WorldConnection::SendPacket(ServerPacket* pack) { bool WorldConnection::SendPacket(ServerPacket* pack) {
_eqp
if (!Connected()) if (!Connected())
return false; return false;
return tcpc.SendPacket(pack); return tcpc.SendPacket(pack);
} }
void WorldConnection::OnConnected() { void WorldConnection::OnConnected() {
_eqp
const EQEmuConfig *Config=EQEmuConfig::get(); const EQEmuConfig *Config=EQEmuConfig::get();
Log.Out(Logs::General, Logs::Netcode, "[WORLD] Connected to World: %s:%d", Config->WorldIP.c_str(), Config->WorldTCPPort); Log.Out(Logs::General, Logs::Netcode, "[WORLD] Connected to World: %s:%d", Config->WorldIP.c_str(), Config->WorldTCPPort);
@@ -53,6 +57,7 @@ void WorldConnection::OnConnected() {
} }
void WorldConnection::Process() { void WorldConnection::Process() {
_eqp
//persistent connection.... //persistent connection....
if (!Connected()) { if (!Connected()) {
pConnected = tcpc.Connected(); pConnected = tcpc.Connected();
@@ -66,11 +71,13 @@ void WorldConnection::Process() {
} }
void WorldConnection::AsyncConnect() { void WorldConnection::AsyncConnect() {
_eqp
const EQEmuConfig *Config=EQEmuConfig::get(); const EQEmuConfig *Config=EQEmuConfig::get();
tcpc.AsyncConnect(Config->WorldIP.c_str(), Config->WorldTCPPort); tcpc.AsyncConnect(Config->WorldIP.c_str(), Config->WorldTCPPort);
} }
bool WorldConnection::Connect() { bool WorldConnection::Connect() {
_eqp
const EQEmuConfig *Config=EQEmuConfig::get(); const EQEmuConfig *Config=EQEmuConfig::get();
char errbuf[TCPConnection_ErrorBufferSize]; char errbuf[TCPConnection_ErrorBufferSize];
if (tcpc.Connect(Config->WorldIP.c_str(), Config->WorldTCPPort, errbuf)) { if (tcpc.Connect(Config->WorldIP.c_str(), Config->WorldTCPPort, errbuf)) {
@@ -82,6 +89,7 @@ bool WorldConnection::Connect() {
} }
void WorldConnection::Disconnect() { void WorldConnection::Disconnect() {
_eqp
tcpc.Disconnect(); tcpc.Disconnect();
} }
+3
View File
@@ -23,6 +23,7 @@ XMLParser::XMLParser() {
} }
bool XMLParser::ParseFile(const char *file, const char *root_ele) { bool XMLParser::ParseFile(const char *file, const char *root_ele) {
_eqp
std::map<std::string,ElementHandler>::iterator handler; std::map<std::string,ElementHandler>::iterator handler;
TiXmlDocument doc( file ); TiXmlDocument doc( file );
if(!doc.LoadFile()) { if(!doc.LoadFile()) {
@@ -70,6 +71,7 @@ bool XMLParser::ParseFile(const char *file, const char *root_ele) {
} }
const char *XMLParser::ParseTextBlock(TiXmlNode *within, const char *name, bool optional) { const char *XMLParser::ParseTextBlock(TiXmlNode *within, const char *name, bool optional) {
_eqp
TiXmlElement * txt = within->FirstChildElement(name); TiXmlElement * txt = within->FirstChildElement(name);
if(txt == nullptr) { if(txt == nullptr) {
if(!optional) { if(!optional) {
@@ -88,6 +90,7 @@ const char *XMLParser::ParseTextBlock(TiXmlNode *within, const char *name, bool
} }
const char *XMLParser::GetText(TiXmlNode *within, bool optional) { const char *XMLParser::GetText(TiXmlNode *within, bool optional) {
_eqp
TiXmlNode *contents = within->FirstChild(); TiXmlNode *contents = within->FirstChild();
if(contents == nullptr || contents->Type() != TiXmlNode::TEXT) { if(contents == nullptr || contents->Type() != TiXmlNode::TEXT) {
if(!optional) { if(!optional) {
+4 -1
View File
@@ -15,15 +15,17 @@ ADD_EXECUTABLE(eqlaunch ${eqlaunch_sources} ${eqlaunch_headers})
INSTALL(TARGETS eqlaunch RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}) INSTALL(TARGETS eqlaunch RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX})
TARGET_LINK_LIBRARIES(eqlaunch common debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE} ${ZLIB_LIBRARY}) TARGET_LINK_LIBRARIES(eqlaunch common ${PERF_LIBS} debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE} ${ZLIB_LIBRARY})
IF(MSVC) IF(MSVC)
SET_TARGET_PROPERTIES(eqlaunch PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF") SET_TARGET_PROPERTIES(eqlaunch PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF")
TARGET_LINK_LIBRARIES(eqlaunch "Ws2_32.lib") TARGET_LINK_LIBRARIES(eqlaunch "Ws2_32.lib")
TARGET_LINK_LIBRARIES(eqlaunch "rpcrt4")
ENDIF(MSVC) ENDIF(MSVC)
IF(MINGW) IF(MINGW)
TARGET_LINK_LIBRARIES(eqlaunch "WS2_32") TARGET_LINK_LIBRARIES(eqlaunch "WS2_32")
TARGET_LINK_LIBRARIES(eqlaunch "rpcrt4")
ENDIF(MINGW) ENDIF(MINGW)
IF(UNIX) IF(UNIX)
@@ -34,6 +36,7 @@ IF(UNIX)
TARGET_LINK_LIBRARIES(eqlaunch "rt") TARGET_LINK_LIBRARIES(eqlaunch "rt")
ENDIF(NOT DARWIN) ENDIF(NOT DARWIN)
TARGET_LINK_LIBRARIES(eqlaunch "pthread") TARGET_LINK_LIBRARIES(eqlaunch "pthread")
TARGET_LINK_LIBRARIES(eqlaunch "uuid")
ADD_DEFINITIONS(-fPIC) ADD_DEFINITIONS(-fPIC)
ENDIF(UNIX) ENDIF(UNIX)
+6
View File
@@ -69,6 +69,10 @@ int main(int argc, char *argv[]) {
Log.Out(Logs::Detail, Logs::Launcher, "Could not set signal handler"); Log.Out(Logs::Detail, Logs::Launcher, "Could not set signal handler");
return 1; return 1;
} }
if (signal(SIGBREAK, CatchSignal) == SIG_ERR) {
Log.Out(Logs::Detail, Logs::Launcher, "Could not set signal handler");
return 1;
}
#ifndef WIN32 #ifndef WIN32
if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) { if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) {
Log.Out(Logs::Detail, Logs::Launcher, "Could not set signal handler"); Log.Out(Logs::Detail, Logs::Launcher, "Could not set signal handler");
@@ -186,6 +190,8 @@ int main(int argc, char *argv[]) {
void CatchSignal(int sig_num) { void CatchSignal(int sig_num) {
Log.Out(Logs::Detail, Logs::Launcher, "Caught signal %d", sig_num); Log.Out(Logs::Detail, Logs::Launcher, "Caught signal %d", sig_num);
RunLoops = false; RunLoops = false;
_eqp_dump_file("eqlaunch");
} }
+20
View File
@@ -0,0 +1,20 @@
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
SET(eqperf_sources
eqp_profile_event.cpp
eqp_profile_timer.cpp
eqp_profiler.cpp
eqp_profiler_node.cpp
)
SET(eqperf_headers
eqp_profile_event.h
eqp_profile_function.h
eqp_profile_timer.h
eqp_profiler.h
eqp_profiler_node.h
)
ADD_LIBRARY(eqperf ${eqperf_sources} ${eqperf_headers})
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
+47
View File
@@ -0,0 +1,47 @@
#include "eqp_profile_event.h"
#include "eqp_profile_timer.h"
#include "eqp_profiler.h"
EQP::CPU::ST::Event::Event(const char *function_name) {
function_name_ = function_name;
name_ = nullptr;
start_ = GetCurrentTimer();
identifier_ = EQP::CPU::ST::GetProfiler().EventStarted(function_name_, name_);
}
EQP::CPU::ST::Event::Event(const char *function_name, const char *name) {
function_name_ = function_name;
name_ = name;
start_ = GetCurrentTimer();
identifier_ = EQP::CPU::ST::GetProfiler().EventStarted(function_name_, name_);
}
EQP::CPU::ST::Event::~Event() {
uint64_t end = GetCurrentTimer();
EQP::CPU::ST::GetProfiler().EventFinished(end - start_, identifier_);
}
EQP::CPU::MT::Event::Event(const char *function_name) {
function_name_ = function_name;
name_ = nullptr;
start_ = GetCurrentTimer();
identifier_ = EQP::CPU::MT::GetProfiler().EventStarted(function_name_, name_);
}
EQP::CPU::MT::Event::Event(const char *function_name, const char *name) {
function_name_ = function_name;
name_ = name;
start_ = GetCurrentTimer();
identifier_ = EQP::CPU::MT::GetProfiler().EventStarted(function_name_, name_);
}
EQP::CPU::MT::Event::~Event() {
uint64_t end = GetCurrentTimer();
EQP::CPU::MT::GetProfiler().EventFinished(end - start_, identifier_);
}
+44
View File
@@ -0,0 +1,44 @@
#pragma once
#include <string>
#include <stdint.h>
#include "eqp_profile_function.h"
namespace EQP
{
namespace CPU
{
namespace ST
{
class EQP_EXPORT Event
{
public:
Event(const char *function_name);
Event(const char *function_name, const char *name);
~Event();
private:
const char *function_name_;
const char *name_;
uint64_t start_;
std::string identifier_;
};
}
namespace MT
{
class EQP_EXPORT Event
{
public:
Event(const char *function_name);
Event(const char *function_name, const char *name);
~Event();
private:
const char *function_name_;
const char *name_;
uint64_t start_;
std::string identifier_;
};
}
}
} // Profile
+16
View File
@@ -0,0 +1,16 @@
#pragma once
#ifndef __PRETTY_FUNCTION__
#ifdef _MSC_VER
#define __PRETTY_FUNCTION__ __FUNCSIG__
#else
#define __PRETTY_FUNCTION__ __FUNCTION__
#endif
#endif
#ifdef _MSC_VER
//#define EQP_EXPORT __declspec(dllexport)
#define EQP_EXPORT
#else
#define EQP_EXPORT
#endif
+24
View File
@@ -0,0 +1,24 @@
#include "eqp_profile_timer.h"
#ifdef _MSC_VER
#include <Windows.h>
#else
#include <time.h>
#endif
uint64_t EQP::GetCurrentTimer()
{
#ifdef _MSC_VER
LARGE_INTEGER qpt_i;
QueryPerformanceCounter(&qpt_i);
return qpt_i.QuadPart;
#else
timespec tp;
if(clock_gettime(CLOCK_MONOTONIC, &tp) == 0) {
uint64_t res = tp.tv_sec * 1000000000;
res += tp.tv_nsec;
return res;
}
return 0;
#endif
}
+9
View File
@@ -0,0 +1,9 @@
#pragma once
#include <stdint.h>
namespace EQP
{
uint64_t GetCurrentTimer();
} // EQP
+245
View File
@@ -0,0 +1,245 @@
#include "eqp_profiler.h"
#include "eqp_profile_timer.h"
#include <iostream>
#include <thread>
#include <mutex>
#include <vector>
#include <algorithm>
#include "../common/uuid.h"
struct EQP::CPU::MT::Profiler::impl
{
std::mutex lock_;
std::unordered_map<std::thread::id, ThreadInfo*> nodes_;
std::string identifier_;
};
EQP::CPU::ST::Profiler &EQP::CPU::ST::GetProfiler() {
static EQP::CPU::ST::Profiler st_profiler;
return st_profiler;
}
EQP::CPU::MT::Profiler &EQP::CPU::MT::GetProfiler() {
static EQP::CPU::MT::Profiler mt_profiler;
return mt_profiler;
}
EQP::CPU::ST::Profiler::Profiler() {
root_ = new ProfilerNode;
root_->SetParent(root_);
current_ = root_;
identifier_ = CreateUUID();
}
EQP::CPU::ST::Profiler::~Profiler() {
delete root_;
}
std::string EQP::CPU::ST::Profiler::EventStarted(const char *func, const char *name) {
std::string cur_name = func;
if(name) {
cur_name += " - ";
cur_name += name;
}
auto search = current_->GetNodes().find(cur_name);
if(search != current_->GetNodes().end()) {
current_ = search->second;
} else {
ProfilerNode *t = new ProfilerNode;
t->SetParent(current_);
current_->GetNodes()[cur_name] = t;
current_ = t;
}
current_->GetCount()++;
current_->SetStarted(GetCurrentTimer());
return identifier_;
}
void EQP::CPU::ST::Profiler::EventFinished(uint64_t time, std::string ident) {
if(ident.compare(identifier_) != 0) {
return;
}
current_->SetStarted(0);
current_->GetTime() += time;
current_ = current_->GetParent();
}
void EQP::CPU::ST::Profiler::Clear() {
for(auto &iter : root_->GetNodes()) {
delete iter.second;
}
root_->GetNodes().clear();
root_->SetTime(0);
root_->SetCount(0);
current_ = root_;
identifier_ = CreateUUID();
}
void EQP::CPU::ST::Profiler::Dump(std::ostream &stream, int num) {
uint64_t total = 0;
std::vector<ProfilerNodeDump> sorted_vec;
sorted_vec.reserve(root_->GetNodes().size() + 1);
for(auto &iter : root_->GetNodes()) {
ProfilerNodeDump n;
n.name = iter.first;
n.node = iter.second;
sorted_vec.push_back(n);
total += iter.second->GetTime();
if(iter.second->GetStarted() > 0) {
total += GetCurrentTimer() - iter.second->GetStarted();
}
}
std::sort(sorted_vec.begin(), sorted_vec.end(),
[](const ProfilerNodeDump& a, const ProfilerNodeDump& b) { return a.node->GetTime() > b.node->GetTime(); });
std::streamsize p = stream.precision();
double m_cycles = total / 1000.0;
stream << std::fixed;
stream.precision(2);
stream << m_cycles << "k cycles" << std::endl;
stream.precision(p);
int i = 0;
for(auto &iter : sorted_vec) {
if(num > 0 && i >= num) {
break;
}
iter.node->Dump(stream, iter.name, total, 1, num);
++i;
}
}
EQP::CPU::MT::Profiler::ThreadInfo::ThreadInfo() {
root_ = new ProfilerNode;
root_->SetParent(root_);
current_ = root_;
}
EQP::CPU::MT::Profiler::ThreadInfo::~ThreadInfo() {
delete root_;
}
EQP::CPU::MT::Profiler::Profiler() {
imp_ = new impl;
imp_->identifier_ = CreateUUID();
}
EQP::CPU::MT::Profiler::~Profiler() {
delete imp_;
}
std::string EQP::CPU::MT::Profiler::EventStarted(const char *func, const char *name) {
std::string cur_name = func;
if(name) {
cur_name += " - ";
cur_name += name;
}
ThreadInfo *ti = nullptr;
std::lock_guard<std::mutex> lg(imp_->lock_);
auto ti_search = imp_->nodes_.find(std::this_thread::get_id());
if(ti_search == imp_->nodes_.end()) {
ti = new ThreadInfo;
imp_->nodes_[std::this_thread::get_id()] = ti;
} else {
ti = ti_search->second;
}
auto search = ti->current_->GetNodes().find(cur_name);
if(search != ti->current_->GetNodes().end()) {
ti->current_ = search->second;
}
else {
ProfilerNode *t = new ProfilerNode;
t->SetParent(ti->current_);
ti->current_->GetNodes()[cur_name] = t;
ti->current_ = t;
}
ti->current_->GetCount()++;
ti->current_->SetStarted(GetCurrentTimer());
return imp_->identifier_;
}
void EQP::CPU::MT::Profiler::EventFinished(uint64_t time, std::string ident) {
ThreadInfo *ti = nullptr;
std::lock_guard<std::mutex> lg(imp_->lock_);
if(ident.compare(imp_->identifier_) != 0) {
return;
}
auto ti_search = imp_->nodes_.find(std::this_thread::get_id());
if(ti_search == imp_->nodes_.end()) {
return;
}
else {
ti = ti_search->second;
}
ti->current_->SetStarted(0);
ti->current_->GetTime() += time;
ti->current_ = ti->current_->GetParent();
}
void EQP::CPU::MT::Profiler::Clear() {
std::lock_guard<std::mutex> lg(imp_->lock_);
for(auto &iter : imp_->nodes_) {
delete iter.second;
}
imp_->nodes_.clear();
imp_->identifier_ = CreateUUID();
}
void EQP::CPU::MT::Profiler::Dump(std::ostream &stream, int num) {
std::lock_guard<std::mutex> lg(imp_->lock_);
for(auto &iter : imp_->nodes_) {
uint64_t total = 0;
std::vector<ProfilerNodeDump> sorted_vec;
sorted_vec.reserve(iter.second->root_->GetNodes().size() + 1);
for(auto &t_iter : iter.second->root_->GetNodes()) {
ProfilerNodeDump n;
n.name = t_iter.first;
n.node = t_iter.second;
sorted_vec.push_back(n);
total += t_iter.second->GetTime();
if(t_iter.second->GetStarted() > 0) {
total += GetCurrentTimer() - t_iter.second->GetStarted();
}
}
std::sort(sorted_vec.begin(), sorted_vec.end(),
[](const ProfilerNodeDump& a, const ProfilerNodeDump& b) { return a.node->GetTime() > b.node->GetTime(); });
std::streamsize p = stream.precision();
double m_cycles = total / 1000.0;
stream << std::fixed;
stream.precision(2);
stream << "Thread: " << iter.first << ", " << m_cycles << "k cycles" << std::endl;
stream.precision(p);
int i = 0;
for(auto &t_iter : sorted_vec) {
if(num > 0 && i >= num) {
break;
}
t_iter.node->Dump(stream, t_iter.name, total, 1, num);
++i;
}
stream << std::endl;
}
}
+112
View File
@@ -0,0 +1,112 @@
#pragma once
#ifdef EQPERF_ENABLED
#include <string>
#include <fstream>
#include <time.h>
#include "eqp_profile_event.h"
#include "eqp_profiler_node.h"
#define eqp_comb_fin(x, y) x##y
#define eqp_comb(x, y) eqp_comb_fin(x, y)
#ifndef EQP_MULTITHREAD
#define _eqp EQP::CPU::ST::Event eqp_comb(eq_perf_event_, __LINE__) (__PRETTY_FUNCTION__);
#define _eqpn(x) EQP::CPU::ST::Event eqp_comb(eq_perf_event_, __LINE__) (__PRETTY_FUNCTION__, x);
#define _eqp_clear() EQP::CPU::ST::GetProfiler().Clear()
#define _eqp_dump(strm, count) EQP::CPU::ST::GetProfiler().Dump(strm, count)
#define _eqp_dump_file(name) char time_str[128]; \
time_t result = time(nullptr); \
strftime(time_str, sizeof(time_str), "%Y_%m_%d_%H_%M_%S", localtime(&result)); \
std::string prof_name = "./profile/"; \
prof_name += name; \
prof_name += "_"; \
prof_name += time_str; \
prof_name += ".log"; \
std::ofstream profile_out(prof_name, std::ofstream::out); \
if(profile_out.good()) { \
_eqp_dump(profile_out, 10); \
}
#else
#define _eqp EQP::CPU::MT::Event eqp_comb(eq_perf_event_, __LINE__) (__PRETTY_FUNCTION__);
#define _eqpn(x) EQP::CPU::MT::Event eqp_comb(eq_perf_event_, __LINE__) (__PRETTY_FUNCTION__, x);
#define _eqp_clear() EQP::CPU::MT::GetProfiler().Clear()
#define _eqp_dump(strm, count) EQP::CPU::MT::GetProfiler().Dump(strm, count)
#define _eqp_dump_file(name) char time_str[128]; \
time_t result = time(nullptr); \
strftime(time_str, sizeof(time_str), "%Y_%m_%d_%H_%M_%S", localtime(&result)); \
std::string prof_name = "./profile/"; \
prof_name += name; \
prof_name += "_"; \
prof_name += time_str; \
prof_name += ".log"; \
std::ofstream profile_out(prof_name, std::ofstream::out); \
if(profile_out.good()) { \
_eqp_dump(profile_out, 10); \
}
#endif
namespace EQP
{
namespace CPU
{
namespace ST
{
class EQP_EXPORT Profiler
{
typedef EQP::CPU::ProfilerNode Node;
public:
Profiler();
~Profiler();
std::string EventStarted(const char *func, const char *name);
void EventFinished(uint64_t time, std::string ident);
void Dump(std::ostream &stream, int num = 0);
void Clear();
private:
Node *root_;
Node *current_;
std::string identifier_;
};
EQP_EXPORT Profiler &GetProfiler();
}
namespace MT
{
class EQP_EXPORT Profiler
{
typedef EQP::CPU::ProfilerNode Node;
class ThreadInfo {
public:
ThreadInfo();
~ThreadInfo();
Node *root_;
Node *current_;
};
public:
Profiler();
~Profiler();
std::string EventStarted(const char *func, const char *name);
void EventFinished(uint64_t time, std::string ident);
void Dump(std::ostream &stream, int num = 0);
void Clear();
private:
struct impl;
impl *imp_;
};
EQP_EXPORT Profiler &GetProfiler();
}
} // CPU
} // EQP
#else
#define _eqp
#define _eqpn(x)
#define _eqp_clear()
#define _eqp_dump(strm, count)
#endif
+66
View File
@@ -0,0 +1,66 @@
#include "eqp_profiler_node.h"
#include "eqp_profile_timer.h"
#include <iostream>
#include <iomanip>
#include <algorithm>
EQP::CPU::ProfilerNode::ProfilerNode() {
count_ = 0;
time_ = 0;
started_ = 0;
parent_ = nullptr;;
}
EQP::CPU::ProfilerNode::~ProfilerNode() {
for(auto &iter : nodes_) {
delete iter.second;
}
}
void EQP::CPU::ProfilerNode::Dump(std::ostream &stream, const std::string &func, uint64_t total_time, int node_level, int num) {
if(node_level >= 1) {
stream << std::setw(node_level * 4) << " ";
}
double m_cycles = static_cast<double>(time_);
if(started_) {
m_cycles += GetCurrentTimer() - started_;
}
double percentage = m_cycles * 100 / static_cast<double>(total_time);
m_cycles = m_cycles / 1000.0;
double m_avg_cycles = m_cycles / count_;
std::streamsize p = stream.precision();
stream << std::fixed;
stream.precision(2);
stream << m_cycles << "k cycles, " << count_ << " calls, " << m_avg_cycles << "k cycles avg, ";
stream << func.c_str() << " ";
stream << percentage << "%";
stream << std::endl;
stream.precision(p);
std::vector<ProfilerNodeDump> sorted_vec;
sorted_vec.reserve(nodes_.size() + 1);
for(auto &iter : nodes_) {
ProfilerNodeDump n;
n.name = iter.first;
n.node = iter.second;
sorted_vec.push_back(n);
}
std::sort(sorted_vec.begin(), sorted_vec.end(),
[](const ProfilerNodeDump& a, const ProfilerNodeDump& b) { return a.node->GetTime() > b.node->GetTime(); });
int i = 0;
for(auto &iter : sorted_vec) {
if(num > 0 && i >= num) {
break;
}
iter.node->Dump(stream, iter.name, total_time, node_level + 1, num);
++i;
}
}
+47
View File
@@ -0,0 +1,47 @@
#pragma once
#include <unordered_map>
#include <string>
#include <stdint.h>
namespace EQP
{
namespace CPU
{
class ProfilerNode
{
public:
ProfilerNode();
~ProfilerNode();
inline void SetCount(uint64_t c) { count_ = c; }
inline uint64_t& GetCount() { return count_; }
inline void SetTime(uint64_t t) { time_ = t; }
inline uint64_t& GetTime() { return time_; }
inline void SetStarted(uint64_t t) { started_ = t; }
inline uint64_t& GetStarted() { return started_; }
inline void SetParent(ProfilerNode *p) { parent_ = p; }
inline ProfilerNode* GetParent() { return parent_; }
inline std::unordered_map<std::string, ProfilerNode*>& GetNodes() { return nodes_; }
void Dump(std::ostream &stream, const std::string &func, uint64_t total_time, int node_level, int num);
private:
uint64_t count_;
uint64_t time_;
uint64_t started_;
ProfilerNode *parent_;
std::unordered_map<std::string, ProfilerNode*> nodes_;
};
struct ProfilerNodeDump
{
std::string name;
ProfilerNode *node;
};
} // CPU
} // EQP
+4 -3
View File
@@ -6,7 +6,6 @@ SET(eqlogin_sources
config.cpp config.cpp
database_mysql.cpp database_mysql.cpp
database_postgresql.cpp database_postgresql.cpp
error_log.cpp
main.cpp main.cpp
server_manager.cpp server_manager.cpp
world_server.cpp world_server.cpp
@@ -26,7 +25,6 @@ SET(eqlogin_headers
database_postgresql.h database_postgresql.h
encryption.h encryption.h
eq_crypto_api.h eq_crypto_api.h
error_log.h
login_server.h login_server.h
login_structures.h login_structures.h
options.h options.h
@@ -43,15 +41,17 @@ ADD_EXECUTABLE(loginserver ${eqlogin_sources} ${eqlogin_headers})
INSTALL(TARGETS loginserver RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}) INSTALL(TARGETS loginserver RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX})
TARGET_LINK_LIBRARIES(loginserver common debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE}) TARGET_LINK_LIBRARIES(loginserver common ${PERF_LIBS} debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE})
IF(MSVC) IF(MSVC)
SET_TARGET_PROPERTIES(loginserver PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF") SET_TARGET_PROPERTIES(loginserver PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF")
TARGET_LINK_LIBRARIES(loginserver "Ws2_32.lib") TARGET_LINK_LIBRARIES(loginserver "Ws2_32.lib")
TARGET_LINK_LIBRARIES(loginserver "rpcrt4")
ENDIF(MSVC) ENDIF(MSVC)
IF(MINGW) IF(MINGW)
TARGET_LINK_LIBRARIES(loginserver "WS2_32") TARGET_LINK_LIBRARIES(loginserver "WS2_32")
TARGET_LINK_LIBRARIES(loginserver "rpcrt4")
ENDIF(MINGW) ENDIF(MINGW)
IF(UNIX) IF(UNIX)
@@ -62,6 +62,7 @@ IF(UNIX)
TARGET_LINK_LIBRARIES(loginserver "rt") TARGET_LINK_LIBRARIES(loginserver "rt")
ENDIF(NOT DARWIN) ENDIF(NOT DARWIN)
TARGET_LINK_LIBRARIES(loginserver "pthread") TARGET_LINK_LIBRARIES(loginserver "pthread")
TARGET_LINK_LIBRARIES(loginserver "uuid")
TARGET_LINK_LIBRARIES(loginserver "EQEmuAuthCrypto") TARGET_LINK_LIBRARIES(loginserver "EQEmuAuthCrypto")
TARGET_LINK_LIBRARIES(loginserver "cryptopp") TARGET_LINK_LIBRARIES(loginserver "cryptopp")
ADD_DEFINITIONS(-fPIC) ADD_DEFINITIONS(-fPIC)
+30 -23
View File
@@ -16,16 +16,16 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#include "client.h" #include "client.h"
#include "error_log.h"
#include "login_server.h" #include "login_server.h"
#include "login_structures.h" #include "login_structures.h"
#include "../common/misc_functions.h" #include "../common/misc_functions.h"
#include "../common/eqemu_logsys.h"
extern ErrorLog *server_log;
extern LoginServer server; extern LoginServer server;
Client::Client(std::shared_ptr<EQStream> c, LSClientVersion v) Client::Client(std::shared_ptr<EQStream> c, LSClientVersion v)
{ {
_eqp
connection = c; connection = c;
version = v; version = v;
status = cs_not_sent_session_ready; status = cs_not_sent_session_ready;
@@ -36,12 +36,13 @@ Client::Client(std::shared_ptr<EQStream> c, LSClientVersion v)
bool Client::Process() bool Client::Process()
{ {
_eqp
EQApplicationPacket *app = connection->PopPacket(); EQApplicationPacket *app = connection->PopPacket();
while(app) while(app)
{ {
if(server.options.IsTraceOn()) if(server.options.IsTraceOn())
{ {
server_log->Log(log_network, "Application packet received from client (size %u)", app->Size()); Log.Out(Logs::General, Logs::Netcode, "Application packet received from client (size %u)", app->Size());
} }
if(server.options.IsDumpInPacketsOn()) if(server.options.IsDumpInPacketsOn())
@@ -55,7 +56,7 @@ bool Client::Process()
{ {
if(server.options.IsTraceOn()) if(server.options.IsTraceOn())
{ {
server_log->Log(log_network, "Session ready received from client."); Log.Out(Logs::General, Logs::Netcode, "Session ready received from client.");
} }
Handle_SessionReady((const char*)app->pBuffer, app->Size()); Handle_SessionReady((const char*)app->pBuffer, app->Size());
break; break;
@@ -64,13 +65,13 @@ bool Client::Process()
{ {
if(app->Size() < 20) if(app->Size() < 20)
{ {
server_log->Log(log_network_error, "Login received but it is too small, discarding."); Log.Out(Logs::General, Logs::Netcode, "Login received but it is too small, discarding.");
break; break;
} }
if(server.options.IsTraceOn()) if(server.options.IsTraceOn())
{ {
server_log->Log(log_network, "Login received from client."); Log.Out(Logs::General, Logs::Netcode, "Login received from client.");
} }
Handle_Login((const char*)app->pBuffer, app->Size()); Handle_Login((const char*)app->pBuffer, app->Size());
@@ -80,7 +81,7 @@ bool Client::Process()
{ {
if(server.options.IsTraceOn()) if(server.options.IsTraceOn())
{ {
server_log->Log(log_network, "Server list request received from client."); Log.Out(Logs::General, Logs::Netcode, "Server list request received from client.");
} }
SendServerListPacket(); SendServerListPacket();
@@ -90,7 +91,7 @@ bool Client::Process()
{ {
if(app->Size() < sizeof(PlayEverquestRequest_Struct)) if(app->Size() < sizeof(PlayEverquestRequest_Struct))
{ {
server_log->Log(log_network_error, "Play received but it is too small, discarding."); Log.Out(Logs::General, Logs::Netcode, "Play received but it is too small, discarding.");
break; break;
} }
@@ -101,7 +102,7 @@ bool Client::Process()
{ {
char dump[64]; char dump[64];
app->build_header_dump(dump); app->build_header_dump(dump);
server_log->Log(log_network_error, "Recieved unhandled application packet from the client: %s.", dump); Log.Out(Logs::General, Logs::Netcode, "Recieved unhandled application packet from the client: %s.", dump);
} }
} }
@@ -114,22 +115,23 @@ bool Client::Process()
void Client::Handle_SessionReady(const char* data, unsigned int size) void Client::Handle_SessionReady(const char* data, unsigned int size)
{ {
_eqp
if(status != cs_not_sent_session_ready) if(status != cs_not_sent_session_ready)
{ {
server_log->Log(log_network_error, "Session ready received again after already being received."); Log.Out(Logs::General, Logs::Netcode, "Session ready received again after already being received.");
return; return;
} }
if(size < sizeof(unsigned int)) if(size < sizeof(unsigned int))
{ {
server_log->Log(log_network_error, "Session ready was too small."); Log.Out(Logs::General, Logs::Netcode, "Session ready was too small.");
return; return;
} }
unsigned int mode = *((unsigned int*)data); unsigned int mode = *((unsigned int*)data);
if(mode == (unsigned int)lm_from_world) if(mode == (unsigned int)lm_from_world)
{ {
server_log->Log(log_network, "Session ready indicated logged in from world(unsupported feature), disconnecting."); Log.Out(Logs::General, Logs::Netcode, "Session ready indicated logged in from world(unsupported feature), disconnecting.");
connection->Close(); connection->Close();
return; return;
} }
@@ -175,15 +177,16 @@ void Client::Handle_SessionReady(const char* data, unsigned int size)
void Client::Handle_Login(const char* data, unsigned int size) void Client::Handle_Login(const char* data, unsigned int size)
{ {
_eqp
if(status != cs_waiting_for_login) if(status != cs_waiting_for_login)
{ {
server_log->Log(log_network_error, "Login received after already having logged in."); Log.Out(Logs::General, Logs::Netcode, "Login received after already having logged in.");
return; return;
} }
if((size - 12) % 8 != 0) if((size - 12) % 8 != 0)
{ {
server_log->Log(log_network_error, "Login received packet of size: %u, this would cause a block corruption, discarding.", size); Log.Out(Logs::General, Logs::Netcode, "Login received packet of size: %u, this would cause a block corruption, discarding.", size);
return; return;
} }
@@ -204,8 +207,8 @@ void Client::Handle_Login(const char* data, unsigned int size)
if(server.options.IsTraceOn()) if(server.options.IsTraceOn())
{ {
server_log->Log(log_client, "User: %s", e_user.c_str()); Log.Out(Logs::General, Logs::LoginServer, "User: %s", e_user.c_str());
server_log->Log(log_client, "Hash: %s", e_hash.c_str()); Log.Out(Logs::General, Logs::LoginServer, "Hash: %s", e_hash.c_str());
} }
server.eq_crypto->DeleteHeap(e_buffer); server.eq_crypto->DeleteHeap(e_buffer);
@@ -218,8 +221,8 @@ void Client::Handle_Login(const char* data, unsigned int size)
if(server.options.IsTraceOn()) if(server.options.IsTraceOn())
{ {
server_log->Log(log_client, "User: %s", e_user.c_str()); Log.Out(Logs::General, Logs::LoginServer, "User: %s", e_user.c_str());
server_log->Log(log_client, "Hash: %s", e_hash.c_str()); Log.Out(Logs::General, Logs::LoginServer, "Hash: %s", e_hash.c_str());
} }
_HeapDeleteCharBuffer(e_buffer); _HeapDeleteCharBuffer(e_buffer);
@@ -228,7 +231,7 @@ void Client::Handle_Login(const char* data, unsigned int size)
bool result; bool result;
if(server.db->GetLoginDataFromAccountName(e_user, d_pass_hash, d_account_id) == false) if(server.db->GetLoginDataFromAccountName(e_user, d_pass_hash, d_account_id) == false)
{ {
server_log->Log(log_client_error, "Error logging in, user %s does not exist in the database.", e_user.c_str()); Log.Out(Logs::General, Logs::Error, "Error logging in, user %s does not exist in the database.", e_user.c_str());
result = false; result = false;
} }
else else
@@ -329,9 +332,10 @@ void Client::Handle_Login(const char* data, unsigned int size)
void Client::Handle_Play(const char* data) void Client::Handle_Play(const char* data)
{ {
_eqp
if(status != cs_logged_in) if(status != cs_logged_in)
{ {
server_log->Log(log_client_error, "Client sent a play request when they either were not logged in, discarding."); Log.Out(Logs::General, Logs::Error, "Client sent a play request when they either were not logged in, discarding.");
return; return;
} }
@@ -341,7 +345,7 @@ void Client::Handle_Play(const char* data)
if(server.options.IsTraceOn()) if(server.options.IsTraceOn())
{ {
server_log->Log(log_network, "Play received from client, server number %u sequence %u.", server_id_in, sequence_in); Log.Out(Logs::General, Logs::Netcode, "Play received from client, server number %u sequence %u.", server_id_in, sequence_in);
} }
this->play_server_id = (unsigned int)play->ServerNumber; this->play_server_id = (unsigned int)play->ServerNumber;
@@ -352,6 +356,7 @@ void Client::Handle_Play(const char* data)
void Client::SendServerListPacket() void Client::SendServerListPacket()
{ {
_eqp
EQApplicationPacket *outapp = server.SM->CreateServerListPacket(this); EQApplicationPacket *outapp = server.SM->CreateServerListPacket(this);
if(server.options.IsDumpOutPacketsOn()) if(server.options.IsDumpOutPacketsOn())
@@ -365,10 +370,11 @@ void Client::SendServerListPacket()
void Client::SendPlayResponse(EQApplicationPacket *outapp) void Client::SendPlayResponse(EQApplicationPacket *outapp)
{ {
_eqp
if(server.options.IsTraceOn()) if(server.options.IsTraceOn())
{ {
server_log->Log(log_network_trace, "Sending play response for %s.", GetAccountName().c_str()); Log.Out(Logs::Detail, Logs::Netcode, "Sending play response for %s.", GetAccountName().c_str());
server_log->LogPacket(log_network_trace, (const char*)outapp->pBuffer, outapp->size); //server_log->LogPacket(log_network_trace, (const char*)outapp->pBuffer, outapp->size);
} }
connection->QueuePacket(outapp); connection->QueuePacket(outapp);
status = cs_logged_in; status = cs_logged_in;
@@ -376,6 +382,7 @@ void Client::SendPlayResponse(EQApplicationPacket *outapp)
void Client::GenerateKey() void Client::GenerateKey()
{ {
_eqp
key.clear(); key.clear();
int count = 0; int count = 0;
while(count < 10) while(count < 10)
+20 -14
View File
@@ -16,32 +16,32 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#include "client_manager.h" #include "client_manager.h"
#include "error_log.h"
#include "login_server.h" #include "login_server.h"
#include "../common/eqemu_logsys.h"
extern ErrorLog *server_log;
extern LoginServer server; extern LoginServer server;
extern bool run_server; extern bool run_server;
ClientManager::ClientManager() ClientManager::ClientManager()
{ {
_eqp
int titanium_port = atoi(server.config->GetVariable("Titanium", "port").c_str()); int titanium_port = atoi(server.config->GetVariable("Titanium", "port").c_str());
titanium_stream = new EQStreamFactory(LoginStream, titanium_port); titanium_stream = new EQStreamFactory(LoginStream, titanium_port);
titanium_ops = new RegularOpcodeManager; titanium_ops = new RegularOpcodeManager;
if(!titanium_ops->LoadOpcodes(server.config->GetVariable("Titanium", "opcodes").c_str())) if(!titanium_ops->LoadOpcodes(server.config->GetVariable("Titanium", "opcodes").c_str()))
{ {
server_log->Log(log_error, "ClientManager fatal error: couldn't load opcodes for Titanium file %s.", Log.Out(Logs::Detail, Logs::Error, "ClientManager fatal error: couldn't load opcodes for Titanium file %s.",
server.config->GetVariable("Titanium", "opcodes").c_str()); server.config->GetVariable("Titanium", "opcodes").c_str());
run_server = false; run_server = false;
} }
if(titanium_stream->Open()) if(titanium_stream->Open())
{ {
server_log->Log(log_network, "ClientManager listening on Titanium stream."); Log.Out(Logs::General, Logs::Netcode, "ClientManager listening on Titanium stream.");
} }
else else
{ {
server_log->Log(log_error, "ClientManager fatal error: couldn't open Titanium stream."); Log.Out(Logs::Detail, Logs::Error, "ClientManager fatal error: couldn't open Titanium stream.");
run_server = false; run_server = false;
} }
@@ -50,24 +50,25 @@ ClientManager::ClientManager()
sod_ops = new RegularOpcodeManager; sod_ops = new RegularOpcodeManager;
if(!sod_ops->LoadOpcodes(server.config->GetVariable("SoD", "opcodes").c_str())) if(!sod_ops->LoadOpcodes(server.config->GetVariable("SoD", "opcodes").c_str()))
{ {
server_log->Log(log_error, "ClientManager fatal error: couldn't load opcodes for SoD file %s.", Log.Out(Logs::Detail, Logs::Error, "ClientManager fatal error: couldn't load opcodes for SoD file %s.",
server.config->GetVariable("SoD", "opcodes").c_str()); server.config->GetVariable("SoD", "opcodes").c_str());
run_server = false; run_server = false;
} }
if(sod_stream->Open()) if(sod_stream->Open())
{ {
server_log->Log(log_network, "ClientManager listening on SoD stream."); Log.Out(Logs::General, Logs::Netcode, "ClientManager listening on SoD stream.");
} }
else else
{ {
server_log->Log(log_error, "ClientManager fatal error: couldn't open SoD stream."); Log.Out(Logs::Detail, Logs::Error, "ClientManager fatal error: couldn't open SoD stream.");
run_server = false; run_server = false;
} }
} }
ClientManager::~ClientManager() ClientManager::~ClientManager()
{ {
_eqp
if(titanium_stream) if(titanium_stream)
{ {
titanium_stream->Close(); titanium_stream->Close();
@@ -93,13 +94,14 @@ ClientManager::~ClientManager()
void ClientManager::Process() void ClientManager::Process()
{ {
_eqp
ProcessDisconnect(); ProcessDisconnect();
std::shared_ptr<EQStream> cur = titanium_stream->Pop(); std::shared_ptr<EQStream> cur = titanium_stream->Pop();
while(cur) while(cur)
{ {
struct in_addr in; struct in_addr in;
in.s_addr = cur->GetRemoteIP(); in.s_addr = cur->GetRemoteIP();
server_log->Log(log_network, "New Titanium client connection from %s:%d", inet_ntoa(in), ntohs(cur->GetRemotePort())); Log.Out(Logs::General, Logs::Netcode, "New Titanium client connection from %s:%d", inet_ntoa(in), ntohs(cur->GetRemotePort()));
cur->SetOpcodeManager(&titanium_ops); cur->SetOpcodeManager(&titanium_ops);
Client *c = new Client(cur, cv_titanium); Client *c = new Client(cur, cv_titanium);
@@ -112,7 +114,7 @@ void ClientManager::Process()
{ {
struct in_addr in; struct in_addr in;
in.s_addr = cur->GetRemoteIP(); in.s_addr = cur->GetRemoteIP();
server_log->Log(log_network, "New SoD client connection from %s:%d", inet_ntoa(in), ntohs(cur->GetRemotePort())); Log.Out(Logs::General, Logs::Netcode, "New SoD client connection from %s:%d", inet_ntoa(in), ntohs(cur->GetRemotePort()));
cur->SetOpcodeManager(&sod_ops); cur->SetOpcodeManager(&sod_ops);
Client *c = new Client(cur, cv_sod); Client *c = new Client(cur, cv_sod);
@@ -125,7 +127,7 @@ void ClientManager::Process()
{ {
if((*iter)->Process() == false) if((*iter)->Process() == false)
{ {
server_log->Log(log_client, "Client had a fatal error and had to be removed from the login."); Log.Out(Logs::General, Logs::LoginServer, "Client had a fatal error and had to be removed from the login.");
delete (*iter); delete (*iter);
iter = clients.erase(iter); iter = clients.erase(iter);
} }
@@ -138,13 +140,14 @@ void ClientManager::Process()
void ClientManager::ProcessDisconnect() void ClientManager::ProcessDisconnect()
{ {
_eqp
list<Client*>::iterator iter = clients.begin(); list<Client*>::iterator iter = clients.begin();
while(iter != clients.end()) while(iter != clients.end())
{ {
std::shared_ptr<EQStream> c = (*iter)->GetConnection(); std::shared_ptr<EQStream> c = (*iter)->GetConnection();
if(c->CheckClosed()) if(c->CheckClosed())
{ {
server_log->Log(log_network, "Client disconnected from the server, removing client."); Log.Out(Logs::General, Logs::Netcode, "Client disconnected from the server, removing client.");
delete (*iter); delete (*iter);
iter = clients.erase(iter); iter = clients.erase(iter);
} }
@@ -157,6 +160,7 @@ void ClientManager::ProcessDisconnect()
void ClientManager::UpdateServerList() void ClientManager::UpdateServerList()
{ {
_eqp
list<Client*>::iterator iter = clients.begin(); list<Client*>::iterator iter = clients.begin();
while(iter != clients.end()) while(iter != clients.end())
{ {
@@ -167,12 +171,13 @@ void ClientManager::UpdateServerList()
void ClientManager::RemoveExistingClient(unsigned int account_id) void ClientManager::RemoveExistingClient(unsigned int account_id)
{ {
_eqp
list<Client*>::iterator iter = clients.begin(); list<Client*>::iterator iter = clients.begin();
while(iter != clients.end()) while(iter != clients.end())
{ {
if((*iter)->GetAccountID() == account_id) if((*iter)->GetAccountID() == account_id)
{ {
server_log->Log(log_network, "Client attempting to log in and existing client already logged in, removing existing client."); Log.Out(Logs::General, Logs::Netcode, "Client attempting to log in and existing client already logged in, removing existing client.");
delete (*iter); delete (*iter);
iter = clients.erase(iter); iter = clients.erase(iter);
} }
@@ -185,6 +190,7 @@ void ClientManager::RemoveExistingClient(unsigned int account_id)
Client *ClientManager::GetClient(unsigned int account_id) Client *ClientManager::GetClient(unsigned int account_id)
{ {
_eqp
Client *cur = nullptr; Client *cur = nullptr;
int count = 0; int count = 0;
list<Client*>::iterator iter = clients.begin(); list<Client*>::iterator iter = clients.begin();
@@ -200,7 +206,7 @@ Client *ClientManager::GetClient(unsigned int account_id)
if(count > 1) if(count > 1)
{ {
server_log->Log(log_client_error, "More than one client with a given account_id existed in the client list."); Log.Out(Logs::General, Logs::Error, "More than one client with a given account_id existed in the client list.");
} }
return cur; return cur;
} }
+8 -6
View File
@@ -17,9 +17,8 @@
*/ */
#include "../common/global_define.h" #include "../common/global_define.h"
#include "config.h" #include "config.h"
#include "error_log.h" #include "../common/eqemu_logsys.h"
extern ErrorLog *server_log;
/** /**
* Retrieves the variable we want from our title or theme * Retrieves the variable we want from our title or theme
* First gets the map from the title * First gets the map from the title
@@ -27,6 +26,7 @@ extern ErrorLog *server_log;
*/ */
std::string Config::GetVariable(std::string title, std::string parameter) std::string Config::GetVariable(std::string title, std::string parameter)
{ {
_eqp
std::map<std::string, std::map<std::string, std::string> >::iterator iter = vars.find(title); std::map<std::string, std::map<std::string, std::string> >::iterator iter = vars.find(title);
if(iter != vars.end()) if(iter != vars.end())
{ {
@@ -46,9 +46,10 @@ std::string Config::GetVariable(std::string title, std::string parameter)
*/ */
void Config::Parse(const char *file_name) void Config::Parse(const char *file_name)
{ {
_eqp
if(file_name == nullptr) if(file_name == nullptr)
{ {
server_log->Log(log_error, "Config::Parse(), file_name passed was null."); Log.Out(Logs::Detail, Logs::Error, "Config::Parse(), file_name passed was null.");
return; return;
} }
@@ -71,7 +72,7 @@ void Config::Parse(const char *file_name)
++iter; ++iter;
if(iter == tokens.end()) if(iter == tokens.end())
{ {
server_log->Log(log_error, "Config::Parse(), EOF before title done parsing."); Log.Out(Logs::Detail, Logs::Error, "Config::Parse(), EOF before title done parsing.");
fclose(input); fclose(input);
vars.clear(); vars.clear();
return; return;
@@ -104,7 +105,7 @@ void Config::Parse(const char *file_name)
mode++; mode++;
if((*iter).compare("=") != 0) if((*iter).compare("=") != 0)
{ {
server_log->Log(log_error, "Config::Parse(), invalid parse token where = should be."); Log.Out(Logs::Detail, Logs::Error, "Config::Parse(), invalid parse token where = should be.");
fclose(input); fclose(input);
vars.clear(); vars.clear();
return; return;
@@ -133,7 +134,7 @@ void Config::Parse(const char *file_name)
} }
else else
{ {
server_log->Log(log_error, "Config::Parse(), file was unable to be opened for parsing."); Log.Out(Logs::Detail, Logs::Error, "Config::Parse(), file was unable to be opened for parsing.");
} }
} }
@@ -144,6 +145,7 @@ void Config::Parse(const char *file_name)
*/ */
void Config::Tokenize(FILE *input, std::list<std::string> &tokens) void Config::Tokenize(FILE *input, std::list<std::string> &tokens)
{ {
_eqp
char c = fgetc(input); char c = fgetc(input);
std::string lexeme; std::string lexeme;
+23 -16
View File
@@ -20,16 +20,16 @@
#ifdef EQEMU_MYSQL_ENABLED #ifdef EQEMU_MYSQL_ENABLED
#include "database_mysql.h" #include "database_mysql.h"
#include "error_log.h"
#include "login_server.h" #include "login_server.h"
#include "../common/eqemu_logsys.h"
extern ErrorLog *server_log;
extern LoginServer server; extern LoginServer server;
#pragma comment(lib, "mysqlclient.lib") #pragma comment(lib, "mysqlclient.lib")
DatabaseMySQL::DatabaseMySQL(string user, string pass, string host, string port, string name) DatabaseMySQL::DatabaseMySQL(string user, string pass, string host, string port, string name)
{ {
_eqp
this->user = user; this->user = user;
this->pass = pass; this->pass = pass;
this->host = host; this->host = host;
@@ -43,18 +43,19 @@ DatabaseMySQL::DatabaseMySQL(string user, string pass, string host, string port,
if(!mysql_real_connect(db, host.c_str(), user.c_str(), pass.c_str(), name.c_str(), atoi(port.c_str()), nullptr, 0)) if(!mysql_real_connect(db, host.c_str(), user.c_str(), pass.c_str(), name.c_str(), atoi(port.c_str()), nullptr, 0))
{ {
mysql_close(db); mysql_close(db);
server_log->Log(log_database, "Failed to connect to MySQL database. Error: %s", mysql_error(db)); Log.Out(Logs::General, Logs::Database,"Failed to connect to MySQL database. Error: %s", mysql_error(db));
exit(1); exit(1);
} }
} }
else else
{ {
server_log->Log(log_database, "Failed to create db object in MySQL database."); Log.Out(Logs::General, Logs::Database,"Failed to create db object in MySQL database.");
} }
} }
DatabaseMySQL::~DatabaseMySQL() DatabaseMySQL::~DatabaseMySQL()
{ {
_eqp
if(db) if(db)
{ {
mysql_close(db); mysql_close(db);
@@ -63,6 +64,7 @@ DatabaseMySQL::~DatabaseMySQL()
bool DatabaseMySQL::GetLoginDataFromAccountName(string name, string &password, unsigned int &id) bool DatabaseMySQL::GetLoginDataFromAccountName(string name, string &password, unsigned int &id)
{ {
_eqp
if(!db) if(!db)
{ {
return false; return false;
@@ -77,7 +79,7 @@ bool DatabaseMySQL::GetLoginDataFromAccountName(string name, string &password, u
if(mysql_query(db, query.str().c_str()) != 0) if(mysql_query(db, query.str().c_str()) != 0)
{ {
server_log->Log(log_database, "Mysql query failed: %s", query.str().c_str()); Log.Out(Logs::General, Logs::Database,"Mysql query failed: %s", query.str().c_str());
return false; return false;
} }
@@ -94,13 +96,14 @@ bool DatabaseMySQL::GetLoginDataFromAccountName(string name, string &password, u
} }
} }
server_log->Log(log_database, "Mysql query returned no result: %s", query.str().c_str()); Log.Out(Logs::General, Logs::Database,"Mysql query returned no result: %s", query.str().c_str());
return false; return false;
} }
bool DatabaseMySQL::GetWorldRegistration(string long_name, string short_name, unsigned int &id, string &desc, unsigned int &list_id, bool DatabaseMySQL::GetWorldRegistration(string long_name, string short_name, unsigned int &id, string &desc, unsigned int &list_id,
unsigned int &trusted, string &list_desc, string &account, string &password) unsigned int &trusted, string &list_desc, string &account, string &password)
{ {
_eqp
if(!db) if(!db)
{ {
return false; return false;
@@ -122,7 +125,7 @@ bool DatabaseMySQL::GetWorldRegistration(string long_name, string short_name, un
if(mysql_query(db, query.str().c_str()) != 0) if(mysql_query(db, query.str().c_str()) != 0)
{ {
server_log->Log(log_database, "Mysql query failed: %s", query.str().c_str()); Log.Out(Logs::General, Logs::Database,"Mysql query failed: %s", query.str().c_str());
return false; return false;
} }
@@ -147,7 +150,7 @@ bool DatabaseMySQL::GetWorldRegistration(string long_name, string short_name, un
if(mysql_query(db, query.str().c_str()) != 0) if(mysql_query(db, query.str().c_str()) != 0)
{ {
server_log->Log(log_database, "Mysql query failed: %s", query.str().c_str()); Log.Out(Logs::General, Logs::Database,"Mysql query failed: %s", query.str().c_str());
return false; return false;
} }
@@ -163,19 +166,20 @@ bool DatabaseMySQL::GetWorldRegistration(string long_name, string short_name, un
} }
} }
server_log->Log(log_database, "Mysql query returned no result: %s", query.str().c_str()); Log.Out(Logs::General, Logs::Database,"Mysql query returned no result: %s", query.str().c_str());
return false; return false;
} }
return true; return true;
} }
} }
server_log->Log(log_database, "Mysql query returned no result: %s", query.str().c_str()); Log.Out(Logs::General, Logs::Database,"Mysql query returned no result: %s", query.str().c_str());
return false; return false;
} }
void DatabaseMySQL::UpdateLSAccountData(unsigned int id, string ip_address) void DatabaseMySQL::UpdateLSAccountData(unsigned int id, string ip_address)
{ {
_eqp
if(!db) if(!db)
{ {
return; return;
@@ -189,12 +193,13 @@ void DatabaseMySQL::UpdateLSAccountData(unsigned int id, string ip_address)
if(mysql_query(db, query.str().c_str()) != 0) if(mysql_query(db, query.str().c_str()) != 0)
{ {
server_log->Log(log_database, "Mysql query failed: %s", query.str().c_str()); Log.Out(Logs::General, Logs::Database,"Mysql query failed: %s", query.str().c_str());
} }
} }
void DatabaseMySQL::UpdateLSAccountInfo(unsigned int id, string name, string password, string email) void DatabaseMySQL::UpdateLSAccountInfo(unsigned int id, string name, string password, string email)
{ {
_eqp
if(!db) if(!db)
{ {
return; return;
@@ -208,12 +213,13 @@ void DatabaseMySQL::UpdateLSAccountInfo(unsigned int id, string name, string pas
if(mysql_query(db, query.str().c_str()) != 0) if(mysql_query(db, query.str().c_str()) != 0)
{ {
server_log->Log(log_database, "Mysql query failed: %s", query.str().c_str()); Log.Out(Logs::General, Logs::Database,"Mysql query failed: %s", query.str().c_str());
} }
} }
void DatabaseMySQL::UpdateWorldRegistration(unsigned int id, string long_name, string ip_address) void DatabaseMySQL::UpdateWorldRegistration(unsigned int id, string long_name, string ip_address)
{ {
_eqp
if(!db) if(!db)
{ {
return; return;
@@ -233,12 +239,13 @@ void DatabaseMySQL::UpdateWorldRegistration(unsigned int id, string long_name, s
if(mysql_query(db, query.str().c_str()) != 0) if(mysql_query(db, query.str().c_str()) != 0)
{ {
server_log->Log(log_database, "Mysql query failed: %s", query.str().c_str()); Log.Out(Logs::General, Logs::Database,"Mysql query failed: %s", query.str().c_str());
} }
} }
bool DatabaseMySQL::CreateWorldRegistration(string long_name, string short_name, unsigned int &id) bool DatabaseMySQL::CreateWorldRegistration(string long_name, string short_name, unsigned int &id)
{ {
_eqp
if(!db) if(!db)
{ {
return false; return false;
@@ -258,7 +265,7 @@ bool DatabaseMySQL::CreateWorldRegistration(string long_name, string short_name,
if(mysql_query(db, query.str().c_str()) != 0) if(mysql_query(db, query.str().c_str()) != 0)
{ {
server_log->Log(log_database, "Mysql query failed: %s", query.str().c_str()); Log.Out(Logs::General, Logs::Database,"Mysql query failed: %s", query.str().c_str());
return false; return false;
} }
@@ -277,13 +284,13 @@ bool DatabaseMySQL::CreateWorldRegistration(string long_name, string short_name,
if(mysql_query(db, query.str().c_str()) != 0) if(mysql_query(db, query.str().c_str()) != 0)
{ {
server_log->Log(log_database, "Mysql query failed: %s", query.str().c_str()); Log.Out(Logs::General, Logs::Database,"Mysql query failed: %s", query.str().c_str());
return false; return false;
} }
return true; return true;
} }
} }
server_log->Log(log_database, "World registration did not exist in the database for %s %s", long_name.c_str(), short_name.c_str()); Log.Out(Logs::General, Logs::Database,"World registration did not exist in the database for %s %s", long_name.c_str(), short_name.c_str());
return false; return false;
} }
+13 -7
View File
@@ -22,24 +22,25 @@
#include "database_postgresql.h" #include "database_postgresql.h"
#include "error_log.h" #include "error_log.h"
#include "login_server.h" #include "login_server.h"
#include "../common/eqemu_logsys.h"
extern ErrorLog *server_log;
extern LoginServer server; extern LoginServer server;
#pragma comment(lib, "libpq.lib") #pragma comment(lib, "libpq.lib")
DatabasePostgreSQL::DatabasePostgreSQL(string user, string pass, string host, string port, string name) DatabasePostgreSQL::DatabasePostgreSQL(string user, string pass, string host, string port, string name)
{ {
_eqp
db = nullptr; db = nullptr;
db = PQsetdbLogin(host.c_str(), port.c_str(), nullptr, nullptr, name.c_str(), user.c_str(), pass.c_str()); db = PQsetdbLogin(host.c_str(), port.c_str(), nullptr, nullptr, name.c_str(), user.c_str(), pass.c_str());
if(!db) if(!db)
{ {
server_log->Log(log_database, "Failed to connect to PostgreSQL Database."); Log.Out(Logs::General, Logs::Database,"Failed to connect to PostgreSQL Database.");
} }
if(PQstatus(db) != CONNECTION_OK) if(PQstatus(db) != CONNECTION_OK)
{ {
server_log->Log(log_database, "Failed to connect to PostgreSQL Database."); Log.Out(Logs::General, Logs::Database,"Failed to connect to PostgreSQL Database.");
PQfinish(db); PQfinish(db);
db = nullptr; db = nullptr;
} }
@@ -47,6 +48,7 @@ DatabasePostgreSQL::DatabasePostgreSQL(string user, string pass, string host, st
DatabasePostgreSQL::~DatabasePostgreSQL() DatabasePostgreSQL::~DatabasePostgreSQL()
{ {
_eqp
if(db) if(db)
{ {
PQfinish(db); PQfinish(db);
@@ -55,6 +57,7 @@ DatabasePostgreSQL::~DatabasePostgreSQL()
bool DatabasePostgreSQL::GetLoginDataFromAccountName(string name, string &password, unsigned int &id) bool DatabasePostgreSQL::GetLoginDataFromAccountName(string name, string &password, unsigned int &id)
{ {
_eqp
if(!db) if(!db)
{ {
return false; return false;
@@ -83,7 +86,7 @@ bool DatabasePostgreSQL::GetLoginDataFromAccountName(string name, string &passwo
char *error = PQresultErrorMessage(res); char *error = PQresultErrorMessage(res);
if(strlen(error) > 0) if(strlen(error) > 0)
{ {
server_log->Log(log_database, "Database error in DatabasePostgreSQL::GetLoginDataFromAccountName(): %s", error); Log.Out(Logs::General, Logs::Database,"Database error in DatabasePostgreSQL::GetLoginDataFromAccountName(): %s", error);
PQclear(res); PQclear(res);
return false; return false;
} }
@@ -103,6 +106,7 @@ bool DatabasePostgreSQL::GetLoginDataFromAccountName(string name, string &passwo
bool DatabasePostgreSQL::GetWorldRegistration(string long_name, string short_name, unsigned int &id, string &desc, unsigned int &list_id, bool DatabasePostgreSQL::GetWorldRegistration(string long_name, string short_name, unsigned int &id, string &desc, unsigned int &list_id,
unsigned int &trusted, string &list_desc, string &account, string &password) unsigned int &trusted, string &list_desc, string &account, string &password)
{ {
_eqp
if(!db) if(!db)
{ {
return false; return false;
@@ -135,7 +139,7 @@ bool DatabasePostgreSQL::GetWorldRegistration(string long_name, string short_nam
char *error = PQresultErrorMessage(res); char *error = PQresultErrorMessage(res);
if(strlen(error) > 0) if(strlen(error) > 0)
{ {
server_log->Log(log_database, "Database error in DatabasePostgreSQL::GetWorldRegistration(): %s", error); Log.Out(Logs::General, Logs::Database,"Database error in DatabasePostgreSQL::GetWorldRegistration(): %s", error);
PQclear(res); PQclear(res);
return false; return false;
} }
@@ -160,6 +164,7 @@ bool DatabasePostgreSQL::GetWorldRegistration(string long_name, string short_nam
void DatabasePostgreSQL::UpdateLSAccountData(unsigned int id, string ip_address) void DatabasePostgreSQL::UpdateLSAccountData(unsigned int id, string ip_address)
{ {
_eqp
if(!db) if(!db)
{ {
return; return;
@@ -188,13 +193,14 @@ void DatabasePostgreSQL::UpdateLSAccountData(unsigned int id, string ip_address)
char *error = PQresultErrorMessage(res); char *error = PQresultErrorMessage(res);
if(strlen(error) > 0) if(strlen(error) > 0)
{ {
server_log->Log(log_database, "Database error in DatabasePostgreSQL::GetLoginDataFromAccountName(): %s", error); Log.Out(Logs::General, Logs::Database,"Database error in DatabasePostgreSQL::GetLoginDataFromAccountName(): %s", error);
} }
PQclear(res); PQclear(res);
} }
void DatabasePostgreSQL::UpdateWorldRegistration(unsigned int id, string long_name, string ip_address) void DatabasePostgreSQL::UpdateWorldRegistration(unsigned int id, string long_name, string ip_address)
{ {
_eqp
if(!db) if(!db)
{ {
return; return;
@@ -225,7 +231,7 @@ void DatabasePostgreSQL::UpdateWorldRegistration(unsigned int id, string long_na
char *error = PQresultErrorMessage(res); char *error = PQresultErrorMessage(res);
if(strlen(error) > 0) if(strlen(error) > 0)
{ {
server_log->Log(log_database, "Database error in DatabasePostgreSQL::GetLoginDataFromAccountName(): %s", error); Log.Out(Logs::General, Logs::Database,"Database error in DatabasePostgreSQL::GetLoginDataFromAccountName(): %s", error);
} }
PQclear(res); PQclear(res);
} }
+13 -7
View File
@@ -16,17 +16,16 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#include "../common/global_define.h" #include "../common/global_define.h"
#include "../common/eqemu_logsys.h"
#include "encryption.h" #include "encryption.h"
#include "error_log.h"
#include <string> #include <string>
extern ErrorLog *server_log;
bool Encryption::LoadCrypto(std::string name) bool Encryption::LoadCrypto(std::string name)
{ {
_eqp
if(!Load(name.c_str())) if(!Load(name.c_str()))
{ {
server_log->Log(log_error, "Failed to load %s from the operating system.", name.c_str()); Log.Out(Logs::Detail, Logs::Error, "Failed to load %s from the operating system.", name.c_str());
return false; return false;
} }
else else
@@ -34,21 +33,21 @@ bool Encryption::LoadCrypto(std::string name)
encrypt_func = (DLLFUNC_Encrypt)GetSym("Encrypt"); encrypt_func = (DLLFUNC_Encrypt)GetSym("Encrypt");
if(encrypt_func == NULL) if(encrypt_func == NULL)
{ {
server_log->Log(log_error, "Failed to attach Encrypt."); Log.Out(Logs::Detail, Logs::Error, "Failed to attach Encrypt.");
Unload(); Unload();
return false; return false;
} }
decrypt_func = (DLLFUNC_DecryptUsernamePassword)GetSym("DecryptUsernamePassword"); decrypt_func = (DLLFUNC_DecryptUsernamePassword)GetSym("DecryptUsernamePassword");
if(decrypt_func == NULL) if(decrypt_func == NULL)
{ {
server_log->Log(log_error, "Failed to attach DecryptUsernamePassword."); Log.Out(Logs::Detail, Logs::Error, "Failed to attach DecryptUsernamePassword.");
Unload(); Unload();
return false; return false;
} }
delete_func = (DLLFUNC_HeapDelete)GetSym("_HeapDeleteCharBuffer"); delete_func = (DLLFUNC_HeapDelete)GetSym("_HeapDeleteCharBuffer");
if(delete_func == NULL) if(delete_func == NULL)
{ {
server_log->Log(log_error, "Failed to attach _HeapDeleteCharBuffer."); Log.Out(Logs::Detail, Logs::Error, "Failed to attach _HeapDeleteCharBuffer.");
Unload(); Unload();
return false; return false;
} }
@@ -58,6 +57,7 @@ bool Encryption::LoadCrypto(std::string name)
char *Encryption::DecryptUsernamePassword(const char* encrypted_buffer, unsigned int buffer_size, int mode) char *Encryption::DecryptUsernamePassword(const char* encrypted_buffer, unsigned int buffer_size, int mode)
{ {
_eqp
if(decrypt_func) if(decrypt_func)
{ {
return decrypt_func(encrypted_buffer, buffer_size, mode); return decrypt_func(encrypted_buffer, buffer_size, mode);
@@ -67,6 +67,7 @@ char *Encryption::DecryptUsernamePassword(const char* encrypted_buffer, unsigned
char *Encryption::Encrypt(const char* buffer, unsigned int buffer_size, unsigned int &out_size) char *Encryption::Encrypt(const char* buffer, unsigned int buffer_size, unsigned int &out_size)
{ {
_eqp
if(encrypt_func) if(encrypt_func)
{ {
return encrypt_func(buffer, buffer_size, out_size); return encrypt_func(buffer, buffer_size, out_size);
@@ -76,6 +77,7 @@ char *Encryption::Encrypt(const char* buffer, unsigned int buffer_size, unsigned
void Encryption::DeleteHeap(char *buffer) void Encryption::DeleteHeap(char *buffer)
{ {
_eqp
if(delete_func) if(delete_func)
{ {
delete_func(buffer); delete_func(buffer);
@@ -84,6 +86,7 @@ void Encryption::DeleteHeap(char *buffer)
bool Encryption::Load(const char *name) bool Encryption::Load(const char *name)
{ {
_eqp
SetLastError(0); SetLastError(0);
#ifdef UNICODE #ifdef UNICODE
int name_length = strlen(name); int name_length = strlen(name);
@@ -111,6 +114,7 @@ bool Encryption::Load(const char *name)
void Encryption::Unload() void Encryption::Unload()
{ {
_eqp
if(h_dll) if(h_dll)
{ {
FreeLibrary(h_dll); FreeLibrary(h_dll);
@@ -120,6 +124,7 @@ void Encryption::Unload()
bool Encryption::GetSym(const char *name, void **sym) bool Encryption::GetSym(const char *name, void **sym)
{ {
_eqp
if(Loaded()) if(Loaded())
{ {
*sym = GetProcAddress(h_dll, name); *sym = GetProcAddress(h_dll, name);
@@ -133,6 +138,7 @@ bool Encryption::GetSym(const char *name, void **sym)
void *Encryption::GetSym(const char *name) void *Encryption::GetSym(const char *name)
{ {
_eqp
if(Loaded()) if(Loaded())
{ {
return GetProcAddress(h_dll, name); return GetProcAddress(h_dll, name);
-210
View File
@@ -1,210 +0,0 @@
/* EQEMu: Everquest Server Emulator
Copyright (C) 2001-2010 EQEMu Development Team (http://eqemulator.net)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY except by those people which sell it, which
are required to give you total support for your newly bought product;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <string.h>
#include "error_log.h"
const char *eqLogTypes[_log_largest_type] =
{
"Debug",
"Error",
"Database",
"Network",
"Network Trace",
"Network Error",
"World",
"World Error",
"Client",
"Client Error"
};
ErrorLog::ErrorLog(const char* file_name)
{
log_mutex = new Mutex();
error_log = fopen(file_name, "w");
}
ErrorLog::~ErrorLog()
{
log_mutex->lock();
if(error_log)
{
fclose(error_log);
}
log_mutex->unlock();
delete log_mutex;
}
void ErrorLog::Log(eqLogType type, const char *message, ...)
{
if(type >= _log_largest_type)
{
return;
}
va_list argptr;
char *buffer = new char[4096];
va_start(argptr, message);
vsnprintf(buffer, 4096, message, argptr);
va_end(argptr);
time_t m_clock;
struct tm *m_time;
time(&m_clock);
m_time = localtime(&m_clock);
log_mutex->lock();
printf("[%s] [%02d.%02d.%02d - %02d:%02d:%02d] %s\n",
eqLogTypes[type],
m_time->tm_mon+1,
m_time->tm_mday,
m_time->tm_year%100,
m_time->tm_hour,
m_time->tm_min,
m_time->tm_sec,
buffer);
if(error_log)
{
fprintf(error_log, "[%s] [%02d.%02d.%02d - %02d:%02d:%02d] %s\n",
eqLogTypes[type],
m_time->tm_mon+1,
m_time->tm_mday,
m_time->tm_year%100,
m_time->tm_hour,
m_time->tm_min,
m_time->tm_sec,
buffer);
fflush(error_log);
}
log_mutex->unlock();
delete[] buffer;
}
void ErrorLog::LogPacket(eqLogType type, const char *data, size_t size)
{
if(type >= _log_largest_type)
{
return;
}
log_mutex->lock();
time_t m_clock;
struct tm *m_time;
time(&m_clock);
m_time = localtime(&m_clock);
log_mutex->lock();
printf("[%s] [%02d.%02d.%02d - %02d:%02d:%02d] dumping packet of size %u:\n",
eqLogTypes[type],
m_time->tm_mon+1,
m_time->tm_mday,
m_time->tm_year%100,
m_time->tm_hour,
m_time->tm_min,
m_time->tm_sec,
(unsigned int)size);
if(error_log)
{
fprintf(error_log, "[%s] [%02d.%02d.%02d - %02d:%02d:%02d] dumping packet of size %u\n",
eqLogTypes[type],
m_time->tm_mon+1,
m_time->tm_mday,
m_time->tm_year%100,
m_time->tm_hour,
m_time->tm_min,
m_time->tm_sec,
(unsigned int)size);
}
char ascii[17]; //16 columns + 1 null term
memset(ascii, 0, 17);
size_t j = 0;
size_t i = 0;
for(; i < size; ++i)
{
if(i % 16 == 0)
{
if(i != 0)
{
printf(" | %s\n", ascii);
if(error_log)
{
fprintf(error_log, " | %s\n", ascii);
}
}
printf("%.4u: ", (unsigned int)i);
memset(ascii, 0, 17);
j = 0;
}
else if(i % 8 == 0)
{
printf("- ");
if(error_log)
{
fprintf(error_log, "- ");
}
}
printf("%02X ", (unsigned int)data[i]);
if(error_log)
{
fprintf(error_log, "%02X ", (unsigned int)data[i]);
}
if(data[i] >= 32 && data[i] < 127)
{
ascii[j++] = data[i];
}
else
{
ascii[j++] = '.';
}
}
size_t k = (i - 1) % 16;
if(k < 8)
{
printf(" ");
if(error_log)
{
fprintf(error_log, " ");
}
}
for(size_t h = k + 1; h < 16; ++h)
{
printf(" ");
if(error_log)
{
fprintf(error_log, " ");
}
}
printf(" | %s\n", ascii);
if(error_log)
{
fprintf(error_log, " | %s\n", ascii);
fflush(error_log);
}
log_mutex->unlock();
}
-79
View File
@@ -1,79 +0,0 @@
/* EQEMu: Everquest Server Emulator
Copyright (C) 2001-2010 EQEMu Development Team (http://eqemulator.net)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY except by those people which sell it, which
are required to give you total support for your newly bought product;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef EQEMU_ERROR_LOG_H
#define EQEMU_ERROR_LOG_H
#include <stdio.h>
#include <stdarg.h>
#include <time.h>
#include <string>
#include "../common/mutex.h"
/**
* Dictates the log type specified in ErrorLog for Log(...)
*/
enum eqLogType
{
log_debug,
log_error,
log_database,
log_network,
log_network_trace,
log_network_error,
log_world,
log_world_error,
log_client,
log_client_error,
_log_largest_type
};
/**
* Basic error logging class.
* Thread safe logging class that records time and date to both a file and to console(if exists).
*/
class ErrorLog
{
public:
/**
* Constructor: opens the log file for writing and creates our mutex for writing to the log.
*/
ErrorLog(const char* file_name);
/**
* Closes the file and destroys the mutex.
*/
~ErrorLog();
/**
* Writes to the log system a variable message.
*/
void Log(eqLogType type, const char *message, ...);
/**
* Writes to the log system a packet.
*/
void LogPacket(eqLogType type, const char *data, size_t size);
protected:
Mutex *log_mutex;
FILE* error_log;
};
#endif
-1
View File
@@ -18,7 +18,6 @@
#ifndef EQEMU_LOGINSERVER_H #ifndef EQEMU_LOGINSERVER_H
#define EQEMU_LOGINSERVER_H #define EQEMU_LOGINSERVER_H
#include "error_log.h"
#include "config.h" #include "config.h"
#include "database.h" #include "database.h"
#include "database_mysql.h" #include "database_mysql.h"
+62 -50
View File
@@ -26,38 +26,60 @@
#include "login_server.h" #include "login_server.h"
#include <time.h> #include <time.h>
#include <stdlib.h> #include <stdlib.h>
#include <signal.h>
#include <string> #include <string>
#include <sstream> #include <sstream>
#include <fstream>
TimeoutManager timeout_manager; TimeoutManager timeout_manager;
LoginServer server; LoginServer server;
EQEmuLogSys Log; EQEmuLogSys Log;
ErrorLog *server_log;
bool run_server = true; bool run_server = true;
void CatchSignal(int sig_num) void CatchSignal(int sig_num)
{ {
_eqp_dump_file("loginserver");
} }
int main() int main()
{ {
RegisterExecutablePlatform(ExePlatformLogin); RegisterExecutablePlatform(ExePlatformLogin);
set_exception_handler(); set_exception_handler();
_eqp
//Create our error log, is of format login_<number>.log Log.LoadLogSettingsDefaults();
time_t current_time = time(nullptr);
std::stringstream log_name(std::stringstream::in | std::stringstream::out); //log_settings
#ifdef WIN32 Log.log_settings[Logs::LogCategory::Crash].log_to_file = true;
log_name << ".\\logs\\login_" << (unsigned int)current_time << ".log"; Log.log_settings[Logs::LogCategory::Error].log_to_console = true;
#else Log.log_settings[Logs::LogCategory::Error].log_to_file = true;
log_name << "./logs/login_" << (unsigned int)current_time << ".log"; Log.log_settings[Logs::LogCategory::Debug].log_to_console = true;
#endif Log.log_settings[Logs::LogCategory::Debug].log_to_file = true;
server_log = new ErrorLog(log_name.str().c_str()); Log.log_settings[Logs::LogCategory::Database].log_to_console = true;
server_log->Log(log_debug, "Logging System Init."); Log.log_settings[Logs::LogCategory::Database].log_to_file = true;
Log.log_settings[Logs::LogCategory::World_Server].log_to_console = true;
Log.log_settings[Logs::LogCategory::World_Server].log_to_file = true;
Log.log_settings[Logs::LogCategory::Netcode].log_to_console = true;
Log.log_settings[Logs::LogCategory::Netcode].log_to_file = true;
Log.file_logs_enabled = true;
Log.StartFileLogs();
if(signal(SIGINT, CatchSignal) == SIG_ERR) {
Log.Out(Logs::Detail, Logs::Error, "Could not set signal handler");
return 1;
}
if(signal(SIGTERM, CatchSignal) == SIG_ERR) {
Log.Out(Logs::Detail, Logs::Error, "Could not set signal handler");
return 1;
}
if(signal(SIGBREAK, CatchSignal) == SIG_ERR) {
Log.Out(Logs::Detail, Logs::Error, "Could not set signal handler");
return 1;
}
//Create our subsystem and parse the ini file. //Create our subsystem and parse the ini file.
server.config = new Config(); server.config = new Config();
server_log->Log(log_debug, "Config System Init."); Log.Out(Logs::General, Logs::Debug, "Config System Init.");
server.config->Parse("login.ini"); server.config->Parse("login.ini");
//Parse unregistered allowed option. //Parse unregistered allowed option.
@@ -142,7 +164,7 @@ int main()
if(server.config->GetVariable("database", "subsystem").compare("MySQL") == 0) if(server.config->GetVariable("database", "subsystem").compare("MySQL") == 0)
{ {
#ifdef EQEMU_MYSQL_ENABLED #ifdef EQEMU_MYSQL_ENABLED
server_log->Log(log_debug, "MySQL Database Init."); Log.Out(Logs::General, Logs::Debug, "MySQL Database Init.");
server.db = (Database*)new DatabaseMySQL( server.db = (Database*)new DatabaseMySQL(
server.config->GetVariable("database", "user"), server.config->GetVariable("database", "user"),
server.config->GetVariable("database", "password"), server.config->GetVariable("database", "password"),
@@ -154,7 +176,7 @@ int main()
else if(server.config->GetVariable("database", "subsystem").compare("PostgreSQL") == 0) else if(server.config->GetVariable("database", "subsystem").compare("PostgreSQL") == 0)
{ {
#ifdef EQEMU_POSTGRESQL_ENABLED #ifdef EQEMU_POSTGRESQL_ENABLED
server_log->Log(log_debug, "PostgreSQL Database Init."); Log.Out(Logs::General, Logs::Debug, "PostgreSQL Database Init.");
server.db = (Database*)new DatabasePostgreSQL( server.db = (Database*)new DatabasePostgreSQL(
server.config->GetVariable("database", "user"), server.config->GetVariable("database", "user"),
server.config->GetVariable("database", "password"), server.config->GetVariable("database", "password"),
@@ -167,75 +189,67 @@ int main()
//Make sure our database got created okay, otherwise cleanup and exit. //Make sure our database got created okay, otherwise cleanup and exit.
if(!server.db) if(!server.db)
{ {
server_log->Log(log_error, "Database Initialization Failure."); Log.Out(Logs::Detail, Logs::Error, "Database Initialization Failure.");
server_log->Log(log_debug, "Config System Shutdown."); Log.Out(Logs::General, Logs::Debug, "Config System Shutdown.");
delete server.config; delete server.config;
server_log->Log(log_debug, "Log System Shutdown.");
delete server_log;
return 1; return 1;
} }
#if WIN32 #if WIN32
//initialize our encryption. //initialize our encryption.
server_log->Log(log_debug, "Encryption Initialize."); Log.Out(Logs::General, Logs::Debug, "Encryption Initialize.");
server.eq_crypto = new Encryption(); server.eq_crypto = new Encryption();
if(server.eq_crypto->LoadCrypto(server.config->GetVariable("security", "plugin"))) if(server.eq_crypto->LoadCrypto(server.config->GetVariable("security", "plugin")))
{ {
server_log->Log(log_debug, "Encryption Loaded Successfully."); Log.Out(Logs::General, Logs::Debug, "Encryption Loaded Successfully.");
} }
else else
{ {
//We can't run without encryption, cleanup and exit. //We can't run without encryption, cleanup and exit.
server_log->Log(log_error, "Encryption Failed to Load."); Log.Out(Logs::Detail, Logs::Error, "Encryption Failed to Load.");
server_log->Log(log_debug, "Database System Shutdown."); Log.Out(Logs::General, Logs::Debug, "Database System Shutdown.");
delete server.db; delete server.db;
server_log->Log(log_debug, "Config System Shutdown."); Log.Out(Logs::General, Logs::Debug, "Config System Shutdown.");
delete server.config; delete server.config;
server_log->Log(log_debug, "Log System Shutdown.");
delete server_log;
return 1; return 1;
} }
#endif #endif
//create our server manager. //create our server manager.
server_log->Log(log_debug, "Server Manager Initialize."); Log.Out(Logs::General, Logs::Debug, "Server Manager Initialize.");
server.SM = new ServerManager(); server.SM = new ServerManager();
if(!server.SM) if(!server.SM)
{ {
//We can't run without a server manager, cleanup and exit. //We can't run without a server manager, cleanup and exit.
server_log->Log(log_error, "Server Manager Failed to Start."); Log.Out(Logs::Detail, Logs::Error, "Server Manager Failed to Start.");
#ifdef WIN32 #ifdef WIN32
server_log->Log(log_debug, "Encryption System Shutdown."); Log.Out(Logs::General, Logs::Debug, "Encryption System Shutdown.");
delete server.eq_crypto; delete server.eq_crypto;
#endif #endif
server_log->Log(log_debug, "Database System Shutdown."); Log.Out(Logs::General, Logs::Debug, "Database System Shutdown.");
delete server.db; delete server.db;
server_log->Log(log_debug, "Config System Shutdown."); Log.Out(Logs::General, Logs::Debug, "Config System Shutdown.");
delete server.config; delete server.config;
server_log->Log(log_debug, "Log System Shutdown.");
delete server_log;
return 1; return 1;
} }
//create our client manager. //create our client manager.
server_log->Log(log_debug, "Client Manager Initialize."); Log.Out(Logs::General, Logs::Debug, "Client Manager Initialize.");
server.CM = new ClientManager(); server.CM = new ClientManager();
if(!server.CM) if(!server.CM)
{ {
//We can't run without a client manager, cleanup and exit. //We can't run without a client manager, cleanup and exit.
server_log->Log(log_error, "Client Manager Failed to Start."); Log.Out(Logs::Detail, Logs::Error, "Client Manager Failed to Start.");
server_log->Log(log_debug, "Server Manager Shutdown."); Log.Out(Logs::General, Logs::Debug, "Server Manager Shutdown.");
delete server.SM; delete server.SM;
#ifdef WIN32 #ifdef WIN32
server_log->Log(log_debug, "Encryption System Shutdown."); Log.Out(Logs::General, Logs::Debug, "Encryption System Shutdown.");
delete server.eq_crypto; delete server.eq_crypto;
#endif #endif
server_log->Log(log_debug, "Database System Shutdown."); Log.Out(Logs::General, Logs::Debug, "Database System Shutdown.");
delete server.db; delete server.db;
server_log->Log(log_debug, "Config System Shutdown."); Log.Out(Logs::General, Logs::Debug, "Config System Shutdown.");
delete server.config; delete server.config;
server_log->Log(log_debug, "Log System Shutdown.");
delete server_log;
return 1; return 1;
} }
@@ -247,30 +261,28 @@ int main()
#endif #endif
#endif #endif
server_log->Log(log_debug, "Server Started."); Log.Out(Logs::General, Logs::Debug, "Server Started.");
while(run_server) while(run_server)
{ {
Timer::SetCurrentTime(); Timer::SetCurrentTime();
server.CM->Process(); server.CM->Process();
server.SM->Process(); server.SM->Process();
Sleep(100); Sleep(50);
} }
server_log->Log(log_debug, "Server Shutdown."); Log.Out(Logs::General, Logs::Debug, "Server Shutdown.");
server_log->Log(log_debug, "Client Manager Shutdown."); Log.Out(Logs::General, Logs::Debug, "Client Manager Shutdown.");
delete server.CM; delete server.CM;
server_log->Log(log_debug, "Server Manager Shutdown."); Log.Out(Logs::General, Logs::Debug, "Server Manager Shutdown.");
delete server.SM; delete server.SM;
#ifdef WIN32 #ifdef WIN32
server_log->Log(log_debug, "Encryption System Shutdown."); Log.Out(Logs::General, Logs::Debug, "Encryption System Shutdown.");
delete server.eq_crypto; delete server.eq_crypto;
#endif #endif
server_log->Log(log_debug, "Database System Shutdown."); Log.Out(Logs::General, Logs::Debug, "Database System Shutdown.");
delete server.db; delete server.db;
server_log->Log(log_debug, "Config System Shutdown."); Log.Out(Logs::General, Logs::Debug, "Config System Shutdown.");
delete server.config; delete server.config;
server_log->Log(log_debug, "Log System Shutdown.");
delete server_log;
return 0; return 0;
} }
+17 -9
View File
@@ -17,33 +17,34 @@
*/ */
#include "server_manager.h" #include "server_manager.h"
#include "login_server.h" #include "login_server.h"
#include "error_log.h"
#include "login_structures.h" #include "login_structures.h"
#include "../common/eqemu_logsys.h"
#include <stdlib.h> #include <stdlib.h>
extern ErrorLog *server_log;
extern LoginServer server; extern LoginServer server;
extern bool run_server; extern bool run_server;
ServerManager::ServerManager() ServerManager::ServerManager()
{ {
_eqp
char error_buffer[TCPConnection_ErrorBufferSize]; char error_buffer[TCPConnection_ErrorBufferSize];
int listen_port = atoi(server.config->GetVariable("options", "listen_port").c_str()); int listen_port = atoi(server.config->GetVariable("options", "listen_port").c_str());
tcps = new EmuTCPServer(listen_port, true); tcps = new EmuTCPServer(listen_port, true);
if(tcps->Open(listen_port, error_buffer)) if(tcps->Open(listen_port, error_buffer))
{ {
server_log->Log(log_network, "ServerManager listening on port %u", listen_port); Log.Out(Logs::General, Logs::Netcode, "ServerManager listening on port %u", listen_port);
} }
else else
{ {
server_log->Log(log_error, "ServerManager fatal error opening port on %u: %s", listen_port, error_buffer); Log.Out(Logs::Detail, Logs::Error, "ServerManager fatal error opening port on %u: %s", listen_port, error_buffer);
run_server = false; run_server = false;
} }
} }
ServerManager::~ServerManager() ServerManager::~ServerManager()
{ {
_eqp
if(tcps) if(tcps)
{ {
tcps->Close(); tcps->Close();
@@ -53,18 +54,19 @@ ServerManager::~ServerManager()
void ServerManager::Process() void ServerManager::Process()
{ {
_eqp
ProcessDisconnect(); ProcessDisconnect();
EmuTCPConnection *tcp_c = nullptr; EmuTCPConnection *tcp_c = nullptr;
while(tcp_c = tcps->NewQueuePop()) while(tcp_c = tcps->NewQueuePop())
{ {
in_addr tmp; in_addr tmp;
tmp.s_addr = tcp_c->GetrIP(); tmp.s_addr = tcp_c->GetrIP();
server_log->Log(log_network, "New world server connection from %s:%d", inet_ntoa(tmp), tcp_c->GetrPort()); Log.Out(Logs::General, Logs::Netcode, "New world server connection from %s:%d", inet_ntoa(tmp), tcp_c->GetrPort());
WorldServer *cur = GetServerByAddress(tcp_c->GetrIP()); WorldServer *cur = GetServerByAddress(tcp_c->GetrIP());
if(cur) if(cur)
{ {
server_log->Log(log_network, "World server already existed for %s, removing existing connection and updating current.", inet_ntoa(tmp)); Log.Out(Logs::General, Logs::Netcode, "World server already existed for %s, removing existing connection and updating current.", inet_ntoa(tmp));
cur->GetConnection()->Free(); cur->GetConnection()->Free();
cur->SetConnection(tcp_c); cur->SetConnection(tcp_c);
cur->Reset(); cur->Reset();
@@ -81,7 +83,7 @@ void ServerManager::Process()
{ {
if((*iter)->Process() == false) if((*iter)->Process() == false)
{ {
server_log->Log(log_world, "World server %s had a fatal error and had to be removed from the login.", (*iter)->GetLongName().c_str()); Log.Out(Logs::General, Logs::World_Server, "World server %s had a fatal error and had to be removed from the login.", (*iter)->GetLongName().c_str());
delete (*iter); delete (*iter);
iter = world_servers.erase(iter); iter = world_servers.erase(iter);
} }
@@ -94,6 +96,7 @@ void ServerManager::Process()
void ServerManager::ProcessDisconnect() void ServerManager::ProcessDisconnect()
{ {
_eqp
list<WorldServer*>::iterator iter = world_servers.begin(); list<WorldServer*>::iterator iter = world_servers.begin();
while(iter != world_servers.end()) while(iter != world_servers.end())
{ {
@@ -102,7 +105,7 @@ void ServerManager::ProcessDisconnect()
{ {
in_addr tmp; in_addr tmp;
tmp.s_addr = c->GetrIP(); tmp.s_addr = c->GetrIP();
server_log->Log(log_network, "World server disconnected from the server, removing server and freeing connection."); Log.Out(Logs::General, Logs::Netcode, "World server disconnected from the server, removing server and freeing connection.");
c->Free(); c->Free();
delete (*iter); delete (*iter);
iter = world_servers.erase(iter); iter = world_servers.erase(iter);
@@ -116,6 +119,7 @@ void ServerManager::ProcessDisconnect()
WorldServer* ServerManager::GetServerByAddress(unsigned int address) WorldServer* ServerManager::GetServerByAddress(unsigned int address)
{ {
_eqp
list<WorldServer*>::iterator iter = world_servers.begin(); list<WorldServer*>::iterator iter = world_servers.begin();
while(iter != world_servers.end()) while(iter != world_servers.end())
{ {
@@ -131,6 +135,7 @@ WorldServer* ServerManager::GetServerByAddress(unsigned int address)
EQApplicationPacket *ServerManager::CreateServerListPacket(Client *c) EQApplicationPacket *ServerManager::CreateServerListPacket(Client *c)
{ {
_eqp
unsigned int packet_size = sizeof(ServerListHeader_Struct); unsigned int packet_size = sizeof(ServerListHeader_Struct);
unsigned int server_count = 0; unsigned int server_count = 0;
in_addr in; in_addr in;
@@ -268,6 +273,7 @@ EQApplicationPacket *ServerManager::CreateServerListPacket(Client *c)
void ServerManager::SendUserToWorldRequest(unsigned int server_id, unsigned int client_account_id) void ServerManager::SendUserToWorldRequest(unsigned int server_id, unsigned int client_account_id)
{ {
_eqp
list<WorldServer*>::iterator iter = world_servers.begin(); list<WorldServer*>::iterator iter = world_servers.begin();
bool found = false; bool found = false;
while(iter != world_servers.end()) while(iter != world_servers.end())
@@ -292,12 +298,13 @@ void ServerManager::SendUserToWorldRequest(unsigned int server_id, unsigned int
if(!found && server.options.IsTraceOn()) if(!found && server.options.IsTraceOn())
{ {
server_log->Log(log_client_error, "Client requested a user to world but supplied an invalid id of %u.", server_id); Log.Out(Logs::General, Logs::Error, "Client requested a user to world but supplied an invalid id of %u.", server_id);
} }
} }
bool ServerManager::ServerExists(string l_name, string s_name, WorldServer *ignore) bool ServerManager::ServerExists(string l_name, string s_name, WorldServer *ignore)
{ {
_eqp
list<WorldServer*>::iterator iter = world_servers.begin(); list<WorldServer*>::iterator iter = world_servers.begin();
while(iter != world_servers.end()) while(iter != world_servers.end())
{ {
@@ -319,6 +326,7 @@ bool ServerManager::ServerExists(string l_name, string s_name, WorldServer *igno
void ServerManager::DestroyServerByName(string l_name, string s_name, WorldServer *ignore) void ServerManager::DestroyServerByName(string l_name, string s_name, WorldServer *ignore)
{ {
_eqp
list<WorldServer*>::iterator iter = world_servers.begin(); list<WorldServer*>::iterator iter = world_servers.begin();
while(iter != world_servers.end()) while(iter != world_servers.end())
{ {
+51 -45
View File
@@ -16,15 +16,15 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#include "world_server.h" #include "world_server.h"
#include "error_log.h"
#include "login_server.h" #include "login_server.h"
#include "login_structures.h" #include "login_structures.h"
#include "../common/eqemu_logsys.h"
extern ErrorLog *server_log;
extern LoginServer server; extern LoginServer server;
WorldServer::WorldServer(EmuTCPConnection *c) WorldServer::WorldServer(EmuTCPConnection *c)
{ {
_eqp
connection = c; connection = c;
zones_booted = 0; zones_booted = 0;
players_online = 0; players_online = 0;
@@ -39,6 +39,7 @@ WorldServer::WorldServer(EmuTCPConnection *c)
WorldServer::~WorldServer() WorldServer::~WorldServer()
{ {
_eqp
if(connection) if(connection)
{ {
connection->Free(); connection->Free();
@@ -47,6 +48,7 @@ WorldServer::~WorldServer()
void WorldServer::Reset() void WorldServer::Reset()
{ {
_eqp
zones_booted = 0; zones_booted = 0;
players_online = 0; players_online = 0;
status = 0; status = 0;
@@ -59,12 +61,13 @@ void WorldServer::Reset()
bool WorldServer::Process() bool WorldServer::Process()
{ {
_eqp
ServerPacket *app = nullptr; ServerPacket *app = nullptr;
while(app = connection->PopPacket()) while(app = connection->PopPacket())
{ {
if(server.options.IsWorldTraceOn()) if(server.options.IsWorldTraceOn())
{ {
server_log->Log(log_network_trace, "Application packet received from server: 0x%.4X, (size %u)", app->opcode, app->size); Log.Out(Logs::Detail, Logs::Netcode, "Application packet received from server: 0x%.4X, (size %u)", app->opcode, app->size);
} }
if(server.options.IsDumpInPacketsOn()) if(server.options.IsDumpInPacketsOn())
@@ -78,14 +81,14 @@ bool WorldServer::Process()
{ {
if(app->size < sizeof(ServerNewLSInfo_Struct)) if(app->size < sizeof(ServerNewLSInfo_Struct))
{ {
server_log->Log(log_network_error, "Received application packet from server that had opcode ServerOP_NewLSInfo, " Log.Out(Logs::General, Logs::Netcode, "Received application packet from server that had opcode ServerOP_NewLSInfo, "
"but was too small. Discarded to avoid buffer overrun."); "but was too small. Discarded to avoid buffer overrun.");
break; break;
} }
if(server.options.IsWorldTraceOn()) if(server.options.IsWorldTraceOn())
{ {
server_log->Log(log_network_trace, "New Login Info Recieved."); Log.Out(Logs::Detail, Logs::Netcode, "New Login Info Recieved.");
} }
ServerNewLSInfo_Struct *info = (ServerNewLSInfo_Struct*)app->pBuffer; ServerNewLSInfo_Struct *info = (ServerNewLSInfo_Struct*)app->pBuffer;
@@ -96,14 +99,14 @@ bool WorldServer::Process()
{ {
if(app->size < sizeof(ServerLSStatus_Struct)) if(app->size < sizeof(ServerLSStatus_Struct))
{ {
server_log->Log(log_network_error, "Recieved application packet from server that had opcode ServerOP_LSStatus, " Log.Out(Logs::General, Logs::Netcode, "Recieved application packet from server that had opcode ServerOP_LSStatus, "
"but was too small. Discarded to avoid buffer overrun."); "but was too small. Discarded to avoid buffer overrun.");
break; break;
} }
if(server.options.IsWorldTraceOn()) if(server.options.IsWorldTraceOn())
{ {
server_log->Log(log_network_trace, "World Server Status Recieved."); Log.Out(Logs::Detail, Logs::Netcode, "World Server Status Recieved.");
} }
ServerLSStatus_Struct *ls_status = (ServerLSStatus_Struct*)app->pBuffer; ServerLSStatus_Struct *ls_status = (ServerLSStatus_Struct*)app->pBuffer;
@@ -127,7 +130,7 @@ bool WorldServer::Process()
{ {
if(app->size < sizeof(UsertoWorldResponse_Struct)) if(app->size < sizeof(UsertoWorldResponse_Struct))
{ {
server_log->Log(log_network_error, "Recieved application packet from server that had opcode ServerOP_UsertoWorldResp, " Log.Out(Logs::General, Logs::Netcode, "Recieved application packet from server that had opcode ServerOP_UsertoWorldResp, "
"but was too small. Discarded to avoid buffer overrun."); "but was too small. Discarded to avoid buffer overrun.");
break; break;
} }
@@ -137,21 +140,21 @@ bool WorldServer::Process()
//While keeping world server spam with multiple servers connected almost impossible. //While keeping world server spam with multiple servers connected almost impossible.
if(server.options.IsTraceOn()) if(server.options.IsTraceOn())
{ {
server_log->Log(log_network_trace, "User-To-World Response received."); Log.Out(Logs::Detail, Logs::Netcode, "User-To-World Response received.");
} }
UsertoWorldResponse_Struct *utwr = (UsertoWorldResponse_Struct*)app->pBuffer; UsertoWorldResponse_Struct *utwr = (UsertoWorldResponse_Struct*)app->pBuffer;
server_log->Log(log_client, "Trying to find client with user id of %u.", utwr->lsaccountid); Log.Out(Logs::General, Logs::LoginServer, "Trying to find client with user id of %u.", utwr->lsaccountid);
Client *c = server.CM->GetClient(utwr->lsaccountid); Client *c = server.CM->GetClient(utwr->lsaccountid);
if(c) if(c)
{ {
server_log->Log(log_client, "Found client with user id of %u and account name of %s.", utwr->lsaccountid, c->GetAccountName().c_str()); Log.Out(Logs::General, Logs::LoginServer, "Found client with user id of %u and account name of %s.", utwr->lsaccountid, c->GetAccountName().c_str());
EQApplicationPacket *outapp = new EQApplicationPacket(OP_PlayEverquestResponse, sizeof(PlayEverquestResponse_Struct)); EQApplicationPacket *outapp = new EQApplicationPacket(OP_PlayEverquestResponse, sizeof(PlayEverquestResponse_Struct));
PlayEverquestResponse_Struct *per = (PlayEverquestResponse_Struct*)outapp->pBuffer; PlayEverquestResponse_Struct *per = (PlayEverquestResponse_Struct*)outapp->pBuffer;
per->Sequence = c->GetPlaySequence(); per->Sequence = c->GetPlaySequence();
per->ServerNumber = c->GetPlayServerID(); per->ServerNumber = c->GetPlayServerID();
server_log->Log(log_client, "Found sequence and play of %u %u", c->GetPlaySequence(), c->GetPlayServerID()); Log.Out(Logs::General, Logs::LoginServer, "Found sequence and play of %u %u", c->GetPlaySequence(), c->GetPlayServerID());
server_log->LogPacket(log_network_trace, (const char*)outapp->pBuffer, outapp->size); //server_log->LogPacket(log_network_trace, (const char*)outapp->pBuffer, outapp->size);
if(utwr->response > 0) if(utwr->response > 0)
{ {
@@ -180,9 +183,9 @@ bool WorldServer::Process()
if(server.options.IsTraceOn()) if(server.options.IsTraceOn())
{ {
server_log->Log(log_network_trace, "Sending play response with following data, allowed %u, sequence %u, server number %u, message %u", Log.Out(Logs::Detail, Logs::Netcode, "Sending play response with following data, allowed %u, sequence %u, server number %u, message %u",
per->Allowed, per->Sequence, per->ServerNumber, per->Message); per->Allowed, per->Sequence, per->ServerNumber, per->Message);
server_log->LogPacket(log_network_trace, (const char*)outapp->pBuffer, outapp->size); //server_log->LogPacket(log_network_trace, (const char*)outapp->pBuffer, outapp->size);
} }
if(server.options.IsDumpOutPacketsOn()) if(server.options.IsDumpOutPacketsOn())
@@ -195,7 +198,7 @@ bool WorldServer::Process()
} }
else else
{ {
server_log->Log(log_client_error, "Recieved User-To-World Response for %u but could not find the client referenced!.", utwr->lsaccountid); Log.Out(Logs::General, Logs::Error, "Recieved User-To-World Response for %u but could not find the client referenced!.", utwr->lsaccountid);
} }
break; break;
} }
@@ -203,16 +206,16 @@ bool WorldServer::Process()
{ {
if(app->size < sizeof(ServerLSAccountUpdate_Struct)) if(app->size < sizeof(ServerLSAccountUpdate_Struct))
{ {
server_log->Log(log_network_error, "Recieved application packet from server that had opcode ServerLSAccountUpdate_Struct, " Log.Out(Logs::General, Logs::Netcode, "Recieved application packet from server that had opcode ServerLSAccountUpdate_Struct, "
"but was too small. Discarded to avoid buffer overrun."); "but was too small. Discarded to avoid buffer overrun.");
break; break;
} }
server_log->Log(log_network_trace, "ServerOP_LSAccountUpdate packet received from: %s", short_name.c_str()); Log.Out(Logs::Detail, Logs::Netcode, "ServerOP_LSAccountUpdate packet received from: %s", short_name.c_str());
ServerLSAccountUpdate_Struct *lsau = (ServerLSAccountUpdate_Struct*)app->pBuffer; ServerLSAccountUpdate_Struct *lsau = (ServerLSAccountUpdate_Struct*)app->pBuffer;
if(trusted) if(trusted)
{ {
server_log->Log(log_network_trace, "ServerOP_LSAccountUpdate update processed for: %s", lsau->useraccount); Log.Out(Logs::Detail, Logs::Netcode, "ServerOP_LSAccountUpdate update processed for: %s", lsau->useraccount);
string name; string name;
string password; string password;
string email; string email;
@@ -225,7 +228,7 @@ bool WorldServer::Process()
} }
default: default:
{ {
server_log->Log(log_network_error, "Recieved application packet from server that had an unknown operation code 0x%.4X.", app->opcode); Log.Out(Logs::General, Logs::Netcode, "Recieved application packet from server that had an unknown operation code 0x%.4X.", app->opcode);
} }
} }
@@ -237,9 +240,10 @@ bool WorldServer::Process()
void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i) void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
{ {
_eqp
if(logged_in) if(logged_in)
{ {
server_log->Log(log_network_error, "WorldServer::Handle_NewLSInfo called but the login server was already marked as logged in, aborting."); Log.Out(Logs::General, Logs::Netcode, "WorldServer::Handle_NewLSInfo called but the login server was already marked as logged in, aborting.");
return; return;
} }
@@ -249,7 +253,7 @@ void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
} }
else else
{ {
server_log->Log(log_network_error, "Handle_NewLSInfo error, account name was too long."); Log.Out(Logs::General, Logs::Netcode, "Handle_NewLSInfo error, account name was too long.");
return; return;
} }
@@ -259,7 +263,7 @@ void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
} }
else else
{ {
server_log->Log(log_network_error, "Handle_NewLSInfo error, account password was too long."); Log.Out(Logs::General, Logs::Netcode, "Handle_NewLSInfo error, account password was too long.");
return; return;
} }
@@ -269,7 +273,7 @@ void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
} }
else else
{ {
server_log->Log(log_network_error, "Handle_NewLSInfo error, long name was too long."); Log.Out(Logs::General, Logs::Netcode, "Handle_NewLSInfo error, long name was too long.");
return; return;
} }
@@ -279,7 +283,7 @@ void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
} }
else else
{ {
server_log->Log(log_network_error, "Handle_NewLSInfo error, short name was too long."); Log.Out(Logs::General, Logs::Netcode, "Handle_NewLSInfo error, short name was too long.");
return; return;
} }
@@ -287,7 +291,7 @@ void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
{ {
if(strlen(i->local_address) == 0) if(strlen(i->local_address) == 0)
{ {
server_log->Log(log_network_error, "Handle_NewLSInfo error, local address was null, defaulting to localhost"); Log.Out(Logs::General, Logs::Netcode, "Handle_NewLSInfo error, local address was null, defaulting to localhost");
local_ip = "127.0.0.1"; local_ip = "127.0.0.1";
} }
else else
@@ -297,7 +301,7 @@ void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
} }
else else
{ {
server_log->Log(log_network_error, "Handle_NewLSInfo error, local address was too long."); Log.Out(Logs::General, Logs::Netcode, "Handle_NewLSInfo error, local address was too long.");
return; return;
} }
@@ -308,7 +312,7 @@ void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
in_addr in; in_addr in;
in.s_addr = GetConnection()->GetrIP(); in.s_addr = GetConnection()->GetrIP();
remote_ip = inet_ntoa(in); remote_ip = inet_ntoa(in);
server_log->Log(log_network_error, "Handle_NewLSInfo error, remote address was null, defaulting to stream address %s.", remote_ip.c_str()); Log.Out(Logs::General, Logs::Netcode, "Handle_NewLSInfo error, remote address was null, defaulting to stream address %s.", remote_ip.c_str());
} }
else else
{ {
@@ -320,7 +324,7 @@ void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
in_addr in; in_addr in;
in.s_addr = GetConnection()->GetrIP(); in.s_addr = GetConnection()->GetrIP();
remote_ip = inet_ntoa(in); remote_ip = inet_ntoa(in);
server_log->Log(log_network_error, "Handle_NewLSInfo error, remote address was too long, defaulting to stream address %s.", remote_ip.c_str()); Log.Out(Logs::General, Logs::Netcode, "Handle_NewLSInfo error, remote address was too long, defaulting to stream address %s.", remote_ip.c_str());
} }
if(strlen(i->serverversion) <= 64) if(strlen(i->serverversion) <= 64)
@@ -329,7 +333,7 @@ void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
} }
else else
{ {
server_log->Log(log_network_error, "Handle_NewLSInfo error, server version was too long."); Log.Out(Logs::General, Logs::Netcode, "Handle_NewLSInfo error, server version was too long.");
return; return;
} }
@@ -339,7 +343,7 @@ void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
} }
else else
{ {
server_log->Log(log_network_error, "Handle_NewLSInfo error, protocol version was too long."); Log.Out(Logs::General, Logs::Netcode, "Handle_NewLSInfo error, protocol version was too long.");
return; return;
} }
@@ -350,7 +354,7 @@ void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
{ {
if(server.SM->ServerExists(long_name, short_name, this)) if(server.SM->ServerExists(long_name, short_name, this))
{ {
server_log->Log(log_world_error, "World tried to login but there already exists a server that has that name."); Log.Out(Logs::General, Logs::Error, "World tried to login but there already exists a server that has that name.");
return; return;
} }
} }
@@ -358,7 +362,7 @@ void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
{ {
if(server.SM->ServerExists(long_name, short_name, this)) if(server.SM->ServerExists(long_name, short_name, this))
{ {
server_log->Log(log_world_error, "World tried to login but there already exists a server that has that name."); Log.Out(Logs::General, Logs::Error, "World tried to login but there already exists a server that has that name.");
server.SM->DestroyServerByName(long_name, short_name, this); server.SM->DestroyServerByName(long_name, short_name, this);
} }
} }
@@ -378,7 +382,7 @@ void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
{ {
if(s_acct_name.size() == 0 || s_acct_pass.size() == 0) if(s_acct_name.size() == 0 || s_acct_pass.size() == 0)
{ {
server_log->Log(log_world, "Server %s(%s) successfully logged into account that had no user/password requirement.", Log.Out(Logs::General, Logs::World_Server, "Server %s(%s) successfully logged into account that had no user/password requirement.",
long_name.c_str(), short_name.c_str()); long_name.c_str(), short_name.c_str());
authorized = true; authorized = true;
SetRuntimeID(s_id); SetRuntimeID(s_id);
@@ -387,7 +391,7 @@ void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
} }
else if(s_acct_name.compare(account_name) == 0 && s_acct_pass.compare(account_password) == 0) else if(s_acct_name.compare(account_name) == 0 && s_acct_pass.compare(account_password) == 0)
{ {
server_log->Log(log_world, "Server %s(%s) successfully logged in.", Log.Out(Logs::General, Logs::World_Server, "Server %s(%s) successfully logged in.",
long_name.c_str(), short_name.c_str()); long_name.c_str(), short_name.c_str());
authorized = true; authorized = true;
SetRuntimeID(s_id); SetRuntimeID(s_id);
@@ -395,7 +399,7 @@ void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
desc = s_desc; desc = s_desc;
if(s_trusted) if(s_trusted)
{ {
server_log->Log(log_network_trace, "ServerOP_LSAccountUpdate sent to world"); Log.Out(Logs::Detail, Logs::Netcode, "ServerOP_LSAccountUpdate sent to world");
trusted = true; trusted = true;
ServerPacket *outapp = new ServerPacket(ServerOP_LSAccountUpdate, 0); ServerPacket *outapp = new ServerPacket(ServerOP_LSAccountUpdate, 0);
connection->SendPacket(outapp); connection->SendPacket(outapp);
@@ -403,21 +407,21 @@ void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
} }
else else
{ {
server_log->Log(log_world, "Server %s(%s) attempted to log in but account and password did not match the entry in the database, and only" Log.Out(Logs::General, Logs::World_Server, "Server %s(%s) attempted to log in but account and password did not match the entry in the database, and only"
" registered servers are allowed.", long_name.c_str(), short_name.c_str()); " registered servers are allowed.", long_name.c_str(), short_name.c_str());
return; return;
} }
} }
else else
{ {
server_log->Log(log_world, "Server %s(%s) attempted to log in but database couldn't find an entry and only registered servers are allowed.", Log.Out(Logs::General, Logs::World_Server, "Server %s(%s) attempted to log in but database couldn't find an entry and only registered servers are allowed.",
long_name.c_str(), short_name.c_str()); long_name.c_str(), short_name.c_str());
return; return;
} }
} }
else else
{ {
server_log->Log(log_world, "Server %s(%s) did not attempt to log in but only registered servers are allowed.", Log.Out(Logs::General, Logs::World_Server, "Server %s(%s) did not attempt to log in but only registered servers are allowed.",
long_name.c_str(), short_name.c_str()); long_name.c_str(), short_name.c_str());
return; return;
} }
@@ -437,7 +441,7 @@ void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
{ {
if(s_acct_name.compare(account_name) == 0 && s_acct_pass.compare(account_password) == 0) if(s_acct_name.compare(account_name) == 0 && s_acct_pass.compare(account_password) == 0)
{ {
server_log->Log(log_world, "Server %s(%s) successfully logged in.", Log.Out(Logs::General, Logs::World_Server, "Server %s(%s) successfully logged in.",
long_name.c_str(), short_name.c_str()); long_name.c_str(), short_name.c_str());
authorized = true; authorized = true;
SetRuntimeID(s_id); SetRuntimeID(s_id);
@@ -445,7 +449,7 @@ void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
desc = s_desc; desc = s_desc;
if(s_trusted) if(s_trusted)
{ {
server_log->Log(log_network_trace, "ServerOP_LSAccountUpdate sent to world"); Log.Out(Logs::Detail, Logs::Netcode, "ServerOP_LSAccountUpdate sent to world");
trusted = true; trusted = true;
ServerPacket *outapp = new ServerPacket(ServerOP_LSAccountUpdate, 0); ServerPacket *outapp = new ServerPacket(ServerOP_LSAccountUpdate, 0);
connection->SendPacket(outapp); connection->SendPacket(outapp);
@@ -454,7 +458,7 @@ void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
else else
{ {
// this is the first of two cases where we should deny access even if unregistered is allowed // this is the first of two cases where we should deny access even if unregistered is allowed
server_log->Log(log_world, "Server %s(%s) attempted to log in but account and password did not match the entry in the database.", Log.Out(Logs::General, Logs::World_Server, "Server %s(%s) attempted to log in but account and password did not match the entry in the database.",
long_name.c_str(), short_name.c_str()); long_name.c_str(), short_name.c_str());
} }
} }
@@ -463,12 +467,12 @@ void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
if(s_acct_name.size() > 0 || s_acct_pass.size() > 0) if(s_acct_name.size() > 0 || s_acct_pass.size() > 0)
{ {
// this is the second of two cases where we should deny access even if unregistered is allowed // this is the second of two cases where we should deny access even if unregistered is allowed
server_log->Log(log_world, "Server %s(%s) did not attempt to log in but this server requires a password.", Log.Out(Logs::General, Logs::World_Server, "Server %s(%s) did not attempt to log in but this server requires a password.",
long_name.c_str(), short_name.c_str()); long_name.c_str(), short_name.c_str());
} }
else else
{ {
server_log->Log(log_world, "Server %s(%s) did not attempt to log in but unregistered servers are allowed.", Log.Out(Logs::General, Logs::World_Server, "Server %s(%s) did not attempt to log in but unregistered servers are allowed.",
long_name.c_str(), short_name.c_str()); long_name.c_str(), short_name.c_str());
authorized = true; authorized = true;
SetRuntimeID(s_id); SetRuntimeID(s_id);
@@ -478,7 +482,7 @@ void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
} }
else else
{ {
server_log->Log(log_world, "Server %s(%s) attempted to log in but database couldn't find an entry but unregistered servers are allowed.", Log.Out(Logs::General, Logs::World_Server, "Server %s(%s) attempted to log in but database couldn't find an entry but unregistered servers are allowed.",
long_name.c_str(), short_name.c_str()); long_name.c_str(), short_name.c_str());
if(server.db->CreateWorldRegistration(long_name, short_name, s_id)) if(server.db->CreateWorldRegistration(long_name, short_name, s_id))
{ {
@@ -501,6 +505,7 @@ void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
void WorldServer::Handle_LSStatus(ServerLSStatus_Struct *s) void WorldServer::Handle_LSStatus(ServerLSStatus_Struct *s)
{ {
_eqp
players_online = s->num_players; players_online = s->num_players;
zones_booted = s->num_zones; zones_booted = s->num_zones;
status = s->status; status = s->status;
@@ -508,6 +513,7 @@ void WorldServer::Handle_LSStatus(ServerLSStatus_Struct *s)
void WorldServer::SendClientAuth(unsigned int ip, string account, string key, unsigned int account_id) void WorldServer::SendClientAuth(unsigned int ip, string account, string key, unsigned int account_id)
{ {
_eqp
ServerPacket *outapp = new ServerPacket(ServerOP_LSClientAuth, sizeof(ServerLSClientAuth)); ServerPacket *outapp = new ServerPacket(ServerOP_LSClientAuth, sizeof(ServerLSClientAuth));
ServerLSClientAuth* slsca = (ServerLSClientAuth*)outapp->pBuffer; ServerLSClientAuth* slsca = (ServerLSClientAuth*)outapp->pBuffer;
+4 -2
View File
@@ -21,15 +21,17 @@ INSTALL(TARGETS queryserv RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX})
ADD_DEFINITIONS(-DQSERV) ADD_DEFINITIONS(-DQSERV)
TARGET_LINK_LIBRARIES(queryserv common debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE} ${ZLIB_LIBRARY}) TARGET_LINK_LIBRARIES(queryserv common ${PERF_LIBS} debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE} ${ZLIB_LIBRARY})
IF(MSVC) IF(MSVC)
SET_TARGET_PROPERTIES(queryserv PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF") SET_TARGET_PROPERTIES(queryserv PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF")
TARGET_LINK_LIBRARIES(queryserv "Ws2_32.lib") TARGET_LINK_LIBRARIES(queryserv "Ws2_32.lib")
TARGET_LINK_LIBRARIES(queryserv "rpcrt4")
ENDIF(MSVC) ENDIF(MSVC)
IF(MINGW) IF(MINGW)
TARGET_LINK_LIBRARIES(queryserv "WS2_32") TARGET_LINK_LIBRARIES(queryserv "WS2_32")
TARGET_LINK_LIBRARIES(queryserv "rpcrt4")
ENDIF(MINGW) ENDIF(MINGW)
IF(UNIX) IF(UNIX)
@@ -40,7 +42,7 @@ IF(UNIX)
TARGET_LINK_LIBRARIES(queryserv "rt") TARGET_LINK_LIBRARIES(queryserv "rt")
ENDIF(NOT DARWIN) ENDIF(NOT DARWIN)
TARGET_LINK_LIBRARIES(queryserv "pthread") TARGET_LINK_LIBRARIES(queryserv "pthread")
ADD_DEFINITIONS(-fPIC) TARGET_LINK_LIBRARIES(queryserv "uuid")
ENDIF(UNIX) ENDIF(UNIX)
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
+16 -8
View File
@@ -50,6 +50,7 @@
Database::Database () Database::Database ()
{ {
_eqp
DBInitVars(); DBInitVars();
} }
@@ -59,12 +60,14 @@ Establish a connection to a mysql database with the supplied parameters
Database::Database(const char* host, const char* user, const char* passwd, const char* database, uint32 port) Database::Database(const char* host, const char* user, const char* passwd, const char* database, uint32 port)
{ {
_eqp
DBInitVars(); DBInitVars();
Connect(host, user, passwd, database, port); Connect(host, user, passwd, database, port);
} }
bool Database::Connect(const char* host, const char* user, const char* passwd, const char* database, uint32 port) bool Database::Connect(const char* host, const char* user, const char* passwd, const char* database, uint32 port)
{ {
_eqp
uint32 errnum= 0; uint32 errnum= 0;
char errbuf[MYSQL_ERRMSG_SIZE]; char errbuf[MYSQL_ERRMSG_SIZE];
if (!Open(host, user, passwd, database, port, &errnum, errbuf)) if (!Open(host, user, passwd, database, port, &errnum, errbuf))
@@ -82,12 +85,13 @@ bool Database::Connect(const char* host, const char* user, const char* passwd, c
} }
void Database::DBInitVars() { void Database::DBInitVars() {
_eqp
} }
void Database::HandleMysqlError(uint32 errnum) { void Database::HandleMysqlError(uint32 errnum) {
_eqp
} }
/* /*
@@ -96,10 +100,11 @@ Close the connection to the database
*/ */
Database::~Database() Database::~Database()
{ {
_eqp
} }
void Database::AddSpeech(const char* from, const char* to, const char* message, uint16 minstatus, uint32 guilddbid, uint8 type) { void Database::AddSpeech(const char* from, const char* to, const char* message, uint16 minstatus, uint32 guilddbid, uint8 type) {
_eqp
char *escapedFrom = new char[strlen(from) * 2 + 1]; char *escapedFrom = new char[strlen(from) * 2 + 1];
char *escapedTo = new char[strlen(to) * 2 + 1]; char *escapedTo = new char[strlen(to) * 2 + 1];
char *escapedMessage = new char[strlen(message) * 2 + 1]; char *escapedMessage = new char[strlen(message) * 2 + 1];
@@ -124,7 +129,7 @@ void Database::AddSpeech(const char* from, const char* to, const char* message,
} }
void Database::LogPlayerTrade(QSPlayerLogTrade_Struct* QS, uint32 detailCount) { void Database::LogPlayerTrade(QSPlayerLogTrade_Struct* QS, uint32 detailCount) {
_eqp
std::string query = StringFormat("INSERT INTO `qs_player_trade_record` SET `time` = NOW(), " std::string query = StringFormat("INSERT INTO `qs_player_trade_record` SET `time` = NOW(), "
"`char1_id` = '%i', `char1_pp` = '%i', `char1_gp` = '%i', " "`char1_id` = '%i', `char1_pp` = '%i', `char1_gp` = '%i', "
"`char1_sp` = '%i', `char1_cp` = '%i', `char1_items` = '%i', " "`char1_sp` = '%i', `char1_cp` = '%i', `char1_items` = '%i', "
@@ -165,7 +170,7 @@ void Database::LogPlayerTrade(QSPlayerLogTrade_Struct* QS, uint32 detailCount) {
} }
void Database::LogPlayerHandin(QSPlayerLogHandin_Struct* QS, uint32 detailCount) { void Database::LogPlayerHandin(QSPlayerLogHandin_Struct* QS, uint32 detailCount) {
_eqp
std::string query = StringFormat("INSERT INTO `qs_player_handin_record` SET `time` = NOW(), " std::string query = StringFormat("INSERT INTO `qs_player_handin_record` SET `time` = NOW(), "
"`quest_id` = '%i', `char_id` = '%i', `char_pp` = '%i', " "`quest_id` = '%i', `char_id` = '%i', `char_pp` = '%i', "
"`char_gp` = '%i', `char_sp` = '%i', `char_cp` = '%i', " "`char_gp` = '%i', `char_sp` = '%i', `char_cp` = '%i', "
@@ -206,7 +211,7 @@ void Database::LogPlayerHandin(QSPlayerLogHandin_Struct* QS, uint32 detailCount)
} }
void Database::LogPlayerNPCKill(QSPlayerLogNPCKill_Struct* QS, uint32 members){ void Database::LogPlayerNPCKill(QSPlayerLogNPCKill_Struct* QS, uint32 members){
_eqp
std::string query = StringFormat("INSERT INTO `qs_player_npc_kill_record` " std::string query = StringFormat("INSERT INTO `qs_player_npc_kill_record` "
"SET `npc_id` = '%i', `type` = '%i', " "SET `npc_id` = '%i', `type` = '%i', "
"`zone_id` = '%i', `time` = NOW()", "`zone_id` = '%i', `time` = NOW()",
@@ -237,7 +242,7 @@ void Database::LogPlayerNPCKill(QSPlayerLogNPCKill_Struct* QS, uint32 members){
} }
void Database::LogPlayerDelete(QSPlayerLogDelete_Struct* QS, uint32 items) { void Database::LogPlayerDelete(QSPlayerLogDelete_Struct* QS, uint32 items) {
_eqp
std::string query = StringFormat("INSERT INTO `qs_player_delete_record` SET `time` = NOW(), " std::string query = StringFormat("INSERT INTO `qs_player_delete_record` SET `time` = NOW(), "
"`char_id` = '%i', `stack_size` = '%i', `char_items` = '%i'", "`char_id` = '%i', `stack_size` = '%i', `char_items` = '%i'",
QS->char_id, QS->stack_size, QS->char_count, QS->char_count); QS->char_id, QS->stack_size, QS->char_count, QS->char_count);
@@ -270,8 +275,8 @@ void Database::LogPlayerDelete(QSPlayerLogDelete_Struct* QS, uint32 items) {
} }
void Database::LogPlayerMove(QSPlayerLogMove_Struct* QS, uint32 items) { void Database::LogPlayerMove(QSPlayerLogMove_Struct* QS, uint32 items) {
_eqp
/* These are item moves */ /* These are item moves */
std::string query = StringFormat("INSERT INTO `qs_player_move_record` SET `time` = NOW(), " std::string query = StringFormat("INSERT INTO `qs_player_move_record` SET `time` = NOW(), "
"`char_id` = '%i', `from_slot` = '%i', `to_slot` = '%i', " "`char_id` = '%i', `from_slot` = '%i', `to_slot` = '%i', "
"`stack_size` = '%i', `char_items` = '%i', `postaction` = '%i'", "`stack_size` = '%i', `char_items` = '%i', `postaction` = '%i'",
@@ -306,6 +311,7 @@ void Database::LogPlayerMove(QSPlayerLogMove_Struct* QS, uint32 items) {
} }
void Database::LogMerchantTransaction(QSMerchantLogTransaction_Struct* QS, uint32 items) { void Database::LogMerchantTransaction(QSMerchantLogTransaction_Struct* QS, uint32 items) {
_eqp
/* Merchant transactions are from the perspective of the merchant, not the player -U */ /* Merchant transactions are from the perspective of the merchant, not the player -U */
std::string query = StringFormat("INSERT INTO `qs_merchant_transaction_record` SET `time` = NOW(), " std::string query = StringFormat("INSERT INTO `qs_merchant_transaction_record` SET `time` = NOW(), "
"`zone_id` = '%i', `merchant_id` = '%i', `merchant_pp` = '%i', " "`zone_id` = '%i', `merchant_id` = '%i', `merchant_pp` = '%i', "
@@ -347,6 +353,7 @@ void Database::LogMerchantTransaction(QSMerchantLogTransaction_Struct* QS, uint3
} }
void Database::GeneralQueryReceive(ServerPacket *pack) { void Database::GeneralQueryReceive(ServerPacket *pack) {
_eqp
/* /*
These are general queries passed from anywhere in zone instead of packing structures and breaking them down again and again These are general queries passed from anywhere in zone instead of packing structures and breaking them down again and again
*/ */
@@ -364,7 +371,8 @@ void Database::GeneralQueryReceive(ServerPacket *pack) {
safe_delete(queryBuffer); safe_delete(queryBuffer);
} }
void Database::LoadLogSettings(EQEmuLogSys::LogSettings* log_settings){ void Database::LoadLogSettings(EQEmuLogSys::LogSettings* log_settings) {
_eqp
std::string query = std::string query =
"SELECT " "SELECT "
"log_category_id, " "log_category_id, "
+11 -1
View File
@@ -12,6 +12,7 @@ extern Database database;
PlayerLookingForGuild::PlayerLookingForGuild(char *Name, char *Comments, uint32 Level, uint32 Class, uint32 AACount, uint32 Timezone, uint32 TimePosted) PlayerLookingForGuild::PlayerLookingForGuild(char *Name, char *Comments, uint32 Level, uint32 Class, uint32 AACount, uint32 Timezone, uint32 TimePosted)
{ {
_eqp
this->Name = Name; this->Name = Name;
this->Comments = Comments; this->Comments = Comments;
this->Level = Level; this->Level = Level;
@@ -23,6 +24,7 @@ PlayerLookingForGuild::PlayerLookingForGuild(char *Name, char *Comments, uint32
GuildLookingForPlayers::GuildLookingForPlayers(char *Name, char *Comments, uint32 FromLevel, uint32 ToLevel, uint32 Classes, uint32 AACount, uint32 Timezone, uint32 TimePosted) GuildLookingForPlayers::GuildLookingForPlayers(char *Name, char *Comments, uint32 FromLevel, uint32 ToLevel, uint32 Classes, uint32 AACount, uint32 Timezone, uint32 TimePosted)
{ {
_eqp
this->Name = Name; this->Name = Name;
this->Comments = Comments; this->Comments = Comments;
this->FromLevel = FromLevel; this->FromLevel = FromLevel;
@@ -35,6 +37,7 @@ GuildLookingForPlayers::GuildLookingForPlayers(char *Name, char *Comments, uint3
bool LFGuildManager::LoadDatabase() bool LFGuildManager::LoadDatabase()
{ {
_eqp
std::string query = "SELECT `type`,`name`,`comment`, " std::string query = "SELECT `type`,`name`,`comment`, "
"`fromlevel`, `tolevel`, `classes`, " "`fromlevel`, `tolevel`, `classes`, "
"`aacount`, `timezone`, `timeposted` FROM `lfguild`"; "`aacount`, `timezone`, `timeposted` FROM `lfguild`";
@@ -61,6 +64,7 @@ bool LFGuildManager::LoadDatabase()
void LFGuildManager::HandlePacket(ServerPacket *pack) void LFGuildManager::HandlePacket(ServerPacket *pack)
{ {
_eqp
char From[64]; char From[64];
pack->SetReadPosition(0); pack->SetReadPosition(0);
@@ -150,6 +154,7 @@ void LFGuildManager::HandlePacket(ServerPacket *pack)
void LFGuildManager::SendPlayerMatches(uint32 FromZoneID, uint32 FromInstanceID, char *From, uint32 FromLevel, uint32 ToLevel, uint32 MinAA, uint32 TimeZone, uint32 Classes) void LFGuildManager::SendPlayerMatches(uint32 FromZoneID, uint32 FromInstanceID, char *From, uint32 FromLevel, uint32 ToLevel, uint32 MinAA, uint32 TimeZone, uint32 Classes)
{ {
_eqp
std::list<PlayerLookingForGuild>::iterator it; std::list<PlayerLookingForGuild>::iterator it;
std::list<PlayerLookingForGuild> Matches; std::list<PlayerLookingForGuild> Matches;
@@ -193,6 +198,7 @@ void LFGuildManager::SendPlayerMatches(uint32 FromZoneID, uint32 FromInstanceID,
void LFGuildManager::SendGuildMatches(uint32 FromZoneID, uint32 FromInstanceID, char *From, uint32 Level, uint32 AAPoints, uint32 TimeZone, uint32 Class) void LFGuildManager::SendGuildMatches(uint32 FromZoneID, uint32 FromInstanceID, char *From, uint32 Level, uint32 AAPoints, uint32 TimeZone, uint32 Class)
{ {
_eqp
std::list<GuildLookingForPlayers>::iterator it; std::list<GuildLookingForPlayers>::iterator it;
std::list<GuildLookingForPlayers> Matches; std::list<GuildLookingForPlayers> Matches;
@@ -232,6 +238,7 @@ void LFGuildManager::SendGuildMatches(uint32 FromZoneID, uint32 FromInstanceID,
void LFGuildManager::TogglePlayer(uint32 FromZoneID, uint32 FromInstanceID, char *From, uint32 Class, uint32 Level, uint32 AAPoints, char *Comments, uint32 Toggle, uint32 TimeZone) void LFGuildManager::TogglePlayer(uint32 FromZoneID, uint32 FromInstanceID, char *From, uint32 Class, uint32 Level, uint32 AAPoints, char *Comments, uint32 Toggle, uint32 TimeZone)
{ {
_eqp
for(auto it = Players.begin(); it != Players.end(); ++it) for(auto it = Players.begin(); it != Players.end(); ++it)
if(!strcasecmp((*it).Name.c_str(), From)) { if(!strcasecmp((*it).Name.c_str(), From)) {
Players.erase(it); Players.erase(it);
@@ -273,6 +280,7 @@ void LFGuildManager::TogglePlayer(uint32 FromZoneID, uint32 FromInstanceID, char
void LFGuildManager::ToggleGuild(uint32 FromZoneID, uint32 FromInstanceID, char *From, char* GuildName, char *Comments, uint32 FromLevel, uint32 ToLevel, uint32 Classes, uint32 AACount, uint32 Toggle, uint32 TimeZone) void LFGuildManager::ToggleGuild(uint32 FromZoneID, uint32 FromInstanceID, char *From, char* GuildName, char *Comments, uint32 FromLevel, uint32 ToLevel, uint32 Classes, uint32 AACount, uint32 Toggle, uint32 TimeZone)
{ {
_eqp
for(auto it = Guilds.begin(); it != Guilds.end(); ++it) for(auto it = Guilds.begin(); it != Guilds.end(); ++it)
if(!strcasecmp((*it).Name.c_str(), GuildName)) if(!strcasecmp((*it).Name.c_str(), GuildName))
{ {
@@ -318,6 +326,7 @@ void LFGuildManager::ToggleGuild(uint32 FromZoneID, uint32 FromInstanceID, char
void LFGuildManager::ExpireEntries() void LFGuildManager::ExpireEntries()
{ {
_eqp
for(auto it = Players.begin(); it != Players.end(); ++it) for(auto it = Players.begin(); it != Players.end(); ++it)
{ {
if((*it).TimePosted + 604800 > (uint32)time(nullptr)) if((*it).TimePosted + 604800 > (uint32)time(nullptr))
@@ -345,7 +354,7 @@ void LFGuildManager::ExpireEntries()
void LFGuildManager::SendPlayerStatus(uint32 FromZoneID, uint32 FromInstanceID, char *From) void LFGuildManager::SendPlayerStatus(uint32 FromZoneID, uint32 FromInstanceID, char *From)
{ {
_eqp
std::list<PlayerLookingForGuild>::iterator it; std::list<PlayerLookingForGuild>::iterator it;
for(it = Players.begin(); it != Players.end(); ++it) for(it = Players.begin(); it != Players.end(); ++it)
@@ -373,6 +382,7 @@ void LFGuildManager::SendPlayerStatus(uint32 FromZoneID, uint32 FromInstanceID,
void LFGuildManager::SendGuildStatus(uint32 FromZoneID, uint32 FromInstanceID, char *From, char *GuildName) void LFGuildManager::SendGuildStatus(uint32 FromZoneID, uint32 FromInstanceID, char *From, char *GuildName)
{ {
_eqp
std::list<GuildLookingForPlayers>::iterator it; std::list<GuildLookingForPlayers>::iterator it;
for(it = Guilds.begin(); it != Guilds.end(); ++it) for(it = Guilds.begin(); it != Guilds.end(); ++it)
+17 -18
View File
@@ -46,6 +46,8 @@ void CatchSignal(int sig_num) {
RunLoops = false; RunLoops = false;
if(worldserver) if(worldserver)
worldserver->Disconnect(); worldserver->Disconnect();
_eqp_dump_file("queryserv");
} }
int main() { int main() {
@@ -55,16 +57,6 @@ int main() {
Timer LFGuildExpireTimer(60000); Timer LFGuildExpireTimer(60000);
Timer InterserverTimer(INTERSERVER_TIMER); // does auto-reconnect Timer InterserverTimer(INTERSERVER_TIMER); // does auto-reconnect
/* Load XML from eqemu_config.xml
<qsdatabase>
<host>127.0.0.1</host>
<port>3306</port>
<username>user</username>
<password>password</password>
<db>dbname</db>
</qsdatabase>
*/
Log.Out(Logs::General, Logs::QS_Server, "Starting EQEmu QueryServ."); Log.Out(Logs::General, Logs::QS_Server, "Starting EQEmu QueryServ.");
if (!queryservconfig::LoadConfig()) { if (!queryservconfig::LoadConfig()) {
Log.Out(Logs::General, Logs::QS_Server, "Loading server configuration failed."); Log.Out(Logs::General, Logs::QS_Server, "Loading server configuration failed.");
@@ -99,6 +91,10 @@ int main() {
Log.Out(Logs::General, Logs::QS_Server, "Could not set signal handler"); Log.Out(Logs::General, Logs::QS_Server, "Could not set signal handler");
return 1; return 1;
} }
if(signal(SIGBREAK, CatchSignal) == SIG_ERR) {
Log.Out(Logs::General, Logs::QS_Server, "Could not set signal handler");
return 1;
}
/* Initial Connection to Worldserver */ /* Initial Connection to Worldserver */
worldserver = new WorldServer; worldserver = new WorldServer;
@@ -108,16 +104,19 @@ int main() {
lfguildmanager.LoadDatabase(); lfguildmanager.LoadDatabase();
while(RunLoops) { while(RunLoops) {
Timer::SetCurrentTime(); {
if(LFGuildExpireTimer.Check()) _eqpn("Main loop")
lfguildmanager.ExpireEntries(); Timer::SetCurrentTime();
if(LFGuildExpireTimer.Check())
lfguildmanager.ExpireEntries();
if (InterserverTimer.Check()) { if (InterserverTimer.Check()) {
if (worldserver->TryReconnect() && (!worldserver->Connected())) if (worldserver->TryReconnect() && (!worldserver->Connected()))
worldserver->AsyncConnect(); worldserver->AsyncConnect();
}
worldserver->Process();
timeout_manager.CheckTimeouts();
} }
worldserver->Process();
timeout_manager.CheckTimeouts();
Sleep(100); Sleep(100);
} }
Log.CloseFileLogs(); Log.CloseFileLogs();
+1
View File
@@ -23,6 +23,7 @@
queryservconfig *queryservconfig::_chat_config = nullptr; queryservconfig *queryservconfig::_chat_config = nullptr;
std::string queryservconfig::GetByName(const std::string &var_name) const { std::string queryservconfig::GetByName(const std::string &var_name) const {
_eqp
return(EQEmuConfig::GetByName(var_name)); return(EQEmuConfig::GetByName(var_name));
} }
+4
View File
@@ -44,21 +44,25 @@ extern LFGuildManager lfguildmanager;
WorldServer::WorldServer() WorldServer::WorldServer()
: WorldConnection(EmuTCPConnection::packetModeQueryServ, Config->SharedKey.c_str()) : WorldConnection(EmuTCPConnection::packetModeQueryServ, Config->SharedKey.c_str())
{ {
_eqp
pTryReconnect = true; pTryReconnect = true;
} }
WorldServer::~WorldServer() WorldServer::~WorldServer()
{ {
_eqp
} }
void WorldServer::OnConnected() void WorldServer::OnConnected()
{ {
_eqp
Log.Out(Logs::Detail, Logs::QS_Server, "Connected to World."); Log.Out(Logs::Detail, Logs::QS_Server, "Connected to World.");
WorldConnection::OnConnected(); WorldConnection::OnConnected();
} }
void WorldServer::Process() void WorldServer::Process()
{ {
_eqp
WorldConnection::Process(); WorldConnection::Process();
if (!Connected()) if (!Connected())
return; return;
+4 -1
View File
@@ -23,15 +23,17 @@ ADD_EXECUTABLE(shared_memory ${shared_memory_sources} ${shared_memory_headers})
INSTALL(TARGETS shared_memory RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}) INSTALL(TARGETS shared_memory RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX})
TARGET_LINK_LIBRARIES(shared_memory common debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE} ${ZLIB_LIBRARY}) TARGET_LINK_LIBRARIES(shared_memory common ${PERF_LIBS} debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE} ${ZLIB_LIBRARY})
IF(MSVC) IF(MSVC)
SET_TARGET_PROPERTIES(shared_memory PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF") SET_TARGET_PROPERTIES(shared_memory PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF")
TARGET_LINK_LIBRARIES(shared_memory "Ws2_32.lib") TARGET_LINK_LIBRARIES(shared_memory "Ws2_32.lib")
TARGET_LINK_LIBRARIES(shared_memory "rpcrt4")
ENDIF(MSVC) ENDIF(MSVC)
IF(MINGW) IF(MINGW)
TARGET_LINK_LIBRARIES(shared_memory "WS2_32") TARGET_LINK_LIBRARIES(shared_memory "WS2_32")
TARGET_LINK_LIBRARIES(shared_memory "rpcrt4")
ENDIF(MINGW) ENDIF(MINGW)
IF(UNIX) IF(UNIX)
@@ -42,6 +44,7 @@ IF(UNIX)
TARGET_LINK_LIBRARIES(shared_memory "rt") TARGET_LINK_LIBRARIES(shared_memory "rt")
ENDIF(NOT DARWIN) ENDIF(NOT DARWIN)
TARGET_LINK_LIBRARIES(shared_memory "pthread") TARGET_LINK_LIBRARIES(shared_memory "pthread")
TARGET_LINK_LIBRARIES(shared_memory "uuid")
ADD_DEFINITIONS(-fPIC) ADD_DEFINITIONS(-fPIC)
ENDIF(UNIX) ENDIF(UNIX)
+1
View File
@@ -24,6 +24,7 @@
#include "../common/eqemu_exception.h" #include "../common/eqemu_exception.h"
void LoadBaseData(SharedDatabase *database) { void LoadBaseData(SharedDatabase *database) {
_eqp
EQEmu::IPCMutex mutex("base_data"); EQEmu::IPCMutex mutex("base_data");
mutex.Lock(); mutex.Lock();
int records = (database->GetMaxBaseDataLevel() + 1); int records = (database->GetMaxBaseDataLevel() + 1);
+1
View File
@@ -25,6 +25,7 @@
#include "../common/item_struct.h" #include "../common/item_struct.h"
void LoadItems(SharedDatabase *database) { void LoadItems(SharedDatabase *database) {
_eqp
EQEmu::IPCMutex mutex("items"); EQEmu::IPCMutex mutex("items");
mutex.Lock(); mutex.Lock();
+1
View File
@@ -26,6 +26,7 @@
#include "../common/loottable.h" #include "../common/loottable.h"
void LoadLoot(SharedDatabase *database) { void LoadLoot(SharedDatabase *database) {
_eqp
EQEmu::IPCMutex mutex("loot"); EQEmu::IPCMutex mutex("loot");
mutex.Lock(); mutex.Lock();
+26 -1
View File
@@ -17,6 +17,7 @@
*/ */
#include <stdio.h> #include <stdio.h>
#include <signal.h>
#include "../common/eqemu_logsys.h" #include "../common/eqemu_logsys.h"
#include "../common/global_define.h" #include "../common/global_define.h"
@@ -35,11 +36,36 @@
EQEmuLogSys Log; EQEmuLogSys Log;
void CatchSignal(int sig_num)
{
_eqp_dump_file("shared_memory");
}
void OnExit() {
CatchSignal(SIGBREAK);
}
int main(int argc, char **argv) { int main(int argc, char **argv) {
_eqp
RegisterExecutablePlatform(ExePlatformSharedMemory); RegisterExecutablePlatform(ExePlatformSharedMemory);
Log.LoadLogSettingsDefaults(); Log.LoadLogSettingsDefaults();
set_exception_handler(); set_exception_handler();
if(signal(SIGINT, CatchSignal) == SIG_ERR) {
Log.Out(Logs::Detail, Logs::Error, "Could not set signal handler");
return 1;
}
if(signal(SIGTERM, CatchSignal) == SIG_ERR) {
Log.Out(Logs::Detail, Logs::Error, "Could not set signal handler");
return 1;
}
if(signal(SIGBREAK, CatchSignal) == SIG_ERR) {
Log.Out(Logs::Detail, Logs::Error, "Could not set signal handler");
return 1;
}
atexit(OnExit);
Log.Out(Logs::General, Logs::Status, "Shared Memory Loader Program"); Log.Out(Logs::General, Logs::Status, "Shared Memory Loader Program");
if(!EQEmuConfig::LoadConfig()) { if(!EQEmuConfig::LoadConfig()) {
Log.Out(Logs::General, Logs::Error, "Unable to load configuration file."); Log.Out(Logs::General, Logs::Error, "Unable to load configuration file.");
@@ -175,6 +201,5 @@ int main(int argc, char **argv) {
} }
Log.CloseFileLogs(); Log.CloseFileLogs();
return 0; return 0;
} }
+1
View File
@@ -25,6 +25,7 @@
#include "../common/faction.h" #include "../common/faction.h"
void LoadFactions(SharedDatabase *database) { void LoadFactions(SharedDatabase *database) {
_eqp
EQEmu::IPCMutex mutex("faction"); EQEmu::IPCMutex mutex("faction");
mutex.Lock(); mutex.Lock();
+1
View File
@@ -26,6 +26,7 @@
#include "../common/features.h" #include "../common/features.h"
void LoadSkillCaps(SharedDatabase *database) { void LoadSkillCaps(SharedDatabase *database) {
_eqp
EQEmu::IPCMutex mutex("skill_caps"); EQEmu::IPCMutex mutex("skill_caps");
mutex.Lock(); mutex.Lock();
+1
View File
@@ -25,6 +25,7 @@
#include "../common/spdat.h" #include "../common/spdat.h"
void LoadSpells(SharedDatabase *database) { void LoadSpells(SharedDatabase *database) {
_eqp
EQEmu::IPCMutex mutex("spells"); EQEmu::IPCMutex mutex("spells");
mutex.Lock(); mutex.Lock();
int records = database->GetMaxSpellID() + 1; int records = database->GetMaxSpellID() + 1;
+4 -1
View File
@@ -20,17 +20,19 @@ SET(tests_headers
ADD_EXECUTABLE(tests ${tests_sources} ${tests_headers}) ADD_EXECUTABLE(tests ${tests_sources} ${tests_headers})
TARGET_LINK_LIBRARIES(tests common cppunit) TARGET_LINK_LIBRARIES(tests common ${PERF_LIBS} cppunit)
INSTALL(TARGETS tests RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}) INSTALL(TARGETS tests RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX})
IF(MSVC) IF(MSVC)
SET_TARGET_PROPERTIES(tests PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF") SET_TARGET_PROPERTIES(tests PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF")
TARGET_LINK_LIBRARIES(tests "Ws2_32.lib") TARGET_LINK_LIBRARIES(tests "Ws2_32.lib")
TARGET_LINK_LIBRARIES(tests "rpcrt4")
ENDIF(MSVC) ENDIF(MSVC)
IF(MINGW) IF(MINGW)
TARGET_LINK_LIBRARIES(tests "WS2_32") TARGET_LINK_LIBRARIES(tests "WS2_32")
TARGET_LINK_LIBRARIES(tests "rpcrt4")
ENDIF(MINGW) ENDIF(MINGW)
IF(UNIX) IF(UNIX)
@@ -41,6 +43,7 @@ IF(UNIX)
TARGET_LINK_LIBRARIES(tests "rt") TARGET_LINK_LIBRARIES(tests "rt")
ENDIF(NOT DARWIN) ENDIF(NOT DARWIN)
TARGET_LINK_LIBRARIES(tests "pthread") TARGET_LINK_LIBRARIES(tests "pthread")
TARGET_LINK_LIBRARIES(tests "uuid")
ADD_DEFINITIONS(-fPIC) ADD_DEFINITIONS(-fPIC)
ENDIF(UNIX) ENDIF(UNIX)
+4 -1
View File
@@ -23,15 +23,17 @@ INSTALL(TARGETS ucs RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX})
ADD_DEFINITIONS(-DUCS) ADD_DEFINITIONS(-DUCS)
TARGET_LINK_LIBRARIES(ucs common debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE} ${ZLIB_LIBRARY}) TARGET_LINK_LIBRARIES(ucs common ${PERF_LIBS} debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE} ${ZLIB_LIBRARY})
IF(MSVC) IF(MSVC)
SET_TARGET_PROPERTIES(ucs PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF") SET_TARGET_PROPERTIES(ucs PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF")
TARGET_LINK_LIBRARIES(ucs "Ws2_32.lib") TARGET_LINK_LIBRARIES(ucs "Ws2_32.lib")
TARGET_LINK_LIBRARIES(ucs "rpcrt4")
ENDIF(MSVC) ENDIF(MSVC)
IF(MINGW) IF(MINGW)
TARGET_LINK_LIBRARIES(ucs "WS2_32") TARGET_LINK_LIBRARIES(ucs "WS2_32")
TARGET_LINK_LIBRARIES(ucs "rpcrt4")
ENDIF(MINGW) ENDIF(MINGW)
IF(UNIX) IF(UNIX)
@@ -42,6 +44,7 @@ IF(UNIX)
TARGET_LINK_LIBRARIES(ucs "rt") TARGET_LINK_LIBRARIES(ucs "rt")
ENDIF(NOT DARWIN) ENDIF(NOT DARWIN)
TARGET_LINK_LIBRARIES(ucs "pthread") TARGET_LINK_LIBRARIES(ucs "pthread")
TARGET_LINK_LIBRARIES(ucs "uuid")
ADD_DEFINITIONS(-fPIC) ADD_DEFINITIONS(-fPIC)
ENDIF(UNIX) ENDIF(UNIX)
+52 -141
View File
@@ -29,17 +29,13 @@ extern uint32 ChatMessagesSent;
ChatChannel::ChatChannel(std::string inName, std::string inOwner, std::string inPassword, bool inPermanent, int inMinimumStatus) : ChatChannel::ChatChannel(std::string inName, std::string inOwner, std::string inPassword, bool inPermanent, int inMinimumStatus) :
DeleteTimer(0) { DeleteTimer(0) {
_eqp
Name = inName; Name = inName;
Owner = inOwner; Owner = inOwner;
Password = inPassword; Password = inPassword;
Permanent = inPermanent; Permanent = inPermanent;
MinimumStatus = inMinimumStatus; MinimumStatus = inMinimumStatus;
Moderated = false; Moderated = false;
Log.Out(Logs::Detail, Logs::UCS_Server, "New ChatChannel created: Name: [%s], Owner: [%s], Password: [%s], MinStatus: %i", Log.Out(Logs::Detail, Logs::UCS_Server, "New ChatChannel created: Name: [%s], Owner: [%s], Password: [%s], MinStatus: %i",
@@ -48,36 +44,30 @@ ChatChannel::ChatChannel(std::string inName, std::string inOwner, std::string in
} }
ChatChannel::~ChatChannel() { ChatChannel::~ChatChannel() {
_eqp
LinkedListIterator<Client*> iterator(ClientsInChannel); LinkedListIterator<Client*> iterator(ClientsInChannel);
iterator.Reset(); iterator.Reset();
while(iterator.MoreElements()) while(iterator.MoreElements())
iterator.RemoveCurrent(false); iterator.RemoveCurrent(false);
} }
ChatChannel* ChatChannelList::CreateChannel(std::string Name, std::string Owner, std::string Password, bool Permanent, int MinimumStatus) { ChatChannel* ChatChannelList::CreateChannel(std::string Name, std::string Owner, std::string Password, bool Permanent, int MinimumStatus) {
_eqp
ChatChannel *NewChannel = new ChatChannel(CapitaliseName(Name), Owner, Password, Permanent, MinimumStatus); ChatChannel *NewChannel = new ChatChannel(CapitaliseName(Name), Owner, Password, Permanent, MinimumStatus);
ChatChannels.Insert(NewChannel); ChatChannels.Insert(NewChannel);
return NewChannel; return NewChannel;
} }
ChatChannel* ChatChannelList::FindChannel(std::string Name) { ChatChannel* ChatChannelList::FindChannel(std::string Name) {
_eqp
std::string NormalisedName = CapitaliseName(Name); std::string NormalisedName = CapitaliseName(Name);
LinkedListIterator<ChatChannel*> iterator(ChatChannels); LinkedListIterator<ChatChannel*> iterator(ChatChannels);
iterator.Reset(); iterator.Reset();
while(iterator.MoreElements()) { while(iterator.MoreElements()) {
ChatChannel *CurrentChannel = iterator.GetData(); ChatChannel *CurrentChannel = iterator.GetData();
if(CurrentChannel && (CurrentChannel->Name == NormalisedName)) if(CurrentChannel && (CurrentChannel->Name == NormalisedName))
return iterator.GetData(); return iterator.GetData();
@@ -88,8 +78,10 @@ ChatChannel* ChatChannelList::FindChannel(std::string Name) {
} }
void ChatChannelList::SendAllChannels(Client *c) { void ChatChannelList::SendAllChannels(Client *c) {
_eqp
if(!c) return; if(!c)
return;
if(!c->CanListAllChannels()) { if(!c->CanListAllChannels()) {
c->GeneralChannelMessage("You do not have permission to list all the channels."); c->GeneralChannelMessage("You do not have permission to list all the channels.");
@@ -99,23 +91,16 @@ void ChatChannelList::SendAllChannels(Client *c) {
c->GeneralChannelMessage("All current channels:"); c->GeneralChannelMessage("All current channels:");
int ChannelsInLine = 0; int ChannelsInLine = 0;
LinkedListIterator<ChatChannel*> iterator(ChatChannels); LinkedListIterator<ChatChannel*> iterator(ChatChannels);
iterator.Reset(); iterator.Reset();
std::string Message; std::string Message;
char CountString[10]; char CountString[10];
while(iterator.MoreElements()) { while(iterator.MoreElements()) {
ChatChannel *CurrentChannel = iterator.GetData(); ChatChannel *CurrentChannel = iterator.GetData();
if(!CurrentChannel || (CurrentChannel->GetMinStatus() > c->GetAccountStatus())) { if(!CurrentChannel || (CurrentChannel->GetMinStatus() > c->GetAccountStatus())) {
iterator.Advance(); iterator.Advance();
continue; continue;
} }
@@ -123,19 +108,13 @@ void ChatChannelList::SendAllChannels(Client *c) {
Message += ", "; Message += ", ";
sprintf(CountString, "(%i)", CurrentChannel->MemberCount(c->GetAccountStatus())); sprintf(CountString, "(%i)", CurrentChannel->MemberCount(c->GetAccountStatus()));
Message += CurrentChannel->GetName(); Message += CurrentChannel->GetName();
Message += CountString; Message += CountString;
ChannelsInLine++; ChannelsInLine++;
if(ChannelsInLine == 6) { if(ChannelsInLine == 6) {
c->GeneralChannelMessage(Message); c->GeneralChannelMessage(Message);
ChannelsInLine = 0; ChannelsInLine = 0;
Message.clear(); Message.clear();
} }
@@ -148,19 +127,14 @@ void ChatChannelList::SendAllChannels(Client *c) {
} }
void ChatChannelList::RemoveChannel(ChatChannel *Channel) { void ChatChannelList::RemoveChannel(ChatChannel *Channel) {
_eqp
Log.Out(Logs::Detail, Logs::UCS_Server, "RemoveChannel(%s)", Channel->GetName().c_str()); Log.Out(Logs::Detail, Logs::UCS_Server, "RemoveChannel(%s)", Channel->GetName().c_str());
LinkedListIterator<ChatChannel*> iterator(ChatChannels); LinkedListIterator<ChatChannel*> iterator(ChatChannels);
iterator.Reset(); iterator.Reset();
while(iterator.MoreElements()) { while(iterator.MoreElements()) {
if(iterator.GetData() == Channel) { if(iterator.GetData() == Channel) {
iterator.RemoveCurrent(); iterator.RemoveCurrent();
return; return;
} }
@@ -169,11 +143,10 @@ void ChatChannelList::RemoveChannel(ChatChannel *Channel) {
} }
void ChatChannelList::RemoveAllChannels() { void ChatChannelList::RemoveAllChannels() {
_eqp
Log.Out(Logs::Detail, Logs::UCS_Server, "RemoveAllChannels"); Log.Out(Logs::Detail, Logs::UCS_Server, "RemoveAllChannels");
LinkedListIterator<ChatChannel*> iterator(ChatChannels); LinkedListIterator<ChatChannel*> iterator(ChatChannels);
iterator.Reset(); iterator.Reset();
while(iterator.MoreElements()) while(iterator.MoreElements())
@@ -181,17 +154,13 @@ void ChatChannelList::RemoveAllChannels() {
} }
int ChatChannel::MemberCount(int Status) { int ChatChannel::MemberCount(int Status) {
_eqp
int Count = 0; int Count = 0;
LinkedListIterator<Client*> iterator(ClientsInChannel); LinkedListIterator<Client*> iterator(ClientsInChannel);
iterator.Reset(); iterator.Reset();
while(iterator.MoreElements()) { while(iterator.MoreElements()) {
Client *ChannelClient = iterator.GetData(); Client *ChannelClient = iterator.GetData();
if(ChannelClient && (!ChannelClient->GetHideMe() || (ChannelClient->GetAccountStatus() < Status))) if(ChannelClient && (!ChannelClient->GetHideMe() || (ChannelClient->GetAccountStatus() < Status)))
Count++; Count++;
@@ -202,7 +171,7 @@ int ChatChannel::MemberCount(int Status) {
} }
void ChatChannel::SetPassword(std::string inPassword) { void ChatChannel::SetPassword(std::string inPassword) {
_eqp
Password = inPassword; Password = inPassword;
if(Permanent) if(Permanent)
@@ -213,7 +182,7 @@ void ChatChannel::SetPassword(std::string inPassword) {
} }
void ChatChannel::SetOwner(std::string inOwner) { void ChatChannel::SetOwner(std::string inOwner) {
_eqp
Owner = inOwner; Owner = inOwner;
if(Permanent) if(Permanent)
@@ -221,68 +190,59 @@ void ChatChannel::SetOwner(std::string inOwner) {
} }
void ChatChannel::AddClient(Client *c) { void ChatChannel::AddClient(Client *c) {
_eqp
if(!c) return; if(!c)
return;
DeleteTimer.Disable(); DeleteTimer.Disable();
if(IsClientInChannel(c)) { if(IsClientInChannel(c)) {
Log.Out(Logs::Detail, Logs::UCS_Server, "Client %s already in channel %s", c->GetName().c_str(), GetName().c_str()); Log.Out(Logs::Detail, Logs::UCS_Server, "Client %s already in channel %s", c->GetName().c_str(), GetName().c_str());
return; return;
} }
bool HideMe = c->GetHideMe(); bool HideMe = c->GetHideMe();
int AccountStatus = c->GetAccountStatus(); int AccountStatus = c->GetAccountStatus();
Log.Out(Logs::Detail, Logs::UCS_Server, "Adding %s to channel %s", c->GetName().c_str(), Name.c_str()); Log.Out(Logs::Detail, Logs::UCS_Server, "Adding %s to channel %s", c->GetName().c_str(), Name.c_str());
LinkedListIterator<Client*> iterator(ClientsInChannel); LinkedListIterator<Client*> iterator(ClientsInChannel);
iterator.Reset(); iterator.Reset();
while(iterator.MoreElements()) { while(iterator.MoreElements()) {
Client *CurrentClient = iterator.GetData(); Client *CurrentClient = iterator.GetData();
if(CurrentClient && CurrentClient->IsAnnounceOn()) if(CurrentClient && CurrentClient->IsAnnounceOn())
if(!HideMe || (CurrentClient->GetAccountStatus() > AccountStatus)) if(!HideMe || (CurrentClient->GetAccountStatus() > AccountStatus))
CurrentClient->AnnounceJoin(this, c); CurrentClient->AnnounceJoin(this, c);
iterator.Advance(); iterator.Advance();
} }
ClientsInChannel.Insert(c); ClientsInChannel.Insert(c);
} }
bool ChatChannel::RemoveClient(Client *c) { bool ChatChannel::RemoveClient(Client *c) {
_eqp
if(!c) return false; if(!c)
return false;
Log.Out(Logs::Detail, Logs::UCS_Server, "RemoveClient %s from channel %s", c->GetName().c_str(), GetName().c_str()); Log.Out(Logs::Detail, Logs::UCS_Server, "RemoveClient %s from channel %s", c->GetName().c_str(), GetName().c_str());
bool HideMe = c->GetHideMe(); bool HideMe = c->GetHideMe();
int AccountStatus = c->GetAccountStatus(); int AccountStatus = c->GetAccountStatus();
int PlayersInChannel = 0; int PlayersInChannel = 0;
LinkedListIterator<Client*> iterator(ClientsInChannel); LinkedListIterator<Client*> iterator(ClientsInChannel);
iterator.Reset(); iterator.Reset();
while(iterator.MoreElements()) { while(iterator.MoreElements()) {
Client *CurrentClient = iterator.GetData(); Client *CurrentClient = iterator.GetData();
if(CurrentClient == c) { if(CurrentClient == c) {
iterator.RemoveCurrent(false); iterator.RemoveCurrent(false);
} }
else if(CurrentClient) { else if(CurrentClient) {
PlayersInChannel++; PlayersInChannel++;
if(CurrentClient->IsAnnounceOn()) if(CurrentClient->IsAnnounceOn())
@@ -295,12 +255,10 @@ bool ChatChannel::RemoveClient(Client *c) {
} }
if((PlayersInChannel == 0) && !Permanent) { if((PlayersInChannel == 0) && !Permanent) {
if((Password.length() == 0) || (RuleI(Channels, DeleteTimer) == 0)) if((Password.length() == 0) || (RuleI(Channels, DeleteTimer) == 0))
return false; return false;
Log.Out(Logs::Detail, Logs::UCS_Server, "Starting delete timer for empty password protected channel %s", Name.c_str()); Log.Out(Logs::Detail, Logs::UCS_Server, "Starting delete timer for empty password protected channel %s", Name.c_str());
DeleteTimer.Start(RuleI(Channels, DeleteTimer) * 60000); DeleteTimer.Start(RuleI(Channels, DeleteTimer) * 60000);
} }
@@ -308,46 +266,40 @@ bool ChatChannel::RemoveClient(Client *c) {
} }
void ChatChannel::SendOPList(Client *c) { void ChatChannel::SendOPList(Client *c) {
_eqp
if(!c) return; if(!c)
return;
c->GeneralChannelMessage("Channel " + Name + " op-list: (Owner=" + Owner + ")"); c->GeneralChannelMessage("Channel " + Name + " op-list: (Owner=" + Owner + ")");
std::list<std::string>::iterator Iterator; std::list<std::string>::iterator Iterator;
for(Iterator = Moderators.begin(); Iterator != Moderators.end(); ++Iterator) for(Iterator = Moderators.begin(); Iterator != Moderators.end(); ++Iterator)
c->GeneralChannelMessage((*Iterator)); c->GeneralChannelMessage((*Iterator));
} }
void ChatChannel::SendChannelMembers(Client *c) { void ChatChannel::SendChannelMembers(Client *c) {
_eqp
if(!c) return; if(!c)
return;
char CountString[10]; char CountString[10];
sprintf(CountString, "(%i)", MemberCount(c->GetAccountStatus())); sprintf(CountString, "(%i)", MemberCount(c->GetAccountStatus()));
std::string Message = "Channel " + GetName(); std::string Message = "Channel " + GetName();
Message += CountString; Message += CountString;
Message += " members:"; Message += " members:";
c->GeneralChannelMessage(Message); c->GeneralChannelMessage(Message);
int AccountStatus = c->GetAccountStatus(); int AccountStatus = c->GetAccountStatus();
Message.clear(); Message.clear();
int MembersInLine = 0; int MembersInLine = 0;
LinkedListIterator<Client*> iterator(ClientsInChannel); LinkedListIterator<Client*> iterator(ClientsInChannel);
iterator.Reset(); iterator.Reset();
while(iterator.MoreElements()) { while(iterator.MoreElements()) {
Client *ChannelClient = iterator.GetData(); Client *ChannelClient = iterator.GetData();
// Don't list hidden characters with status higher or equal than the character requesting the list. // Don't list hidden characters with status higher or equal than the character requesting the list.
@@ -361,15 +313,11 @@ void ChatChannel::SendChannelMembers(Client *c) {
Message += ", "; Message += ", ";
Message += ChannelClient->GetName(); Message += ChannelClient->GetName();
MembersInLine++; MembersInLine++;
if(MembersInLine == 6) { if(MembersInLine == 6) {
c->GeneralChannelMessage(Message); c->GeneralChannelMessage(Message);
MembersInLine = 0; MembersInLine = 0;
Message.clear(); Message.clear();
} }
@@ -378,23 +326,22 @@ void ChatChannel::SendChannelMembers(Client *c) {
if(MembersInLine > 0) if(MembersInLine > 0)
c->GeneralChannelMessage(Message); c->GeneralChannelMessage(Message);
} }
void ChatChannel::SendMessageToChannel(std::string Message, Client* Sender) { void ChatChannel::SendMessageToChannel(std::string Message, Client* Sender) {
_eqp
if(!Sender) return; if(!Sender)
return;
ChatMessagesSent++; ChatMessagesSent++;
LinkedListIterator<Client*> iterator(ClientsInChannel); LinkedListIterator<Client*> iterator(ClientsInChannel);
iterator.Reset(); iterator.Reset();
while(iterator.MoreElements()) { while(iterator.MoreElements()) {
Client *ChannelClient = iterator.GetData(); Client *ChannelClient = iterator.GetData();
if(ChannelClient) if(ChannelClient)
{ {
Log.Out(Logs::Detail, Logs::UCS_Server, "Sending message to %s from %s", Log.Out(Logs::Detail, Logs::UCS_Server, "Sending message to %s from %s",
@@ -407,19 +354,16 @@ void ChatChannel::SendMessageToChannel(std::string Message, Client* Sender) {
} }
void ChatChannel::SetModerated(bool inModerated) { void ChatChannel::SetModerated(bool inModerated) {
_eqp
Moderated = inModerated; Moderated = inModerated;
LinkedListIterator<Client*> iterator(ClientsInChannel); LinkedListIterator<Client*> iterator(ClientsInChannel);
iterator.Reset(); iterator.Reset();
while(iterator.MoreElements()) { while(iterator.MoreElements()) {
Client *ChannelClient = iterator.GetData(); Client *ChannelClient = iterator.GetData();
if(ChannelClient) { if(ChannelClient) {
if(Moderated) if(Moderated)
ChannelClient->GeneralChannelMessage("Channel " + Name + " is now moderated."); ChannelClient->GeneralChannelMessage("Channel " + Name + " is now moderated.");
else else
@@ -428,18 +372,17 @@ void ChatChannel::SetModerated(bool inModerated) {
iterator.Advance(); iterator.Advance();
} }
} }
bool ChatChannel::IsClientInChannel(Client *c) { bool ChatChannel::IsClientInChannel(Client *c) {
_eqp
if(!c) return false; if(!c)
return false;
LinkedListIterator<Client*> iterator(ClientsInChannel); LinkedListIterator<Client*> iterator(ClientsInChannel);
iterator.Reset(); iterator.Reset();
while(iterator.MoreElements()) { while(iterator.MoreElements()) {
if(iterator.GetData() == c) if(iterator.GetData() == c)
return true; return true;
@@ -450,18 +393,18 @@ bool ChatChannel::IsClientInChannel(Client *c) {
} }
ChatChannel *ChatChannelList::AddClientToChannel(std::string ChannelName, Client *c) { ChatChannel *ChatChannelList::AddClientToChannel(std::string ChannelName, Client *c) {
_eqp
if(!c) return nullptr; if(!c)
return nullptr;
if((ChannelName.length() > 0) && (isdigit(ChannelName[0]))) { if((ChannelName.length() > 0) && (isdigit(ChannelName[0]))) {
c->GeneralChannelMessage("The channel name can not begin with a number."); c->GeneralChannelMessage("The channel name can not begin with a number.");
return nullptr; return nullptr;
} }
std::string NormalisedName, Password; std::string NormalisedName, Password;
std::string::size_type Colon = ChannelName.find_first_of(":"); std::string::size_type Colon = ChannelName.find_first_of(":");
if(Colon == std::string::npos) if(Colon == std::string::npos)
@@ -473,9 +416,7 @@ ChatChannel *ChatChannelList::AddClientToChannel(std::string ChannelName, Client
} }
if((NormalisedName.length() > 64) || (Password.length() > 64)) { if((NormalisedName.length() > 64) || (Password.length() > 64)) {
c->GeneralChannelMessage("The channel name or password cannot exceed 64 characters."); c->GeneralChannelMessage("The channel name or password cannot exceed 64 characters.");
return nullptr; return nullptr;
} }
@@ -487,11 +428,8 @@ ChatChannel *ChatChannelList::AddClientToChannel(std::string ChannelName, Client
RequiredChannel = CreateChannel(NormalisedName, c->GetName(), Password, false, 0); RequiredChannel = CreateChannel(NormalisedName, c->GetName(), Password, false, 0);
if(RequiredChannel->GetMinStatus() > c->GetAccountStatus()) { if(RequiredChannel->GetMinStatus() > c->GetAccountStatus()) {
std::string Message = "You do not have the required account status to join channel " + NormalisedName; std::string Message = "You do not have the required account status to join channel " + NormalisedName;
c->GeneralChannelMessage(Message); c->GeneralChannelMessage(Message);
return nullptr; return nullptr;
} }
@@ -499,19 +437,14 @@ ChatChannel *ChatChannelList::AddClientToChannel(std::string ChannelName, Client
return nullptr; return nullptr;
if(RequiredChannel->IsInvitee(c->GetName())) { if(RequiredChannel->IsInvitee(c->GetName())) {
RequiredChannel->AddClient(c); RequiredChannel->AddClient(c);
RequiredChannel->RemoveInvitee(c->GetName()); RequiredChannel->RemoveInvitee(c->GetName());
return RequiredChannel; return RequiredChannel;
} }
if(RequiredChannel->CheckPassword(Password) || RequiredChannel->IsOwner(c->GetName()) || RequiredChannel->IsModerator(c->GetName()) || if(RequiredChannel->CheckPassword(Password) || RequiredChannel->IsOwner(c->GetName()) || RequiredChannel->IsModerator(c->GetName()) ||
c->IsChannelAdmin()) { c->IsChannelAdmin()) {
RequiredChannel->AddClient(c); RequiredChannel->AddClient(c);
return RequiredChannel; return RequiredChannel;
} }
@@ -521,8 +454,10 @@ ChatChannel *ChatChannelList::AddClientToChannel(std::string ChannelName, Client
} }
ChatChannel *ChatChannelList::RemoveClientFromChannel(std::string inChannelName, Client *c) { ChatChannel *ChatChannelList::RemoveClientFromChannel(std::string inChannelName, Client *c) {
_eqp
if(!c) return nullptr; if(!c)
return nullptr;
std::string ChannelName = inChannelName; std::string ChannelName = inChannelName;
@@ -530,7 +465,6 @@ ChatChannel *ChatChannelList::RemoveClientFromChannel(std::string inChannelName,
ChannelName = c->ChannelSlotName(atoi(inChannelName.c_str())); ChannelName = c->ChannelSlotName(atoi(inChannelName.c_str()));
ChatChannel *RequiredChannel = FindChannel(ChannelName); ChatChannel *RequiredChannel = FindChannel(ChannelName);
if(!RequiredChannel) if(!RequiredChannel)
return nullptr; return nullptr;
@@ -544,62 +478,53 @@ ChatChannel *ChatChannelList::RemoveClientFromChannel(std::string inChannelName,
} }
void ChatChannelList::Process() { void ChatChannelList::Process() {
_eqp
LinkedListIterator<ChatChannel*> iterator(ChatChannels); LinkedListIterator<ChatChannel*> iterator(ChatChannels);
iterator.Reset(); iterator.Reset();
while(iterator.MoreElements()) { while(iterator.MoreElements()) {
ChatChannel *CurrentChannel = iterator.GetData(); ChatChannel *CurrentChannel = iterator.GetData();
if(CurrentChannel && CurrentChannel->ReadyToDelete()) { if(CurrentChannel && CurrentChannel->ReadyToDelete()) {
Log.Out(Logs::Detail, Logs::UCS_Server, "Empty temporary password protected channel %s being destroyed.", Log.Out(Logs::Detail, Logs::UCS_Server, "Empty temporary password protected channel %s being destroyed.",
CurrentChannel->GetName().c_str()); CurrentChannel->GetName().c_str());
RemoveChannel(CurrentChannel); RemoveChannel(CurrentChannel);
} }
iterator.Advance(); iterator.Advance();
} }
} }
void ChatChannel::AddInvitee(std::string Invitee) { void ChatChannel::AddInvitee(std::string Invitee) {
_eqp
if(!IsInvitee(Invitee)) { if(!IsInvitee(Invitee)) {
Invitees.push_back(Invitee); Invitees.push_back(Invitee);
Log.Out(Logs::Detail, Logs::UCS_Server, "Added %s as invitee to channel %s", Invitee.c_str(), Name.c_str()); Log.Out(Logs::Detail, Logs::UCS_Server, "Added %s as invitee to channel %s", Invitee.c_str(), Name.c_str());
} }
} }
void ChatChannel::RemoveInvitee(std::string Invitee) { void ChatChannel::RemoveInvitee(std::string Invitee) {
_eqp
std::list<std::string>::iterator Iterator; std::list<std::string>::iterator Iterator;
for(Iterator = Invitees.begin(); Iterator != Invitees.end(); ++Iterator) { for(Iterator = Invitees.begin(); Iterator != Invitees.end(); ++Iterator) {
if((*Iterator) == Invitee) { if((*Iterator) == Invitee) {
Invitees.erase(Iterator); Invitees.erase(Iterator);
Log.Out(Logs::Detail, Logs::UCS_Server, "Removed %s as invitee to channel %s", Invitee.c_str(), Name.c_str()); Log.Out(Logs::Detail, Logs::UCS_Server, "Removed %s as invitee to channel %s", Invitee.c_str(), Name.c_str());
return; return;
} }
} }
} }
bool ChatChannel::IsInvitee(std::string Invitee) { bool ChatChannel::IsInvitee(std::string Invitee) {
_eqp
std::list<std::string>::iterator Iterator; std::list<std::string>::iterator Iterator;
for(Iterator = Invitees.begin(); Iterator != Invitees.end(); ++Iterator) { for(Iterator = Invitees.begin(); Iterator != Invitees.end(); ++Iterator) {
if((*Iterator) == Invitee) if((*Iterator) == Invitee)
return true; return true;
} }
@@ -608,80 +533,66 @@ bool ChatChannel::IsInvitee(std::string Invitee) {
} }
void ChatChannel::AddModerator(std::string Moderator) { void ChatChannel::AddModerator(std::string Moderator) {
_eqp
if(!IsModerator(Moderator)) { if(!IsModerator(Moderator)) {
Moderators.push_back(Moderator); Moderators.push_back(Moderator);
Log.Out(Logs::Detail, Logs::UCS_Server, "Added %s as moderator to channel %s", Moderator.c_str(), Name.c_str()); Log.Out(Logs::Detail, Logs::UCS_Server, "Added %s as moderator to channel %s", Moderator.c_str(), Name.c_str());
} }
} }
void ChatChannel::RemoveModerator(std::string Moderator) { void ChatChannel::RemoveModerator(std::string Moderator) {
_eqp
std::list<std::string>::iterator Iterator; std::list<std::string>::iterator Iterator;
for(Iterator = Moderators.begin(); Iterator != Moderators.end(); ++Iterator) { for(Iterator = Moderators.begin(); Iterator != Moderators.end(); ++Iterator) {
if((*Iterator) == Moderator) { if((*Iterator) == Moderator) {
Moderators.erase(Iterator); Moderators.erase(Iterator);
Log.Out(Logs::Detail, Logs::UCS_Server, "Removed %s as moderator to channel %s", Moderator.c_str(), Name.c_str()); Log.Out(Logs::Detail, Logs::UCS_Server, "Removed %s as moderator to channel %s", Moderator.c_str(), Name.c_str());
return; return;
} }
} }
} }
bool ChatChannel::IsModerator(std::string Moderator) { bool ChatChannel::IsModerator(std::string Moderator) {
_eqp
std::list<std::string>::iterator Iterator; std::list<std::string>::iterator Iterator;
for(Iterator = Moderators.begin(); Iterator != Moderators.end(); ++Iterator) { for(Iterator = Moderators.begin(); Iterator != Moderators.end(); ++Iterator) {
if((*Iterator) == Moderator) if((*Iterator) == Moderator)
return true; return true;
} }
return false; return false;
} }
void ChatChannel::AddVoice(std::string inVoiced) { void ChatChannel::AddVoice(std::string inVoiced) {
_eqp
if(!HasVoice(inVoiced)) { if(!HasVoice(inVoiced)) {
Voiced.push_back(inVoiced); Voiced.push_back(inVoiced);
Log.Out(Logs::Detail, Logs::UCS_Server, "Added %s as voiced to channel %s", inVoiced.c_str(), Name.c_str()); Log.Out(Logs::Detail, Logs::UCS_Server, "Added %s as voiced to channel %s", inVoiced.c_str(), Name.c_str());
} }
} }
void ChatChannel::RemoveVoice(std::string inVoiced) { void ChatChannel::RemoveVoice(std::string inVoiced) {
_eqp
std::list<std::string>::iterator Iterator; std::list<std::string>::iterator Iterator;
for(Iterator = Voiced.begin(); Iterator != Voiced.end(); ++Iterator) { for(Iterator = Voiced.begin(); Iterator != Voiced.end(); ++Iterator) {
if((*Iterator) == inVoiced) { if((*Iterator) == inVoiced) {
Voiced.erase(Iterator); Voiced.erase(Iterator);
Log.Out(Logs::Detail, Logs::UCS_Server, "Removed %s as voiced to channel %s", inVoiced.c_str(), Name.c_str()); Log.Out(Logs::Detail, Logs::UCS_Server, "Removed %s as voiced to channel %s", inVoiced.c_str(), Name.c_str());
return; return;
} }
} }
} }
bool ChatChannel::HasVoice(std::string inVoiced) { bool ChatChannel::HasVoice(std::string inVoiced) {
_eqp
std::list<std::string>::iterator Iterator; std::list<std::string>::iterator Iterator;
for(Iterator = Voiced.begin(); Iterator != Voiced.end(); ++Iterator) { for(Iterator = Voiced.begin(); Iterator != Voiced.end(); ++Iterator) {
if((*Iterator) == inVoiced) if((*Iterator) == inVoiced)
return true; return true;
} }
@@ -690,9 +601,9 @@ bool ChatChannel::HasVoice(std::string inVoiced) {
} }
std::string CapitaliseName(std::string inString) { std::string CapitaliseName(std::string inString) {
_eqp
std::string NormalisedName = inString; std::string NormalisedName = inString;
for(unsigned int i = 0; i < NormalisedName.length(); i++) { for(unsigned int i = 0; i < NormalisedName.length(); i++) {
if(i == 0) if(i == 0)
+74 -10
View File
@@ -43,8 +43,10 @@ extern uint32 ChatMessagesSent;
extern uint32 MailMessagesSent; extern uint32 MailMessagesSent;
int LookupCommand(const char *ChatCommand) { int LookupCommand(const char *ChatCommand) {
_eqp
if(!ChatCommand) return -1; if(!ChatCommand)
return -1;
for(int i = 0; i < CommandEndOfList; i++) { for(int i = 0; i < CommandEndOfList; i++) {
@@ -56,6 +58,7 @@ int LookupCommand(const char *ChatCommand) {
} }
void Client::SendUptime() { void Client::SendUptime() {
_eqp
uint32 ms = Timer::GetCurrentTime(); uint32 ms = Timer::GetCurrentTime();
uint32 d = ms / 86400000; uint32 d = ms / 86400000;
@@ -77,6 +80,7 @@ void Client::SendUptime() {
} }
std::vector<std::string> ParseRecipients(std::string RecipientString) { std::vector<std::string> ParseRecipients(std::string RecipientString) {
_eqp
// This method parses the Recipient List in the mailto command, which can look like this example: // This method parses the Recipient List in the mailto command, which can look like this example:
// //
@@ -235,6 +239,7 @@ std::vector<std::string> ParseRecipients(std::string RecipientString) {
} }
static void ProcessMailTo(Client *c, std::string MailMessage) { static void ProcessMailTo(Client *c, std::string MailMessage) {
_eqp
Log.Out(Logs::Detail, Logs::UCS_Server, "MAILTO: From %s, %s", c->MailBoxName().c_str(), MailMessage.c_str()); Log.Out(Logs::Detail, Logs::UCS_Server, "MAILTO: From %s, %s", c->MailBoxName().c_str(), MailMessage.c_str());
@@ -351,9 +356,11 @@ static void ProcessMailTo(Client *c, std::string MailMessage) {
} }
static void ProcessMailTo(Client *c, std::string from, std::string subject, std::string message) { static void ProcessMailTo(Client *c, std::string from, std::string subject, std::string message) {
_eqp
} }
static void ProcessSetMessageStatus(std::string SetMessageCommand) { static void ProcessSetMessageStatus(std::string SetMessageCommand) {
_eqp
int MessageNumber; int MessageNumber;
@@ -397,6 +404,7 @@ static void ProcessSetMessageStatus(std::string SetMessageCommand) {
} }
static void ProcessCommandBuddy(Client *c, std::string Buddy) { static void ProcessCommandBuddy(Client *c, std::string Buddy) {
_eqp
Log.Out(Logs::Detail, Logs::UCS_Server, "Received buddy command with parameters %s", Buddy.c_str()); Log.Out(Logs::Detail, Logs::UCS_Server, "Received buddy command with parameters %s", Buddy.c_str());
c->GeneralChannelMessage("Buddy list modified"); c->GeneralChannelMessage("Buddy list modified");
@@ -426,6 +434,7 @@ static void ProcessCommandBuddy(Client *c, std::string Buddy) {
} }
static void ProcessCommandIgnore(Client *c, std::string Ignoree) { static void ProcessCommandIgnore(Client *c, std::string Ignoree) {
_eqp
Log.Out(Logs::Detail, Logs::UCS_Server, "Received ignore command with parameters %s", Ignoree.c_str()); Log.Out(Logs::Detail, Logs::UCS_Server, "Received ignore command with parameters %s", Ignoree.c_str());
c->GeneralChannelMessage("Ignore list modified"); c->GeneralChannelMessage("Ignore list modified");
@@ -468,7 +477,8 @@ static void ProcessCommandIgnore(Client *c, std::string Ignoree) {
} }
Clientlist::Clientlist(int ChatPort) { Clientlist::Clientlist(int ChatPort) {
_eqp
chatsf = new EQStreamFactory(ChatStream, ChatPort, 45000); chatsf = new EQStreamFactory(ChatStream, ChatPort, 45000);
ChatOpMgr = new RegularOpcodeManager; ChatOpMgr = new RegularOpcodeManager;
@@ -486,6 +496,7 @@ Clientlist::Clientlist(int ChatPort) {
} }
Client::Client(std::shared_ptr<EQStream> eqs) { Client::Client(std::shared_ptr<EQStream> eqs) {
_eqp
ClientStream = eqs; ClientStream = eqs;
@@ -518,6 +529,7 @@ Client::Client(std::shared_ptr<EQStream> eqs) {
} }
Client::~Client() { Client::~Client() {
_eqp
CloseConnection(); CloseConnection();
@@ -537,6 +549,7 @@ Client::~Client() {
} }
void Client::CloseConnection() { void Client::CloseConnection() {
_eqp
ClientStream->RemoveData(); ClientStream->RemoveData();
@@ -546,8 +559,10 @@ void Client::CloseConnection() {
} }
void Clientlist::CheckForStaleConnections(Client *c) { void Clientlist::CheckForStaleConnections(Client *c) {
_eqp
if(!c) return; if(!c)
return;
std::list<Client*>::iterator Iterator; std::list<Client*>::iterator Iterator;
@@ -573,6 +588,7 @@ void Clientlist::CheckForStaleConnections(Client *c) {
} }
void Clientlist::Process() { void Clientlist::Process() {
_eqp
std::shared_ptr<EQStream> eqs; std::shared_ptr<EQStream> eqs;
@@ -731,6 +747,7 @@ void Clientlist::Process() {
void Clientlist::ProcessOPMailCommand(Client *c, std::string CommandString) void Clientlist::ProcessOPMailCommand(Client *c, std::string CommandString)
{ {
_eqp
if(CommandString.length() == 0) if(CommandString.length() == 0)
return; return;
@@ -885,7 +902,7 @@ void Clientlist::ProcessOPMailCommand(Client *c, std::string CommandString)
} }
void Clientlist::CloseAllConnections() { void Clientlist::CloseAllConnections() {
_eqp
std::list<Client*>::iterator Iterator; std::list<Client*>::iterator Iterator;
@@ -898,8 +915,10 @@ void Clientlist::CloseAllConnections() {
} }
void Client::AddCharacter(int CharID, const char *CharacterName, int Level) { void Client::AddCharacter(int CharID, const char *CharacterName, int Level) {
_eqp
if(!CharacterName) return; if(!CharacterName)
return;
Log.Out(Logs::Detail, Logs::UCS_Server, "Adding character %s with ID %i for %s", CharacterName, CharID, GetName().c_str()); Log.Out(Logs::Detail, Logs::UCS_Server, "Adding character %s with ID %i for %s", CharacterName, CharID, GetName().c_str());
CharacterEntry NewCharacter; CharacterEntry NewCharacter;
NewCharacter.CharID = CharID; NewCharacter.CharID = CharID;
@@ -910,6 +929,7 @@ void Client::AddCharacter(int CharID, const char *CharacterName, int Level) {
} }
void Client::SendMailBoxes() { void Client::SendMailBoxes() {
_eqp
int Count = Characters.size(); int Count = Characters.size();
@@ -945,6 +965,7 @@ void Client::SendMailBoxes() {
} }
Client *Clientlist::FindCharacter(std::string CharacterName) { Client *Clientlist::FindCharacter(std::string CharacterName) {
_eqp
std::list<Client*>::iterator Iterator; std::list<Client*>::iterator Iterator;
@@ -959,8 +980,10 @@ Client *Clientlist::FindCharacter(std::string CharacterName) {
} }
void Client::AddToChannelList(ChatChannel *JoinedChannel) { void Client::AddToChannelList(ChatChannel *JoinedChannel) {
_eqp
if(!JoinedChannel) return; if(!JoinedChannel)
return;
for(int i = 0; i < MAX_JOINED_CHANNELS; i++) for(int i = 0; i < MAX_JOINED_CHANNELS; i++)
if(JoinedChannels[i] == nullptr) { if(JoinedChannels[i] == nullptr) {
@@ -971,6 +994,7 @@ void Client::AddToChannelList(ChatChannel *JoinedChannel) {
} }
void Client::RemoveFromChannelList(ChatChannel *JoinedChannel) { void Client::RemoveFromChannelList(ChatChannel *JoinedChannel) {
_eqp
for(int i = 0; i < MAX_JOINED_CHANNELS; i++) for(int i = 0; i < MAX_JOINED_CHANNELS; i++)
if(JoinedChannels[i] == JoinedChannel) { if(JoinedChannels[i] == JoinedChannel) {
@@ -987,6 +1011,7 @@ void Client::RemoveFromChannelList(ChatChannel *JoinedChannel) {
} }
int Client::ChannelCount() { int Client::ChannelCount() {
_eqp
int NumberOfChannels = 0; int NumberOfChannels = 0;
@@ -999,6 +1024,7 @@ int Client::ChannelCount() {
} }
void Client::JoinChannels(std::string ChannelNameList) { void Client::JoinChannels(std::string ChannelNameList) {
_eqp
for (auto &elem : ChannelNameList) { for (auto &elem : ChannelNameList) {
if (elem == '%') { if (elem == '%') {
@@ -1104,6 +1130,7 @@ void Client::JoinChannels(std::string ChannelNameList) {
} }
void Client::LeaveChannels(std::string ChannelNameList) { void Client::LeaveChannels(std::string ChannelNameList) {
_eqp
Log.Out(Logs::Detail, Logs::UCS_Server, "Client: %s leaving channels %s", GetName().c_str(), ChannelNameList.c_str()); Log.Out(Logs::Detail, Logs::UCS_Server, "Client: %s leaving channels %s", GetName().c_str(), ChannelNameList.c_str());
@@ -1189,6 +1216,7 @@ void Client::LeaveChannels(std::string ChannelNameList) {
} }
void Client::LeaveAllChannels(bool SendUpdatedChannelList) { void Client::LeaveAllChannels(bool SendUpdatedChannelList) {
_eqp
for (auto &elem : JoinedChannels) { for (auto &elem : JoinedChannels) {
@@ -1206,6 +1234,7 @@ void Client::LeaveAllChannels(bool SendUpdatedChannelList) {
void Client::ProcessChannelList(std::string Input) { void Client::ProcessChannelList(std::string Input) {
_eqp
if(Input.length() == 0) { if(Input.length() == 0) {
@@ -1230,6 +1259,7 @@ void Client::ProcessChannelList(std::string Input) {
void Client::SendChannelList() { void Client::SendChannelList() {
_eqp
std::string ChannelMessage; std::string ChannelMessage;
@@ -1273,6 +1303,7 @@ void Client::SendChannelList() {
void Client::SendChannelMessage(std::string Message) void Client::SendChannelMessage(std::string Message)
{ {
_eqp
std::string::size_type MessageStart = Message.find_first_of(" "); std::string::size_type MessageStart = Message.find_first_of(" ");
@@ -1372,6 +1403,7 @@ void Client::SendChannelMessage(std::string Message)
} }
void Client::SendChannelMessageByNumber(std::string Message) { void Client::SendChannelMessageByNumber(std::string Message) {
_eqp
std::string::size_type MessageStart = Message.find_first_of(" "); std::string::size_type MessageStart = Message.find_first_of(" ");
@@ -1484,8 +1516,10 @@ void Client::SendChannelMessageByNumber(std::string Message) {
} }
void Client::SendChannelMessage(std::string ChannelName, std::string Message, Client *Sender) { void Client::SendChannelMessage(std::string ChannelName, std::string Message, Client *Sender) {
_eqp
if(!Sender) return; if(!Sender)
return;
std::string FQSenderName = WorldShortName + "." + Sender->GetName(); std::string FQSenderName = WorldShortName + "." + Sender->GetName();
@@ -1512,6 +1546,8 @@ void Client::SendChannelMessage(std::string ChannelName, std::string Message, Cl
void Client::ToggleAnnounce(std::string State) void Client::ToggleAnnounce(std::string State)
{ {
_eqp
if(State == "") if(State == "")
Announce = !Announce; Announce = !Announce;
else if(State == "on") else if(State == "on")
@@ -1530,8 +1566,10 @@ void Client::ToggleAnnounce(std::string State)
} }
void Client::AnnounceJoin(ChatChannel *Channel, Client *c) { void Client::AnnounceJoin(ChatChannel *Channel, Client *c) {
_eqp
if(!Channel || !c) return; if(!Channel || !c)
return;
int PacketLength = Channel->GetName().length() + c->GetName().length() + 2; int PacketLength = Channel->GetName().length() + c->GetName().length() + 2;
@@ -1549,8 +1587,10 @@ void Client::AnnounceJoin(ChatChannel *Channel, Client *c) {
} }
void Client::AnnounceLeave(ChatChannel *Channel, Client *c) { void Client::AnnounceLeave(ChatChannel *Channel, Client *c) {
_eqp
if(!Channel || !c) return; if(!Channel || !c)
return;
int PacketLength = Channel->GetName().length() + c->GetName().length() + 2; int PacketLength = Channel->GetName().length() + c->GetName().length() + 2;
@@ -1568,8 +1608,10 @@ void Client::AnnounceLeave(ChatChannel *Channel, Client *c) {
} }
void Client::GeneralChannelMessage(const char *Characters) { void Client::GeneralChannelMessage(const char *Characters) {
_eqp
if(!Characters) return; if(!Characters)
return;
std::string Message = Characters; std::string Message = Characters;
@@ -1578,6 +1620,7 @@ void Client::GeneralChannelMessage(const char *Characters) {
} }
void Client::GeneralChannelMessage(std::string Message) { void Client::GeneralChannelMessage(std::string Message) {
_eqp
auto outapp = new EQApplicationPacket(OP_ChannelMessage, Message.length() + 3); auto outapp = new EQApplicationPacket(OP_ChannelMessage, Message.length() + 3);
char *PacketBuffer = (char *)outapp->pBuffer; char *PacketBuffer = (char *)outapp->pBuffer;
@@ -1591,6 +1634,7 @@ void Client::GeneralChannelMessage(std::string Message) {
} }
void Client::SetChannelPassword(std::string ChannelPassword) { void Client::SetChannelPassword(std::string ChannelPassword) {
_eqp
std::string::size_type PasswordStart = ChannelPassword.find_first_not_of(" "); std::string::size_type PasswordStart = ChannelPassword.find_first_not_of(" ");
@@ -1655,6 +1699,7 @@ void Client::SetChannelPassword(std::string ChannelPassword) {
} }
void Client::SetChannelOwner(std::string CommandString) { void Client::SetChannelOwner(std::string CommandString) {
_eqp
std::string::size_type PlayerStart = CommandString.find_first_not_of(" "); std::string::size_type PlayerStart = CommandString.find_first_not_of(" ");
@@ -1718,6 +1763,7 @@ void Client::SetChannelOwner(std::string CommandString) {
} }
void Client::OPList(std::string CommandString) { void Client::OPList(std::string CommandString) {
_eqp
std::string::size_type ChannelStart = CommandString.find_first_not_of(" "); std::string::size_type ChannelStart = CommandString.find_first_not_of(" ");
@@ -1743,6 +1789,7 @@ void Client::OPList(std::string CommandString) {
} }
void Client::ChannelInvite(std::string CommandString) { void Client::ChannelInvite(std::string CommandString) {
_eqp
std::string::size_type PlayerStart = CommandString.find_first_not_of(" "); std::string::size_type PlayerStart = CommandString.find_first_not_of(" ");
@@ -1829,6 +1876,7 @@ void Client::ChannelInvite(std::string CommandString) {
} }
void Client::ChannelModerate(std::string CommandString) { void Client::ChannelModerate(std::string CommandString) {
_eqp
std::string::size_type ChannelStart = CommandString.find_first_not_of(" "); std::string::size_type ChannelStart = CommandString.find_first_not_of(" ");
@@ -1871,6 +1919,7 @@ void Client::ChannelModerate(std::string CommandString) {
} }
void Client::ChannelGrantModerator(std::string CommandString) { void Client::ChannelGrantModerator(std::string CommandString) {
_eqp
std::string::size_type PlayerStart = CommandString.find_first_not_of(" "); std::string::size_type PlayerStart = CommandString.find_first_not_of(" ");
@@ -1954,6 +2003,7 @@ void Client::ChannelGrantModerator(std::string CommandString) {
} }
void Client::ChannelGrantVoice(std::string CommandString) { void Client::ChannelGrantVoice(std::string CommandString) {
_eqp
std::string::size_type PlayerStart = CommandString.find_first_not_of(" "); std::string::size_type PlayerStart = CommandString.find_first_not_of(" ");
@@ -2041,6 +2091,7 @@ void Client::ChannelGrantVoice(std::string CommandString) {
} }
void Client::ChannelKick(std::string CommandString) { void Client::ChannelKick(std::string CommandString) {
_eqp
std::string::size_type PlayerStart = CommandString.find_first_not_of(" "); std::string::size_type PlayerStart = CommandString.find_first_not_of(" ");
@@ -2131,6 +2182,7 @@ void Client::ChannelKick(std::string CommandString) {
} }
void Client::ToggleInvites() { void Client::ToggleInvites() {
_eqp
AllowInvites = !AllowInvites; AllowInvites = !AllowInvites;
@@ -2142,6 +2194,7 @@ void Client::ToggleInvites() {
} }
std::string Client::ChannelSlotName(int SlotNumber) { std::string Client::ChannelSlotName(int SlotNumber) {
_eqp
if((SlotNumber < 1 ) || (SlotNumber > MAX_JOINED_CHANNELS)) if((SlotNumber < 1 ) || (SlotNumber > MAX_JOINED_CHANNELS))
return ""; return "";
@@ -2154,6 +2207,7 @@ std::string Client::ChannelSlotName(int SlotNumber) {
} }
void Client::SendHelp() { void Client::SendHelp() {
_eqp
GeneralChannelMessage("Chat Channel Commands:"); GeneralChannelMessage("Chat Channel Commands:");
@@ -2164,6 +2218,8 @@ void Client::SendHelp() {
void Client::AccountUpdate() void Client::AccountUpdate()
{ {
_eqp
if(AccountGrabUpdateTimer) if(AccountGrabUpdateTimer)
{ {
if(AccountGrabUpdateTimer->Check(false)) if(AccountGrabUpdateTimer->Check(false))
@@ -2175,6 +2231,7 @@ void Client::AccountUpdate()
} }
void Client::SetConnectionType(char c) { void Client::SetConnectionType(char c) {
_eqp
switch(c) switch(c)
{ {
@@ -2212,6 +2269,7 @@ void Client::SetConnectionType(char c) {
} }
Client *Clientlist::IsCharacterOnline(std::string CharacterName) { Client *Clientlist::IsCharacterOnline(std::string CharacterName) {
_eqp
// This method is used to determine if the character we are a sending an email to is connected to the mailserver, // This method is used to determine if the character we are a sending an email to is connected to the mailserver,
// so we can send them a new email notification. // so we can send them a new email notification.
@@ -2240,6 +2298,7 @@ Client *Clientlist::IsCharacterOnline(std::string CharacterName) {
} }
int Client::GetMailBoxNumber(std::string CharacterName) { int Client::GetMailBoxNumber(std::string CharacterName) {
_eqp
for(unsigned int i = 0; i < Characters.size(); i++) for(unsigned int i = 0; i < Characters.size(); i++)
if(Characters[i].Name == CharacterName) if(Characters[i].Name == CharacterName)
@@ -2249,6 +2308,7 @@ int Client::GetMailBoxNumber(std::string CharacterName) {
} }
void Client::SendNotification(int MailBoxNumber, std::string Subject, std::string From, int MessageID) { void Client::SendNotification(int MailBoxNumber, std::string Subject, std::string From, int MessageID) {
_eqp
char TimeStamp[100]; char TimeStamp[100];
@@ -2282,6 +2342,7 @@ void Client::SendNotification(int MailBoxNumber, std::string Subject, std::strin
} }
void Client::ChangeMailBox(int NewMailBox) { void Client::ChangeMailBox(int NewMailBox) {
_eqp
Log.Out(Logs::Detail, Logs::UCS_Server, "%s Change to mailbox %i", MailBoxName().c_str(), NewMailBox); Log.Out(Logs::Detail, Logs::UCS_Server, "%s Change to mailbox %i", MailBoxName().c_str(), NewMailBox);
@@ -2302,6 +2363,7 @@ void Client::ChangeMailBox(int NewMailBox) {
} }
void Client::SendFriends() { void Client::SendFriends() {
_eqp
std::vector<std::string> Friends, Ignorees; std::vector<std::string> Friends, Ignorees;
@@ -2355,6 +2417,7 @@ void Client::SendFriends() {
} }
std::string Client::MailBoxName() { std::string Client::MailBoxName() {
_eqp
if((Characters.size() == 0) || (CurrentMailBox > (Characters.size() - 1))) if((Characters.size() == 0) || (CurrentMailBox > (Characters.size() - 1)))
{ {
@@ -2372,6 +2435,7 @@ std::string Client::MailBoxName() {
} }
int Client::GetCharID() { int Client::GetCharID() {
_eqp
if(Characters.size() == 0) if(Characters.size() == 0)
return 0; return 0;
+25 -4
View File
@@ -55,6 +55,7 @@ extern uint32 MailMessagesSent;
Database::Database () Database::Database ()
{ {
_eqp
DBInitVars(); DBInitVars();
} }
@@ -64,12 +65,14 @@ Establish a connection to a mysql database with the supplied parameters
Database::Database(const char* host, const char* user, const char* passwd, const char* database, uint32 port) Database::Database(const char* host, const char* user, const char* passwd, const char* database, uint32 port)
{ {
_eqp
DBInitVars(); DBInitVars();
Connect(host, user, passwd, database, port); Connect(host, user, passwd, database, port);
} }
bool Database::Connect(const char* host, const char* user, const char* passwd, const char* database, uint32 port) bool Database::Connect(const char* host, const char* user, const char* passwd, const char* database, uint32 port)
{ {
_eqp
uint32 errnum= 0; uint32 errnum= 0;
char errbuf[MYSQL_ERRMSG_SIZE]; char errbuf[MYSQL_ERRMSG_SIZE];
if (!Open(host, user, passwd, database, port, &errnum, errbuf)) if (!Open(host, user, passwd, database, port, &errnum, errbuf))
@@ -87,12 +90,11 @@ bool Database::Connect(const char* host, const char* user, const char* passwd, c
} }
void Database::DBInitVars() { void Database::DBInitVars() {
_eqp
} }
void Database::HandleMysqlError(uint32 errnum) { void Database::HandleMysqlError(uint32 errnum) {
_eqp
} }
/* /*
@@ -101,9 +103,11 @@ Close the connection to the database
*/ */
Database::~Database() Database::~Database()
{ {
_eqp
} }
void Database::GetAccountStatus(Client *client) { void Database::GetAccountStatus(Client *client) {
_eqp
std::string query = StringFormat("SELECT `status`, `hideme`, `karma`, `revoked` " std::string query = StringFormat("SELECT `status`, `hideme`, `karma`, `revoked` "
"FROM `account` WHERE `id` = '%i' LIMIT 1", "FROM `account` WHERE `id` = '%i' LIMIT 1",
@@ -134,6 +138,7 @@ void Database::GetAccountStatus(Client *client) {
} }
int Database::FindAccount(const char *characterName, Client *client) { int Database::FindAccount(const char *characterName, Client *client) {
_eqp
Log.Out(Logs::Detail, Logs::UCS_Server, "FindAccount for character %s", characterName); Log.Out(Logs::Detail, Logs::UCS_Server, "FindAccount for character %s", characterName);
@@ -174,6 +179,7 @@ int Database::FindAccount(const char *characterName, Client *client) {
} }
bool Database::VerifyMailKey(std::string characterName, int IPAddress, std::string MailKey) { bool Database::VerifyMailKey(std::string characterName, int IPAddress, std::string MailKey) {
_eqp
std::string query = StringFormat("SELECT `mailkey` FROM `character_data` WHERE `name`='%s' LIMIT 1", std::string query = StringFormat("SELECT `mailkey` FROM `character_data` WHERE `name`='%s' LIMIT 1",
characterName.c_str()); characterName.c_str());
@@ -201,6 +207,7 @@ bool Database::VerifyMailKey(std::string characterName, int IPAddress, std::stri
} }
int Database::FindCharacter(const char *characterName) { int Database::FindCharacter(const char *characterName) {
_eqp
char *safeCharName = RemoveApostrophes(characterName); char *safeCharName = RemoveApostrophes(characterName);
std::string query = StringFormat("SELECT `id` FROM `character_data` WHERE `name`='%s' LIMIT 1", safeCharName); std::string query = StringFormat("SELECT `id` FROM `character_data` WHERE `name`='%s' LIMIT 1", safeCharName);
@@ -224,6 +231,7 @@ int Database::FindCharacter(const char *characterName) {
} }
bool Database::GetVariable(const char* varname, char* varvalue, uint16 varvalue_len) { bool Database::GetVariable(const char* varname, char* varvalue, uint16 varvalue_len) {
_eqp
std::string query = StringFormat("SELECT `value` FROM `variables` WHERE `varname` = '%s'", varname); std::string query = StringFormat("SELECT `value` FROM `variables` WHERE `varname` = '%s'", varname);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
@@ -242,6 +250,7 @@ bool Database::GetVariable(const char* varname, char* varvalue, uint16 varvalue_
} }
bool Database::LoadChatChannels() { bool Database::LoadChatChannels() {
_eqp
Log.Out(Logs::Detail, Logs::UCS_Server, "Loading chat channels from the database."); Log.Out(Logs::Detail, Logs::UCS_Server, "Loading chat channels from the database.");
@@ -263,6 +272,7 @@ bool Database::LoadChatChannels() {
} }
void Database::SetChannelPassword(std::string channelName, std::string password) { void Database::SetChannelPassword(std::string channelName, std::string password) {
_eqp
Log.Out(Logs::Detail, Logs::UCS_Server, "Database::SetChannelPassword(%s, %s)", channelName.c_str(), password.c_str()); Log.Out(Logs::Detail, Logs::UCS_Server, "Database::SetChannelPassword(%s, %s)", channelName.c_str(), password.c_str());
@@ -272,6 +282,7 @@ void Database::SetChannelPassword(std::string channelName, std::string password)
} }
void Database::SetChannelOwner(std::string channelName, std::string owner) { void Database::SetChannelOwner(std::string channelName, std::string owner) {
_eqp
Log.Out(Logs::Detail, Logs::UCS_Server, "Database::SetChannelOwner(%s, %s)", channelName.c_str(), owner.c_str()); Log.Out(Logs::Detail, Logs::UCS_Server, "Database::SetChannelOwner(%s, %s)", channelName.c_str(), owner.c_str());
@@ -281,6 +292,7 @@ void Database::SetChannelOwner(std::string channelName, std::string owner) {
} }
void Database::SendHeaders(Client *client) { void Database::SendHeaders(Client *client) {
_eqp
int unknownField2 = 25015275; int unknownField2 = 25015275;
int unknownField3 = 1; int unknownField3 = 1;
@@ -368,6 +380,7 @@ void Database::SendHeaders(Client *client) {
} }
void Database::SendBody(Client *client, int messageNumber) { void Database::SendBody(Client *client, int messageNumber) {
_eqp
int characterID = FindCharacter(client->MailBoxName().c_str()); int characterID = FindCharacter(client->MailBoxName().c_str());
@@ -415,6 +428,7 @@ void Database::SendBody(Client *client, int messageNumber) {
} }
bool Database::SendMail(std::string recipient, std::string from, std::string subject, std::string body, std::string recipientsString) { bool Database::SendMail(std::string recipient, std::string from, std::string subject, std::string body, std::string recipientsString) {
_eqp
int characterID; int characterID;
std::string characterName; std::string characterName;
@@ -474,6 +488,7 @@ bool Database::SendMail(std::string recipient, std::string from, std::string sub
} }
void Database::SetMessageStatus(int messageNumber, int status) { void Database::SetMessageStatus(int messageNumber, int status) {
_eqp
Log.Out(Logs::Detail, Logs::UCS_Server, "SetMessageStatus %i %i", messageNumber, status); Log.Out(Logs::Detail, Logs::UCS_Server, "SetMessageStatus %i %i", messageNumber, status);
@@ -488,6 +503,7 @@ void Database::SetMessageStatus(int messageNumber, int status) {
} }
void Database::ExpireMail() { void Database::ExpireMail() {
_eqp
Log.Out(Logs::Detail, Logs::UCS_Server, "Expiring mail..."); Log.Out(Logs::Detail, Logs::UCS_Server, "Expiring mail...");
@@ -530,6 +546,7 @@ void Database::ExpireMail() {
} }
void Database::AddFriendOrIgnore(int charID, int type, std::string name) { void Database::AddFriendOrIgnore(int charID, int type, std::string name) {
_eqp
std::string query = StringFormat("INSERT INTO `friends` (`charid`, `type`, `name`) " std::string query = StringFormat("INSERT INTO `friends` (`charid`, `type`, `name`) "
"VALUES('%i', %i, '%s')", "VALUES('%i', %i, '%s')",
@@ -541,6 +558,7 @@ void Database::AddFriendOrIgnore(int charID, int type, std::string name) {
} }
void Database::RemoveFriendOrIgnore(int charID, int type, std::string name) { void Database::RemoveFriendOrIgnore(int charID, int type, std::string name) {
_eqp
std::string query = StringFormat("DELETE FROM `friends` WHERE `charid` = %i " std::string query = StringFormat("DELETE FROM `friends` WHERE `charid` = %i "
"AND `type` = %i AND `name` = '%s'", "AND `type` = %i AND `name` = '%s'",
@@ -554,6 +572,7 @@ void Database::RemoveFriendOrIgnore(int charID, int type, std::string name) {
} }
void Database::GetFriendsAndIgnore(int charID, std::vector<std::string> &friends, std::vector<std::string> &ignorees) { void Database::GetFriendsAndIgnore(int charID, std::vector<std::string> &friends, std::vector<std::string> &ignorees) {
_eqp
std::string query = StringFormat("select `type`, `name` FROM `friends` WHERE `charid`=%i", charID); std::string query = StringFormat("select `type`, `name` FROM `friends` WHERE `charid`=%i", charID);
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
@@ -578,7 +597,9 @@ void Database::GetFriendsAndIgnore(int charID, std::vector<std::string> &friends
} }
void Database::LoadLogSettings(EQEmuLogSys::LogSettings* log_settings){ void Database::LoadLogSettings(EQEmuLogSys::LogSettings* log_settings) {
_eqp
std::string query = std::string query =
"SELECT " "SELECT "
"log_category_id, " "log_category_id, "
+20 -12
View File
@@ -19,13 +19,13 @@
#include "../common/eqemu_logsys.h" #include "../common/eqemu_logsys.h"
#include "../common/global_define.h" #include "../common/global_define.h"
#include "clientlist.h"
#include "../common/opcodemgr.h" #include "../common/opcodemgr.h"
#include "../common/eq_stream_factory.h" #include "../common/eq_stream_factory.h"
#include "../common/rulesys.h" #include "../common/rulesys.h"
#include "../common/servertalk.h" #include "../common/servertalk.h"
#include "../common/platform.h" #include "../common/platform.h"
#include "../common/crash.h" #include "../common/crash.h"
#include "clientlist.h"
#include "database.h" #include "database.h"
#include "ucsconfig.h" #include "ucsconfig.h"
#include "chatchannel.h" #include "chatchannel.h"
@@ -55,6 +55,8 @@ void CatchSignal(int sig_num) {
if(worldserver) if(worldserver)
worldserver->Disconnect(); worldserver->Disconnect();
_eqp_dump_file("ucs");
} }
std::string GetMailPrefix() { std::string GetMailPrefix() {
@@ -138,28 +140,33 @@ int main() {
Log.Out(Logs::General, Logs::UCS_Server, "Could not set signal handler"); Log.Out(Logs::General, Logs::UCS_Server, "Could not set signal handler");
return 1; return 1;
} }
if(signal(SIGBREAK, CatchSignal) == SIG_ERR) {
Log.Out(Logs::General, Logs::UCS_Server, "Could not set signal handler");
return 1;
}
worldserver = new WorldServer; worldserver = new WorldServer;
worldserver->Connect(); worldserver->Connect();
while(RunLoops) { while(RunLoops) {
{
_eqpn("Main loop");
Timer::SetCurrentTime();
Timer::SetCurrentTime(); CL->Process();
CL->Process(); if(ChannelListProcessTimer.Check())
ChannelList->Process();
if(ChannelListProcessTimer.Check()) if (InterserverTimer.Check()) {
ChannelList->Process(); if (worldserver->TryReconnect() && (!worldserver->Connected()))
worldserver->AsyncConnect();
}
worldserver->Process();
if (InterserverTimer.Check()) { timeout_manager.CheckTimeouts();
if (worldserver->TryReconnect() && (!worldserver->Connected()))
worldserver->AsyncConnect();
} }
worldserver->Process();
timeout_manager.CheckTimeouts();
Sleep(100); Sleep(100);
} }
@@ -172,6 +179,7 @@ int main() {
} }
void UpdateWindowTitle(char* iNewTitle) { void UpdateWindowTitle(char* iNewTitle) {
_eqp
#ifdef _WINDOWS #ifdef _WINDOWS
char tmp[500]; char tmp[500];
if (iNewTitle) { if (iNewTitle) {
+1
View File
@@ -23,6 +23,7 @@
ucsconfig *ucsconfig::_chat_config = nullptr; ucsconfig *ucsconfig::_chat_config = nullptr;
std::string ucsconfig::GetByName(const std::string &var_name) const { std::string ucsconfig::GetByName(const std::string &var_name) const {
_eqp
return(EQEmuConfig::GetByName(var_name)); return(EQEmuConfig::GetByName(var_name));
} }
+4
View File
@@ -43,21 +43,25 @@ void ProcessMailTo(Client *c, std::string from, std::string subject, std::string
WorldServer::WorldServer() WorldServer::WorldServer()
: WorldConnection(EmuTCPConnection::packetModeUCS, Config->SharedKey.c_str()) : WorldConnection(EmuTCPConnection::packetModeUCS, Config->SharedKey.c_str())
{ {
_eqp
pTryReconnect = true; pTryReconnect = true;
} }
WorldServer::~WorldServer() WorldServer::~WorldServer()
{ {
_eqp
} }
void WorldServer::OnConnected() void WorldServer::OnConnected()
{ {
_eqp
Log.Out(Logs::Detail, Logs::UCS_Server, "Connected to World."); Log.Out(Logs::Detail, Logs::UCS_Server, "Connected to World.");
WorldConnection::OnConnected(); WorldConnection::OnConnected();
} }
void WorldServer::Process() void WorldServer::Process()
{ {
_eqp
WorldConnection::Process(); WorldConnection::Process();
if (!Connected()) if (!Connected())
+4 -1
View File
@@ -68,15 +68,17 @@ INSTALL(TARGETS world RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX})
ADD_DEFINITIONS(-DWORLD) ADD_DEFINITIONS(-DWORLD)
TARGET_LINK_LIBRARIES(world common ${PERL_LIBRARY} debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE} ${ZLIB_LIBRARY}) TARGET_LINK_LIBRARIES(world common ${PERF_LIBS} ${PERL_LIBRARY} debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE} ${ZLIB_LIBRARY})
IF(MSVC) IF(MSVC)
SET_TARGET_PROPERTIES(world PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF") SET_TARGET_PROPERTIES(world PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF")
TARGET_LINK_LIBRARIES(world "Ws2_32.lib") TARGET_LINK_LIBRARIES(world "Ws2_32.lib")
TARGET_LINK_LIBRARIES(world "rpcrt4")
ENDIF(MSVC) ENDIF(MSVC)
IF(MINGW) IF(MINGW)
TARGET_LINK_LIBRARIES(world "WS2_32") TARGET_LINK_LIBRARIES(world "WS2_32")
TARGET_LINK_LIBRARIES(world "rpcrt4")
ENDIF(MINGW) ENDIF(MINGW)
IF(UNIX) IF(UNIX)
@@ -87,6 +89,7 @@ IF(UNIX)
TARGET_LINK_LIBRARIES(world "rt") TARGET_LINK_LIBRARIES(world "rt")
ENDIF(NOT DARWIN) ENDIF(NOT DARWIN)
TARGET_LINK_LIBRARIES(world "pthread") TARGET_LINK_LIBRARIES(world "pthread")
TARGET_LINK_LIBRARIES(world "uuid")
ADD_DEFINITIONS(-fPIC) ADD_DEFINITIONS(-fPIC)
ENDIF(UNIX) ENDIF(UNIX)
-22
View File
@@ -307,29 +307,7 @@ bool EQWHTTPServer::Start(uint16 port, const char *mime_file) {
m_running = true; m_running = true;
m_port = port; m_port = port;
/*
#ifdef _WINDOWS
_beginthread(ThreadProc, 0, this);
#else
pthread_create(&m_thread, nullptr, ThreadProc, this);
#endif*/
return(true); return(true);
} }
/*
void EQWHTTPServer::Run() {
Log.LogDebugType(Logs::Detail, Logs::World_Server, "HTTP Processing thread started on port %d", m_port);
do {
#warning DELETE THIS IF YOU DONT USE IT
Sleep(10);
} while(m_running);
Log.LogDebugType(Logs::Detail, Logs::World_Server, "HTTP Processing thread terminating on port %d", m_port);
}
ThreadReturnType EQWHTTPServer::ThreadProc(void *data) {
((EQWHTTPServer *) data)->Run();
THREAD_RETURN(nullptr);
}*/
+7 -3
View File
@@ -21,9 +21,7 @@
#include <string.h> #include <string.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <signal.h> #include <signal.h>
#include "../common/global_define.h" #include "../common/global_define.h"
#include "../common/eqemu_logsys.h" #include "../common/eqemu_logsys.h"
#include "../common/queue.h" #include "../common/queue.h"
@@ -34,7 +32,6 @@
#include "../common/version.h" #include "../common/version.h"
#include "../common/eqtime.h" #include "../common/eqtime.h"
#include "../common/timeoutmgr.h" #include "../common/timeoutmgr.h"
#include "../common/opcodemgr.h" #include "../common/opcodemgr.h"
#include "../common/guilds.h" #include "../common/guilds.h"
#include "../common/eq_stream_ident.h" #include "../common/eq_stream_ident.h"
@@ -43,6 +40,7 @@
#include "../common/crash.h" #include "../common/crash.h"
#include "client.h" #include "client.h"
#include "worlddb.h" #include "worlddb.h"
#ifdef _WINDOWS #ifdef _WINDOWS
#include <process.h> #include <process.h>
#define snprintf _snprintf #define snprintf _snprintf
@@ -147,6 +145,10 @@ int main(int argc, char** argv) {
Log.Out(Logs::General, Logs::World_Server, "Could not set signal handler"); Log.Out(Logs::General, Logs::World_Server, "Could not set signal handler");
return 1; return 1;
} }
if (signal(SIGBREAK, CatchSignal) == SIG_ERR) {
Log.Out(Logs::General, Logs::World_Server, "Could not set signal handler");
return 1;
}
#ifndef WIN32 #ifndef WIN32
if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) { if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) {
Log.Out(Logs::General, Logs::World_Server, "Could not set signal handler"); Log.Out(Logs::General, Logs::World_Server, "Could not set signal handler");
@@ -511,6 +513,8 @@ void CatchSignal(int sig_num) {
if(zoneserver_list.worldclock.saveFile(WorldConfig::get()->EQTimeFile.c_str())==false) if(zoneserver_list.worldclock.saveFile(WorldConfig::get()->EQTimeFile.c_str())==false)
Log.Out(Logs::General, Logs::World_Server,"Failed to save time file."); Log.Out(Logs::General, Logs::World_Server,"Failed to save time file.");
RunLoops = false; RunLoops = false;
_eqp_dump_file("world");
} }
void UpdateWindowTitle(char* iNewTitle) { void UpdateWindowTitle(char* iNewTitle) {
+4 -1
View File
@@ -219,7 +219,7 @@ INSTALL(TARGETS zone RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX})
ADD_DEFINITIONS(-DZONE) ADD_DEFINITIONS(-DZONE)
TARGET_LINK_LIBRARIES(zone common debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE} ${ZLIB_LIBRARY}) TARGET_LINK_LIBRARIES(zone common ${PERF_LIBS} debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE} ${ZLIB_LIBRARY})
IF(EQEMU_BUILD_PERL) IF(EQEMU_BUILD_PERL)
TARGET_LINK_LIBRARIES(zone ${PERL_LIBRARY}) TARGET_LINK_LIBRARIES(zone ${PERL_LIBRARY})
@@ -233,10 +233,12 @@ ENDIF(EQEMU_BUILD_LUA)
IF(MSVC) IF(MSVC)
SET_TARGET_PROPERTIES(zone PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF") SET_TARGET_PROPERTIES(zone PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF")
TARGET_LINK_LIBRARIES(zone "Ws2_32.lib") TARGET_LINK_LIBRARIES(zone "Ws2_32.lib")
TARGET_LINK_LIBRARIES(zone "rpcrt4")
ENDIF(MSVC) ENDIF(MSVC)
IF(MINGW) IF(MINGW)
TARGET_LINK_LIBRARIES(zone "WS2_32") TARGET_LINK_LIBRARIES(zone "WS2_32")
TARGET_LINK_LIBRARIES(zone "rpcrt4")
ENDIF(MINGW) ENDIF(MINGW)
IF(UNIX) IF(UNIX)
@@ -247,6 +249,7 @@ IF(UNIX)
TARGET_LINK_LIBRARIES(zone "rt") TARGET_LINK_LIBRARIES(zone "rt")
ENDIF(NOT DARWIN) ENDIF(NOT DARWIN)
TARGET_LINK_LIBRARIES(zone "pthread") TARGET_LINK_LIBRARIES(zone "pthread")
TARGET_LINK_LIBRARIES(zone "uuid")
ADD_DEFINITIONS(-fPIC) ADD_DEFINITIONS(-fPIC)
ENDIF(UNIX) ENDIF(UNIX)
-9
View File
@@ -41,7 +41,6 @@
#include "../common/data_verification.h" #include "../common/data_verification.h"
#include "../common/faction.h" #include "../common/faction.h"
#include "../common/guilds.h" #include "../common/guilds.h"
#include "../common/rdtsc.h"
#include "../common/rulesys.h" #include "../common/rulesys.h"
#include "../common/skills.h" #include "../common/skills.h"
#include "../common/spdat.h" #include "../common/spdat.h"
@@ -11968,8 +11967,6 @@ void Client::Handle_OP_ShopPlayerBuy(const EQApplicationPacket *app)
sizeof(Merchant_Sell_Struct), app->size); sizeof(Merchant_Sell_Struct), app->size);
return; return;
} }
RDTSC_Timer t1;
t1.start();
Merchant_Sell_Struct* mp = (Merchant_Sell_Struct*)app->pBuffer; Merchant_Sell_Struct* mp = (Merchant_Sell_Struct*)app->pBuffer;
#if EQDEBUG >= 5 #if EQDEBUG >= 5
Log.Out(Logs::General, Logs::None, "%s, purchase item..", GetName()); Log.Out(Logs::General, Logs::None, "%s, purchase item..", GetName());
@@ -12220,8 +12217,6 @@ void Client::Handle_OP_ShopPlayerBuy(const EQApplicationPacket *app)
DiscoverItem(item_id); DiscoverItem(item_id);
} }
t1.stop();
std::cout << "At 1: " << t1.getDuration() << std::endl;
return; return;
} }
void Client::Handle_OP_ShopPlayerSell(const EQApplicationPacket *app) void Client::Handle_OP_ShopPlayerSell(const EQApplicationPacket *app)
@@ -12231,7 +12226,6 @@ void Client::Handle_OP_ShopPlayerSell(const EQApplicationPacket *app)
sizeof(Merchant_Purchase_Struct), app->size); sizeof(Merchant_Purchase_Struct), app->size);
return; return;
} }
RDTSC_Timer t1(true);
Merchant_Purchase_Struct* mp = (Merchant_Purchase_Struct*)app->pBuffer; Merchant_Purchase_Struct* mp = (Merchant_Purchase_Struct*)app->pBuffer;
Mob* vendor = entity_list.GetMob(mp->npcid); Mob* vendor = entity_list.GetMob(mp->npcid);
@@ -12373,10 +12367,7 @@ void Client::Handle_OP_ShopPlayerSell(const EQApplicationPacket *app)
QueuePacket(outapp); QueuePacket(outapp);
safe_delete(outapp); safe_delete(outapp);
SendMoneyUpdate(); SendMoneyUpdate();
t1.start();
Save(1); Save(1);
t1.stop();
std::cout << "Save took: " << t1.getDuration() << std::endl;
return; return;
} }
-14
View File
@@ -153,10 +153,6 @@ int command_init(void) {
#ifdef PACKET_PROFILER #ifdef PACKET_PROFILER
command_add("packetprofile", "- Dump packet profile for target or self.", 250, command_packetprofile) || command_add("packetprofile", "- Dump packet profile for target or self.", 250, command_packetprofile) ||
#endif #endif
#ifdef EQPROFILE
command_add("profiledump", "- Dump profiling info to logs", 250, command_profiledump) ||
command_add("profilereset", "- Reset profiling info", 250, command_profilereset) ||
#endif
#ifdef BOTS #ifdef BOTS
command_add("bot", "- Type \"#bot help\" to the see the list of available commands for bots.", 0, command_bot) || command_add("bot", "- Type \"#bot help\" to the see the list of available commands for bots.", 0, command_bot) ||
#endif #endif
@@ -6629,16 +6625,6 @@ void command_packetprofile(Client *c, const Seperator *sep) {
} }
#endif #endif
#ifdef EQPROFILE
void command_profiledump(Client *c, const Seperator *sep) {
DumpZoneProfile();
}
void command_profilereset(Client *c, const Seperator *sep) {
ResetZoneProfile();
}
#endif
void command_opcode(Client *c, const Seperator *sep) { void command_opcode(Client *c, const Seperator *sep) {
if(!strcasecmp(sep->arg[1], "reload" )) { if(!strcasecmp(sep->arg[1], "reload" )) {
ReloadAllPatches(); ReloadAllPatches();
-5
View File
@@ -325,11 +325,6 @@ void command_tune(Client *c, const Seperator *sep);
void command_logtest(Client *c, const Seperator *sep); void command_logtest(Client *c, const Seperator *sep);
void command_mysqltest(Client *c, const Seperator *sep); void command_mysqltest(Client *c, const Seperator *sep);
void command_logs(Client *c, const Seperator *sep); void command_logs(Client *c, const Seperator *sep);
#ifdef EQPROFILE
void command_profiledump(Client *c, const Seperator *sep);
void command_profilereset(Client *c, const Seperator *sep);
#endif
#ifdef PACKET_PROFILER #ifdef PACKET_PROFILER
void command_packetprofile(Client *c, const Seperator *sep); void command_packetprofile(Client *c, const Seperator *sep);
-13
View File
@@ -308,12 +308,6 @@ int main(int argc, char** argv) {
} }
Timer InterserverTimer(INTERSERVER_TIMER); // does MySQL pings and auto-reconnect Timer InterserverTimer(INTERSERVER_TIMER); // does MySQL pings and auto-reconnect
#ifdef EQPROFILE
#ifdef PROFILE_DUMP_TIME
Timer profile_dump_timer(PROFILE_DUMP_TIME*1000);
profile_dump_timer.Start();
#endif
#endif
if (!strlen(zone_name) || !strcmp(zone_name,".")) { if (!strlen(zone_name) || !strcmp(zone_name,".")) {
Log.Out(Logs::General, Logs::Zone_Server, "Entering sleep mode"); Log.Out(Logs::General, Logs::Zone_Server, "Entering sleep mode");
} else if (!Zone::Bootup(database.GetZoneID(zone_name), 0, true)) { //todo: go above and fix this to allow cmd line instance } else if (!Zone::Bootup(database.GetZoneID(zone_name), 0, true)) { //todo: go above and fix this to allow cmd line instance
@@ -444,13 +438,6 @@ int main(int argc, char** argv) {
worldserver.AsyncConnect(); worldserver.AsyncConnect();
} }
#ifdef EQPROFILE
#ifdef PROFILE_DUMP_TIME
if(profile_dump_timer.Check()) {
DumpZoneProfile();
}
#endif
#endif
} //end extra profiler block } //end extra profiler block
Sleep(ZoneTimerResolution); Sleep(ZoneTimerResolution);
} }