00001 #ifndef ERIS_PLAYER_H
00002 #define ERIS_PLAYER_H
00003
00004 #include <Eris/Types.h>
00005
00006 #include <Atlas/Objects/ObjectsFwd.h>
00007
00008 #include <sigc++/signal.h>
00009
00010 #include <vector>
00011 #include <map>
00012 #include <memory>
00013
00014 namespace Eris
00015 {
00016
00017 class Connection;
00018 class Avatar;
00019 class AccountRouter;
00020 class Timeout;
00021
00023 typedef std::map<std::string, Atlas::Objects::Entity::RootEntity> CharacterMap;
00024
00025 typedef std::map<std::string, Avatar*> ActiveCharacterMap;
00026
00028
00036 class Account : virtual public sigc::trackable
00037 {
00038 public:
00040
00045 Account(Connection *con);
00046
00047 ~Account();
00048
00050
00059 Result login(const std::string &uname, const std::string &pwd);
00060
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072 Result createAccount(const std::string &uname,
00073 const std::string &fullName,
00074 const std::string &pwd);
00075
00077
00080 Result logout();
00081
00083
00084 bool isLoggedIn() const;
00085
00087 const std::vector< std::string > & getCharacterTypes(void) const;
00088
00090
00095 const CharacterMap& getCharacters();
00096
00104 Result refreshCharacterInfo();
00105
00107
00112 Result takeCharacter(const std::string &id);
00113
00115 Result createCharacter(const Atlas::Objects::Entity::RootEntity &character);
00116
00118
00119
00121 bool canCreateCharacter() {return false;}
00122
00123 const ActiveCharacterMap& getActiveCharacters() const
00124 { return m_activeCharacters; }
00125
00130 Result deactivateCharacter(Avatar* av);
00131
00133 const std::string& getId() const
00134 {
00135 return m_accountId;
00136 }
00137
00139 const std::string& getUsername() const
00140 { return m_username; }
00141
00143 Connection* getConnection() const
00144 {
00145 return m_con;
00146 }
00147
00148
00150 sigc::signal<void, const Atlas::Objects::Entity::RootEntity&> GotCharacterInfo;
00151
00153 sigc::signal<void> GotAllCharacters;
00154
00156
00160 sigc::signal<void, const std::string &> LoginFailure;
00161
00163 sigc::signal<void> LoginSuccess;
00164
00166
00170 sigc::signal<void, bool> LogoutComplete;
00171
00176 sigc::signal<void, Avatar*> AvatarSuccess;
00177
00182 sigc::signal<void, const std::string &> AvatarFailure;
00183
00189 sigc::signal<void, Avatar*> AvatarDeactivated;
00190 protected:
00191 friend class AccountRouter;
00192 friend class Avatar;
00193
00194 void sightCharacter(const Atlas::Objects::Operation::RootOperation& op);
00195
00196 void loginComplete(const Atlas::Objects::Entity::Account &p);
00197 void loginError(const Atlas::Objects::Operation::Error& err);
00198
00199 Result internalLogin(const std::string &unm, const std::string &pwd);
00200 void internalLogout(bool clean);
00201
00203 void netConnected();
00204
00206 bool netDisconnecting();
00207 void netFailure(const std::string& msg);
00208
00209 void loginResponse(const Atlas::Objects::Operation::RootOperation& op);
00210 void logoutResponse(const Atlas::Objects::Operation::RootOperation& op);
00211 void avatarResponse(const Atlas::Objects::Operation::RootOperation& op);
00212 void avatarLogoutResponse(const Atlas::Objects::Operation::RootOperation& op);
00213
00214 void handleLogoutTimeout();
00215
00216
00217 void handleLoginTimeout();
00218
00219 typedef enum
00220 {
00221 DISCONNECTED = 0,
00222 LOGGING_IN,
00223 LOGGED_IN,
00224 LOGGING_OUT,
00225
00226 TAKING_CHAR,
00227 CREATING_CHAR
00228 } Status;
00229
00230 void internalDeactivateCharacter(Avatar* av);
00231 void updateFromObject(const Atlas::Objects::Entity::Account &p);
00232
00233 Connection* m_con;
00234 Status m_status;
00235 AccountRouter* m_router;
00236
00237 std::string m_accountId;
00238 std::string m_username;
00239 std::string m_pass;
00240
00241 std::vector< std::string > m_characterTypes;
00242 CharacterMap _characters;
00243 StringSet m_characterIds;
00244 bool m_doingCharacterRefresh;
00245
00246 ActiveCharacterMap m_activeCharacters;
00247 std::auto_ptr<Timeout> m_timeout;
00248 };
00249
00250 }
00251
00252 #endif