Added platform libs

This commit is contained in:
Anonymous
2014-01-16 07:25:50 -07:00
parent 202d7d1de3
commit 77c2b5f6bc
92 changed files with 16139 additions and 2 deletions
+2
View File
@@ -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,&copy,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,&copy,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,&copy,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,&copy,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, &copy, 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