Halidel Data Model class DataBlob { protected: unsigned char *data; int length; } class Blobable { public: virtual Blobable(DataBlob); virtual DataBlob GetBlob(void); protected: // Put DataBlob parsing functions here, eg: List Tokenize(DataBlob, char); }; class Halidel::Blobable { public: Halidel(String configFile); // Don't forget: {bbs = this;} FileStore *GetFileStore(void); // Maybe a static FileStore * data member, like BBS? static Halidel *BBS; // Singleton protected: FileStore fileStore; Room currentRoom; User currentUser; }; class Room::Blobable { public: Room(RoomID); // Read from disk // Create and write to disk. Room(String roomName, RoomType rType, String passwd, AnonType aType, UserID aide, ); String GetRoomName(void); RoomType GetRoomType(void); AnonType GetAnonType(void); bool CheckPassword(String); UserID GetRoomAide(void); enum RoomType { Public, GuessName, Password, Invite }; enum AnonType { NotAnon, AnonOption, AnonOnly }; protected: virtual DataBlob *GetMessageBlob(MessageID) { return Halidel::BBS->GetFileStore()->GetMessageBlob(roomID, MessageID); } virtual List *GetMessageBlobList(void) { return Halidel::BBS->GetFileStore()->GetMessageBlobList(roomID); } virtual bool SetMessageBlob(MessageID, DataBlob) { return Halidel::BBS->GetFileStore()->SetMessageBlob(roomID, MessageID, DataBlob); } virtual bool EraseMessageBlob(MessageID) { return Halidel::BBS->GetFileStore()->EraseMessageBlob(roomID, MessageID); } // Data is very effemeral; stored on disk and read whenever needed. } class Mail::Room { public: Mail(UserID); // Read from disk // There's no creation constructor; you can't make a new Mail room. protected: virtual DataBlob *GetMessageBlob(MessageID) { return Halidel::BBS->GetFileStore()->GetMailMessageBlob(roomID, MessageID); } virtual List *GetMessageBlobList(void) { return Halidel::BBS->GetFileStore()->GetMailMessageBlobList(roomID); } virtual bool SetMessageBlob(MessageID, DataBlob) { return Halidel::BBS->GetFileStore()->SetMailMessageBlob(roomID, MessageID, DataBlob); } virtual bool EraseMessageBlob(MessageID) { return Halidel::BBS->GetFileStore()->EraseMailMessageBlob(roomID, MessageID); } } class User::Blobable { public: User(UserID); // Read from disk // Create and write to disk. User(String userName, String passwd, AccessLevel level, bool lastOld, bool expert, bool noPrompt, int screenWidth); UserID GetUserID(void); String GetName(void); bool CheckPassword(String); AccessLevel GetAccessLevel(void); bool GetLastOldFlag(void); bool GetExpertFlag(void); bool GetNoPromptFlag(void); int GetScreenWidth(void); MessageID GetLastRead(RoomID); // Returns -1 if room not in list List *GetZappedList(void); // Returns true on success, false on failure. bool SetPassword(String); bool SetAccessLevel(AccessLevel); bool SetLastOldFlag(bool); bool SetExpertFlag(bool); bool SetNoPromptFlag(bool); bool SetScreenWidth(bool); bool SetLastRead(RoomID, MessageID); bool SetZapped(RoomID, bool); // If true, add room, if false, remove enum AccessLevel { Delete, New, Problem, Local, Network, Prefered, Aide }; protected: UserID userID; String name; } class Message::Blobable { public: Message(RoomID, MessageID); // Create a message. The caller is responsible for writing to disk Message(UserID a, Time t, MessageType type, String b); UserID GetAuthor(void); Time GetTime(void); String GetBody(void); MessageType GetMessageType(void); enum MessageType { Normal, Anon, Mail }; protected: UserID author; String body; Time time; MessageType msgType; } class MailMessage::Message { public: MailMessage(UserID, MessageID); // Create a MailMessage. The caller is responsible for writing to disk. MailMessage(UserID a, UserID r, Time t, MessageType type, String d); UserID GetRcpt(void); protected: UserID rcpt; } class Page::Blobable { public: Page(UserID, PageID); // Read from disk Page(UserID a, UserID r, Time t, String b); protected: UserID author; UserID rcpt; Time time; String body; } class FileStore { public: DataBlob *GetMessageBlob(RoomID, MessageID); List *GetMessageBlobList(RoomID); DataBlob *GetMailMessageBlob(UserID, MessageID); List *GetMailMessageBlobList(UserID); DataBlob *GetRoomBlob(RoomID); List *GetRoomBlobList(void); DataBlob *GetUserBlob(UserID); List *GetUserBlobList(void); DataBlob *GetPageBlob(UserID, PageID); List *GetPageBlobList(UserID); List *GetWtmpBlobList(void); bool SetMessageBlob(RoomID, MessageID, DataBlob); bool SetMailMessageBlob(UserID, MessageID, DataBlob); bool SetRoomBlob(RoomID, DataBlob); bool SetUserBlob(UserID, DataBlob); bool SetPageBlob(UserID, PageID, DataBlob); bool SetWtmpBlob(ProcID, DataBlob); bool EraseMessageBlob(RoomID, MessageID); bool EraseMailMessageBlob(UserID, MessageID); bool EraseRoomBlob(RoomID); bool EraseUserBlob(UserID); bool ErasePageBlob(UserID, PageID); bool EraseWtmpBlob(ProcID); MessageID GetNextMessageID(void); RoomID GetNextRoomID(void); UserID GetNextUserID(void); PageID GetNextPageID(void); protected: String UsersDirectory; String RoomsDirectory; } class MessageID { public: operator==; operator int; int GetMessageID(void); private: int messageID; } class RoomID { public: operator==; operator int; int GetRoomID(void); private: int roomID; } class UserID { public: operator==; operator int; int GetUserID(void); private: int userID; } class PageID { public: operator==; operator int; int GetPageID(void); private: int pageID; }