/* Yo Emacs, this -*- C++ -*- Copyright (C) 1999-2001 Jens Hoefkens jens@hoefkens.com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. $Id$ */ #ifndef __KBGFIBS_H #define __KBGFIBS_H #ifdef HAVE_CONFIG_H #include #endif #include #include "kplayerlist.h" #include "kbgfibschat.h" #include "kbginvite.h" // TODO #include #include #include #include class TQTimer; class TQSocket; class TQPopupMenu; class TQCheckBox; class KAction; class KToggleAction; /** * * Special backgammon engine for games on the First Internet Backgammon Server * * @short The FIBS backgammon engine * @author Jens Hoefkens * */ class KBgEngineFIBS : public KBgEngine { Q_OBJECT TQ_OBJECT public: /** * Constructor */ KBgEngineFIBS(TQWidget *parent = 0, TQString *name = 0, TQPopupMenu *pmenu = 0); /** * Destructor */ virtual ~KBgEngineFIBS(); /** * Fills the engine-specific page into the notebook */ virtual void getSetupPages(KDialogBase *nb); virtual void setupOk(); virtual void setupDefault(); virtual void setupCancel(); /* * Check with the engine if we can quit. This may require user * interaction. */ virtual bool queryClose(); /** * About to be closed. Let the engine exit properly. */ virtual bool queryExit(); virtual void start(); public slots: /** * Read and save user settings to the config file */ virtual void readConfig(); virtual void saveConfig(); /** * Roll dice for the player w */ virtual void rollDice(const int w); /** * Double the cube of player w */ virtual void doubleCube(const int w); /** * A move has been made on the board - see the board class * for the format of the string s */ virtual void handleMove(TQString *s); /** * Undo the last move */ virtual void undo(); /** * Redo the last move */ virtual void redo(); /** * Commit a move */ virtual void done(); // ########################################################################### // // // // TODO TODO TODO TODO TODO TODO TODO // // // // ########################################################################### /* * Process the string cmd */ void handleCommand(const TQString &cmd); void fibsRequestInvitation(const TQString &player); void personalMessage(const TQString &msg); /* * Local configuration handling */ void keepAlive(); signals: void serverString(const TQString &s); void fibsWhoInfo(const TQString &line); void fibsWhoEnd(); void fibsLogout(const TQString &p); void fibsLogin(const TQString &p); void fibsConnectionClosed(); void changePlayertqStatus(const TQString &, int, bool); void chatMessage(const TQString &msg); void fibsStartNewGame(const TQString &msg); void gameOver(); protected slots: void invitationDone(); void inviteDialog(); void showList(); void showChat(); void endGame(); private: TQTimer *keepaliveTimer; TQString pname[2]; TQString currBoard, caption; //KBgtqStatus *currBoard //KBgFIBSBoard *boardHandler; TQStringList invitations; /* * special menu entries */ int respMenuID, cmdMenuID, joinMenuID, optsMenuID; TQPopupMenu *respMenu, *cmdMenu, *joinMenu, *optsMenu; /* * child windows */ KFibsPlayerList *playerlist; KBgChat *chatWindow; KBgInvite *invitationDlg; /* * Other stuff */ TQString lastMove; int toMove; TQString lastAway; bool playing; bool redoPossible; int undoCounter; KAction *conAction, *disAction, *newAction, *invAction; KAction *actAccept, *actReject, *actConti, *actLeave, *actAway, *actBack; KToggleAction *chatAct, *listAct; // ########################################################################### // // // // DONE DONE DONE DONE DONE DONE DONE // // // // ########################################################################### private: /** * Actions for responding to invitations. numJoin is he current * number of active actions. The max. number of pending invitations * is eight and this is hardcoded in a lot of places (not the least * of which are the slots join_N(). */ KAction *actJoin[8]; int numJoin; protected slots: /** * Handle rawwho information for the purposes of the invitation * submenu and the join entries */ void changeJoin(const TQString &info); /** * A player will be removed from the menu of pending invitations * if necessary. */ void cancelJoin(const TQString &info); /** * We have up to 8 names in the join menu. They are the * players that invited us to play games. Each action * has its own slot and all slots call the common backend * join(). */ void join(const TQString &msg); void join_0(); void join_1(); void join_2(); void join_3(); void join_4(); void join_5(); void join_6(); void join_7(); /** * Simple slots that toggle FIBS server-side settings. The * names of the functions reflect the name of the toggle on * FIBS. */ void toggle_greedy(); void toggle_ready(); void toggle_double(); void toggle_ratings(); private: /** * Toggle actions for the FIBS server-side settings */ enum FIBSOpt {OptReady, OptGreedy, OptDouble, OptAllowPip, OptAutoMove, OptCrawford, OptSilent, OptRatings, OptMoves, NumFIBSOpt}; KToggleAction *fibsOpt[NumFIBSOpt]; public slots: /* * Connection handling * ------------------- */ // initiate asynchronous connection establishment void connectFIBS(); // take the connection down void disconnectFIBS(); // create a new account and connect void newAccount(); // called when the connection is down void connectionClosed(); // the hostname has been resolved void hostFound(); // a connection error occurred void connError(int f); // connection has been established void connected(); // data can be read from the socket void readData(); // send the string s to the server void sendData(const TQString &s); protected: // get the connection parameters bool queryConnection(const bool newlogin); private: // actual connection object TQSocket *connection; // flag if we have login information or new account bool login; protected slots: /* * FIBS command slots * ------------------ */ // go away and leave a message void away(); // come back after being away void back(); // roll dice virtual void roll(); // double the cube virtual void cube(); // reload the board to the last known sane state virtual void load(); // accept an offer void accept(); // reject an offer void reject(); // continue a multi game match void match_conti(); // leave a multi game match void match_leave(); protected slots: /* * All strings received from the server are given to handleServerData() for * identification and processing. It implements a limited state machine to * handle the incoming data correctly. The whole function could probably be * made more efficient, but it is not time critical (and it appears to be * easier to understand this way). */ void handleServerData(TQString &line); protected: enum RxtqStatus {RxIgnore, RxConnect, RxWhois, RxMotd, RxRating, RxNewLogin, RxGoodbye, RxNormal}; int rxtqStatus, rxCount; TQString rxCollect; /* * The following functions handle the individual states * of the handleServerData() state machine, */ void handleMessageWhois(const TQString &line); void handleMessageRating(const TQString &line); void handleMessageMotd(const TQString &line); void handleMessageNewLogin(const TQString &line); void handleMessageConnect(const TQString &line, const TQString &rawline); void handleMessageNormal(TQString &line, TQString &rawline); /* * The next enumeration and the array of regular expressions is needed for the * message identification in handleServerData(). */ enum Pattern {Welcome, OwnInfo, NoLogin, BegRate, EndRate, HTML_lt, HTML_gt, BoardSY, BoardSN, WhoisBG, WhoisE1, WhoisE2, WhoEnde, WhoInfo, MotdBeg, MotdEnd, MsgPers, MsgDeli, MsgSave, ChatSay, ChatSht, ChatWis, ChatKib, SelfSay, SelfSlf, SelfSht, SelfWis, SelfKib, UserLin, UserLot, Goodbye, GameSav, RawBord, YouTurn, PlsMove, BegWtch, EndWtch, BegBlnd, EndBlnd, BegGame, OneWave, TwoWave, YouWave, Reload1, Reload2, GameBG1, GameBG2, GameRE1, GameRE2, GameEnd, EndLose, EndVict, MatchB1, MatchB2, MatchB3, MatchB4, RejAcpt, YouAway, YouAcpt, HelpTxt, Invite0, Invite1, Invite2, Invite3, ConLeav, TabChar, PlsChar, OneName, TypJoin, YouBack, YouMove, YouRoll, TwoStar, BoxHori, BoxVer1, BoxVer2, OthrNam, YourNam, GivePwd, RetypeP, GreedyY, GreedyN, RejCont, AcptWin, YouGive, DoubleY, DoubleN, KeepAlv, RatingY, RatingN, NumPattern}; TQRegExp pat[NumPattern]; /* * This function is simply filling the pat[] array with the proper values. */ void initPattern(); private: /* * Local setup and config variables * ================================ */ /* * Various options */ bool showMsg, whoisInvite; TQCheckBox *cbp, *cbi; TQCheckBox *cbk; bool keepalive; /* * Connection setup */ enum FIBSInfo {FIBSHost, FIBSPort, FIBSUser, FIBSPswd, NumFIBS}; TQString infoFIBS[NumFIBS]; TQLineEdit *lec[NumFIBS]; /* * Auto messages */ enum AutoMessages {MsgBeg, MsgLos, MsgWin, NumMsg}; TQLineEdit *lem[NumMsg]; TQCheckBox *cbm[NumMsg]; bool useAutoMsg[NumMsg]; TQString autoMsg[NumMsg]; }; #endif // __KBGFIBS_H