00001 #ifndef ERIS_LOBBY_H
00002 #define ERIS_LOBBY_H
00003
00004 #include <Eris/Connection.h>
00005 #include <Eris/Room.h>
00006
00007
00008 class TestLobby;
00009
00010 namespace Atlas {
00011 namespace Objects {
00012 namespace Entity {
00013 class Account;
00014 class Player;
00015 }
00016 namespace Operation {
00017 class Create;
00018 class Info;
00019 }
00020 }
00021 }
00022
00023 namespace Eris
00024 {
00025
00026 class Player;
00027 class Person;
00028
00031 class Lobby : public Room
00032 {
00033 public:
00034 Lobby(Connection *c);
00035 virtual ~Lobby();
00036
00038 Room* join(const std::string &roomID);
00039
00040
00041
00043 Person* getPerson(const std::string &acc);
00044
00046 Room* getRoom(const std::string &id);
00047
00049 const std::string& getAccountID();
00050
00052 Connection* getConnection() const { return _con; }
00053
00054
00056 SigC::Signal1<void, Person*> SightPerson;
00057
00059
00060
00061
00062 SigC::Signal2<void, const std::string&, const std::string&> PrivateTalk;
00063
00065 SigC::Signal1<void, const Atlas::Objects::Entity::Player&> LoggedIn;
00066
00070 static Lobby* getPrimary() {return Connection::getPrimary()->getLobby();}
00072 static Lobby* instance() {return getPrimary();}
00073 protected:
00074 friend class Room;
00075 friend class Player;
00076
00077 friend class TestLobby;
00078
00079 void look(const std::string &id);
00080 void expectInfoRefno(long ref);
00081
00082
00083 void recvInfoAccount(const Atlas::Objects::Operation::Info &ifo,
00084 const Atlas::Objects::Entity::Account &account);
00085
00086 void recvSightPerson(const Atlas::Objects::Entity::Account &ac);
00087 void recvSightRoom(const Atlas::Objects::Entity::RootEntity &room);
00088
00089 void recvSightLobby(const Atlas::Objects::Entity::RootEntity &lobby);
00090
00091 void recvPrivateChat(const Atlas::Objects::Operation::Talk &tk);
00092
00093 void recvSightCreate(const Atlas::Objects::Operation::Create &cr,
00094 const Atlas::Objects::Entity::RootEntity &ent);
00095
00097 void processRoomCreate(const Atlas::Objects::Operation::Create &cr,
00098 const Atlas::Objects::Entity::RootEntity &ent);
00099
00101 void registerCallbacks();
00102
00106 void addPendingCreate(Room *r, int serialno);
00107
00108
00109 void netFailure(const std::string& msg);
00110 void netConnected();
00111 void netDisconnected();
00112
00113 std::string _account;
00114 Connection* _con;
00115
00116 bool _reconnect;
00117 long _infoRefno;
00118
00119 typedef std::map<std::string, Person*> PersonDict;
00120 PersonDict _peopleDict;
00121
00122 typedef std::map<std::string, Room*> RoomDict;
00123 RoomDict _roomDict;
00124
00125 typedef std::map<int, Room*> PendingCreateMap;
00127 PendingCreateMap _pendingCreate;
00128 };
00129
00130 }
00131
00132 #endif