Eris  1.3.19
Room.h
00001 #ifndef ERIS_ROOM_H
00002 #define ERIS_ROOM_H
00003 
00004 #include <Eris/Router.h>
00005 
00006 #include <sigc++/trackable.h>
00007 #include <sigc++/signal.h>
00008 
00009 #include <vector>
00010 #include <map>
00011 #include <string>
00012 
00013 namespace Eris
00014 {
00015         
00016 // forward decls
00017 class Person;
00018 class Lobby;
00019 
00024 class Room : public sigc::trackable, public Router
00025 {
00026 public: 
00027     virtual ~Room();
00028 
00030     void say(const std::string &tk);
00031 
00034     void emote(const std::string &em);
00035 
00038     void leave();
00039 
00044     Room* createRoom(const std::string &name);
00045 
00047     std::string getName() const
00048     {
00049         return m_name;
00050     }
00051         
00052     std::string getTopic() const
00053     {
00054         return m_topic;
00055     }
00056     
00058     std::vector<Person*> getPeople() const;
00059         
00061     std::vector<Room*> getRooms() const
00062     {
00063         return m_subrooms;
00064     }
00065         
00068     std::string getId() const
00069     {
00070         return m_roomId;
00071     }
00072     
00073     Person* getPersonByUID(const std::string& uid);
00074                 
00075 // signals
00078     sigc::signal<void, Room*> Entered;
00079     
00082     sigc::signal<void, Room*, Person*, const std::string&> Speech;
00083     
00085     sigc::signal<void, Room*, Person*, const std::string&> Emote;
00086         
00090     sigc::signal<void, Room*, Person*> Appearance;
00091     
00093     sigc::signal<void, Room*, Person*> Disappearance;
00094         
00095         
00096 protected:
00097     friend class Lobby;
00098 
00099     typedef std::map<std::string, Person*> IdPersonMap;
00100     
00103     explicit Room(Lobby *l, const std::string& id);
00104         
00105     virtual RouterResult handleOperation(const Atlas::Objects::Operation::RootOperation& op);
00106     void handleSoundTalk(Person* p, const std::string& speech);
00107     void handleEmote(Person* p, const std::string& desc);
00108         
00109         
00110     std::string m_roomId;
00111 private:
00113     void checkEntry();
00114 
00115     void sight(const Atlas::Objects::Entity::RootEntity &room);
00116 
00117     void appearance(const std::string& personId);
00118     void disappearance(const std::string& personId);
00119     
00120     // callback slot when Lobby recives SIGHT(person)
00121     void notifyPersonSight(Person *p);
00122         
00123     std::string m_name;
00124     std::string m_topic;
00125     bool m_entered;     
00126     Lobby* m_lobby;
00127     
00128     IdPersonMap m_members;
00129     
00130     std::vector<Room*> m_subrooms;
00131 };
00132         
00133 }
00134 
00135 #endif