mirror of
https://github.com/SWG-Source/src.git
synced 2026-10-18 10:03:06 -04:00
Added platform libs
This commit is contained in:
@@ -0,0 +1,2 @@
|
||||
|
||||
add_subdirectory(Session)
|
||||
@@ -0,0 +1,3 @@
|
||||
|
||||
add_subdirectory(CommonAPI)
|
||||
add_subdirectory(LoginAPI)
|
||||
@@ -0,0 +1,14 @@
|
||||
|
||||
include_directories(
|
||||
${SWG_EXTERNALS_SOURCE_DIR}/3rd/library/udplibrary
|
||||
)
|
||||
|
||||
add_library(CommonAPI
|
||||
CommonAPI.cpp
|
||||
CommonAPI.h
|
||||
CommonAPIStrings.h
|
||||
CommonClient.cpp
|
||||
CommonClient.h
|
||||
CommonMessages.cpp
|
||||
CommonMessages.h
|
||||
)
|
||||
@@ -0,0 +1,455 @@
|
||||
#include <memory.h>
|
||||
#include <string.h>
|
||||
#include "CommonAPI.h"
|
||||
|
||||
|
||||
const unsigned MAX_ACCOUNT_NAME_LENGTH = 15;
|
||||
const unsigned MAX_PASSWORD_LENGTH = 15;
|
||||
const unsigned MAX_NAMESPACE_LENGTH = 64;
|
||||
const unsigned SESSION_TICKET_LENGTH = 16;
|
||||
const unsigned SESSION_SERVER_NAME_LENGTH = 40;
|
||||
const unsigned SESSION_CHARACTER_NAME_LENGTH = 128;
|
||||
const unsigned MAX_CLIENT_IP_LENGTH = 16;
|
||||
const unsigned MAX_PLAN_DURATION_LENGTH = 64;
|
||||
const unsigned MAX_GAME_CODE_LENGTH = 64;
|
||||
|
||||
const char * _defaultNamespace = "STATION";
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
apiAccount::apiAccount() :
|
||||
mName(),
|
||||
mId(0),
|
||||
mStatus(ACCOUNT_STATUS_NULL)
|
||||
{
|
||||
mName[0] = 0;
|
||||
}
|
||||
|
||||
apiAccount::apiAccount(const apiAccount & copy) :
|
||||
mName(),
|
||||
mId(copy.mId),
|
||||
mStatus(copy.mStatus)
|
||||
{
|
||||
memcpy(mName, copy.mName, apiAccountNameWidth);
|
||||
mName[apiAccountNameWidth-1] = 0;
|
||||
}
|
||||
|
||||
apiAccount::apiAccount(const apiAccount_v1 & copy) :
|
||||
mName(),
|
||||
mId(copy.id),
|
||||
mStatus(copy.status)
|
||||
{
|
||||
strncpy(mName, copy.name, apiAccountNameWidth);
|
||||
mName[apiAccountNameWidth-1] = 0;
|
||||
}
|
||||
|
||||
apiAccount::~apiAccount()
|
||||
{
|
||||
}
|
||||
|
||||
apiAccount & apiAccount::operator=(const apiAccount & rhs)
|
||||
{
|
||||
if (this != &rhs)
|
||||
{
|
||||
memcpy(mName, rhs.mName, apiAccountNameWidth);
|
||||
mName[apiAccountNameWidth-1] = 0;
|
||||
mId = rhs.mId;
|
||||
mStatus = rhs.mStatus;
|
||||
}
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
void apiAccount::SetName(const char * name)
|
||||
{
|
||||
strncpy(mName, name, apiAccountNameWidth-1);
|
||||
mName[apiAccountNameWidth-1] = 0;
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
apiSubscription::apiSubscription() :
|
||||
mGamecode(GAMECODE_NULL),
|
||||
mProviderId(PROVIDER_NULL),
|
||||
mStatus(SUBSCRIPTION_STATUS_NULL),
|
||||
mSubscriptionFeatures(0),
|
||||
mGameFeatures(0),
|
||||
mDurationSeconds(0),
|
||||
mParentalLimitSeconds(0)
|
||||
{
|
||||
}
|
||||
|
||||
apiSubscription::apiSubscription(const apiSubscription & copy) :
|
||||
mGamecode(copy.mGamecode),
|
||||
mProviderId(copy.mProviderId),
|
||||
mStatus(copy.mStatus),
|
||||
mSubscriptionFeatures(copy.mSubscriptionFeatures),
|
||||
mGameFeatures(copy.mGameFeatures),
|
||||
mDurationSeconds(copy.mDurationSeconds),
|
||||
mParentalLimitSeconds(copy.mParentalLimitSeconds)
|
||||
{
|
||||
}
|
||||
|
||||
apiSubscription::apiSubscription(const apiSubscription_v1 & copy) :
|
||||
mGamecode(copy.gamecode),
|
||||
mProviderId(PROVIDER_SOE),
|
||||
mStatus(copy.status),
|
||||
mSubscriptionFeatures(copy.subscriptionFeatures),
|
||||
mGameFeatures(copy.gameFeatures),
|
||||
mDurationSeconds(copy.durationSeconds),
|
||||
mParentalLimitSeconds(copy.parentalLimitSeconds)
|
||||
{
|
||||
}
|
||||
|
||||
apiSubscription::~apiSubscription()
|
||||
{
|
||||
}
|
||||
|
||||
apiSubscription & apiSubscription::operator=(const apiSubscription & rhs)
|
||||
{
|
||||
if (this != &rhs)
|
||||
{
|
||||
mGamecode = rhs.mGamecode;
|
||||
mProviderId = rhs.mProviderId;
|
||||
mStatus = rhs.mStatus;
|
||||
mSubscriptionFeatures = rhs.mSubscriptionFeatures;
|
||||
mGameFeatures = rhs.mGameFeatures;
|
||||
mDurationSeconds = rhs.mDurationSeconds;
|
||||
mParentalLimitSeconds = rhs.mParentalLimitSeconds;
|
||||
}
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
apiSession::apiSession() :
|
||||
mType(SESSION_TYPE_NULL),
|
||||
mProviderId(PROVIDER_NULL),
|
||||
mId(),
|
||||
mClientIP(0),
|
||||
mDurationSeconds(0),
|
||||
mParentalLimitSeconds(0),
|
||||
mTimeoutMinutes(0),
|
||||
mIsSecure(false)
|
||||
{
|
||||
mId[0] = 0;
|
||||
}
|
||||
|
||||
apiSession::apiSession(const apiSession & copy) :
|
||||
mType(copy.mType),
|
||||
mProviderId(copy.mProviderId),
|
||||
mId(),
|
||||
mClientIP(copy.mClientIP),
|
||||
mDurationSeconds(copy.mDurationSeconds),
|
||||
mParentalLimitSeconds(copy.mParentalLimitSeconds),
|
||||
mTimeoutMinutes(copy.mTimeoutMinutes),
|
||||
mIsSecure(copy.mIsSecure)
|
||||
{
|
||||
memcpy(mId, copy.mId, apiSessionIdWidth);
|
||||
mId[apiSessionIdWidth-1] = 0;
|
||||
}
|
||||
|
||||
apiSession::apiSession(const apiSession_v1 & copy) :
|
||||
mType(copy.type),
|
||||
mProviderId(PROVIDER_SOE),
|
||||
mId(),
|
||||
mClientIP(copy.clientIP),
|
||||
mDurationSeconds(copy.durationSeconds),
|
||||
mParentalLimitSeconds(copy.parentalLimitSeconds),
|
||||
mTimeoutMinutes(copy.timeoutMinutes),
|
||||
mIsSecure(copy.isSecure)
|
||||
{
|
||||
strncpy(mId, copy.id, apiSessionIdWidth);
|
||||
mId[apiSessionIdWidth-1] = 0;
|
||||
}
|
||||
|
||||
apiSession::~apiSession()
|
||||
{
|
||||
}
|
||||
|
||||
apiSession & apiSession::operator=(const apiSession & rhs)
|
||||
{
|
||||
if (this != &rhs)
|
||||
{
|
||||
mType = rhs.mType;
|
||||
mProviderId = rhs.mProviderId;
|
||||
mClientIP = rhs.mClientIP;
|
||||
mDurationSeconds = rhs.mDurationSeconds;
|
||||
mParentalLimitSeconds = rhs.mParentalLimitSeconds;
|
||||
mTimeoutMinutes = rhs.mTimeoutMinutes;
|
||||
mIsSecure = rhs.mIsSecure;
|
||||
|
||||
memcpy(mId, rhs.mId, apiSessionIdWidth);
|
||||
mId[apiSessionIdWidth-1] = 0;
|
||||
}
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
void apiSession::SetId(const char * id)
|
||||
{
|
||||
strncpy(mId, id, apiSessionIdWidth-1);
|
||||
mId[apiSessionIdWidth-1] = 0;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
apiAccount_v1::apiAccount_v1()
|
||||
{
|
||||
memset(this,0,sizeof(apiAccount_v1));
|
||||
}
|
||||
|
||||
apiAccount_v1::apiAccount_v1(const apiAccount_v1 & copy)
|
||||
{
|
||||
memcpy(this,©,sizeof(apiAccount_v1));
|
||||
}
|
||||
|
||||
apiAccount_v1::apiAccount_v1(const apiAccount & copy) :
|
||||
name(),
|
||||
id(copy.GetId()),
|
||||
status(copy.GetStatus())
|
||||
{
|
||||
strncpy(name, copy.GetName(), apiAccountNameWidth_v1-1);
|
||||
name[apiAccountNameWidth_v1-1] = 0;
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
apiSubscription_v1::apiSubscription_v1()
|
||||
{
|
||||
memset(this,0,sizeof(apiSubscription_v1));
|
||||
}
|
||||
|
||||
apiSubscription_v1::apiSubscription_v1(const apiSubscription_v1 & copy)
|
||||
{
|
||||
memcpy(this,©,sizeof(apiSubscription_v1));
|
||||
}
|
||||
|
||||
apiSubscription_v1::apiSubscription_v1(const apiSubscription & copy) :
|
||||
gamecode(copy.GetGamecode()),
|
||||
status(copy.GetStatus()),
|
||||
subscriptionFeatures(copy.GetSubscriptionFeatures()),
|
||||
gameFeatures(copy.GetGameFeatures()),
|
||||
durationSeconds(copy.GetDurationSeconds()),
|
||||
parentalLimitSeconds(copy.GetParentalLimitSeconds())
|
||||
{
|
||||
}
|
||||
|
||||
/********************* Plan *********************************/
|
||||
apiPlan::apiPlan():
|
||||
m_planID(0),
|
||||
m_paymentType(0),
|
||||
m_attributes(0),
|
||||
m_defaultStatus(0),
|
||||
m_reqGameFeatures(0),
|
||||
m_grantedGameFeatures(0),
|
||||
m_reqSubFeatures(0),
|
||||
m_grantedSubFeatures(0)
|
||||
{
|
||||
|
||||
m_description[0] = 0;
|
||||
m_sku[0] = 0;
|
||||
m_duration[0] = 0;
|
||||
m_gameCode[0] = 0;
|
||||
m_billFeatureSkuExt[0] = 0;
|
||||
}
|
||||
|
||||
apiPlan::apiPlan(const apiPlan & copy):
|
||||
m_planID(copy.m_planID),
|
||||
m_paymentType(copy.m_paymentType),
|
||||
m_attributes(copy.m_attributes),
|
||||
m_defaultStatus(copy.m_defaultStatus),
|
||||
m_reqGameFeatures(copy.m_reqGameFeatures),
|
||||
m_grantedGameFeatures(copy.m_grantedGameFeatures),
|
||||
m_reqSubFeatures(copy.m_reqSubFeatures),
|
||||
m_grantedSubFeatures(copy.m_grantedSubFeatures)
|
||||
{
|
||||
memcpy(m_description, copy.m_description, planDescWidth);
|
||||
m_description[planDescWidth-1] = 0;
|
||||
|
||||
memcpy(m_sku, copy.m_sku, planSkuWidth);
|
||||
m_sku[planSkuWidth-1] = 0;
|
||||
|
||||
memcpy(m_duration, copy.m_duration, planDurationWidth);
|
||||
m_duration[planDurationWidth-1] = 0;
|
||||
|
||||
memcpy(m_gameCode, copy.m_gameCode, gameCodeWidth);
|
||||
m_gameCode[gameCodeWidth-1] = 0;
|
||||
|
||||
memcpy(m_billFeatureSkuExt, copy.m_billFeatureSkuExt, billFeatureSkuExtWidth);
|
||||
m_billFeatureSkuExt[billFeatureSkuExtWidth-1] = 0;
|
||||
}
|
||||
|
||||
apiPlan::apiPlan(const apiPlan_v1 & copy):
|
||||
m_planID(copy.planID),
|
||||
m_paymentType(copy.paymentType),
|
||||
m_attributes(copy.attributes),
|
||||
m_defaultStatus(copy.defaultStatus),
|
||||
m_reqGameFeatures(copy.reqGameFeatures),
|
||||
m_grantedGameFeatures(copy.grantedGameFeatures),
|
||||
m_reqSubFeatures(copy.reqSubFeatures),
|
||||
m_grantedSubFeatures(copy.grantedSubFeatures)
|
||||
{
|
||||
strncpy(m_description, copy.description, planDescWidth);
|
||||
m_description[planDescWidth-1] = 0;
|
||||
|
||||
strncpy(m_sku, copy.sku, planSkuWidth);
|
||||
m_sku[planSkuWidth-1] = 0;
|
||||
|
||||
strncpy(m_duration, copy.duration, planDurationWidth);
|
||||
m_duration[planDurationWidth-1] = 0;
|
||||
|
||||
strncpy(m_gameCode, copy.gameCode, gameCodeWidth);
|
||||
m_gameCode[gameCodeWidth-1] = 0;
|
||||
|
||||
strncpy(m_billFeatureSkuExt, copy.billFeatureSkuExt, billFeatureSkuExtWidth);
|
||||
m_billFeatureSkuExt[billFeatureSkuExtWidth-1] = 0;
|
||||
}
|
||||
|
||||
apiPlan::~apiPlan()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
apiPlan & apiPlan::operator=(const apiPlan & rhs)
|
||||
{
|
||||
if (this != &rhs)
|
||||
{
|
||||
m_planID = rhs.m_planID;
|
||||
m_paymentType = rhs.m_paymentType;
|
||||
m_attributes = rhs.m_attributes;
|
||||
m_defaultStatus = rhs.m_defaultStatus;
|
||||
m_reqGameFeatures = rhs.m_reqGameFeatures;
|
||||
m_grantedGameFeatures = rhs.m_grantedGameFeatures;
|
||||
m_reqSubFeatures = rhs.m_reqSubFeatures;
|
||||
m_grantedSubFeatures = rhs.m_grantedSubFeatures;
|
||||
|
||||
memcpy(m_description, rhs.m_description, planDescWidth);
|
||||
m_description[planDescWidth-1] = 0;
|
||||
|
||||
memcpy(m_sku, rhs.m_sku, planSkuWidth);
|
||||
m_sku[planSkuWidth-1] = 0;
|
||||
|
||||
memcpy(m_duration, rhs.m_duration, planDurationWidth);
|
||||
m_duration[planDurationWidth-1] = 0;
|
||||
|
||||
memcpy(m_gameCode, rhs.m_gameCode, gameCodeWidth);
|
||||
m_gameCode[gameCodeWidth-1] = 0;
|
||||
|
||||
memcpy(m_billFeatureSkuExt, rhs.m_billFeatureSkuExt, billFeatureSkuExtWidth);
|
||||
m_billFeatureSkuExt[billFeatureSkuExtWidth-1] = 0;
|
||||
}
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
void apiPlan::SetDescription(const char * description)
|
||||
{
|
||||
memcpy(m_description, description, planDescWidth);
|
||||
m_description[planDescWidth-1] = 0;
|
||||
}
|
||||
|
||||
void apiPlan::SetSku(const char * sku)
|
||||
{
|
||||
memcpy(m_sku, sku, planSkuWidth);
|
||||
m_sku[planSkuWidth-1] = 0;
|
||||
}
|
||||
|
||||
void apiPlan::SetDuration(const char * duration)
|
||||
{
|
||||
memcpy(m_duration, duration, planDurationWidth);
|
||||
m_duration[planDurationWidth-1] = 0;
|
||||
}
|
||||
|
||||
void apiPlan::SetGameCode(const char * gameCode)
|
||||
{
|
||||
memcpy(m_gameCode, gameCode, gameCodeWidth);
|
||||
m_gameCode[gameCodeWidth-1] = 0;
|
||||
}
|
||||
|
||||
void apiPlan::SetBillFeatureSkuExt(const char * billFeatureSkuExt)
|
||||
{
|
||||
memcpy(m_billFeatureSkuExt, billFeatureSkuExt, billFeatureSkuExtWidth);
|
||||
m_billFeatureSkuExt[billFeatureSkuExtWidth-1] = 0;
|
||||
}
|
||||
|
||||
|
||||
///////////////// V1 ////////////////
|
||||
|
||||
apiPlan_v1::apiPlan_v1()
|
||||
{
|
||||
memset(this,0,sizeof(apiPlan_v1));
|
||||
}
|
||||
|
||||
apiPlan_v1::apiPlan_v1(const apiPlan_v1 & copy)
|
||||
{
|
||||
memcpy(this,©,sizeof(apiPlan_v1));
|
||||
}
|
||||
|
||||
apiPlan_v1::apiPlan_v1(const apiPlan & copy):
|
||||
planID(copy.GetPlanID()),
|
||||
paymentType(copy.GetPaymentType()),
|
||||
attributes(copy.GetAttributes()),
|
||||
defaultStatus(copy.GetDefaultStatus()),
|
||||
reqGameFeatures(copy.GetReqGameFeatures()),
|
||||
grantedGameFeatures(copy.GetGrantedGameFeatures()),
|
||||
reqSubFeatures(copy.GetReqSubFeatures()),
|
||||
grantedSubFeatures(copy.GetGrantedSubFeatures())
|
||||
{
|
||||
strncpy(description, copy.GetDescription(), planDescWidth);
|
||||
description[planDescWidth-1] = 0;
|
||||
|
||||
strncpy(sku, copy.GetSku(), planSkuWidth);
|
||||
sku[planSkuWidth-1] = 0;
|
||||
|
||||
strncpy(duration, copy.GetDuration(), planDurationWidth);
|
||||
duration[planDurationWidth-1] = 0;
|
||||
|
||||
strncpy(gameCode, copy.GetGameCode(), gameCodeWidth);
|
||||
gameCode[gameCodeWidth-1] = 0;
|
||||
|
||||
strncpy(billFeatureSkuExt, copy.GetBillFeatureSkuExt(), billFeatureSkuExtWidth);
|
||||
billFeatureSkuExt[billFeatureSkuExtWidth-1] = 0;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
apiSession_v1::apiSession_v1()
|
||||
{
|
||||
memset(this,0,sizeof(apiSession_v1));
|
||||
}
|
||||
|
||||
apiSession_v1::apiSession_v1(const apiSession_v1 & copy)
|
||||
{
|
||||
memcpy(this,©,sizeof(apiSession_v1));
|
||||
}
|
||||
|
||||
apiSession_v1::apiSession_v1(const apiSession & copy) :
|
||||
type(copy.GetType()),
|
||||
id(),
|
||||
clientIP(copy.GetClientIP()),
|
||||
durationSeconds(copy.GetDurationSeconds()),
|
||||
parentalLimitSeconds(copy.GetParentalLimitSeconds()),
|
||||
timeoutMinutes(copy.GetTimeoutMinutes()),
|
||||
isSecure(copy.GetIsSecure())
|
||||
{
|
||||
strncpy(id, copy.GetId(), apiSessionIdWidth_v1-1);
|
||||
id[apiSessionIdWidth_v1-1] = 0;
|
||||
}
|
||||
SessionTypeDesc::SessionTypeDesc(const SessionTypeDesc & copy)
|
||||
{
|
||||
memcpy( this, ©, sizeof(SessionTypeDesc));
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -0,0 +1,502 @@
|
||||
#ifndef COMMON_API_H
|
||||
#define COMMON_API_H
|
||||
|
||||
|
||||
class apiCore;
|
||||
class apiClient
|
||||
{
|
||||
public:
|
||||
apiClient();
|
||||
virtual ~apiClient();
|
||||
|
||||
void Connect(const char * address);
|
||||
virtual void Process();
|
||||
|
||||
////////////////////////////////////////
|
||||
// State Callbacks
|
||||
virtual void OnConnectionOpened(const char * address, unsigned connectionCount);
|
||||
virtual void OnConnectionClosed(const char * address, unsigned connectionCount);
|
||||
virtual void OnConnectionFailed(const char * address, unsigned connectionCount);
|
||||
|
||||
protected:
|
||||
apiCore * mClientCore;
|
||||
};
|
||||
|
||||
#define apiSessionType unsigned
|
||||
#define apiGamecode unsigned
|
||||
|
||||
typedef unsigned apiAccountId;
|
||||
typedef unsigned apiTrackingNumber;
|
||||
typedef unsigned apiProductFeatures;
|
||||
typedef unsigned apiIP;
|
||||
typedef unsigned apiResult;
|
||||
typedef unsigned apiAccountStatus;
|
||||
typedef unsigned apiSubscriptionStatus;
|
||||
typedef unsigned apiProviderId;
|
||||
typedef unsigned apiKickReason;
|
||||
typedef unsigned apiKickReply;
|
||||
|
||||
#ifdef API_NAMESPACE
|
||||
namespace API_NAMESPACE
|
||||
{
|
||||
#endif
|
||||
|
||||
|
||||
enum
|
||||
{
|
||||
RESULT_SUCCESS = 0, // operation successful
|
||||
RESULT_CANCELLED, // operation cancelled by user
|
||||
RESULT_TIMEOUT, // operation could not be serviced
|
||||
RESULT_FUNCTION_DEPRICATED, // operation is not supported anymore
|
||||
RESULT_FUNCTION_NOT_SUPPORTED, // operation is not supported yet
|
||||
|
||||
// Login related result codes
|
||||
RESULT_INVALID_NAME_OR_PASSWORD = 1000,
|
||||
RESULT_INVALID_ACCOUNT_ID,
|
||||
RESULT_INVALID_SESSION,
|
||||
RESULT_INVALID_PARENT_SESSION,
|
||||
RESULT_INVALID_SESSION_TYPE,
|
||||
RESULT_INVALID_GAMECODE,
|
||||
RESULT_REQUIRES_VALID_SUBSCRIPTION,
|
||||
RESULT_REQUIRES_ACTIVE_ACCOUNT,
|
||||
RESULT_REQUIRES_CLIENT_LOGOUT,
|
||||
RESULT_SESSION_ALREADY_CONSUMED,
|
||||
RESULT_REQUIRES_SECURE_ID_NEXT_CODE,
|
||||
RESULT_REQUIRES_SECURE_ID_NEW_PIN,
|
||||
RESULT_SECURE_ID_PIN_ACCEPTED,
|
||||
RESULT_SECURE_ID_PIN_REJECTED,
|
||||
RESULT_USAGE_LIMIT_DENIED_LOGIN,
|
||||
RESULT_INVALID_FEATURE,
|
||||
RESULT_INVALID_SERVER_NAME,
|
||||
RESULT_INVALID_CHARACTER_NAME,
|
||||
RESULT_INVALID_NAMESPACE,
|
||||
RESULT_INVALID_CLIENT_IP,
|
||||
RESULT_USER_LOCKOUT,
|
||||
RESULT_INVALID_KICK_REASON,
|
||||
|
||||
// Chat related result codes
|
||||
RESULT_INVALID_AVATAR = 1032,
|
||||
RESULT_INVALID_CHATROOM,
|
||||
RESULT_INVALID_MESSAGE,
|
||||
RESULT_INVALID_FANCLUB,
|
||||
RESULT_INVALID_ROOM_BANNER,
|
||||
RESULT_REQUIRES_FANCLUB_MEMBERSHIP,
|
||||
RESULT_REQUIRES_ONLINE_AVATAR,
|
||||
RESULT_REQUIRES_MODERATOR_PRIVILEGES,
|
||||
RESULT_REQUIRES_VALID_MODERATION_STATE,
|
||||
RESULT_BANNED_FROM_ROOM,
|
||||
RESULT_FULL_ROOM,
|
||||
RESULT_INVALID_ROOM_PATH,
|
||||
RESULT_INVALID_ROOM_ATTRIBUTES,
|
||||
RESULT_INVALID_MAX_ROOM_SIZE,
|
||||
RESULT_INVALID_SUBJECT_SIZE,
|
||||
|
||||
RESULT_INVALID_PLAN_DURATION_SIZE = 2000,
|
||||
RESULT_INVALID_GAME_CODE_SIZE,
|
||||
RESULT_INVALID_PLAN_ID,
|
||||
RESULT_INVALID_FEATURE_MATCH,
|
||||
RESULT_INVALID_SUBSCRIPTION
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
ACCOUNT_STATUS_NULL, // Invalid account status
|
||||
ACCOUNT_STATUS_ACTIVE,
|
||||
ACCOUNT_STATUS_CLOSED,
|
||||
// Add new account status codes here
|
||||
ACCOUNT_STATUS_END
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
SESSION_TYPE_NULL, // Invalid session type
|
||||
SESSION_TYPE_LAUNCH_PAD,
|
||||
SESSION_TYPE_STATION_UNSECURE,
|
||||
SESSION_TYPE_STATION_SECURE,
|
||||
SESSION_TYPE_TANARUS,
|
||||
SESSION_TYPE_INFANTRY,
|
||||
SESSION_TYPE_COSMIC_RIFT,
|
||||
SESSION_TYPE_EVERQUEST,
|
||||
SESSION_TYPE_EVERQUEST_2,
|
||||
SESSION_TYPE_STARWARS,
|
||||
SESSION_TYPE_PLANETSIDE,
|
||||
SESSION_TYPE_EVERQUEST_ONLINE_ADVENTURES_BETA,
|
||||
SESSION_TYPE_EVERQUEST_ONLINE_ADVENTURES,
|
||||
SESSION_TYPE_EVERQUEST_INSTANT_MESSENGER,
|
||||
SESSION_TYPE_REALM_SERVER,
|
||||
SESSION_TYPE_EVERQUEST_MACINTOSH,
|
||||
SESSION_TYPE_MATRIX_ONLINE,
|
||||
SESSION_TYPE_HARRY_POTTER,
|
||||
SESSION_TYPE_NEO_PETS,
|
||||
SESSION_TYPE_GOODLIFE,
|
||||
SESSION_TYPE_EQ2_GUILDS,
|
||||
SESSION_TYPE_SWG_JP_BETA,
|
||||
SESSION_TYPE_MARVEL,
|
||||
SESSION_TYPE_EQ2_JAPAN,
|
||||
SESSION_TYPE_EQ2_TAIWAN,
|
||||
SESSION_TYPE_EQ2_CHINA,
|
||||
SESSION_TYPE_EQ2_KOREA,
|
||||
SESSION_TYPE_VGD,
|
||||
SESSION_TYPE_PIRATE,
|
||||
SESSION_TYPE_STAR_CHAMBER,
|
||||
SESSION_TYPE_STARGATE,
|
||||
SESSION_TYPE_DCU_ONLINE,
|
||||
SESSION_TYPE_NORRATH_CSG,
|
||||
// Add new session type codes here
|
||||
SESSION_TYPE_END
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
GAMECODE_NULL, // Invalid gamecode
|
||||
GAMECODE_STATION_PASS,
|
||||
GAMECODE_EVERQUEST,
|
||||
GAMECODE_EVERQUEST_2,
|
||||
GAMECODE_STARWARS,
|
||||
GAMECODE_PLANETSIDE,
|
||||
GAMECODE_EVERQUEST_ONLINE_ADVENTURES_BETA,
|
||||
GAMECODE_EVERQUEST_ONLINE_ADVENTURES,
|
||||
GAMECODE_EVERQUEST_INSTANT_MESSENGER,
|
||||
GAMECODE_EVERQUEST_MACINTOSH,
|
||||
GAMECODE_MATRIX_ONLINE,
|
||||
GAMECODE_HARRY_POTTER,
|
||||
GAMECODE_NEO_PETS,
|
||||
GAMECODE_GOODLIFE,
|
||||
GAMECODE_SWG_JP_BETA,
|
||||
GAMECODE_MARVEL,
|
||||
GAMECODE_EQ2_JAPAN,
|
||||
GAMECODE_EQ2_TAIWAN,
|
||||
GAMECODE_EQ2_CHINA,
|
||||
GAMECODE_EQ2_KOREA,
|
||||
GAMECODE_VGD,
|
||||
GAMECODE_PIRATE,
|
||||
GAMECODE_STAR_CHAMBER,
|
||||
GAMECODE_STARGATE,
|
||||
GAMECODE_DCU_ONLINE,
|
||||
GAMECODE_NORRATH_CSG,
|
||||
// Add new gamecodes here
|
||||
GAMECODE_END
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
SUBSCRIPTION_STATUS_NULL, // Invalid subscription status
|
||||
SUBSCRIPTION_STATUS_NO_ACCOUNT,
|
||||
SUBSCRIPTION_STATUS_ACTIVE,
|
||||
SUBSCRIPTION_STATUS_PENDING,
|
||||
SUBSCRIPTION_STATUS_CLOSED,
|
||||
SUBSCRIPTION_STATUS_TRIAL_ACTIVE,
|
||||
SUBSCRIPTION_STATUS_TRIAL_EXPIRED,
|
||||
SUBSCRIPTION_STATUS_SUSPENDED,
|
||||
SUBSCRIPTION_STATUS_BANNED,
|
||||
SUBSCRIPTION_STATUS_RENTAL_ACTIVE,
|
||||
SUBSCRIPTION_STATUS_RENTAL_CLOSED,
|
||||
SUBSCRIPTION_STATUS_ACTIVE_COMBO,
|
||||
SUBSCRIPTION_STATUS_BANNED_CHARGEBACK,
|
||||
// Add new subscription status codes here
|
||||
SUBSCRIPTION_STATUS_END
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
KICK_REASON_NULL, // Invalid kick reason
|
||||
KICK_REASON_USER_REQUEST,
|
||||
KICK_REASON_ADMIN_REQUEST,
|
||||
// Add new kick reason codes here
|
||||
KICK_REASON_END
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
KICK_REPLY_NULL,
|
||||
KICK_REPLY_ALLOW,
|
||||
KICK_REPLY_DENY,
|
||||
KICK_REPLY_UNKNOWN_SESSION,
|
||||
// Add new kick reply codes here
|
||||
KICK_REPLY_END
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
PROVIDER_NULL,
|
||||
PROVIDER_SOE,
|
||||
PROVIDER_UBISOFT,
|
||||
// Add new provider id codes here
|
||||
PROVIDER_END
|
||||
};
|
||||
|
||||
|
||||
#ifdef API_NAMESPACE
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
extern const unsigned MAX_ACCOUNT_NAME_LENGTH; // 15: ASCII characters (alpha-numeric only)
|
||||
extern const unsigned MAX_PASSWORD_LENGTH; // 15: ASCII characters (alpha-numeric only)
|
||||
extern const unsigned MAX_NAMESPACE_LENGTH; // 64: ASCII characters (alpha-numeric only)
|
||||
extern const unsigned SESSION_TICKET_LENGTH; // 16: ASCII characters (alpha numeric + '.' + '?')
|
||||
extern const unsigned SESSION_SERVER_NAME_LENGTH;
|
||||
extern const unsigned SESSION_CHARACTER_NAME_LENGTH;
|
||||
extern const unsigned MAX_CLIENT_IP_LENGTH;
|
||||
extern const unsigned MAX_PLAN_DURATION_LENGTH;
|
||||
extern const unsigned MAX_GAME_CODE_LENGTH;
|
||||
|
||||
extern const char * _defaultNamespace;
|
||||
|
||||
static const int apiAccountNameWidth = 16;
|
||||
struct apiAccount_v1;
|
||||
class apiAccount
|
||||
{
|
||||
public:
|
||||
apiAccount();
|
||||
apiAccount(const apiAccount & copy);
|
||||
apiAccount(const apiAccount_v1 & copy);
|
||||
~apiAccount();
|
||||
|
||||
apiAccount & operator=(const apiAccount & rhs);
|
||||
|
||||
const char * GetName() const { return mName; }
|
||||
apiAccountId GetId() const { return mId; }
|
||||
apiAccountStatus GetStatus() const { return mStatus; }
|
||||
|
||||
void SetName(const char * name);
|
||||
void SetId(apiAccountId id) { mId = id; }
|
||||
void SetStatus(apiAccountStatus status) { mStatus = status; }
|
||||
|
||||
private:
|
||||
char mName[apiAccountNameWidth];
|
||||
apiAccountId mId;
|
||||
apiAccountStatus mStatus;
|
||||
};
|
||||
|
||||
struct apiSubscription_v1;
|
||||
class apiSubscription
|
||||
{
|
||||
public:
|
||||
apiSubscription();
|
||||
apiSubscription(const apiSubscription & copy);
|
||||
apiSubscription(const apiSubscription_v1 & copy);
|
||||
~apiSubscription();
|
||||
|
||||
apiSubscription & operator=(const apiSubscription & rhs);
|
||||
|
||||
apiGamecode GetGamecode() const { return mGamecode; }
|
||||
apiProviderId GetProviderId() const { return mProviderId; }
|
||||
apiSubscriptionStatus GetStatus() const { return mStatus; }
|
||||
apiProductFeatures GetSubscriptionFeatures() const { return mSubscriptionFeatures; }
|
||||
apiProductFeatures GetGameFeatures() const { return mGameFeatures; }
|
||||
unsigned GetDurationSeconds() const { return mDurationSeconds; }
|
||||
unsigned GetParentalLimitSeconds() const { return mParentalLimitSeconds; }
|
||||
|
||||
void SetGamecode(apiGamecode gamecode) { mGamecode = gamecode; }
|
||||
void SetProviderId(apiProviderId provider) { mProviderId = provider; }
|
||||
void SetStatus(apiSubscriptionStatus status) { mStatus = status; }
|
||||
void SetSubscriptionFeatures(apiProductFeatures features) { mSubscriptionFeatures = features; }
|
||||
void SetGameFeatures(apiProductFeatures features) { mGameFeatures = features; }
|
||||
void SetDurationSeconds(unsigned duration) { mDurationSeconds = duration; }
|
||||
void SetParentalLimitSeconds(unsigned parentalLimit) { mParentalLimitSeconds = parentalLimit; }
|
||||
|
||||
private:
|
||||
apiGamecode mGamecode;
|
||||
apiProviderId mProviderId;
|
||||
apiSubscriptionStatus mStatus;
|
||||
apiProductFeatures mSubscriptionFeatures;
|
||||
apiProductFeatures mGameFeatures;
|
||||
unsigned mDurationSeconds;
|
||||
unsigned mParentalLimitSeconds;
|
||||
};
|
||||
|
||||
static const int apiSessionIdWidth = 17;
|
||||
struct apiSession_v1;
|
||||
class apiSession
|
||||
{
|
||||
public:
|
||||
apiSession();
|
||||
apiSession(const apiSession & copy);
|
||||
apiSession(const apiSession_v1 & copy);
|
||||
~apiSession();
|
||||
|
||||
apiSession & operator=(const apiSession & rhs);
|
||||
|
||||
apiSessionType GetType() const { return mType; }
|
||||
apiProviderId GetProviderId() const { return mProviderId; }
|
||||
const char * GetId() const { return mId; }
|
||||
apiIP GetClientIP() const { return mClientIP; }
|
||||
unsigned GetDurationSeconds() const { return mDurationSeconds; }
|
||||
unsigned GetParentalLimitSeconds() const { return mParentalLimitSeconds; }
|
||||
unsigned char GetTimeoutMinutes() const { return mTimeoutMinutes; }
|
||||
bool GetIsSecure() const { return mIsSecure; }
|
||||
|
||||
void SetType(apiSessionType type) { mType = type; }
|
||||
void SetProviderId(apiProviderId provider) { mProviderId = provider; }
|
||||
void SetId(const char * id);
|
||||
void SetClientIP(apiIP clientIP) { mClientIP = clientIP; }
|
||||
void SetDurationSeconds(unsigned duration) { mDurationSeconds = duration; }
|
||||
void SetParentalLimitSeconds(unsigned parentalLimit) { mParentalLimitSeconds = parentalLimit; }
|
||||
void SetTimeoutMinutes(unsigned char timeout) { mTimeoutMinutes = timeout; }
|
||||
void SetIsSecure(bool isSecure) { mIsSecure = isSecure; }
|
||||
|
||||
private:
|
||||
apiSessionType mType;
|
||||
apiProviderId mProviderId;
|
||||
char mId[apiSessionIdWidth];
|
||||
apiIP mClientIP;
|
||||
unsigned mDurationSeconds;
|
||||
unsigned mParentalLimitSeconds;
|
||||
unsigned char mTimeoutMinutes;
|
||||
bool mIsSecure;
|
||||
};
|
||||
|
||||
|
||||
static const int apiAccountNameWidth_v1 = 32;
|
||||
struct apiAccount_v1
|
||||
{
|
||||
apiAccount_v1();
|
||||
apiAccount_v1(const apiAccount_v1 & copy);
|
||||
apiAccount_v1(const apiAccount & copy);
|
||||
|
||||
char name[apiAccountNameWidth_v1];
|
||||
apiAccountId id;
|
||||
apiAccountStatus status;
|
||||
};
|
||||
|
||||
struct apiSubscription_v1
|
||||
{
|
||||
apiSubscription_v1();
|
||||
apiSubscription_v1(const apiSubscription_v1 & copy);
|
||||
apiSubscription_v1(const apiSubscription & copy);
|
||||
|
||||
apiGamecode gamecode;
|
||||
apiSubscriptionStatus status;
|
||||
apiProductFeatures subscriptionFeatures;
|
||||
apiProductFeatures gameFeatures;
|
||||
unsigned durationSeconds;
|
||||
unsigned parentalLimitSeconds;
|
||||
};
|
||||
|
||||
static const int apiSessionIdWidth_v1 = 32;
|
||||
struct apiSession_v1
|
||||
{
|
||||
apiSession_v1();
|
||||
apiSession_v1(const apiSession_v1 & copy);
|
||||
apiSession_v1(const apiSession & copy);
|
||||
|
||||
apiSessionType type;
|
||||
char id[apiSessionIdWidth_v1];
|
||||
apiIP clientIP;
|
||||
unsigned durationSeconds;
|
||||
unsigned parentalLimitSeconds;
|
||||
unsigned char timeoutMinutes;
|
||||
bool isSecure;
|
||||
};
|
||||
|
||||
static const int gameCodeWidth = 26;
|
||||
static const int sessionTypeDescriptionWidth = 257;
|
||||
struct SessionTypeDesc
|
||||
{
|
||||
SessionTypeDesc() : type(0), gameCodeID(0), independent(false), exclusive(false) {gameCode[0]= 0; description[0] = 0;}
|
||||
SessionTypeDesc(const SessionTypeDesc & copy);
|
||||
apiSessionType type;
|
||||
char gameCode[gameCodeWidth];
|
||||
apiGamecode gameCodeID;
|
||||
char description[sessionTypeDescriptionWidth];
|
||||
bool independent;
|
||||
bool exclusive;
|
||||
};
|
||||
|
||||
static const int gameCodeDescriptionWidth = 256;
|
||||
struct GameCodeDescription
|
||||
{
|
||||
GameCodeDescription() : gameID(0), createDynamic(false) { code[0] = 0; description[0] = 0;}
|
||||
|
||||
apiGamecode gameID;
|
||||
char code[gameCodeWidth];
|
||||
char description[gameCodeDescriptionWidth];
|
||||
bool createDynamic;
|
||||
};
|
||||
|
||||
/*************** Plan **************************************/
|
||||
struct apiPlan_v1;
|
||||
static const int planDescWidth = 256;
|
||||
static const int planSkuWidth = 256;
|
||||
static const int planDurationWidth = 11;
|
||||
static const int billFeatureSkuExtWidth = 101;
|
||||
|
||||
class apiPlan
|
||||
{
|
||||
public:
|
||||
apiPlan();
|
||||
apiPlan(const apiPlan & copy);
|
||||
apiPlan(const apiPlan_v1 & copy);
|
||||
~apiPlan();
|
||||
|
||||
apiPlan & operator=(const apiPlan & rhs);
|
||||
|
||||
unsigned GetPlanID() const { return m_planID; }
|
||||
const char * GetDescription() const { return m_description; }
|
||||
const char * GetSku() const { return m_sku; }
|
||||
unsigned GetPaymentType() const { return m_paymentType; }
|
||||
const char * GetDuration() const { return m_duration; }
|
||||
unsigned GetAttributes() const { return m_attributes; }
|
||||
unsigned GetDefaultStatus() const { return m_defaultStatus; }
|
||||
const char * GetGameCode() const { return m_gameCode; }
|
||||
unsigned GetReqGameFeatures() const { return m_reqGameFeatures; }
|
||||
unsigned GetGrantedGameFeatures() const { return m_grantedGameFeatures; }
|
||||
unsigned GetReqSubFeatures() const { return m_reqSubFeatures; }
|
||||
unsigned GetGrantedSubFeatures() const { return m_grantedSubFeatures; }
|
||||
const char * GetBillFeatureSkuExt() const { return m_billFeatureSkuExt; }
|
||||
|
||||
void SetPlanID(unsigned planID) { m_planID = planID; }
|
||||
void SetDescription(const char * description);
|
||||
void SetSku(const char * sku);
|
||||
void SetPaymentType(unsigned paymentType) { m_paymentType = paymentType; }
|
||||
void SetDuration(const char * duration);
|
||||
void SetAttributes(unsigned attributes) { m_attributes = attributes; }
|
||||
void SetDefaultStatus(unsigned defaultStatus) { m_defaultStatus = defaultStatus; }
|
||||
void SetGameCode(const char * gameCode);
|
||||
void SetReqGameFeatures(unsigned reqGameFeatures) { m_reqGameFeatures = reqGameFeatures; }
|
||||
void SetGrantedGameFeatures(unsigned grantedGameFeatures) { m_grantedGameFeatures = grantedGameFeatures; }
|
||||
void SetReqSubFeatures(unsigned reqSubFeatures) { m_reqSubFeatures = reqSubFeatures; }
|
||||
void SetGrantedSubFeatures(unsigned grantedSubFeatures) { m_grantedSubFeatures = grantedSubFeatures; }
|
||||
void SetBillFeatureSkuExt(const char * billFeatureSkuExt);
|
||||
|
||||
private:
|
||||
|
||||
unsigned m_planID;
|
||||
char m_description[planDescWidth];
|
||||
char m_sku[planSkuWidth];
|
||||
unsigned m_paymentType;
|
||||
char m_duration[planDurationWidth];
|
||||
unsigned m_attributes;
|
||||
unsigned m_defaultStatus;
|
||||
char m_gameCode[gameCodeWidth];
|
||||
unsigned m_reqGameFeatures;
|
||||
unsigned m_grantedGameFeatures;
|
||||
unsigned m_reqSubFeatures;
|
||||
unsigned m_grantedSubFeatures;
|
||||
char m_billFeatureSkuExt[billFeatureSkuExtWidth];
|
||||
};
|
||||
|
||||
struct apiPlan_v1
|
||||
{
|
||||
apiPlan_v1();
|
||||
apiPlan_v1(const apiPlan_v1 & copy);
|
||||
apiPlan_v1(const apiPlan & copy);
|
||||
|
||||
unsigned planID;
|
||||
char description[planDescWidth];
|
||||
char sku[planSkuWidth];
|
||||
unsigned paymentType;
|
||||
char duration[planDurationWidth];
|
||||
unsigned attributes;
|
||||
unsigned defaultStatus;
|
||||
char gameCode[gameCodeWidth];
|
||||
unsigned reqGameFeatures;
|
||||
unsigned grantedGameFeatures;
|
||||
unsigned reqSubFeatures;
|
||||
unsigned grantedSubFeatures;
|
||||
char billFeatureSkuExt[billFeatureSkuExtWidth];
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,251 @@
|
||||
#ifndef COMMON_API_STRINGS_H
|
||||
#define COMMON_API_STRINGS_H
|
||||
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include "CommonAPI.h"
|
||||
|
||||
#define result_text std::pair<apiResult,const char *>
|
||||
#define gamecode_text std::pair<apiGamecode,const char *>
|
||||
#define text_gamecode std::pair<std::string, apiGamecode>
|
||||
|
||||
static const int _ResultCount = 38;
|
||||
static const result_text _resultString[_ResultCount] =
|
||||
{
|
||||
result_text(RESULT_SUCCESS, "RESULT_SUCCESS"),
|
||||
result_text(RESULT_CANCELLED, "RESULT_CANCELLED"),
|
||||
result_text(RESULT_TIMEOUT, "RESULT_TIMEOUT"),
|
||||
result_text(RESULT_FUNCTION_DEPRICATED, "RESULT_FUNCTION_DEPRICATED"),
|
||||
result_text(RESULT_FUNCTION_NOT_SUPPORTED, "RESULT_FUNCTION_NOT_SUPPORTED"),
|
||||
result_text(RESULT_INVALID_NAME_OR_PASSWORD, "RESULT_INVALID_NAME_OR_PASSWORD"),
|
||||
result_text(RESULT_INVALID_ACCOUNT_ID, "RESULT_INVALID_USER_ID"),
|
||||
result_text(RESULT_INVALID_SESSION, "RESULT_INVALID_SESSION"),
|
||||
result_text(RESULT_INVALID_PARENT_SESSION, "RESULT_INVALID_PARENT_SESSION"),
|
||||
result_text(RESULT_INVALID_SESSION_TYPE, "RESULT_INVALID_SESSION_TYPE"),
|
||||
result_text(RESULT_INVALID_GAMECODE, "RESULT_INVALID_GAMECODE"),
|
||||
result_text(RESULT_REQUIRES_VALID_SUBSCRIPTION, "RESULT_REQUIRES_VALID_SUBSCRIPTION"),
|
||||
result_text(RESULT_REQUIRES_ACTIVE_ACCOUNT, "RESULT_REQUIRES_ACTIVE_ACCOUNT"),
|
||||
result_text(RESULT_REQUIRES_CLIENT_LOGOUT, "RESULT_REQUIRES_CLIENT_LOGOUT"),
|
||||
result_text(RESULT_SESSION_ALREADY_CONSUMED, "RESULT_SESSION_ALREADY_CONSUMED"),
|
||||
result_text(RESULT_REQUIRES_SECURE_ID_NEXT_CODE, "RESULT_REQUIRES_SECURE_ID_NEXT_CODE"),
|
||||
result_text(RESULT_REQUIRES_SECURE_ID_NEW_PIN, "RESULT_REQUIRES_SECURE_ID_NEW_PIN"),
|
||||
result_text(RESULT_SECURE_ID_PIN_ACCEPTED, "RESULT_SECURE_ID_PIN_ACCEPTED"),
|
||||
result_text(RESULT_SECURE_ID_PIN_REJECTED, "RESULT_SECURE_ID_PIN_REJECTED"),
|
||||
result_text(RESULT_USAGE_LIMIT_DENIED_LOGIN, "RESULT_USAGE_LIMIT_DENIED_LOGIN"),
|
||||
result_text(RESULT_INVALID_FEATURE, "RESULT_INVALID_FEATURE"),
|
||||
result_text(RESULT_INVALID_AVATAR, "RESULT_INVALID_AVATAR"),
|
||||
result_text(RESULT_INVALID_CHATROOM, "RESULT_INVALID_CHATROOM"),
|
||||
result_text(RESULT_INVALID_MESSAGE, "RESULT_INVALID_MESSAGE"),
|
||||
result_text(RESULT_INVALID_FANCLUB, "RESULT_INVALID_FANCLUB"),
|
||||
result_text(RESULT_INVALID_ROOM_BANNER, "RESULT_INVALID_ROOM_BANNER"),
|
||||
result_text(RESULT_REQUIRES_FANCLUB_MEMBERSHIP, "RESULT_REQUIRES_FANCLUB_MEMBERSHIP"),
|
||||
result_text(RESULT_REQUIRES_ONLINE_AVATAR, "RESULT_REQUIRES_ONLINE_AVATAR"),
|
||||
result_text(RESULT_REQUIRES_MODERATOR_PRIVILEGES, "RESULT_REQUIRES_MODERATOR_PRIVILEGES"),
|
||||
result_text(RESULT_REQUIRES_VALID_MODERATION_STATE, "RESULT_REQUIRES_VALID_MODERATION_STATE"),
|
||||
result_text(RESULT_BANNED_FROM_ROOM, "RESULT_BANNED_FROM_ROOM"),
|
||||
result_text(RESULT_INVALID_NAMESPACE, "RESULT_INVALID_NAMESPACE"),
|
||||
result_text(RESULT_INVALID_CLIENT_IP, "RESULT_INVALID_CLIENT_IP"),
|
||||
result_text(RESULT_USER_LOCKOUT, "RESULT_USER_LOCKOUT"),
|
||||
result_text(RESULT_INVALID_KICK_REASON, "RESULT_INVALID_KICK_REASON"),
|
||||
result_text(RESULT_INVALID_PLAN_ID, "RESULT_INVALID_PLAN_ID"),
|
||||
result_text(RESULT_INVALID_FEATURE_MATCH, "RESULT_INVALID_FEATURE_MATCH"),
|
||||
result_text(RESULT_INVALID_SUBSCRIPTION, "RESULT_INVALID_SUBSCRIPTION"),
|
||||
|
||||
};
|
||||
static std::map<apiResult,const char *> ResultString((const std::map<apiResult,const char *>::value_type *)&_resultString[0],(const std::map<apiResult,const char *>::value_type *)&_resultString[_ResultCount]);
|
||||
|
||||
static const result_text _resultText[_ResultCount] =
|
||||
{
|
||||
result_text(RESULT_SUCCESS, "The operation completed successfully."),
|
||||
result_text(RESULT_CANCELLED, "The operation was cancelled by the requestor."),
|
||||
result_text(RESULT_TIMEOUT, "The operation could not be processed within a reasonable time. Please try again."),
|
||||
result_text(RESULT_FUNCTION_DEPRICATED, "This operation is no longer supported."),
|
||||
result_text(RESULT_FUNCTION_NOT_SUPPORTED, "This operation is not supported yet."),
|
||||
result_text(RESULT_INVALID_NAME_OR_PASSWORD, "The sepecifed user name or password is invalid."),
|
||||
result_text(RESULT_INVALID_ACCOUNT_ID, "The sepecifed account identifier is invalid."),
|
||||
result_text(RESULT_INVALID_SESSION, "The sepecifed session identifier is invalid."),
|
||||
result_text(RESULT_INVALID_PARENT_SESSION, "The sepecifed parent session identifier is invalid."),
|
||||
result_text(RESULT_INVALID_SESSION_TYPE, "The sepecifed session type is invalid."),
|
||||
result_text(RESULT_INVALID_GAMECODE, "The specified gamecode is invalid."),
|
||||
result_text(RESULT_REQUIRES_VALID_SUBSCRIPTION, "This operation requires a valid subscription to complete."),
|
||||
result_text(RESULT_REQUIRES_ACTIVE_ACCOUNT, "RESULT_REQUIRES_ACTIVE_ACCOUNT"),
|
||||
result_text(RESULT_REQUIRES_CLIENT_LOGOUT, "RESULT_REQUIRES_CLIENT_LOGOUT"),
|
||||
result_text(RESULT_SESSION_ALREADY_CONSUMED, "RESULT_SESSION_ALREADY_CONSUMED"),
|
||||
result_text(RESULT_REQUIRES_SECURE_ID_NEXT_CODE,"RESULT_REQUIRES_SECURE_ID_NEXT_CODE"),
|
||||
result_text(RESULT_REQUIRES_SECURE_ID_NEW_PIN, "RESULT_REQUIRES_SECURE_ID_NEW_PIN"),
|
||||
result_text(RESULT_SECURE_ID_PIN_ACCEPTED, "RESULT_SECURE_ID_PIN_ACCEPTED"),
|
||||
result_text(RESULT_SECURE_ID_PIN_REJECTED, "RESULT_SECURE_ID_PIN_REJECTED"),
|
||||
result_text(RESULT_USAGE_LIMIT_DENIED_LOGIN, "RESULT_USAGE_LIMIT_DENIED_LOGIN"),
|
||||
result_text(RESULT_INVALID_FEATURE, "RESULT_INVALID_FEATURE"),
|
||||
result_text(RESULT_INVALID_AVATAR, "The specified chat avatar name is invalid."),
|
||||
result_text(RESULT_INVALID_CHATROOM, "The specified chat room name is invalid."),
|
||||
result_text(RESULT_INVALID_MESSAGE, "The specified chat message is invalid."),
|
||||
result_text(RESULT_INVALID_FANCLUB, "The specified fan club is invalid."),
|
||||
result_text(RESULT_INVALID_ROOM_BANNER, "RESULT_INVALID_ROOM_BANNER"),
|
||||
result_text(RESULT_REQUIRES_FANCLUB_MEMBERSHIP, "This operation requires membership inb the specified fan club."),
|
||||
result_text(RESULT_REQUIRES_ONLINE_AVATAR, "RESULT_REQUIRES_ONLINE_AVATAR"),
|
||||
result_text(RESULT_REQUIRES_MODERATOR_PRIVILEGES, "RESULT_REQUIRES_MODERATOR_PRIVILEGES"),
|
||||
result_text(RESULT_REQUIRES_VALID_MODERATION_STATE, "RESULT_REQUIRES_VALID_MODERATION_STATE"),
|
||||
result_text(RESULT_BANNED_FROM_ROOM, "RESULT_BANNED_FROM_ROOM"),
|
||||
result_text(RESULT_INVALID_NAMESPACE, "RESULT_INVALID_NAMESPACE"),
|
||||
result_text(RESULT_INVALID_PLAN_ID, "RESULT_INVALID_PLAN_ID"),
|
||||
result_text(RESULT_INVALID_FEATURE_MATCH, "RESULT_INVALID_FEATURE_MATCH"),
|
||||
result_text(RESULT_INVALID_SUBSCRIPTION, "RESULT_INVALID_SUBSCRIPTION"),
|
||||
};
|
||||
static std::map<apiResult,const char *> ResultText((const std::map<apiResult,const char *>::value_type *)&_resultText[0],(const std::map<apiResult,const char *>::value_type *)&_resultText[_ResultCount]);
|
||||
|
||||
static const char * AccountStatusString[ACCOUNT_STATUS_END] =
|
||||
{
|
||||
"ACCOUNT_STATUS_NULL",
|
||||
"ACCOUNT_STATUS_ACTIVE",
|
||||
"ACCOUNT_STATUS_CLOSED"
|
||||
};
|
||||
|
||||
static const char * SessionTypeString[SESSION_TYPE_END] =
|
||||
{
|
||||
"SESSION_TYPE_NULL",
|
||||
"SESSION_TYPE_LAUNCH_PAD",
|
||||
"SESSION_TYPE_STATION_UNSECURE",
|
||||
"SESSION_TYPE_STATION_SECURE",
|
||||
"SESSION_TYPE_TANARUS",
|
||||
"SESSION_TYPE_INFANTRY",
|
||||
"SESSION_TYPE_COSMIC_RIFT",
|
||||
"SESSION_TYPE_EVERQUEST",
|
||||
"SESSION_TYPE_EVERQUEST_2",
|
||||
"SESSION_TYPE_STARWARS",
|
||||
"SESSION_TYPE_PLANETSIDE",
|
||||
"SESSION_TYPE_EVERQUEST_ONLINE_ADVENTURES_BETA",
|
||||
"SESSION_TYPE_EVERQUEST_ONLINE_ADVENTURES",
|
||||
"SESSION_TYPE_EVERQUEST_INSTANT_MESSENGER",
|
||||
"SESSION_TYPE_REALM_SERVER",
|
||||
"SESSION_TYPE_EVERQUEST_MACINTOSH",
|
||||
"SESSION_TYPE_MATRIX_ONLINE",
|
||||
"SESSION_TYPE_HARRY_POTTER",
|
||||
"SESSION_TYPE_NEO_PETS",
|
||||
"SESSION_TYPE_GOODLIFE",
|
||||
"SESSION_TYPE_EQ2_GUILDS",
|
||||
"SESSION_TYPE_SWG_JP_BETA",
|
||||
"SESSION_TYPE_MARVEL",
|
||||
"SESSION_TYPE_EQ2_JAPAN",
|
||||
"SESSION_TYPE_EQ2_TAIWAN",
|
||||
"SESSION_TYPE_EQ2_CHINA",
|
||||
"SESSION_TYPE_EQ2_KOREA",
|
||||
"SESSION_TYPE_VGD",
|
||||
"SESSION_TYPE_PIRATE",
|
||||
"SESSION_TYPE_STAR_CHAMBER",
|
||||
"SESSION_TYPE_STARGATE",
|
||||
"SESSION_TYPE_DCU_ONLINE",
|
||||
"SESSION_TYPE_NORRATH_CSG",
|
||||
};
|
||||
|
||||
static const char * GamecodeString[GAMECODE_END] =
|
||||
{
|
||||
"GAMECODE_NULL",
|
||||
"GAMECODE_STATION_PASS",
|
||||
"GAMECODE_EVERQUEST",
|
||||
"GAMECODE_EVERQUEST_2",
|
||||
"GAMECODE_STARWARS",
|
||||
"GAMECODE_PLANETSIDE",
|
||||
"GAMECODE_EVERQUEST_ONLINE_ADVENTURES_BETA",
|
||||
"GAMECODE_EVERQUEST_ONLINE_ADVENTURES",
|
||||
"GAMECODE_EVERQUEST_INSTANT_MESSENGER",
|
||||
"GAMECODE_EVERQUEST_MACINTOSH",
|
||||
"GAMECODE_MATRIX_ONLINE",
|
||||
"GAMECODE_HARRY_POTTER",
|
||||
"GAMECODE_NEO_PETS",
|
||||
"GAMECODE_GOODLIFE",
|
||||
"GAMECODE_SWG_JP_BETA",
|
||||
"GAMECODE_MARVEL",
|
||||
"GAMECODE_EQ2_JAPAN",
|
||||
"GAMECODE_EQ2_TAIWAN",
|
||||
"GAMECODE_EQ2_CHINA",
|
||||
"GAMECODE_EQ2_KOREA",
|
||||
"GAMECODE_VGD",
|
||||
"GAMECODE_PIRATE",
|
||||
"GAMECODE_STAR_CHAMBER",
|
||||
"GAMECODE_STARGATE",
|
||||
"GAMECODE_DCU_ONLINE",
|
||||
"GAMECODE_NORRATH_CSG"
|
||||
};
|
||||
|
||||
static const char * SubscriptionStatusString[SUBSCRIPTION_STATUS_END] =
|
||||
{
|
||||
"SUBSCRIPTION_STATUS_NULL",
|
||||
"SUBSCRIPTION_STATUS_NO_ACCOUNT",
|
||||
"SUBSCRIPTION_STATUS_ACTIVE",
|
||||
"SUBSCRIPTION_STATUS_PENDING",
|
||||
"SUBSCRIPTION_STATUS_CANCEL",
|
||||
"SUBSCRIPTION_STATUS_TRIAL_ACTIVE",
|
||||
"SUBSCRIPTION_STATUS_TRIAL_EXPIRED",
|
||||
"SUBSCRIPTION_STATUS_SUSPENDED",
|
||||
"SUBSCRIPTION_STATUS_BANNED",
|
||||
"SUBSCRIPTION_STATUS_RENTAL_ACTIVE",
|
||||
"SUBSCRIPTION_STATUS_RENTAL_CLOSED"
|
||||
"SUBSCRIPTION_STATUS_ACTIVE_COMBO",
|
||||
"SUBSCRIPTION_STATUS_BANNED_CHARGEBACK",
|
||||
};
|
||||
|
||||
const std::pair<std::string, apiGamecode> _gamecodeID[GAMECODE_END] =
|
||||
{
|
||||
text_gamecode(std::string("SP"), GAMECODE_STATION_PASS),
|
||||
text_gamecode(std::string("EQ"), GAMECODE_EVERQUEST),
|
||||
text_gamecode(std::string("EQ2"), GAMECODE_EVERQUEST_2),
|
||||
text_gamecode(std::string("SWG"), GAMECODE_STARWARS),
|
||||
text_gamecode(std::string("PS"), GAMECODE_PLANETSIDE),
|
||||
text_gamecode(std::string("EQOA-beta"), GAMECODE_EVERQUEST_ONLINE_ADVENTURES_BETA),
|
||||
text_gamecode(std::string("EQOA"), GAMECODE_EVERQUEST_ONLINE_ADVENTURES),
|
||||
text_gamecode(std::string("EQIM"), GAMECODE_EVERQUEST_INSTANT_MESSENGER),
|
||||
text_gamecode(std::string("EQM"), GAMECODE_EVERQUEST_MACINTOSH),
|
||||
text_gamecode(std::string("MXO"), GAMECODE_MATRIX_ONLINE),
|
||||
text_gamecode(std::string("HPO"), GAMECODE_HARRY_POTTER),
|
||||
text_gamecode(std::string("NP"), GAMECODE_NEO_PETS),
|
||||
text_gamecode(std::string("GL"), GAMECODE_GOODLIFE),
|
||||
text_gamecode(std::string("SWG-JP"), GAMECODE_SWG_JP_BETA),
|
||||
text_gamecode(std::string("MRVL"), GAMECODE_MARVEL),
|
||||
text_gamecode(std::string("EQ2-JP"), GAMECODE_EQ2_JAPAN),
|
||||
text_gamecode(std::string("EQ2-TW"), GAMECODE_EQ2_TAIWAN),
|
||||
text_gamecode(std::string("EQ2-CN"), GAMECODE_EQ2_CHINA),
|
||||
text_gamecode(std::string("EQ2-KR"), GAMECODE_EQ2_KOREA),
|
||||
text_gamecode(std::string("VGD"), GAMECODE_VGD),
|
||||
text_gamecode(std::string("POCSG"), GAMECODE_PIRATE),
|
||||
text_gamecode(std::string("StarChamber"), GAMECODE_STAR_CHAMBER),
|
||||
text_gamecode(std::string("Stargate"), GAMECODE_STARGATE),
|
||||
text_gamecode(std::string("DCO"), GAMECODE_DCU_ONLINE),
|
||||
text_gamecode(std::string("NCSG"), GAMECODE_NORRATH_CSG)
|
||||
};
|
||||
static std::map<std::string,apiGamecode> GamecodeID((const std::map<std::string,apiGamecode>::value_type *)&_gamecodeID[0],(const std::map<std::string,apiGamecode>::value_type *)&_gamecodeID[GAMECODE_END]);
|
||||
|
||||
const gamecode_text _gamecodeName[GAMECODE_END] =
|
||||
{
|
||||
gamecode_text(GAMECODE_NULL, ""),
|
||||
gamecode_text(GAMECODE_STATION_PASS, "SP"),
|
||||
gamecode_text(GAMECODE_EVERQUEST, "EQ"),
|
||||
gamecode_text(GAMECODE_EVERQUEST_2, "EQ2"),
|
||||
gamecode_text(GAMECODE_STARWARS, "SWG"),
|
||||
gamecode_text(GAMECODE_PLANETSIDE, "PS"),
|
||||
gamecode_text(GAMECODE_EVERQUEST_ONLINE_ADVENTURES_BETA, "EQOA-beta"),
|
||||
gamecode_text(GAMECODE_EVERQUEST_ONLINE_ADVENTURES, "EQOA"),
|
||||
gamecode_text(GAMECODE_EVERQUEST_INSTANT_MESSENGER, "EQIM"),
|
||||
gamecode_text(GAMECODE_EVERQUEST_MACINTOSH, "EQM"),
|
||||
gamecode_text(GAMECODE_MATRIX_ONLINE, "MXO"),
|
||||
gamecode_text(GAMECODE_HARRY_POTTER, "HPO"),
|
||||
gamecode_text(GAMECODE_NEO_PETS, "NP"),
|
||||
gamecode_text(GAMECODE_GOODLIFE, "GL"),
|
||||
gamecode_text(GAMECODE_SWG_JP_BETA, "SWG-JP"),
|
||||
gamecode_text(GAMECODE_MARVEL, "MRVL"),
|
||||
gamecode_text(GAMECODE_EQ2_JAPAN, "EQ2-JP"),
|
||||
gamecode_text(GAMECODE_EQ2_TAIWAN, "EQ2-TW"),
|
||||
gamecode_text(GAMECODE_EQ2_CHINA, "EQ2-CN"),
|
||||
gamecode_text(GAMECODE_EQ2_KOREA, "EQ2-KR"),
|
||||
gamecode_text(GAMECODE_VGD, "VGD"),
|
||||
gamecode_text(GAMECODE_PIRATE, "POCSG"),
|
||||
gamecode_text(GAMECODE_STAR_CHAMBER, "StarChamber"),
|
||||
gamecode_text(GAMECODE_STARGATE, "Stargate"),
|
||||
gamecode_text(GAMECODE_DCU_ONLINE, "DCO"),
|
||||
gamecode_text(GAMECODE_NORRATH_CSG, "NCSG")
|
||||
};
|
||||
static std::map<apiGamecode,const char *> GamecodeName((const std::map<apiGamecode,const char *>::value_type *)&_gamecodeName[0],(const std::map<apiGamecode,const char *>::value_type *)&_gamecodeName[GAMECODE_END]);
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,764 @@
|
||||
#pragma warning (disable : 4786)
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
#include <stdlib.h>
|
||||
#include "CommonClient.h"
|
||||
#include "CommonMessages.h"
|
||||
#include "Base/Platform.h"
|
||||
#include <algorithm>
|
||||
|
||||
|
||||
using namespace std;
|
||||
using namespace Base;
|
||||
|
||||
|
||||
const int CONNECTION_ATTEMPT_TIMEOUT = 4; // connection timeout in seconds
|
||||
const int CONNECTION_DELAY = 5; // pause between connection attempts in seconds
|
||||
const int KEEP_ALIVE_DELAY = 15; // connection keep-alive timeout in seconds
|
||||
const int PORT_ALIVE_DELAY = 0; // port-alive delay in milliseconds
|
||||
const int NO_DATA_TIMEOUT = 0; // no-data timeout in seconds
|
||||
const int UNACKNOWLEDGED_DATA_TIMEOUT = 15; // unacknowledged-data timeout in seconds
|
||||
|
||||
struct RandFunction : std::unary_function<int,int>
|
||||
{
|
||||
int operator()(int n) { return rand()%n; }
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
CConnectionHandler::CConnectionHandler(CConnectionManager & parent, UdpConnection * connection, unsigned index) :
|
||||
mParent(parent),
|
||||
mConnection(connection),
|
||||
mIndex(index)
|
||||
{
|
||||
if (mConnection)
|
||||
mConnection->SetHandler(this);
|
||||
}
|
||||
|
||||
CConnectionHandler::~CConnectionHandler()
|
||||
{
|
||||
if (mConnection)
|
||||
{
|
||||
mConnection->SetHandler(NULL);
|
||||
mConnection->Disconnect();
|
||||
mConnection->Release();
|
||||
}
|
||||
}
|
||||
|
||||
void CConnectionHandler::Send(const Base::ByteStream & stream)
|
||||
{
|
||||
if (mConnection && mConnection->GetStatus() == UdpConnection::cStatusConnected)
|
||||
{
|
||||
mConnection->Send(cUdpChannelReliable1, stream.getBuffer(), stream.getSize());
|
||||
}
|
||||
}
|
||||
|
||||
void CConnectionHandler::OnConnectComplete(UdpConnection *)
|
||||
{
|
||||
if (mConnection->GetStatus() == UdpConnection::cStatusConnected)
|
||||
{
|
||||
Message::Connect message;
|
||||
message.SetVersion(mParent.GetCore().GetVersion());
|
||||
message.SetDescription(mParent.GetCore().GetDescription());
|
||||
Base::ByteStream stream;
|
||||
message.pack(stream);
|
||||
Send(stream);
|
||||
}
|
||||
else
|
||||
{
|
||||
OnTerminated(mConnection);
|
||||
}
|
||||
}
|
||||
|
||||
void CConnectionHandler::OnTerminated(UdpConnection *)
|
||||
{
|
||||
mParent.OnConnectionClosed(mIndex);
|
||||
|
||||
if (mConnection)
|
||||
{
|
||||
mConnection->SetHandler(NULL);
|
||||
mConnection->Release();
|
||||
mConnection = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void CConnectionHandler::OnRoutePacket(UdpConnection *, const uchar *data, int dataLen)
|
||||
{
|
||||
unsigned short itemCount;
|
||||
unsigned short messageId = 0;
|
||||
unsigned trackingNumber = 0;
|
||||
|
||||
if (dataLen < 8)
|
||||
return;
|
||||
|
||||
Base::ByteStream stream(data,dataLen);
|
||||
Base::ByteStream::ReadIterator streamIterator = stream.begin();
|
||||
|
||||
Base::get(streamIterator, itemCount);
|
||||
Base::get(streamIterator, messageId);
|
||||
Base::get(streamIterator, trackingNumber);
|
||||
|
||||
if (messageId == Message::MESSAGE_CONNECT_REPLY)
|
||||
{
|
||||
streamIterator = stream.begin();
|
||||
Message::ConnectReply message(streamIterator);
|
||||
if (message.GetResult() == RESULT_SUCCESS)
|
||||
mParent.OnConnectionOpened(mIndex);
|
||||
else
|
||||
OnTerminated(mConnection);
|
||||
}
|
||||
|
||||
mParent.GetCore().QueueTrackedCallback(stream);
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
CConnectionManager::CConnectionManager(apiCore & parent, std::vector<std::string> & serverList, unsigned maxConnections) :
|
||||
mParent(parent),
|
||||
mServerArray(),
|
||||
mServerCount(0),
|
||||
mMaxConnections(maxConnections),
|
||||
mParams(),
|
||||
mUdpManager(0),
|
||||
mConnectionArray(),
|
||||
mConnectedSet(),
|
||||
mPendingSet(),
|
||||
mDisconnectedQueue(),
|
||||
mSendQueue(),
|
||||
mConnectionCount(0),
|
||||
mActiveCount(0),
|
||||
mConnectionDelay(0)
|
||||
{
|
||||
for (unsigned serverIndex = 0; serverIndex < serverList.size(); serverIndex++)
|
||||
{
|
||||
std::string address = serverList[serverIndex];
|
||||
unsigned portIndex = address.find(':');
|
||||
if (portIndex != string::npos)
|
||||
{
|
||||
std::string host = address.substr(0, portIndex);
|
||||
std::string port = address.substr(portIndex+1);
|
||||
|
||||
if (!host.length() || !port.length())
|
||||
continue;
|
||||
|
||||
portIndex = port.find('-');
|
||||
if (portIndex == string::npos)
|
||||
{
|
||||
if (atoi(port.c_str()) == 0)
|
||||
continue;
|
||||
mServerArray.push_back(address);
|
||||
mServerCount++;
|
||||
}
|
||||
else
|
||||
{
|
||||
int first = atoi(port.substr(0,portIndex).c_str());
|
||||
int last = atoi(port.substr(portIndex+1).c_str());
|
||||
|
||||
if (!first || !last)
|
||||
continue;
|
||||
|
||||
char buffer[64];
|
||||
for (int rangeIndex=first; rangeIndex<=last; rangeIndex++)
|
||||
{
|
||||
sprintf(buffer,"%s:%d",host.c_str(),rangeIndex);
|
||||
mServerArray.push_back(std::string(buffer));
|
||||
mServerCount++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (mMaxConnections > mServerCount)
|
||||
mMaxConnections = mServerCount;
|
||||
if (mMaxConnections == 0)
|
||||
mMaxConnections = 1;
|
||||
|
||||
//mParams.handler = this;
|
||||
mParams.keepAliveDelay = parent.GetKeepAliveDelay() * 1000;
|
||||
mParams.portAliveDelay = parent.GetPortAliveDelay();
|
||||
mParams.incomingBufferSize = 256 * 1024;
|
||||
mParams.outgoingBufferSize = 256 * 1024;
|
||||
mParams.maxConnections = mMaxConnections;
|
||||
mParams.hashTableSize = mMaxConnections*10;
|
||||
mParams.port = 0;
|
||||
|
||||
mUdpManager = new UdpManager(&mParams);
|
||||
|
||||
srand((int)Base::getTimer()+(int)time(0));
|
||||
RandFunction myRand;
|
||||
random_shuffle(mServerArray.begin(), mServerArray.end(), myRand);
|
||||
mConnectionArray.resize(mServerCount,0);
|
||||
for (unsigned i=0; i<mServerCount; i++)
|
||||
{
|
||||
mDisconnectedQueue.push_back(i);
|
||||
}
|
||||
}
|
||||
|
||||
CConnectionManager::~CConnectionManager()
|
||||
{
|
||||
for (unsigned i=0; i<mConnectionArray.size(); i++)
|
||||
{
|
||||
if (mConnectionArray[i] != 0)
|
||||
{
|
||||
delete mConnectionArray[i];
|
||||
mConnectionArray[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
mUdpManager->Release();
|
||||
}
|
||||
|
||||
void CConnectionManager::Process()
|
||||
{
|
||||
mUdpManager->GiveTime();
|
||||
|
||||
////////////////////////////////////////
|
||||
// try a new connection if:
|
||||
// 1. active connection count (pending + connected) < max connections
|
||||
// 2. (and) the set of disconnect servers is not empty
|
||||
// 3. (and) connection delay has expired or there are no active connections
|
||||
if (mActiveCount < mMaxConnections && !mDisconnectedQueue.empty())
|
||||
{
|
||||
if (!mConnectionCount || mConnectionDelay < (unsigned)time(0))
|
||||
{
|
||||
Connect();
|
||||
}
|
||||
}
|
||||
|
||||
for (unsigned i=0; i<mServerCount; i++)
|
||||
{
|
||||
CConnectionHandler * handler = mConnectionArray[i];
|
||||
if (!handler)
|
||||
continue;
|
||||
|
||||
if (!handler->mConnection)
|
||||
{
|
||||
std::set<unsigned>::iterator iterator;
|
||||
|
||||
// remove from connected set
|
||||
if ((iterator = mConnectedSet.find(i)) != mConnectedSet.end())
|
||||
{
|
||||
mConnectedSet.erase(iterator);
|
||||
mActiveCount--;
|
||||
mConnectionCount--;
|
||||
}
|
||||
|
||||
// remove from pending set
|
||||
if ((iterator = mPendingSet.find(i)) != mPendingSet.end())
|
||||
{
|
||||
mPendingSet.erase(iterator);
|
||||
mActiveCount--;
|
||||
}
|
||||
|
||||
// add to disconnected set
|
||||
mDisconnectedQueue.push_back(i);
|
||||
|
||||
delete handler;
|
||||
mConnectionArray[i] = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
UdpConnection::ChannelStatus cs;
|
||||
handler->mConnection->GetChannelStatus(cUdpChannelReliable1,&cs);
|
||||
if (handler->mConnection->GetStatus() == UdpConnection::cStatusDisconnected || cs.oldestUnacknowledgedAge > mParent.GetUnacknowledgedDataTimeout()*1000) // 30 seconds, fairly liberal, odds are the connection is dead after 10 seconds
|
||||
{
|
||||
handler->OnTerminated(handler->mConnection);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CConnectionManager::Connect()
|
||||
{
|
||||
unsigned index = mDisconnectedQueue.front();
|
||||
mDisconnectedQueue.pop_front();
|
||||
|
||||
std::string address;
|
||||
int port;
|
||||
|
||||
if (!ParseAddress(mServerArray[index],address,port))
|
||||
{
|
||||
mDisconnectedQueue.push_back(index);
|
||||
return;
|
||||
}
|
||||
|
||||
UdpConnection * connection = mUdpManager->EstablishConnection(address.c_str(), port, CONNECTION_ATTEMPT_TIMEOUT*1000);
|
||||
if (connection)
|
||||
{
|
||||
mConnectionArray[index] = new CConnectionHandler(*this, connection, index);
|
||||
|
||||
mPendingSet.insert(index);
|
||||
mActiveCount++;
|
||||
}
|
||||
else
|
||||
{
|
||||
mDisconnectedQueue.push_back(index);
|
||||
mParent.OnConnectionFailed(mServerArray[index],mConnectionCount);
|
||||
}
|
||||
}
|
||||
|
||||
void CConnectionManager::Send(const Base::ByteStream & stream)
|
||||
{
|
||||
if (CanSend())
|
||||
{
|
||||
unsigned index;
|
||||
CConnectionHandler * handler = 0;
|
||||
while (!handler && !mSendQueue.empty())
|
||||
{
|
||||
index = mSendQueue.front();
|
||||
mSendQueue.pop_front();
|
||||
|
||||
handler = mConnectionArray[index];
|
||||
}
|
||||
|
||||
if (handler)
|
||||
{
|
||||
mSendQueue.push_back(index);
|
||||
handler->Send(stream);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool CConnectionManager::CanSend()
|
||||
{
|
||||
return (mConnectionCount > 0);
|
||||
}
|
||||
|
||||
void CConnectionManager::SetConnectionDelay()
|
||||
{
|
||||
mConnectionDelay = (int)time(0) + CONNECTION_DELAY;
|
||||
}
|
||||
|
||||
void CConnectionManager::OnConnectionOpened(unsigned index)
|
||||
{
|
||||
mPendingSet.erase(index);
|
||||
mConnectedSet.insert(index);
|
||||
mSendQueue.push_back(index);
|
||||
mConnectionCount++;
|
||||
|
||||
mParent.OnConnectionOpened(mServerArray[index],mConnectionCount);
|
||||
}
|
||||
|
||||
void CConnectionManager::OnConnectionClosed(unsigned index)
|
||||
{
|
||||
if (mPendingSet.find(index) != mPendingSet.end())
|
||||
{
|
||||
mParent.OnConnectionFailed(mServerArray[index],mConnectionCount ? mConnectionCount-1 : mConnectionCount);
|
||||
}
|
||||
else
|
||||
{
|
||||
mSendQueue.remove(index);
|
||||
mParent.OnConnectionClosed(mServerArray[index],mConnectionCount);
|
||||
}
|
||||
}
|
||||
|
||||
bool CConnectionManager::ParseAddress(const std::string & full, std::string & address, int & port)
|
||||
{
|
||||
unsigned index = full.find(':');
|
||||
if (full.length() == 0 || index == string::npos)
|
||||
return false;
|
||||
|
||||
address = full.substr(0,index);
|
||||
port = atoi(full.substr(index+1).c_str());
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
apiClient::apiClient() :
|
||||
mClientCore(0)
|
||||
{
|
||||
}
|
||||
|
||||
apiClient::~apiClient()
|
||||
{
|
||||
}
|
||||
|
||||
void apiClient::Process()
|
||||
{
|
||||
if (mClientCore)
|
||||
static_cast<apiCore *>(mClientCore)->Process();
|
||||
}
|
||||
|
||||
void apiClient::OnConnectionOpened(const char *, unsigned)
|
||||
{
|
||||
}
|
||||
|
||||
void apiClient::OnConnectionClosed(const char *, unsigned)
|
||||
{
|
||||
}
|
||||
|
||||
void apiClient::OnConnectionFailed(const char *, unsigned)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
apiCore::apiCore(apiClient * parent, const char * version, const char * serverList, const char * description, unsigned maxConnections) :
|
||||
mParent(parent),
|
||||
mVersion(version),
|
||||
mDescription(description),
|
||||
mServerArray(),
|
||||
mMaxConnections(maxConnections),
|
||||
mConnectionManager(0),
|
||||
mTrackingIndex(1),
|
||||
mTrackedMessages(),
|
||||
mRequestMap(),
|
||||
mCallbackQueue(),
|
||||
mTrackedCallbackQueue(),
|
||||
mTimeoutQueue(),
|
||||
mRequestQueueSize(0),
|
||||
mExpirationTimeout(0),
|
||||
mInCallback(false)
|
||||
{
|
||||
std::string list = serverList;
|
||||
unsigned offset=0;
|
||||
unsigned index=0;
|
||||
|
||||
while ((index = list.find(' ',offset)) != std::string::npos)
|
||||
{
|
||||
mServerArray.push_back(list.substr(offset, index-offset));
|
||||
offset = index + 1;
|
||||
}
|
||||
|
||||
mServerArray.push_back(list.substr(offset));
|
||||
|
||||
if (mDescription.length() > 64)
|
||||
mDescription = mDescription.substr(0,64);
|
||||
}
|
||||
|
||||
apiCore::apiCore(apiClient * parent, const char * version, const char ** serverList, unsigned serverCount, const char * description, unsigned maxConnections) :
|
||||
mParent(parent),
|
||||
mVersion(version),
|
||||
mDescription(description),
|
||||
mServerArray(),
|
||||
mMaxConnections(maxConnections),
|
||||
mConnectionManager(0),
|
||||
mTrackingIndex(1),
|
||||
mTrackedMessages(),
|
||||
mRequestMap(),
|
||||
mCallbackQueue(),
|
||||
mTrackedCallbackQueue(),
|
||||
mTimeoutQueue(),
|
||||
mRequestQueueSize(0),
|
||||
mExpirationTimeout(0),
|
||||
mInCallback(false)
|
||||
{
|
||||
for (unsigned i=0; i<serverCount; i++)
|
||||
{
|
||||
mServerArray.push_back(serverList[i]);
|
||||
}
|
||||
|
||||
if (mDescription.length() > 64)
|
||||
mDescription = mDescription.substr(0,64);
|
||||
}
|
||||
|
||||
apiCore::~apiCore()
|
||||
{
|
||||
delete mConnectionManager;
|
||||
}
|
||||
|
||||
int apiCore::GetKeepAliveDelay()
|
||||
{
|
||||
return KEEP_ALIVE_DELAY;
|
||||
}
|
||||
|
||||
int apiCore::GetPortAliveDelay()
|
||||
{
|
||||
return PORT_ALIVE_DELAY;
|
||||
}
|
||||
|
||||
int apiCore::GetNoDataTimeout()
|
||||
{
|
||||
return NO_DATA_TIMEOUT;
|
||||
}
|
||||
|
||||
int apiCore::GetUnacknowledgedDataTimeout()
|
||||
{
|
||||
return UNACKNOWLEDGED_DATA_TIMEOUT;
|
||||
}
|
||||
|
||||
void apiCore::NotifyConnectionOpened(const char *address, unsigned connectionCount)
|
||||
{
|
||||
}
|
||||
|
||||
void apiCore::NotifyConnectionClosed(const char *address, unsigned connectionCount)
|
||||
{
|
||||
}
|
||||
|
||||
void apiCore::NotifyConnectionFailed(const char *address, unsigned connectionCount)
|
||||
{
|
||||
}
|
||||
|
||||
void apiCore::OnConnectionOpened(const std::string & address, unsigned connectionCount)
|
||||
{
|
||||
NotifyConnectionOpened(address.c_str(),connectionCount);
|
||||
mParent->OnConnectionOpened(address.c_str(),connectionCount);
|
||||
}
|
||||
|
||||
void apiCore::OnConnectionClosed(const std::string & address, unsigned connectionCount)
|
||||
{
|
||||
NotifyConnectionClosed(address.c_str(),connectionCount);
|
||||
mParent->OnConnectionClosed(address.c_str(),connectionCount);
|
||||
}
|
||||
|
||||
void apiCore::OnConnectionFailed(const std::string & address, unsigned connectionCount)
|
||||
{
|
||||
NotifyConnectionFailed(address.c_str(),connectionCount);
|
||||
mParent->OnConnectionFailed(address.c_str(),connectionCount);
|
||||
}
|
||||
|
||||
bool apiCore::IsTrackedMessage(const unsigned short messageId)
|
||||
{
|
||||
return mTrackedMessages.find(messageId) != mTrackedMessages.end();
|
||||
}
|
||||
|
||||
void apiCore::RegisterTrackedMessage(const unsigned short messageId)
|
||||
{
|
||||
mTrackedMessages.insert(messageId);
|
||||
}
|
||||
|
||||
////////////////////////////////////////
|
||||
// This function submits a request that expects no reply
|
||||
void apiCore::SubmitRequest(Message::Basic & input)
|
||||
{
|
||||
Base::ByteStream stream;
|
||||
input.pack(stream);
|
||||
|
||||
if (mConnectionManager && mConnectionManager->CanSend())
|
||||
mConnectionManager->Send(stream);
|
||||
}
|
||||
|
||||
////////////////////////////////////////
|
||||
// This function submits a request that expects a reply
|
||||
apiTrackingNumber apiCore::SubmitRequest(Message::Tracked & input, Message::TrackedReply & output, const void * userData, unsigned timeout)
|
||||
{
|
||||
////////////////////////////////////////
|
||||
// Set tracking number
|
||||
apiTrackingNumber trackingNumber = mTrackingIndex++;
|
||||
|
||||
input.SetTrackingNumber(trackingNumber);
|
||||
output.SetTrackingNumber(trackingNumber);
|
||||
|
||||
mRequestMap.insert(pair<apiTrackingNumber,apiTrackedRequest>(trackingNumber, apiTrackedRequest(trackingNumber, output.GetMessageID(), userData, timeout)));
|
||||
|
||||
////////////////////////////////////////
|
||||
// Verify that the request needs to be sent.
|
||||
// If the default result is not RESULT_TIMEOUT,
|
||||
// trigger callback using the output
|
||||
if (!mConnectionManager || !mConnectionManager->CanSend() || output.GetResult() != RESULT_TIMEOUT)
|
||||
{
|
||||
QueueTrackedCallback(output);
|
||||
}
|
||||
else
|
||||
{
|
||||
Base::ByteStream stream;
|
||||
input.pack(stream);
|
||||
|
||||
mConnectionManager->Send(stream);
|
||||
}
|
||||
|
||||
return input.GetTrackingNumber();
|
||||
}
|
||||
|
||||
void apiCore::QueueCallback(const Base::ByteStream & stream)
|
||||
{
|
||||
mCallbackQueue.push_back(stream);
|
||||
}
|
||||
|
||||
void apiCore::QueueCallback(const Message::Basic & message)
|
||||
{
|
||||
Base::ByteStream stream;
|
||||
message.pack(stream);
|
||||
|
||||
mCallbackQueue.push_back(stream);
|
||||
}
|
||||
|
||||
void apiCore::QueueTrackedCallback(const Base::ByteStream & stream)
|
||||
{
|
||||
mTrackedCallbackQueue.push_back(stream);
|
||||
}
|
||||
|
||||
void apiCore::QueueTrackedCallback(const Message::Basic & message)
|
||||
{
|
||||
Base::ByteStream stream;
|
||||
message.pack(stream);
|
||||
|
||||
mTrackedCallbackQueue.push_back(stream);
|
||||
}
|
||||
|
||||
std::string & apiCore::GetVersion()
|
||||
{
|
||||
return mVersion;
|
||||
}
|
||||
|
||||
std::string & apiCore::GetDescription()
|
||||
{
|
||||
return mDescription;
|
||||
}
|
||||
|
||||
void apiCore::Process()
|
||||
{
|
||||
if (mInCallback)
|
||||
return;
|
||||
mInCallback = true;
|
||||
|
||||
unsigned currentTime = (unsigned)time(0);
|
||||
|
||||
////////////////////////////////////////
|
||||
// Process connection manager
|
||||
if (mConnectionManager)
|
||||
mConnectionManager->Process();
|
||||
else
|
||||
{
|
||||
mConnectionManager = new CConnectionManager(*this, mServerArray, mMaxConnections);
|
||||
}
|
||||
|
||||
////////////////////////////////////////
|
||||
// Check timeout in Request Map
|
||||
if (mExpirationTimeout <= currentTime)
|
||||
{
|
||||
map<unsigned,apiTrackedRequest>::iterator mapIterator = mRequestMap.begin();
|
||||
while (mapIterator != mRequestMap.end())
|
||||
{
|
||||
apiTrackedRequest & request = (*mapIterator).second;
|
||||
mapIterator++;
|
||||
|
||||
if (request.Expired())
|
||||
{
|
||||
mTimeoutQueue.push_back(request.GetTrackingNumber());
|
||||
}
|
||||
}
|
||||
mExpirationTimeout = currentTime + 3;
|
||||
}
|
||||
|
||||
////////////////////////////////////////
|
||||
// Process Timeout Queue
|
||||
while (!mTimeoutQueue.empty())
|
||||
{
|
||||
apiTrackingNumber trackingNumber = mTimeoutQueue.front();
|
||||
|
||||
map<unsigned,apiTrackedRequest>::iterator mapIterator;
|
||||
mapIterator = mRequestMap.find(trackingNumber);
|
||||
if (mapIterator != mRequestMap.end())
|
||||
{
|
||||
apiTrackedRequest & request = mapIterator->second;
|
||||
Timeout(request.GetMessageId(), trackingNumber, (void *)request.GetUserData());
|
||||
mRequestMap.erase(mapIterator);
|
||||
}
|
||||
mTimeoutQueue.pop_front();
|
||||
}
|
||||
|
||||
/*
|
||||
////////////////////////////////////////
|
||||
// Process Callback Queue
|
||||
while (!mCallbackQueue.empty())
|
||||
{
|
||||
Base::ByteStream & stream = mCallbackQueue.front();
|
||||
Callback(stream,0);
|
||||
mCallbackQueue.pop_front();
|
||||
}
|
||||
*/
|
||||
|
||||
////////////////////////////////////////
|
||||
// Process Tracked Callback Queue
|
||||
while (!mTrackedCallbackQueue.empty())
|
||||
{
|
||||
unsigned short itemCount;
|
||||
unsigned short messageId = 0;
|
||||
|
||||
Base::ByteStream & stream = mTrackedCallbackQueue.front();
|
||||
Base::ByteStream::ReadIterator streamIterator = stream.begin();
|
||||
Base::get(streamIterator, itemCount);
|
||||
Base::get(streamIterator, messageId);
|
||||
|
||||
if (!IsTrackedMessage(messageId))
|
||||
{
|
||||
Callback(stream,0);
|
||||
}
|
||||
else
|
||||
{
|
||||
streamIterator = stream.begin();
|
||||
Message::Tracked message(streamIterator);
|
||||
|
||||
map<apiTrackingNumber,apiTrackedRequest>::iterator mapIterator = mRequestMap.find(message.GetTrackingNumber());
|
||||
if (mapIterator != mRequestMap.end())
|
||||
{
|
||||
apiTrackedRequest & request = (*mapIterator).second;
|
||||
Callback(stream,(void *)request.GetUserData());
|
||||
mRequestMap.erase(mapIterator);
|
||||
}
|
||||
}
|
||||
mTrackedCallbackQueue.pop_front();
|
||||
}
|
||||
|
||||
mInCallback = false;
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
const int DEFAULT_TIMEOUT = 20;
|
||||
|
||||
|
||||
apiTrackedRequest::apiTrackedRequest(apiTrackingNumber trackingNumber, const unsigned short messageId, const void * userData, unsigned duration) :
|
||||
mTrackingNumber(trackingNumber),
|
||||
mMessageId(messageId),
|
||||
mUserData(userData),
|
||||
mTimeout(0),
|
||||
mDuration(duration)
|
||||
{
|
||||
if (mDuration == 0)
|
||||
mDuration = DEFAULT_TIMEOUT;
|
||||
|
||||
mTimeout = (int)time(0) + mDuration;
|
||||
}
|
||||
|
||||
apiTrackedRequest::apiTrackedRequest(const apiTrackedRequest & copy) :
|
||||
mTrackingNumber(copy.mTrackingNumber),
|
||||
mMessageId(copy.mMessageId),
|
||||
mUserData(copy.mUserData),
|
||||
mTimeout(copy.mTimeout),
|
||||
mDuration(copy.mDuration)
|
||||
{
|
||||
}
|
||||
|
||||
apiTrackedRequest::~apiTrackedRequest()
|
||||
{
|
||||
}
|
||||
|
||||
apiTrackingNumber apiTrackedRequest::GetTrackingNumber()
|
||||
{
|
||||
return mTrackingNumber;
|
||||
}
|
||||
|
||||
unsigned short apiTrackedRequest::GetMessageId()
|
||||
{
|
||||
return mMessageId;
|
||||
}
|
||||
|
||||
const void * apiTrackedRequest::GetUserData()
|
||||
{
|
||||
return mUserData;
|
||||
}
|
||||
|
||||
bool apiTrackedRequest::Expired()
|
||||
{
|
||||
return mTimeout < (unsigned)time(0);
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -0,0 +1,195 @@
|
||||
#ifndef COMMON_API__COMMON_CLIENT_H
|
||||
#define COMMON_API__COMMON_CLIENT_H
|
||||
|
||||
|
||||
#include <list>
|
||||
#include <set>
|
||||
#include <map>
|
||||
#include "Base/Archive.h"
|
||||
#include "UdpLibrary.hpp"
|
||||
#include "CommonAPI.h"
|
||||
#include "CommonMessages.h"
|
||||
|
||||
#ifdef COMMON__UDPLIBRARY_HPP
|
||||
using CommonAPI::UdpManager;
|
||||
using CommonAPI::UdpConnectionHandler;
|
||||
using CommonAPI::UdpConnection;
|
||||
using CommonAPI::uchar;
|
||||
using CommonAPI::cUdpChannelReliable1;
|
||||
#endif
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
class apiTrackedRequest;
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
class CConnectionManager;
|
||||
class CConnectionHandler : public UdpConnectionHandler
|
||||
{
|
||||
public:
|
||||
CConnectionHandler(CConnectionManager & parent, UdpConnection * connection, unsigned index);
|
||||
virtual ~CConnectionHandler();
|
||||
|
||||
void Send(const Base::ByteStream & stream);
|
||||
|
||||
virtual void OnRoutePacket(UdpConnection *con, const uchar *data, int dataLen);
|
||||
virtual void OnConnectComplete(UdpConnection *con);
|
||||
virtual void OnTerminated(UdpConnection *con);
|
||||
|
||||
public:
|
||||
CConnectionManager & mParent;
|
||||
UdpConnection * mConnection;
|
||||
unsigned mIndex;
|
||||
};
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
class CConnectionManager
|
||||
{
|
||||
public:
|
||||
CConnectionManager(apiCore & parent, std::vector<std::string> & serverList, unsigned maxConnections);
|
||||
virtual ~CConnectionManager();
|
||||
|
||||
void Process();
|
||||
void Connect();
|
||||
void Send(const Base::ByteStream & stream);
|
||||
bool CanSend();
|
||||
void SetConnectionDelay();
|
||||
|
||||
apiCore & GetCore() { return mParent; }
|
||||
|
||||
void OnConnectionOpened(unsigned index);
|
||||
void OnConnectionClosed(unsigned index);
|
||||
|
||||
bool ParseAddress(const std::string & full, std::string & address, int & port);
|
||||
|
||||
protected:
|
||||
apiCore & mParent;
|
||||
std::vector<std::string> mServerArray;
|
||||
unsigned mServerCount;
|
||||
unsigned mMaxConnections;
|
||||
|
||||
UdpManager::Params mParams;
|
||||
UdpManager * mUdpManager;
|
||||
|
||||
std::vector<CConnectionHandler *> mConnectionArray;
|
||||
std::set<unsigned> mConnectedSet;
|
||||
std::set<unsigned> mPendingSet;
|
||||
std::list<unsigned> mDisconnectedQueue;
|
||||
std::list<unsigned> mSendQueue;
|
||||
unsigned mConnectionCount;
|
||||
unsigned mActiveCount;
|
||||
|
||||
unsigned mConnectionDelay;
|
||||
};
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
class apiTrackedRequest
|
||||
{
|
||||
public:
|
||||
apiTrackedRequest(apiTrackingNumber trackingNumber, const unsigned short messageId, const void * userData, unsigned duration = 20);
|
||||
apiTrackedRequest(const apiTrackedRequest & copy);
|
||||
~apiTrackedRequest();
|
||||
|
||||
apiTrackingNumber GetTrackingNumber();
|
||||
unsigned short GetMessageId();
|
||||
const void * GetUserData();
|
||||
|
||||
bool Expired();
|
||||
|
||||
private:
|
||||
apiTrackingNumber mTrackingNumber;
|
||||
unsigned short mMessageId;
|
||||
const void * mUserData;
|
||||
unsigned mTimeout;
|
||||
unsigned mDuration;
|
||||
};
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
class apiCore
|
||||
{
|
||||
friend class CConnectionHandler;
|
||||
friend class CConnectionManager;
|
||||
|
||||
public:
|
||||
apiCore(apiClient * parent, const char * version, const char * serverList, const char * description, unsigned maxConnections);
|
||||
apiCore(apiClient * parent, const char * version, const char ** serverList, unsigned serverCount, const char * description, unsigned maxConnections);
|
||||
virtual ~apiCore();
|
||||
|
||||
apiClient * GetParent() { return mParent; }
|
||||
|
||||
void Process();
|
||||
|
||||
void RegisterTrackedMessage(const unsigned short messageId);
|
||||
bool IsTrackedMessage(const unsigned short messageId);
|
||||
|
||||
virtual int GetKeepAliveDelay();
|
||||
virtual int GetPortAliveDelay();
|
||||
virtual int GetNoDataTimeout();
|
||||
virtual int GetUnacknowledgedDataTimeout();
|
||||
virtual void NotifyConnectionOpened(const char *address, unsigned connectionCount);
|
||||
virtual void NotifyConnectionClosed(const char *address, unsigned connectionCount);
|
||||
virtual void NotifyConnectionFailed(const char *address, unsigned connectionCount);
|
||||
|
||||
protected:
|
||||
void SubmitRequest(Message::Basic & input);
|
||||
apiTrackingNumber SubmitRequest(Message::Tracked & input, Message::TrackedReply & output, const void * userData, unsigned timeout=0);
|
||||
|
||||
virtual bool Callback(Base::ByteStream & stream, void * userData) = 0;
|
||||
virtual void Timeout(unsigned short messageId, apiTrackingNumber trackingNumber, void * userData) = 0;
|
||||
|
||||
private:
|
||||
void OnConnectionOpened(const std::string & address, unsigned connectionCount);
|
||||
void OnConnectionClosed(const std::string & address, unsigned connectionCount);
|
||||
void OnConnectionFailed(const std::string & address, unsigned connectionCount);
|
||||
|
||||
void QueueRequest(Message::Basic & input);
|
||||
void QueueTrackedRequest(Message::Tracked & input, apiTrackedRequest & request);
|
||||
|
||||
void QueueCallback(const Base::ByteStream & stream);
|
||||
void QueueCallback(const Message::Basic & input);
|
||||
void QueueTrackedCallback(const Base::ByteStream & stream);
|
||||
void QueueTrackedCallback(const Message::Basic & input);
|
||||
|
||||
std::string & GetVersion();
|
||||
std::string & GetDescription();
|
||||
|
||||
void Update();
|
||||
|
||||
private:
|
||||
apiClient * mParent;
|
||||
std::string mVersion;
|
||||
std::string mDescription;
|
||||
std::vector<std::string> mServerArray;
|
||||
unsigned mMaxConnections;
|
||||
|
||||
CConnectionManager * mConnectionManager;
|
||||
|
||||
apiTrackingNumber mTrackingIndex;
|
||||
|
||||
std::set<unsigned short> mTrackedMessages;
|
||||
std::map<unsigned,apiTrackedRequest> mRequestMap;
|
||||
|
||||
std::list<Base::ByteStream> mCallbackQueue;
|
||||
std::list<Base::ByteStream> mTrackedCallbackQueue;
|
||||
std::list<apiTrackingNumber> mTimeoutQueue;
|
||||
|
||||
unsigned mRequestQueueSize;
|
||||
unsigned mExpirationTimeout;
|
||||
bool mInCallback;
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,333 @@
|
||||
#include "CommonMessages.h"
|
||||
|
||||
|
||||
namespace Base
|
||||
{
|
||||
|
||||
|
||||
void get(ByteStream::ReadIterator & source, apiAccount & target)
|
||||
{
|
||||
char name[apiAccountNameWidth];
|
||||
apiAccountId id;
|
||||
apiAccountStatus status;
|
||||
|
||||
get(source, (unsigned char *)name, apiAccountNameWidth);
|
||||
get(source, id);
|
||||
get(source, status);
|
||||
|
||||
target.SetName(name);
|
||||
target.SetId(id);
|
||||
target.SetStatus(status);
|
||||
}
|
||||
|
||||
void get(ByteStream::ReadIterator & source, apiSubscription & target)
|
||||
{
|
||||
apiGamecode gamecode;
|
||||
apiProviderId provider;
|
||||
apiSubscriptionStatus status;
|
||||
apiProductFeatures subscriptionFeatures;
|
||||
apiProductFeatures gameFeatures;
|
||||
unsigned durationSeconds;
|
||||
unsigned parentalLimitSeconds;
|
||||
|
||||
get(source, gamecode);
|
||||
get(source, provider);
|
||||
get(source, status);
|
||||
get(source, subscriptionFeatures);
|
||||
get(source, gameFeatures);
|
||||
get(source, durationSeconds);
|
||||
get(source, parentalLimitSeconds);
|
||||
|
||||
target.SetGamecode(gamecode);
|
||||
target.SetProviderId(provider);
|
||||
target.SetStatus(status);
|
||||
target.SetSubscriptionFeatures(subscriptionFeatures);
|
||||
target.SetGameFeatures(gameFeatures);
|
||||
target.SetDurationSeconds(durationSeconds);
|
||||
target.SetParentalLimitSeconds(parentalLimitSeconds);
|
||||
|
||||
}
|
||||
|
||||
void get(ByteStream::ReadIterator & source, apiSession & target)
|
||||
{
|
||||
apiSessionType type;
|
||||
apiProviderId provider;
|
||||
char id[apiSessionIdWidth];
|
||||
apiIP clientIP;
|
||||
unsigned durationSeconds;
|
||||
unsigned parentalLimitSeconds;
|
||||
unsigned char timeoutMinutes;
|
||||
bool isSecure;
|
||||
|
||||
get(source, type);
|
||||
get(source, provider);
|
||||
get(source, (unsigned char *)id, apiSessionIdWidth);
|
||||
get(source, clientIP);
|
||||
get(source, durationSeconds);
|
||||
get(source, parentalLimitSeconds);
|
||||
get(source, timeoutMinutes);
|
||||
get(source, isSecure);
|
||||
|
||||
target.SetType(type);
|
||||
target.SetProviderId(provider);
|
||||
target.SetId(id);
|
||||
target.SetClientIP(clientIP);
|
||||
target.SetDurationSeconds(durationSeconds);
|
||||
target.SetParentalLimitSeconds(parentalLimitSeconds);
|
||||
target.SetTimeoutMinutes(timeoutMinutes);
|
||||
target.SetIsSecure(isSecure);
|
||||
}
|
||||
|
||||
void get(ByteStream::ReadIterator & source, apiAccount_v1 & target)
|
||||
{
|
||||
get(source, (unsigned char *)target.name, apiAccountNameWidth_v1);
|
||||
get(source, target.id);
|
||||
get(source, target.status);
|
||||
}
|
||||
|
||||
void get(ByteStream::ReadIterator & source, apiSubscription_v1 & target)
|
||||
{
|
||||
get(source, target.gamecode);
|
||||
get(source, target.status);
|
||||
get(source, target.subscriptionFeatures);
|
||||
get(source, target.gameFeatures);
|
||||
get(source, target.durationSeconds);
|
||||
get(source, target.parentalLimitSeconds);
|
||||
}
|
||||
|
||||
void get(ByteStream::ReadIterator & source, apiSession_v1 & target)
|
||||
{
|
||||
get(source, target.type);
|
||||
get(source, (unsigned char *)target.id, apiSessionIdWidth_v1);
|
||||
get(source, target.clientIP);
|
||||
get(source, target.durationSeconds);
|
||||
get(source, target.parentalLimitSeconds);
|
||||
get(source, target.timeoutMinutes);
|
||||
get(source, target.isSecure);
|
||||
}
|
||||
|
||||
void get(ByteStream::ReadIterator & source, SessionTypeDesc & target)
|
||||
{
|
||||
unsigned tmp = 0;
|
||||
get(source, target.type);
|
||||
get(source, (unsigned char *)target.gameCode, gameCodeWidth);
|
||||
get(source, target.gameCodeID);
|
||||
get(source, (unsigned char *)target.description, sessionTypeDescriptionWidth);
|
||||
get(source, tmp);
|
||||
target.independent = (tmp == 1);
|
||||
get(source, tmp);
|
||||
target.exclusive = (tmp == 1);
|
||||
}
|
||||
|
||||
void get(ByteStream::ReadIterator & source, GameCodeDescription & target)
|
||||
{
|
||||
unsigned tmp = 0;
|
||||
get(source, target.gameID);
|
||||
get(source, (unsigned char *)target.code, gameCodeWidth);
|
||||
get(source, (unsigned char *)target.description, sessionTypeDescriptionWidth);
|
||||
get(source, tmp);
|
||||
target.createDynamic = (tmp == 1);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void put(ByteStream & target, const apiAccount & source)
|
||||
{
|
||||
put(target, (const unsigned char *)source.GetName(), apiAccountNameWidth);
|
||||
put(target, source.GetId());
|
||||
put(target, source.GetStatus());
|
||||
}
|
||||
|
||||
void put(ByteStream & target, const apiSubscription & source)
|
||||
{
|
||||
put(target, source.GetGamecode());
|
||||
put(target, source.GetProviderId());
|
||||
put(target, source.GetStatus());
|
||||
put(target, source.GetSubscriptionFeatures());
|
||||
put(target, source.GetGameFeatures());
|
||||
put(target, source.GetDurationSeconds());
|
||||
put(target, source.GetParentalLimitSeconds());
|
||||
}
|
||||
|
||||
void put(ByteStream & target, const apiSession & source)
|
||||
{
|
||||
put(target, source.GetType());
|
||||
put(target, source.GetProviderId());
|
||||
put(target, (const unsigned char *)source.GetId(), apiSessionIdWidth);
|
||||
put(target, source.GetClientIP());
|
||||
put(target, source.GetDurationSeconds());
|
||||
put(target, source.GetParentalLimitSeconds());
|
||||
put(target, source.GetTimeoutMinutes());
|
||||
put(target, source.GetIsSecure());
|
||||
}
|
||||
|
||||
void put(ByteStream & target, const apiAccount_v1 & source)
|
||||
{
|
||||
put(target, (unsigned char *)source.name, apiAccountNameWidth_v1);
|
||||
put(target, source.id);
|
||||
put(target, source.status);
|
||||
}
|
||||
|
||||
void put(ByteStream & target, const apiSubscription_v1 & source)
|
||||
{
|
||||
put(target, source.gamecode);
|
||||
put(target, source.status);
|
||||
put(target, source.subscriptionFeatures);
|
||||
put(target, source.gameFeatures);
|
||||
put(target, source.durationSeconds);
|
||||
put(target, source.parentalLimitSeconds);
|
||||
}
|
||||
|
||||
void put(ByteStream & target, const apiSession_v1 & source)
|
||||
{
|
||||
put(target, source.type);
|
||||
put(target, (unsigned char *)source.id, apiSessionIdWidth_v1);
|
||||
put(target, source.clientIP);
|
||||
put(target, source.durationSeconds);
|
||||
put(target, source.parentalLimitSeconds);
|
||||
put(target, source.timeoutMinutes);
|
||||
put(target, source.isSecure);
|
||||
}
|
||||
|
||||
void put (ByteStream & target, const SessionTypeDesc & source)
|
||||
{
|
||||
put(target, source.type);
|
||||
put(target, (unsigned char *)source.gameCode, gameCodeWidth);
|
||||
put(target, source.gameCodeID);
|
||||
put(target, (unsigned char *)source.description, sessionTypeDescriptionWidth);
|
||||
put(target, (unsigned)source.independent);
|
||||
put(target, (unsigned)source.exclusive);
|
||||
}
|
||||
|
||||
void put (ByteStream & target, const GameCodeDescription & source)
|
||||
{
|
||||
put(target, source.gameID);
|
||||
put(target, (unsigned char *)source.code, gameCodeWidth);
|
||||
put(target, (unsigned char *)source.description, sessionTypeDescriptionWidth);
|
||||
put(target, (unsigned)source.createDynamic);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
namespace Message
|
||||
{
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
/*
|
||||
Basic::Basic() :
|
||||
AutoByteStream(),
|
||||
mMessageID(0)
|
||||
{
|
||||
}
|
||||
*/
|
||||
|
||||
Basic::Basic(const unsigned short newMessageId) :
|
||||
AutoByteStream(),
|
||||
mMessageID(newMessageId)
|
||||
{
|
||||
addVariable(mMessageID);
|
||||
}
|
||||
|
||||
Basic::Basic(Base::ByteStream::ReadIterator & source) :
|
||||
AutoByteStream(),
|
||||
mMessageID(0)
|
||||
{
|
||||
addVariable(mMessageID);
|
||||
AutoByteStream::unpack(source);
|
||||
}
|
||||
|
||||
/*
|
||||
Basic::Basic(const Basic & source) :
|
||||
AutoByteStream(source),
|
||||
mMessageID(source.GetMessageID())
|
||||
{
|
||||
}
|
||||
|
||||
Basic & Basic::operator=(const Basic & rhs)
|
||||
{
|
||||
if (&rhs != this)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
Basic::~Basic()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
////////////////////////////////////////
|
||||
// Null
|
||||
BeginImplementMessage(Null, Basic)
|
||||
EndImplementMessage
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
////////////////////////////////////////
|
||||
// Connect_v1
|
||||
BeginImplementMessage(Connect_v1, Basic)
|
||||
ImplementMessageMember(Version, "unknown")
|
||||
EndImplementMessage
|
||||
|
||||
|
||||
////////////////////////////////////////
|
||||
// Connect
|
||||
BeginImplementMessage(Connect, Basic)
|
||||
ImplementMessageMember(Version, "unknown")
|
||||
ImplementMessageMember(Description, "unknown")
|
||||
EndImplementMessage
|
||||
|
||||
|
||||
////////////////////////////////////////
|
||||
// ConnectReply
|
||||
BeginImplementMessage(ConnectReply, Basic)
|
||||
ImplementMessageMember(Result, RESULT_SUCCESS)
|
||||
ImplementMessageMember(Version, "unknown")
|
||||
EndImplementMessage
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
////////////////////////////////////////
|
||||
// Unknown
|
||||
BeginImplementMessage(Unknown, Basic)
|
||||
ImplementMessageMember(UnknownMessageID,0)
|
||||
EndImplementMessage
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
////////////////////////////////////////
|
||||
// Tracked
|
||||
BeginImplementMessage(Tracked, Basic)
|
||||
ImplementMessageMember(TrackingNumber, 0)
|
||||
EndImplementMessage
|
||||
|
||||
|
||||
////////////////////////////////////////
|
||||
// TrackedReply
|
||||
BeginImplementMessage(TrackedReply, Tracked)
|
||||
ImplementMessageMember(Result, RESULT_TIMEOUT)
|
||||
EndImplementMessage
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,244 @@
|
||||
#ifndef COMMON_API__COMMON_MESSAGES_H
|
||||
#define COMMON_API__COMMON_MESSAGES_H
|
||||
|
||||
|
||||
#include <vector>
|
||||
#include "Base/Archive.h"
|
||||
#include "CommonAPI.h"
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
namespace Base
|
||||
{
|
||||
|
||||
/*
|
||||
void get(ByteStream::ReadIterator & source, apiAccountStatus & target);
|
||||
void get(ByteStream::ReadIterator & source, apiSessionType & target);
|
||||
void get(ByteStream::ReadIterator & source, apiGamecode & target);
|
||||
void get(ByteStream::ReadIterator & source, apiSubscriptionStatus & target);
|
||||
void get(ByteStream::ReadIterator & source, apiKickReason & target);
|
||||
void get(ByteStream::ReadIterator & source, apiKickResult & target);
|
||||
*/
|
||||
void get(ByteStream::ReadIterator & source, apiAccount_v1 & target);
|
||||
void get(ByteStream::ReadIterator & source, apiSubscription_v1 & target);
|
||||
void get(ByteStream::ReadIterator & source, apiSession_v1 & target);
|
||||
void get(ByteStream::ReadIterator & source, apiAccount & target);
|
||||
void get(ByteStream::ReadIterator & source, apiSubscription & target);
|
||||
void get(ByteStream::ReadIterator & source, apiSession & target);
|
||||
|
||||
/*
|
||||
void put(ByteStream & target, const apiAccountStatus & source);
|
||||
void put(ByteStream & target, const apiSessionType & source);
|
||||
void put(ByteStream & target, const apiGamecode & source);
|
||||
void put(ByteStream & target, const apiSubscriptionStatus & source);
|
||||
void put(ByteStream & target, const apiKickReason & source);
|
||||
void put(ByteStream & target, const apiKickResult & source);
|
||||
*/
|
||||
void put(ByteStream & target, const apiAccount_v1 & source);
|
||||
void put(ByteStream & target, const apiSubscription_v1 & source);
|
||||
void put(ByteStream & target, const apiSession_v1 & source);
|
||||
void put(ByteStream & target, const apiAccount & source);
|
||||
void put(ByteStream & target, const apiSubscription & source);
|
||||
void put(ByteStream & target, const apiSession & source);
|
||||
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
namespace Message
|
||||
{
|
||||
|
||||
|
||||
class Basic : public Base::AutoByteStream
|
||||
{
|
||||
public:
|
||||
Basic();
|
||||
|
||||
Basic(const unsigned char * const buffer, const unsigned int bufferSize);
|
||||
explicit Basic(const unsigned short messageId);
|
||||
explicit Basic(Base::ByteStream::ReadIterator & source);
|
||||
|
||||
Basic(const Basic & source);
|
||||
Basic & operator=(const Basic & rhs);
|
||||
|
||||
virtual ~Basic();
|
||||
const unsigned short GetMessageID() const;
|
||||
private:
|
||||
Base::AutoVariable<unsigned short> mMessageID;
|
||||
};
|
||||
|
||||
inline const unsigned short Basic::GetMessageID() const
|
||||
{
|
||||
return mMessageID.get(); //lint !e1037 choosing a const or non const conversion is NOT ambiguous
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// These macros are used to define VNL messages. These marcos make the message
|
||||
// objects easier to read and easier to define. There are three macros used
|
||||
// to define message objects and three macros used to implement the message
|
||||
// objects.
|
||||
|
||||
#define BeginDefineMessage(ClassName,BaseClass,MessageID) \
|
||||
class ClassName : public BaseClass \
|
||||
{ \
|
||||
enum { MESSAGE_ID = MessageID }; \
|
||||
private: \
|
||||
void InitializeMembers(); \
|
||||
public: \
|
||||
ClassName(const unsigned short messageId = MESSAGE_ID); \
|
||||
ClassName(Base::ByteStream::ReadIterator & source);
|
||||
|
||||
#define DefineMessageMember(MemberName,Type) \
|
||||
private: \
|
||||
Base::AutoVariable<Type> m##MemberName; \
|
||||
public: \
|
||||
const Type & Get##MemberName() const \
|
||||
{ return (const Type &)m##MemberName.get(); } \
|
||||
void Set##MemberName(const Type & value) \
|
||||
{ m##MemberName.set((const Type &)value); }
|
||||
|
||||
/*
|
||||
#define DefineMessageMemberEnum(MemberName,Type,Internal) \
|
||||
private: \
|
||||
Base::AutoVariable<Internal> m##MemberName; \
|
||||
public: \
|
||||
const Type & Get##MemberName() const \
|
||||
{ return (const Type &)m##MemberName.get(); } \
|
||||
void Set##MemberName(const Type & value) \
|
||||
{ m##MemberName.set((const Internal &)value); }
|
||||
*/
|
||||
|
||||
#define DefineMessageMemberArray(MemberName, MemberType) \
|
||||
private: \
|
||||
Base::AutoArray<MemberType> m##MemberName; \
|
||||
public: \
|
||||
const std::vector<MemberType> & Get##MemberName() const { return m##MemberName.get(); } \
|
||||
void Set##MemberName(const std::vector<MemberType> & value) { m##MemberName.set(value); }
|
||||
|
||||
#define EndDefineMessage \
|
||||
};
|
||||
|
||||
#define BeginImplementMessage(ClassName,BaseClass) \
|
||||
ClassName::ClassName(const unsigned short messageId) : BaseClass(messageId) \
|
||||
{ \
|
||||
InitializeMembers(); \
|
||||
} \
|
||||
ClassName::ClassName(Base::ByteStream::ReadIterator & source) : BaseClass(MESSAGE_ID) \
|
||||
{ \
|
||||
InitializeMembers(); \
|
||||
unpack(source); \
|
||||
} \
|
||||
void ClassName::InitializeMembers() \
|
||||
{
|
||||
|
||||
#define ImplementMessageMember(MemberName,DefaultValue) \
|
||||
m##MemberName.set(DefaultValue); \
|
||||
addVariable(m##MemberName);
|
||||
|
||||
#define EndImplementMessage \
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
namespace Message
|
||||
{
|
||||
|
||||
|
||||
enum
|
||||
{
|
||||
MESSAGE_NULL = 0x0000,
|
||||
|
||||
// Client Messages
|
||||
MESSAGE_CONNECT_v1 = 0x0ff0,
|
||||
MESSAGE_CANCEL_REQUEST = 0x0ff1,
|
||||
MESSAGE_CONNECT = 0x0ff2,
|
||||
|
||||
// Server Messages
|
||||
MESSAGE_CONNECT_REPLY = 0x7ff0,
|
||||
MESSAGE_RECONNECT = 0x7ffd,
|
||||
MESSAGE_CONNECTION_CLOSED = 0x7ffe,
|
||||
MESSAGE_CONNECTION_FAILED = 0x7fff,
|
||||
|
||||
MESSAGE_UNKNOWN = 0xffff
|
||||
};
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
////////////////////////////////////////
|
||||
// Null
|
||||
BeginDefineMessage(Null, Basic, MESSAGE_NULL)
|
||||
EndDefineMessage
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
////////////////////////////////////////
|
||||
// Connect_v1
|
||||
BeginDefineMessage(Connect_v1, Basic, MESSAGE_CONNECT_v1)
|
||||
DefineMessageMember(Version, std::string)
|
||||
EndDefineMessage
|
||||
|
||||
|
||||
////////////////////////////////////////
|
||||
// Connect
|
||||
BeginDefineMessage(Connect, Basic, MESSAGE_CONNECT)
|
||||
DefineMessageMember(Version, std::string)
|
||||
DefineMessageMember(Description, std::string)
|
||||
EndDefineMessage
|
||||
|
||||
|
||||
////////////////////////////////////////
|
||||
// ConnectReply
|
||||
BeginDefineMessage(ConnectReply, Basic, MESSAGE_CONNECT_REPLY)
|
||||
DefineMessageMember(Result, apiResult)
|
||||
DefineMessageMember(Version, std::string)
|
||||
EndDefineMessage
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
////////////////////////////////////////
|
||||
// Unknown
|
||||
BeginDefineMessage(Unknown, Basic, MESSAGE_UNKNOWN)
|
||||
DefineMessageMember(UnknownMessageID, unsigned short)
|
||||
EndDefineMessage
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
////////////////////////////////////////
|
||||
// Tracked
|
||||
BeginDefineMessage(Tracked, Basic, MESSAGE_NULL)
|
||||
DefineMessageMember(TrackingNumber, apiTrackingNumber)
|
||||
EndDefineMessage
|
||||
|
||||
|
||||
////////////////////////////////////////
|
||||
// TrackedReply
|
||||
BeginDefineMessage(TrackedReply, Tracked, MESSAGE_NULL)
|
||||
DefineMessageMember(Result, apiResult)
|
||||
EndDefineMessage
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
}
|
||||
|
||||
#endif // LAUNCHPAD_API_COMMON_H
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
|
||||
include_directories(
|
||||
${SWG_EXTERNALS_SOURCE_DIR}/3rd/library/udplibrary
|
||||
)
|
||||
|
||||
add_library(LoginAPI
|
||||
Client.cpp
|
||||
Client.h
|
||||
ClientCore.cpp
|
||||
ClientCore.h
|
||||
Messages.cpp
|
||||
Messages.h
|
||||
)
|
||||
@@ -0,0 +1,419 @@
|
||||
#pragma warning (disable : 4786 )
|
||||
|
||||
|
||||
#include "Client.h"
|
||||
#include "ClientCore.h"
|
||||
|
||||
|
||||
namespace LoginAPI
|
||||
{
|
||||
|
||||
Entitlement::Entitlement() :
|
||||
mTotalTime(0),
|
||||
mEntitledTime(0),
|
||||
mTotalTimeSinceLastLogin(0),
|
||||
mEntitledTimeSinceLastLogin(0),
|
||||
mReasonUnentitled(0)
|
||||
{
|
||||
}
|
||||
|
||||
Feature::Feature() :
|
||||
mID(0),
|
||||
mData()
|
||||
{
|
||||
}
|
||||
|
||||
bool Feature::SetParameter(const std::string & key, int value)
|
||||
{
|
||||
if (key.size() > 32)
|
||||
return false;
|
||||
|
||||
std::string keyToken = key + "[";
|
||||
unsigned offset = mData.find(keyToken);
|
||||
if (offset == std::string::npos)
|
||||
{
|
||||
char token[256];
|
||||
sprintf(token, "%s[%d]", key.c_str(), value);
|
||||
if (!mData.empty())
|
||||
mData += ", ";
|
||||
mData += token;
|
||||
}
|
||||
else
|
||||
{
|
||||
char token[256];
|
||||
unsigned delimiter = mData.find("]", offset);
|
||||
sprintf(token, "%d", value);
|
||||
std::string newData = mData.substr(0,offset+keyToken.size()) + token + mData.substr(delimiter);
|
||||
mData = newData;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Feature::SetParameter(const std::string & key, const std::string & value)
|
||||
{
|
||||
if (key.size() > 32 || value.size() > 32)
|
||||
return false;
|
||||
|
||||
std::string keyToken = key + "[";
|
||||
unsigned offset = mData.find(keyToken);
|
||||
if (offset == std::string::npos)
|
||||
{
|
||||
char token[256];
|
||||
sprintf(token, "%s[%s]", key.c_str(), value.c_str());
|
||||
if (!mData.empty())
|
||||
mData += ", ";
|
||||
mData += token;
|
||||
}
|
||||
else
|
||||
{
|
||||
unsigned delimiter = mData.find("]", offset);
|
||||
offset += keyToken.size();
|
||||
std::string newData = mData.substr(0,offset) + value + mData.substr(delimiter);
|
||||
mData = newData;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
int Feature::GetParameter(const std::string & key) const
|
||||
{
|
||||
std::string keyToken = key + "[";
|
||||
unsigned offset = mData.find(keyToken);
|
||||
if (offset != std::string::npos)
|
||||
{
|
||||
offset += keyToken.size();
|
||||
return atoi(mData.c_str() + offset);
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
std::string & Feature::GetParameter(const std::string & key, std::string & value) const
|
||||
{
|
||||
std::string keyToken = key + "[";
|
||||
unsigned offset = mData.find(keyToken);
|
||||
if (offset != std::string::npos)
|
||||
{
|
||||
unsigned delimiter = mData.find("]", offset);
|
||||
offset += keyToken.size();
|
||||
value = mData.substr(offset,delimiter-offset);
|
||||
}
|
||||
else
|
||||
{
|
||||
value = "";
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
// For consumable promotions
|
||||
bool Feature::Consume()
|
||||
{
|
||||
int consumeCount = GetParameter("count");
|
||||
if (consumeCount == 0)
|
||||
return false;
|
||||
SetParameter("count", consumeCount-1);
|
||||
return true;
|
||||
}
|
||||
|
||||
int Feature::GetConsumeCount() const
|
||||
{
|
||||
return GetParameter("count");
|
||||
}
|
||||
|
||||
bool Feature::IsActive() const
|
||||
{
|
||||
return GetParameter("active") ? true : false;
|
||||
}
|
||||
|
||||
void Feature::SetActive(bool isActive)
|
||||
{
|
||||
SetParameter("active", (int)isActive);
|
||||
}
|
||||
|
||||
|
||||
FeatureDescription::FeatureDescription() :
|
||||
mID(0),
|
||||
mDescription(),
|
||||
mDefaultData()
|
||||
{
|
||||
}
|
||||
|
||||
UsageLimit::UsageLimit() :
|
||||
mType(0),
|
||||
mAllowance(0),
|
||||
mNextAllowance(0)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
const char * apiVersion = "2004.07.20";
|
||||
|
||||
Client::Client(const char * serverList, const char * description, unsigned maxConnections)
|
||||
: apiClient()
|
||||
{
|
||||
mClientCore = new ClientCore(this, apiVersion, serverList, description, maxConnections);
|
||||
}
|
||||
|
||||
Client::Client(const char ** serverList, unsigned serverCount, const char * description, unsigned maxConnections)
|
||||
: apiClient()
|
||||
{
|
||||
mClientCore = new ClientCore(this, apiVersion, serverList, serverCount, description, maxConnections);
|
||||
}
|
||||
|
||||
Client::~Client()
|
||||
{
|
||||
delete mClientCore;
|
||||
}
|
||||
|
||||
void Client::Process()
|
||||
{
|
||||
this->apiClient::Process();
|
||||
}
|
||||
|
||||
void Client::OnConnectionOpened(const char * address, unsigned connectionCount)
|
||||
{
|
||||
}
|
||||
|
||||
void Client::OnConnectionClosed(const char * address, unsigned connectionCount)
|
||||
{
|
||||
}
|
||||
|
||||
void Client::OnConnectionFailed(const char * address, unsigned connectionCount)
|
||||
{
|
||||
}
|
||||
|
||||
apiTrackingNumber Client::SessionLogin(const char * name, const char * password, const apiSessionType sessionType, const apiIP clientIP, unsigned flags, const char * sessionNamespace, const void * userData)
|
||||
{
|
||||
return mClientCore ? static_cast<ClientCore *>(mClientCore)->SessionLogin(name, password, sessionType, clientIP, flags, sessionNamespace, userData) : 0;
|
||||
}
|
||||
|
||||
apiTrackingNumber Client::SessionLogin(const char * parentSession, const apiSessionType sessionType, const apiIP clientIP, unsigned flags, const void * userData)
|
||||
{
|
||||
return mClientCore ? static_cast<ClientCore *>(mClientCore)->SessionLogin(parentSession, sessionType, clientIP, flags, userData) : 0;
|
||||
}
|
||||
|
||||
apiTrackingNumber Client::SessionLoginInternal(const apiAccountId accountId, const apiSessionType sessionType, const apiIP clientIP, unsigned flags, const void * userData)
|
||||
{
|
||||
return mClientCore ? static_cast<ClientCore *>(mClientCore)->SessionLoginInternal(accountId, sessionType, clientIP, flags, userData) : 0;
|
||||
}
|
||||
|
||||
apiTrackingNumber Client::SessionConsume(const char * sessionID, const apiSessionType sessionType, const void * userData)
|
||||
{
|
||||
return mClientCore ? static_cast<ClientCore *>(mClientCore)->SessionConsume(sessionID, sessionType, userData) : 0;
|
||||
}
|
||||
|
||||
apiTrackingNumber Client::SessionValidate(const char * sessionID, const apiSessionType sessionType, const void * userData)
|
||||
{
|
||||
return mClientCore ? static_cast<ClientCore *>(mClientCore)->SessionValidate(sessionID, sessionType, userData) : 0;
|
||||
}
|
||||
|
||||
void Client::SessionLogout(const char * sessionID)
|
||||
{
|
||||
if (mClientCore)
|
||||
static_cast<ClientCore *>(mClientCore)->SessionLogout(sessionID);
|
||||
}
|
||||
|
||||
void Client::SessionTouch(const char * sessionID)
|
||||
{
|
||||
if (mClientCore)
|
||||
static_cast<ClientCore *>(mClientCore)->SessionTouch(sessionID);
|
||||
}
|
||||
|
||||
apiTrackingNumber Client::GetSessions(const apiAccountId accountId, const void * userData)
|
||||
{
|
||||
return mClientCore ? static_cast<ClientCore *>(mClientCore)->GetSessions(accountId, userData) : 0;
|
||||
}
|
||||
|
||||
apiTrackingNumber Client::GetFeatures(const char * sessionID, const void * userData)
|
||||
{
|
||||
return mClientCore ? static_cast<ClientCore *>(mClientCore)->GetFeatures(sessionID, userData) : 0;
|
||||
}
|
||||
|
||||
apiTrackingNumber Client::GetFeatures(const apiAccountId accountId, const apiGamecode gamecode, const void * userData)
|
||||
{
|
||||
return mClientCore ? static_cast<ClientCore *>(mClientCore)->GetFeatures(accountId, gamecode, userData) : 0;
|
||||
}
|
||||
|
||||
apiTrackingNumber Client::GrantFeature(const char * sessionID, unsigned featureType, const void * userData)
|
||||
{
|
||||
return mClientCore ? static_cast<ClientCore *>(mClientCore)->GrantFeature(sessionID, featureType, userData) : 0;
|
||||
}
|
||||
|
||||
apiTrackingNumber Client::ModifyFeature(const char * sessionID, const Feature & feature, const void * userData)
|
||||
{
|
||||
return mClientCore ? static_cast<ClientCore *>(mClientCore)->ModifyFeature(sessionID, feature, userData) : 0;
|
||||
}
|
||||
apiTrackingNumber Client::RevokeFeature(const char * sessionID, unsigned featureType, const void * userData)
|
||||
{
|
||||
return mClientCore ? static_cast<ClientCore *>(mClientCore)->RevokeFeature(sessionID, featureType, userData) : 0;
|
||||
}
|
||||
|
||||
apiTrackingNumber Client::EnumerateFeatures(apiGamecode gamecode, const void * userData)
|
||||
{
|
||||
return mClientCore ? static_cast<ClientCore *>(mClientCore)->EnumerateFeatures(gamecode, userData) : 0;
|
||||
}
|
||||
|
||||
apiTrackingNumber Client::SessionStartPlay(const char * sessionID, const char * serverName, const char * characterName, const char * gameData, const void * userData)
|
||||
{
|
||||
return mClientCore ? static_cast<ClientCore *>(mClientCore)->SessionStartPlay(sessionID, serverName, characterName, gameData, userData) : 0;
|
||||
}
|
||||
|
||||
apiTrackingNumber Client::SessionStopPlay(const char * sessionID, const char * serverName, const char * characterName, const void * userData)
|
||||
{
|
||||
return mClientCore ? static_cast<ClientCore *>(mClientCore)->SessionStopPlay(sessionID, serverName, characterName, userData) : 0;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////
|
||||
// OLD CALLS
|
||||
apiTrackingNumber Client::GetAccountStatus(const char * name, const char * password, const void * userData)
|
||||
{
|
||||
return mClientCore ? static_cast<ClientCore *>(mClientCore)->GetAccountStatus(name, password, userData) : 0;
|
||||
}
|
||||
|
||||
apiTrackingNumber Client::GetAccountStatus(const apiAccountId accountId, const void * userData)
|
||||
{
|
||||
return mClientCore ? static_cast<ClientCore *>(mClientCore)->GetAccountStatus(accountId, userData) : 0;
|
||||
}
|
||||
|
||||
apiTrackingNumber Client::GetAccountSubscriptions(const char * name, const char * password, const void * userData)
|
||||
{
|
||||
return mClientCore ? static_cast<ClientCore *>(mClientCore)->GetAccountSubscriptions(name, password, userData) : 0;
|
||||
}
|
||||
|
||||
apiTrackingNumber Client::GetAccountSubscriptions(const char * sessionID, const void * userData)
|
||||
{
|
||||
return mClientCore ? static_cast<ClientCore *>(mClientCore)->GetAccountSubscriptions(sessionID, userData) : 0;
|
||||
}
|
||||
|
||||
apiTrackingNumber Client::GetAccountSubscriptions(const apiAccountId accountId, const void * userData)
|
||||
{
|
||||
return mClientCore ? static_cast<ClientCore *>(mClientCore)->GetAccountSubscriptions(accountId, userData) : 0;
|
||||
}
|
||||
|
||||
apiTrackingNumber Client::GetAccountSubscription(const char * name, const char * password, const apiGamecode gamecode, const void * userData)
|
||||
{
|
||||
return mClientCore ? static_cast<ClientCore *>(mClientCore)->GetAccountSubscription(name, password, gamecode, userData) : 0;
|
||||
}
|
||||
|
||||
apiTrackingNumber Client::GetAccountSubscription(const char * sessionID, const apiGamecode gamecode, const void * userData)
|
||||
{
|
||||
return mClientCore ? static_cast<ClientCore *>(mClientCore)->GetAccountSubscription(sessionID, gamecode, userData) : 0;
|
||||
}
|
||||
|
||||
apiTrackingNumber Client::GetAccountSubscription(const apiAccountId accountId, const apiGamecode gamecode, const void * userData)
|
||||
{
|
||||
return mClientCore ? static_cast<ClientCore *>(mClientCore)->GetAccountSubscription(accountId, gamecode, userData) : 0;
|
||||
}
|
||||
|
||||
apiTrackingNumber Client::SessionLogin_v3(const char * name, const char * password, const apiSessionType sessionType, const apiIP clientIP, const bool forceLogin, const void * userData)
|
||||
{
|
||||
return mClientCore ? static_cast<ClientCore *>(mClientCore)->SessionLogin_v3(name, password, sessionType, clientIP, forceLogin, userData) : 0;
|
||||
}
|
||||
|
||||
apiTrackingNumber Client::SessionLogin_v3(const char * parentSession, const apiSessionType sessionType, const apiIP clientIP, const bool forceLogin, const void * userData)
|
||||
{
|
||||
return mClientCore ? static_cast<ClientCore *>(mClientCore)->SessionLogin_v3(parentSession, sessionType, clientIP, forceLogin, userData) : 0;
|
||||
}
|
||||
|
||||
apiTrackingNumber Client::SessionLogin_v4(const char * name, const char * password, const apiSessionType sessionType, const apiIP clientIP, const bool forceLogin, const void * userData)
|
||||
{
|
||||
return mClientCore ? static_cast<ClientCore *>(mClientCore)->SessionLogin_v4(name, password, sessionType, clientIP, forceLogin, userData) : 0;
|
||||
}
|
||||
|
||||
apiTrackingNumber Client::SessionLogin_v4(const char * parentSession, const apiSessionType sessionType, const apiIP clientIP, const bool forceLogin, const void * userData)
|
||||
{
|
||||
return mClientCore ? static_cast<ClientCore *>(mClientCore)->SessionLogin_v4(parentSession, sessionType, clientIP, forceLogin, userData) : 0;
|
||||
}
|
||||
|
||||
apiTrackingNumber Client::SessionLogin_v5(const char * name, const char * password, const apiSessionType sessionType, const apiIP clientIP, unsigned flags, const void * userData)
|
||||
{
|
||||
return mClientCore ? static_cast<ClientCore *>(mClientCore)->SessionLogin_v5(name, password, sessionType, clientIP, flags, userData) : 0;
|
||||
}
|
||||
|
||||
apiTrackingNumber Client::SessionLogin_v5(const char * parentSession, const apiSessionType sessionType, const apiIP clientIP, unsigned flags, const void * userData)
|
||||
{
|
||||
return mClientCore ? static_cast<ClientCore *>(mClientCore)->SessionLogin_v5(parentSession, sessionType, clientIP, flags, userData) : 0;
|
||||
}
|
||||
|
||||
apiTrackingNumber Client::SessionConsume_v2(const char * sessionID, const apiSessionType sessionType, const void * userData)
|
||||
{
|
||||
return mClientCore ? static_cast<ClientCore *>(mClientCore)->SessionConsume_v2(sessionID, sessionType, userData) : 0;
|
||||
}
|
||||
|
||||
apiTrackingNumber Client::SessionConsume_v3(const char * sessionID, const apiSessionType sessionType, const void * userData)
|
||||
{
|
||||
return mClientCore ? static_cast<ClientCore *>(mClientCore)->SessionConsume_v3(sessionID, sessionType, userData) : 0;
|
||||
}
|
||||
|
||||
apiTrackingNumber Client::SessionValidate_v2(const char * sessionID, const apiSessionType sessionType, const void * userData)
|
||||
{
|
||||
return mClientCore ? static_cast<ClientCore *>(mClientCore)->SessionValidate_v2(sessionID, sessionType, userData) : 0;
|
||||
}
|
||||
|
||||
apiTrackingNumber Client::SessionValidate_v3(const char * sessionID, const apiSessionType sessionType, const void * userData)
|
||||
{
|
||||
return mClientCore ? static_cast<ClientCore *>(mClientCore)->SessionValidate_v3(sessionID, sessionType, userData) : 0;
|
||||
}
|
||||
|
||||
apiTrackingNumber Client::SessionValidateEx(const char * sessionID, const apiSessionType sessionType, const void * userData)
|
||||
{
|
||||
return mClientCore ? static_cast<ClientCore *>(mClientCore)->SessionValidateEx(sessionID, sessionType, userData) : 0;
|
||||
}
|
||||
|
||||
apiTrackingNumber Client::SubscriptionValidate(const char * sessionID, const apiGamecode gamecode, const void * userData)
|
||||
{
|
||||
return mClientCore ? static_cast<ClientCore *>(mClientCore)->SubscriptionValidate(sessionID, gamecode, userData) : 0;
|
||||
}
|
||||
|
||||
void Client::SessionLogout(const char ** sessionList, const unsigned sessionCount)
|
||||
{
|
||||
if (mClientCore)
|
||||
static_cast<ClientCore *>(mClientCore)->SessionLogout(sessionList, sessionCount);
|
||||
}
|
||||
|
||||
void Client::SessionTouch(const char ** sessionList, const unsigned sessionCount)
|
||||
{
|
||||
if (mClientCore)
|
||||
static_cast<ClientCore *>(mClientCore)->SessionTouch(sessionList, sessionCount);
|
||||
}
|
||||
|
||||
apiTrackingNumber Client::SessionKick(const char * sessionID, apiKickReason reason, const void * userData)
|
||||
{
|
||||
return mClientCore ? static_cast<ClientCore *>(mClientCore)->SessionKick(sessionID, reason, userData) : 0;
|
||||
}
|
||||
|
||||
apiTrackingNumber Client::GetMemberInformation(const apiAccountId accountId, const void * userData)
|
||||
{
|
||||
return mClientCore ? static_cast<ClientCore *>(mClientCore)->GetMemberInformation(accountId, userData) : 0;
|
||||
}
|
||||
|
||||
apiTrackingNumber Client::GetMemberInformation_v2(const apiAccountId accountId, const void * userData)
|
||||
{
|
||||
return mClientCore ? static_cast<ClientCore *>(mClientCore)->GetMemberInformation_v2(accountId, userData) : 0;
|
||||
}
|
||||
|
||||
void Client::SessionKickReply(const char * sessionID, apiKickReply reply)
|
||||
{
|
||||
if (mClientCore)
|
||||
static_cast<ClientCore *>(mClientCore)->SessionKickReply(sessionID, reply);
|
||||
}
|
||||
|
||||
apiTrackingNumber Client::GrantFeature_v2(const char * sessionID, unsigned featureType, const char * gameCode, unsigned providerID, unsigned promoID, const void * userData)
|
||||
{
|
||||
return mClientCore ? static_cast<ClientCore *>(mClientCore)->GrantFeature_v2(sessionID, featureType, gameCode, providerID, promoID, userData) : 0;
|
||||
}
|
||||
|
||||
apiTrackingNumber Client::ModifyFeature_v2(unsigned accountID, const char * gameCode, const Feature & origFeature, const Feature & newFeature, const void * userData)
|
||||
{
|
||||
return mClientCore ? static_cast<ClientCore *>(mClientCore)->ModifyFeature_v2(accountID, gameCode, origFeature, newFeature, userData) : 0;
|
||||
}
|
||||
|
||||
|
||||
apiTrackingNumber Client::GrantFeatureByStationID(unsigned accountID, unsigned featureType, const char * gameCode, unsigned providerID, unsigned promoID, const void * userData)
|
||||
{
|
||||
return mClientCore ? static_cast<ClientCore *>(mClientCore)->GrantFeatureByStationID(accountID, featureType, gameCode, providerID, promoID, userData) : 0;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,504 @@
|
||||
#ifndef SESSION_LOGIN_API__CLIENT_H
|
||||
#define SESSION_LOGIN_API__CLIENT_H
|
||||
|
||||
|
||||
#include <string>
|
||||
#include "Session/CommonAPI/CommonAPI.h"
|
||||
|
||||
|
||||
namespace LoginAPI
|
||||
{
|
||||
|
||||
|
||||
class UsageLimit;
|
||||
class Feature;
|
||||
class FeatureDescription;
|
||||
class Entitlement;
|
||||
class Client : public apiClient
|
||||
{
|
||||
public:
|
||||
// server list is space delimited
|
||||
Client(const char * serverList, const char * description, unsigned maxConnections = 2);
|
||||
// server list is c-style string array
|
||||
Client(const char ** serverList, unsigned serverCount, const char * description, unsigned maxConnections = 2);
|
||||
virtual ~Client();
|
||||
|
||||
virtual void Process();
|
||||
|
||||
////////////////////////////////////////
|
||||
// State Callbacks
|
||||
virtual void OnConnectionOpened(const char * address, unsigned connectionCount);
|
||||
virtual void OnConnectionClosed(const char * address, unsigned connectionCount);
|
||||
virtual void OnConnectionFailed(const char * address, unsigned connectionCount);
|
||||
|
||||
|
||||
////////////////////////////////////////
|
||||
// Requests
|
||||
apiTrackingNumber SessionLogin(const char * name,
|
||||
const char * password,
|
||||
const apiSessionType sessionType,
|
||||
const apiIP clientIP,
|
||||
const unsigned flags,
|
||||
const char * sessionNamespace = _defaultNamespace,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber SessionLogin(const char * parentSessionID,
|
||||
const apiSessionType sessionType,
|
||||
const apiIP clientIP,
|
||||
const unsigned flags,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber SessionLoginInternal(const apiAccountId accountId,
|
||||
const apiSessionType sessionType,
|
||||
const apiIP clientIP,
|
||||
const unsigned flags,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber SessionConsume(const char * sessionID,
|
||||
const apiSessionType sessionType,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber SessionValidate(const char * sessionID,
|
||||
const apiSessionType sessionType,
|
||||
const void * userData = 0);
|
||||
void SessionLogout(const char * sessionID);
|
||||
void SessionTouch(const char * sessionID);
|
||||
|
||||
apiTrackingNumber SessionStartPlay(const char * sessionID,
|
||||
const char * serverName,
|
||||
const char * characterName,
|
||||
const char * gameData,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber SessionStopPlay(const char * sessionID,
|
||||
const char * serverName,
|
||||
const char * characterName,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber SessionKick(const char * sessionID,
|
||||
apiKickReason reason,
|
||||
const void * userData = 0);
|
||||
|
||||
apiTrackingNumber GetSessions(const apiAccountId accountId,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber GetFeatures(const char * sessionID,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber GetFeatures(const apiAccountId accountId,
|
||||
const apiGamecode gamecode,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber GrantFeature(const char * sessionID,
|
||||
unsigned featureType,
|
||||
const void * userData = 0);
|
||||
|
||||
apiTrackingNumber ModifyFeature(const char * sessionID,
|
||||
const Feature & feature,
|
||||
const void * userData = 0);
|
||||
|
||||
|
||||
|
||||
apiTrackingNumber RevokeFeature(const char * sessionID,
|
||||
unsigned featureType,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber EnumerateFeatures(apiGamecode,
|
||||
const void * userData = 0);
|
||||
|
||||
apiTrackingNumber GrantFeature_v2(const char * sessionID,
|
||||
unsigned featureType,
|
||||
const char * gameCode,
|
||||
unsigned providerID = 0,
|
||||
unsigned promoID = 0,
|
||||
const void * userData = 0);
|
||||
|
||||
apiTrackingNumber ModifyFeature_v2( unsigned accountID,
|
||||
const char * gameCode,
|
||||
const Feature & origFeature,
|
||||
const Feature & newFeature,
|
||||
const void * userData = 0);
|
||||
|
||||
apiTrackingNumber GrantFeatureByStationID(unsigned accountID,
|
||||
unsigned featureType,
|
||||
const char * gameCode,
|
||||
unsigned providerID = 0,
|
||||
unsigned promoID = 0,
|
||||
const void * userData = 0);
|
||||
|
||||
|
||||
////////////////////////////////////////
|
||||
// Result Callbacks
|
||||
virtual void OnSessionLogin(const apiTrackingNumber trackingNumber,
|
||||
const apiResult result,
|
||||
const apiAccount & account,
|
||||
const apiSubscription & subscription,
|
||||
const apiSession & session,
|
||||
const UsageLimit & usageLimit,
|
||||
const Entitlement & entitlement,
|
||||
void * userData) = 0;
|
||||
virtual void OnSessionLoginInternal(const apiTrackingNumber trackingNumber,
|
||||
const apiResult result,
|
||||
const apiAccount & account,
|
||||
const apiSubscription & subscription,
|
||||
const apiSession & session,
|
||||
const UsageLimit & usageLimit,
|
||||
const Entitlement & entitlement,
|
||||
void * userData) = 0;
|
||||
virtual void OnSessionValidate(const apiTrackingNumber trackingNumber,
|
||||
const apiResult result,
|
||||
const apiAccount & account,
|
||||
const apiSubscription & subscription,
|
||||
const apiSession & session,
|
||||
const UsageLimit & usageLimit,
|
||||
const Entitlement & entitlement,
|
||||
void * userData) = 0;
|
||||
virtual void OnSessionConsume(const apiTrackingNumber trackingNumber,
|
||||
const apiResult result,
|
||||
const apiAccount & account,
|
||||
const apiSubscription & subscription,
|
||||
const apiSession & session,
|
||||
const UsageLimit & usageLimit,
|
||||
const Entitlement & entitlement,
|
||||
void * userData) = 0;
|
||||
virtual void OnSessionStartPlay(const apiTrackingNumber trackingNumber,
|
||||
const apiResult result,
|
||||
void * userData) = 0;
|
||||
virtual void OnSessionStopPlay(const apiTrackingNumber trackingNumber,
|
||||
const apiResult result,
|
||||
void * userData) = 0;
|
||||
virtual void OnSessionKick(const unsigned trackingNumber,
|
||||
const apiResult result,
|
||||
void * userData) = 0;
|
||||
virtual void OnGetSessions(const apiTrackingNumber trackingNumber,
|
||||
const apiResult result,
|
||||
const unsigned count,
|
||||
const apiSession session[],
|
||||
const apiSubscription subscription[],
|
||||
const UsageLimit usageLimit[],
|
||||
const unsigned timeCreated[],
|
||||
const unsigned timeTouched[],
|
||||
void * userData) = 0;
|
||||
virtual void OnGetFeatures(const apiTrackingNumber trackingNumber,
|
||||
const apiResult result,
|
||||
const unsigned featureCount,
|
||||
const Feature featureArray[],
|
||||
const void * userData = 0) = 0;
|
||||
virtual void OnGrantFeature(const apiTrackingNumber trackingNumber,
|
||||
const apiResult result,
|
||||
void * userData) = 0;
|
||||
virtual void OnModifyFeature(const apiTrackingNumber trackingNumber,
|
||||
const apiResult result,
|
||||
void * userData) = 0;
|
||||
virtual void OnRevokeFeature(const apiTrackingNumber trackingNumber,
|
||||
const apiResult result,
|
||||
void * userData) = 0;
|
||||
virtual void OnEnumerateFeatures(const apiTrackingNumber trackingNumber,
|
||||
const apiResult result,
|
||||
const unsigned featureCount,
|
||||
const FeatureDescription featureArray[],
|
||||
const void * userData = 0) = 0;
|
||||
virtual void NotifySessionKick(const char ** sessionList,
|
||||
const unsigned sessionCount) = 0;
|
||||
|
||||
////////////////////////////////////////
|
||||
// Call support for backwards compatability
|
||||
apiTrackingNumber GetAccountStatus(const char * name,
|
||||
const char * password,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber GetAccountStatus(const apiAccountId accountId,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber GetAccountSubscriptions(const char * name,
|
||||
const char * password,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber GetAccountSubscriptions(const char * sessionID,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber GetAccountSubscriptions(const apiAccountId accountId,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber GetAccountSubscription(const char * name,
|
||||
const char * password,
|
||||
const apiGamecode gamecode,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber GetAccountSubscription(const char * sessionID,
|
||||
const apiGamecode gamecode,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber GetAccountSubscription(const apiAccountId accountId,
|
||||
const apiGamecode gamecode,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber SessionLogin_v3(const char * name,
|
||||
const char * password,
|
||||
const apiSessionType sessionType,
|
||||
const apiIP clientIP,
|
||||
const bool forceLogin,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber SessionLogin_v3(const char * parentSessionID,
|
||||
const apiSessionType sessionType,
|
||||
const apiIP clientIP,
|
||||
const bool forceLogin,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber SessionLogin_v4(const char * name,
|
||||
const char * password,
|
||||
const apiSessionType sessionType,
|
||||
const apiIP clientIP,
|
||||
const bool forceLogin,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber SessionLogin_v4(const char * parentSessionID,
|
||||
const apiSessionType sessionType,
|
||||
const apiIP clientIP,
|
||||
const bool forceLogin,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber SessionLogin_v5(const char * name,
|
||||
const char * password,
|
||||
const apiSessionType sessionType,
|
||||
const apiIP clientIP,
|
||||
const unsigned flags,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber SessionLogin_v5(const char * parentSessionID,
|
||||
const apiSessionType sessionType,
|
||||
const apiIP clientIP,
|
||||
const unsigned flags,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber SessionConsume_v2(const char * sessionID,
|
||||
const apiSessionType sessionType,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber SessionConsume_v3(const char * sessionID,
|
||||
const apiSessionType sessionType,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber SessionValidate_v2(const char * sessionID,
|
||||
const apiSessionType sessionType,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber SessionValidate_v3(const char * sessionID,
|
||||
const apiSessionType sessionType,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber SessionValidateEx(const char * sessionID,
|
||||
const apiSessionType sessionType,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber SubscriptionValidate(const char * sessionID,
|
||||
const apiGamecode gamecode,
|
||||
const void * userData = 0);
|
||||
void SessionLogout(const char ** sessionList,
|
||||
const unsigned sessionCount);
|
||||
void SessionTouch(const char ** sessionList,
|
||||
const unsigned sessionCount);
|
||||
apiTrackingNumber GetMemberInformation(const apiAccountId accountId,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber GetMemberInformation_v2(const apiAccountId accountId,
|
||||
const void * userData = 0);
|
||||
|
||||
void SessionKickReply(const char * sessionID,
|
||||
apiKickReply reply);
|
||||
|
||||
virtual void NotifySessionKickRequest(const apiAccount & account,
|
||||
const apiSession & session,
|
||||
const apiKickReason reason) {}
|
||||
virtual void OnGetAccountStatus(const apiTrackingNumber trackingNumber,
|
||||
const apiResult result,
|
||||
const apiAccount & account,
|
||||
void * userData) {}
|
||||
virtual void OnGetAccountSubscriptions(const apiTrackingNumber trackingNumber,
|
||||
const apiResult result,
|
||||
const apiAccount & account,
|
||||
const apiSubscription * subscriptionArray,
|
||||
unsigned subscriptionCount,
|
||||
void * userData) {}
|
||||
virtual void OnGetAccountSubscription(const apiTrackingNumber trackingNumber,
|
||||
const apiResult result,
|
||||
const apiAccount & account,
|
||||
const apiSubscription & subscription,
|
||||
void * userData) {}
|
||||
virtual void OnSessionLogin_v3(const apiTrackingNumber trackingNumber,
|
||||
const apiResult result,
|
||||
const apiAccount & account,
|
||||
const apiSubscription & subscription,
|
||||
const apiSession & session,
|
||||
void * userData) {}
|
||||
virtual void OnSessionLogin_v4(const apiTrackingNumber trackingNumber,
|
||||
const apiResult result,
|
||||
const apiAccount & account,
|
||||
const apiSubscription & subscription,
|
||||
const apiSession & session,
|
||||
const UsageLimit & usageLimit,
|
||||
void * userData) {}
|
||||
virtual void OnSessionLogin_v5(const apiTrackingNumber trackingNumber,
|
||||
const apiResult result,
|
||||
const apiAccount & account,
|
||||
const apiSubscription & subscription,
|
||||
const apiSession & session,
|
||||
const UsageLimit & usageLimit,
|
||||
const Entitlement & entitlement,
|
||||
void * userData) {};
|
||||
virtual void OnSessionValidate_v2(const apiTrackingNumber trackingNumber,
|
||||
const apiResult result,
|
||||
const apiAccount & account,
|
||||
const apiSubscription & subscription,
|
||||
const apiSession & session,
|
||||
void * userData) {}
|
||||
virtual void OnSessionValidate_v3(const apiTrackingNumber trackingNumber,
|
||||
const apiResult result,
|
||||
const apiAccount & account,
|
||||
const apiSubscription & subscription,
|
||||
const apiSession & session,
|
||||
const UsageLimit & usageLimit,
|
||||
void * userData) {}
|
||||
virtual void OnSessionValidateEx(const apiTrackingNumber trackingNumber,
|
||||
const apiResult result,
|
||||
const apiAccount & account,
|
||||
const apiSubscription & subscription,
|
||||
const apiSession & session,
|
||||
const char * password,
|
||||
void * userData) {}
|
||||
virtual void OnSessionConsume_v2(const apiTrackingNumber trackingNumber,
|
||||
const apiResult result,
|
||||
const apiAccount & account,
|
||||
const apiSubscription & subscription,
|
||||
const apiSession & session,
|
||||
void * userData) {}
|
||||
virtual void OnSessionConsume_v3(const apiTrackingNumber trackingNumber,
|
||||
const apiResult result,
|
||||
const apiAccount & account,
|
||||
const apiSubscription & subscription,
|
||||
const apiSession & session,
|
||||
const UsageLimit & usageLimit,
|
||||
void * userData) {}
|
||||
virtual void OnSubscriptionValidate(const apiTrackingNumber trackingNumber,
|
||||
const apiResult result,
|
||||
const apiSubscription & subscription,
|
||||
void * userData) {}
|
||||
virtual void OnGetMemberInformation(const apiTrackingNumber trackingNumber,
|
||||
const apiResult result,
|
||||
const apiAccount & account,
|
||||
const char * firstName,
|
||||
const char * lastName,
|
||||
const char * gender,
|
||||
const char * email,
|
||||
void * userData) {}
|
||||
virtual void OnGetMemberInformation_v2(const apiTrackingNumber trackingNumber,
|
||||
const apiResult result,
|
||||
const apiAccount & account,
|
||||
const char * firstName,
|
||||
const char * lastName,
|
||||
const char * gender,
|
||||
const char * email,
|
||||
const char * defaultCurrency,
|
||||
const char * defaultCountry,
|
||||
const char * stationHandle,
|
||||
void * userData) {}
|
||||
|
||||
virtual void OnGrantFeatureV2(const apiTrackingNumber trackingNumber,
|
||||
const apiResult result,
|
||||
void * userData) {}
|
||||
|
||||
virtual void OnModifyFeature_v2(const apiTrackingNumber trackingNumber,
|
||||
const apiResult result,
|
||||
const Feature & currentFeature,
|
||||
void * userData) {}
|
||||
|
||||
virtual void OnGrantFeatureByStationID(const apiTrackingNumber trackingNumber,
|
||||
const apiResult result,
|
||||
void * userData) {}
|
||||
|
||||
|
||||
};
|
||||
|
||||
class Entitlement
|
||||
{
|
||||
public:
|
||||
typedef unsigned char UnentitledCode;
|
||||
enum
|
||||
{
|
||||
UNENTITLED_REASON_NULL,
|
||||
UNENTITLED_REASON_USER_CLOSED,
|
||||
UNENTITLED_REASON_ADMIN_CLOSED,
|
||||
UNENTITLED_REASON_BILL_DECLINED,
|
||||
UNENTITLED_REASON_END
|
||||
};
|
||||
|
||||
public:
|
||||
Entitlement();
|
||||
|
||||
unsigned GetTotalTime() const { return mTotalTime; }
|
||||
unsigned GetEntitledTime() const { return mEntitledTime; }
|
||||
unsigned GetTotalTimeSinceLastLogin() const { return mTotalTimeSinceLastLogin; }
|
||||
unsigned GetEntitledTimeSinceLastLogin() const { return mEntitledTimeSinceLastLogin; }
|
||||
UnentitledCode GetReasonUnentitled() const { return mReasonUnentitled; }
|
||||
|
||||
void SetTotalTime(unsigned value) { mTotalTime = value; }
|
||||
void SetEntitledTime(unsigned value) { mEntitledTime = value; }
|
||||
void SetTotalTimeSinceLastLogin(unsigned value) { mTotalTimeSinceLastLogin = value; }
|
||||
void SetEntitledTimeSinceLastLogin(unsigned value) { mEntitledTimeSinceLastLogin = value; }
|
||||
void SetReasonUnentitled(UnentitledCode value) { mReasonUnentitled = value; }
|
||||
|
||||
private:
|
||||
unsigned mTotalTime;
|
||||
unsigned mEntitledTime;
|
||||
unsigned mTotalTimeSinceLastLogin;
|
||||
unsigned mEntitledTimeSinceLastLogin;
|
||||
UnentitledCode mReasonUnentitled;
|
||||
};
|
||||
|
||||
class Feature
|
||||
{
|
||||
public:
|
||||
Feature();
|
||||
|
||||
unsigned GetID() const { return mID; }
|
||||
const std::string & GetData() const { return mData; }
|
||||
|
||||
void SetID(unsigned value) { mID = value; }
|
||||
void SetData(const std::string & value) { mData = value; }
|
||||
|
||||
bool SetParameter(const std::string & key, int value);
|
||||
bool SetParameter(const std::string & key, const std::string & value);
|
||||
int GetParameter(const std::string & key) const;
|
||||
std::string & GetParameter(const std::string & key, std::string & value) const;
|
||||
|
||||
// For consumable promotions
|
||||
bool Consume();
|
||||
int GetConsumeCount() const;
|
||||
bool IsActive() const;
|
||||
void SetActive(bool isActive);
|
||||
|
||||
private:
|
||||
unsigned mID;
|
||||
std::string mData;
|
||||
};
|
||||
|
||||
class FeatureDescription
|
||||
{
|
||||
public:
|
||||
FeatureDescription();
|
||||
unsigned GetID() const { return mID; }
|
||||
const std::string & GetDescription() const { return mDescription; }
|
||||
const std::string & GetDefaultData() const { return mDefaultData; }
|
||||
void SetID(unsigned value) { mID = value; }
|
||||
void SetDescription(const std::string & value) { mDescription = value; }
|
||||
void SetDefaultData(const std::string & value) { mDefaultData = value; }
|
||||
private:
|
||||
unsigned mID;
|
||||
std::string mDescription;
|
||||
std::string mDefaultData;
|
||||
};
|
||||
|
||||
class UsageLimit
|
||||
{
|
||||
public:
|
||||
typedef unsigned char TypeCode;
|
||||
enum
|
||||
{
|
||||
TYPE_NONE,
|
||||
TYPE_COMPULSORY,
|
||||
TYPE_ADVISORY
|
||||
};
|
||||
|
||||
public:
|
||||
UsageLimit();
|
||||
|
||||
TypeCode GetType() const { return mType; }
|
||||
unsigned GetAllowance() const { return mAllowance; }
|
||||
time_t GetNextAllowance() const { return mNextAllowance; }
|
||||
|
||||
void SetType(unsigned char value) { mType = value; }
|
||||
void SetAllowance(unsigned value) { mAllowance = value; }
|
||||
void SetNextAllowance(time_t value) { mNextAllowance = value; }
|
||||
|
||||
private:
|
||||
TypeCode mType;
|
||||
unsigned mAllowance;
|
||||
time_t mNextAllowance;
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,240 @@
|
||||
#ifndef SESSION_LOGIN_API__CLIENT_CORE_H
|
||||
#define SESSION_LOGIN_API__CLIENT_CORE_H
|
||||
|
||||
|
||||
#include "Session/CommonAPI/CommonClient.h"
|
||||
#include "Client.h"
|
||||
|
||||
|
||||
namespace LoginAPI
|
||||
{
|
||||
|
||||
|
||||
class ClientCore : public apiCore
|
||||
{
|
||||
public:
|
||||
ClientCore(apiClient * parent, const char * version, const char * serverList, const char * description, unsigned maxConnections);
|
||||
ClientCore(apiClient * parent, const char * version, const char ** serverList, unsigned serverCount, const char * description, unsigned maxConnections);
|
||||
virtual ~ClientCore();
|
||||
|
||||
Client * GetClient() { return static_cast<Client *>(GetParent()); }
|
||||
|
||||
virtual int GetKeepAliveDelay();
|
||||
|
||||
////////////////////////////////////////
|
||||
// Requests
|
||||
public:
|
||||
apiTrackingNumber GetAccountStatus(const char * name,
|
||||
const char * password,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber GetAccountStatus(const apiAccountId accountId,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber GetAccountSubscriptions(const char * name,
|
||||
const char * password,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber GetAccountSubscriptions(const char * sessionID,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber GetAccountSubscriptions(const apiAccountId accountId,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber GetAccountSubscription(const char * name,
|
||||
const char * password,
|
||||
const apiGamecode gamecode,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber GetAccountSubscription(const char * sessionID,
|
||||
const apiGamecode gamecode,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber GetAccountSubscription(const apiAccountId accountId,
|
||||
const apiGamecode gamecode,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber SessionLogin_v3(const char * name,
|
||||
const char * password,
|
||||
const apiSessionType sessionType,
|
||||
const apiIP clientIP,
|
||||
const bool forceLogin,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber SessionLogin_v3(const char * parentSessionID,
|
||||
const apiSessionType sessionType,
|
||||
const apiIP clientIP,
|
||||
const bool forceLogin,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber SessionLogin_v4(const char * name,
|
||||
const char * password,
|
||||
const apiSessionType sessionType,
|
||||
const apiIP clientIP,
|
||||
const bool forceLogin,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber SessionLogin_v4(const char * parentSessionID,
|
||||
const apiSessionType sessionType,
|
||||
const apiIP clientIP,
|
||||
const bool forceLogin,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber SessionLogin_v5(const char * name,
|
||||
const char * password,
|
||||
const apiSessionType sessionType,
|
||||
const apiIP clientIP,
|
||||
const unsigned flags,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber SessionLogin_v5(const char * parentSessionID,
|
||||
const apiSessionType sessionType,
|
||||
const apiIP clientIP,
|
||||
const unsigned flags,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber SessionLogin(const char * name,
|
||||
const char * password,
|
||||
const apiSessionType sessionType,
|
||||
const apiIP clientIP,
|
||||
const unsigned flags,
|
||||
const char * sessionNamespace = _defaultNamespace,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber SessionLogin(const char * parentSessionID,
|
||||
const apiSessionType sessionType,
|
||||
const apiIP clientIP,
|
||||
const unsigned flags,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber SessionLoginInternal(const apiAccountId accountId,
|
||||
const apiSessionType sessionType,
|
||||
const apiIP clientIP,
|
||||
const unsigned flags,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber SessionConsume_v2(const char * sessionID,
|
||||
const apiSessionType sessionType,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber SessionConsume_v3(const char * sessionID,
|
||||
const apiSessionType sessionType,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber SessionConsume(const char * sessionID,
|
||||
const apiSessionType sessionType,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber SessionValidate_v2(const char * sessionID,
|
||||
const apiSessionType sessionType,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber SessionValidate_v3(const char * sessionID,
|
||||
const apiSessionType sessionType,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber SessionValidate(const char * sessionID,
|
||||
const apiSessionType sessionType,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber SessionValidateEx(const char * sessionID,
|
||||
const apiSessionType sessionType,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber SubscriptionValidate(const char * sessionID,
|
||||
const apiGamecode gamecode,
|
||||
const void * userData = 0);
|
||||
|
||||
void SessionLogout(const char * sessionID);
|
||||
void SessionLogout(const char ** sessionList,
|
||||
const unsigned sessionCount);
|
||||
void SessionTouch(const char * sessionID);
|
||||
void SessionTouch(const char ** sessionList,
|
||||
const unsigned sessionCount);
|
||||
|
||||
apiTrackingNumber GetMemberInformation(const apiAccountId accountId,
|
||||
const void * userData = 0);
|
||||
|
||||
apiTrackingNumber GetMemberInformation_v2(const apiAccountId accountId,
|
||||
const void * userData = 0);
|
||||
|
||||
void SessionKickReply(const char * sessionID,
|
||||
apiKickReply reply);
|
||||
|
||||
apiTrackingNumber GetSessions(const apiAccountId accountId,
|
||||
const void * userData = 0);
|
||||
|
||||
apiTrackingNumber GetFeatures(const char * sessionID,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber GetFeatures(const apiAccountId accountId,
|
||||
const apiGamecode gamecode,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber GrantFeature(const char * sessionID,
|
||||
unsigned featureType,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber ModifyFeature(const char * sessionID,
|
||||
const Feature & feature,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber RevokeFeature(const char * sessionID,
|
||||
unsigned featureType,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber EnumerateFeatures(apiGamecode,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber SessionStartPlay(const char * sessionId,
|
||||
const char * serverName,
|
||||
const char * characterName,
|
||||
const char * gameData,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber SessionStopPlay(const char * sessionId,
|
||||
const char * serverName,
|
||||
const char * characterName,
|
||||
const void * userData = 0);
|
||||
apiTrackingNumber SessionKick(const char * sessionID,
|
||||
apiKickReason reason,
|
||||
const void * userData = 0);
|
||||
|
||||
apiTrackingNumber GrantFeature_v2(const char * sessionID,
|
||||
unsigned featureType,
|
||||
const char * gameCode,
|
||||
unsigned providerID,
|
||||
unsigned promoID,
|
||||
const void * userData = 0);
|
||||
|
||||
apiTrackingNumber ModifyFeature_v2( unsigned accountID,
|
||||
const char * gameCode,
|
||||
const Feature & origFeature,
|
||||
const Feature & newFeature,
|
||||
const void * userData = 0);
|
||||
|
||||
apiTrackingNumber GrantFeatureByStationID(unsigned accountID,
|
||||
unsigned featureType,
|
||||
const char * gameCode,
|
||||
unsigned providerID,
|
||||
unsigned promoID,
|
||||
const void * userData = 0);
|
||||
|
||||
|
||||
////////////////////////////////////////
|
||||
// Result Callbacks
|
||||
public:
|
||||
void OnGetAccountStatus(const Base::ByteStream & stream, void * userData);
|
||||
void OnGetAccountSubscriptions(const Base::ByteStream & stream, void * userData);
|
||||
void OnGetAccountSubscription(const Base::ByteStream & stream, void * userData);
|
||||
void OnSessionLogin_v3(const Base::ByteStream & stream, void * userData);
|
||||
void OnSessionLogin_v4(const Base::ByteStream & stream, void * userData);
|
||||
void OnSessionLogin_v5(const Base::ByteStream & stream, void * userData);
|
||||
void OnSessionLogin(const Base::ByteStream & stream, void * userData);
|
||||
void OnSessionLoginInternal(const Base::ByteStream & stream, void * userData);
|
||||
void OnSessionValidate_v2(const Base::ByteStream & stream, void * userData);
|
||||
void OnSessionValidate_v3(const Base::ByteStream & stream, void * userData);
|
||||
void OnSessionValidate(const Base::ByteStream & stream, void * userData);
|
||||
void OnSessionValidateEx(const Base::ByteStream & stream, void * userData);
|
||||
void OnSessionConsume_v2(const Base::ByteStream & stream, void * userData);
|
||||
void OnSessionConsume_v3(const Base::ByteStream & stream, void * userData);
|
||||
void OnSessionConsume(const Base::ByteStream & stream, void * userData);
|
||||
void OnSessionKick(const Base::ByteStream & stream);
|
||||
void OnSubscriptionValidate(const Base::ByteStream & stream, void * userData);
|
||||
void OnGetMemberInformation(const Base::ByteStream & stream, void * userData);
|
||||
void OnGetMemberInformation_v2(const Base::ByteStream & stream, void * userData);
|
||||
void OnGetSessions(const Base::ByteStream & stream, void * userData);
|
||||
void OnGetFeatures(const Base::ByteStream & stream, void * userData);
|
||||
void OnGrantFeature(const Base::ByteStream & stream, void * userData);
|
||||
void OnModifyFeature(const Base::ByteStream & stream, void * userData);
|
||||
void OnRevokeFeature(const Base::ByteStream & stream, void * userData);
|
||||
void OnEnumerateFeatures(const Base::ByteStream & stream, void * userData);
|
||||
void OnSessionStartPlay(const Base::ByteStream & stream, void * userData);
|
||||
void OnSessionStopPlay(const Base::ByteStream & stream, void * userData);
|
||||
void OnSessionKick(const Base::ByteStream & stream, void * userData);
|
||||
void OnGrantFeatureV2(const Base::ByteStream & stream, void * userData);
|
||||
void NotifySessionKickRequest(const Base::ByteStream & stream, void * userData);
|
||||
void NotifySessionKick(const Base::ByteStream & stream, void * userData);
|
||||
void OnModifyFeature_v2(const Base::ByteStream & stream, void * userData);
|
||||
void OnGrantFeatureByStationID(const Base::ByteStream & stream, void * userData);
|
||||
|
||||
|
||||
virtual bool Callback(Base::ByteStream & stream, void * userData);
|
||||
virtual void Timeout(unsigned short messageId, apiTrackingNumber trackingNumber, void * userData);
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user