[Widelands-cvs] widelands/src/ui/ui_fs_menus fullscreen_menu_netsetup.cc,1.3,1.4 fullscreen_menu_net
Status: Beta
Brought to you by:
sirver
From: Stefan T. B. <vir...@us...> - 2004-12-30 21:37:33
|
Update of /cvsroot/widelands/widelands/src/ui/ui_fs_menus In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19988/src/ui/ui_fs_menus Modified Files: fullscreen_menu_netsetup.cc fullscreen_menu_netsetup.h Log Message: Added promotion and discovery of open games in a local network. The new code is using the socket API directly, the old code is still using SDL_net which is planned to be removed. Index: fullscreen_menu_netsetup.cc =================================================================== RCS file: /cvsroot/widelands/widelands/src/ui/ui_fs_menus/fullscreen_menu_netsetup.cc,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- fullscreen_menu_netsetup.cc 11 Dec 2004 17:45:34 -0000 1.3 +++ fullscreen_menu_netsetup.cc 30 Dec 2004 21:37:12 -0000 1.4 @@ -20,11 +20,19 @@ #include "fullscreen_menu_netsetup.h" #include "ui_button.h" #include "ui_textarea.h" +#include "ui_editbox.h" +#include "ui_table.h" #include "constants.h" +#include "network_lan_promotion.h" +#include "network.h" + Fullscreen_Menu_NetSetup::Fullscreen_Menu_NetSetup () :Fullscreen_Menu_Base("singleplmenu.jpg") // change this { + discovery=new LAN_Game_Finder(); + discovery->set_callback (discovery_callback, this); + // Text UITextarea* title= new UITextarea(this, MENU_XRES/2, 140, "Begin Network Game", Align_HCenter); title->set_font(UI_FONT_BIG, UI_FONT_CLR_FG); @@ -32,15 +40,15 @@ // UIButtons UIButton* b; - b = new UIButton(this, 60, 170, 174, 24, 1, HOSTGAME); + b = new UIButton(this, 60, 170, 174, 24, 1, JOINGAME); b->clickedid.set(this, &Fullscreen_Menu_NetSetup::end_modal); - b->set_title("Host a New Game"); + b->set_title("Join a Game"); - b = new UIButton(this, 60, 210, 174, 24, 1, JOINGAME); + b = new UIButton(this, 60, 210, 174, 24, 1, HOSTGAME); b->clickedid.set(this, &Fullscreen_Menu_NetSetup::end_modal); - b->set_title("Join a Game"); + b->set_title("Host a New Game"); - b = new UIButton(this, 60, 250, 174, 24, 1, INTERNETGAME); + b = new UIButton(this, 60, 250, 174, 24, 1, INTERNETGAME); b->clickedid.set(this, &Fullscreen_Menu_NetSetup::end_modal); b->set_title("Play in Internet"); @@ -49,11 +57,112 @@ b->set_title("Back"); // Hostname - hostname=new UIEdit_Box(this, 288, 210, 174, 24, 2, 0); + hostname=new UIEdit_Box(this, 288, 170, 174, 24, 2, 0); hostname->set_text("localhost"); + + // List of open games in local network + opengames=new UITable(this, 288, 210, 320, 128); + opengames->add_column ("Host", UITable::STRING, 128); + opengames->add_column ("Map", UITable::STRING, 128); + opengames->add_column ("State", UITable::STRING, 64); + opengames->selected.set (this, &Fullscreen_Menu_NetSetup::game_selected); } Fullscreen_Menu_NetSetup::~Fullscreen_Menu_NetSetup () { + delete discovery; +} + +void Fullscreen_Menu_NetSetup::think () +{ + Fullscreen_Menu_Base::think (); + + discovery->run (); +} + +bool Fullscreen_Menu_NetSetup::get_host_address (ulong& addr, ushort& port) +{ + const char* host=hostname->get_text(); + + int i; + for (i=0;i<opengames->get_nr_entries();i++) { + LAN_Open_Game* game=(LAN_Open_Game*) (opengames->get_entry(i)->get_user_data()); + + if (!strcmp(game->info.hostname, host)) { + addr=game->address; + port=game->port; + return true; + } + } + + hostent* he=gethostbyname(host); + if (he==0) + return false; + + addr=((in_addr*) (he->h_addr_list[0]))->s_addr; + port=htons(WIDELANDS_PORT); + + endhostent (); + + return true; +} + +void Fullscreen_Menu_NetSetup::game_selected (int sel) +{ + LAN_Open_Game* game=(LAN_Open_Game*) (opengames->get_selection()); + + hostname->set_text (game->info.hostname); +} + +void Fullscreen_Menu_NetSetup::update_game_info (UITable_Entry* entry, const LAN_Game_Info& info) +{ + entry->set_string (0, info.hostname); + entry->set_string (1, info.map); + + switch (info.state) { + case LAN_GAME_OPEN: + entry->set_string (2, "Open"); + break; + case LAN_GAME_CLOSED: + entry->set_string (2, "Closed"); + break; + default: + entry->set_string (2, "Unknown"); + break; + } +} + +void Fullscreen_Menu_NetSetup::game_opened (const LAN_Open_Game* game) +{ + update_game_info (new UITable_Entry(opengames, (void*) game), game->info); +} + +void Fullscreen_Menu_NetSetup::game_closed (const LAN_Open_Game* game) +{ +} + +void Fullscreen_Menu_NetSetup::game_updated (const LAN_Open_Game* game) +{ + UITable_Entry* entry=opengames->find_entry(game); + + if (entry!=0) + update_game_info (entry, game->info); +} + +void Fullscreen_Menu_NetSetup::discovery_callback (int type, const LAN_Open_Game* game, void* userdata) +{ + switch (type) { + case LAN_Game_Finder::GameOpened: + static_cast<Fullscreen_Menu_NetSetup*>(userdata)->game_opened (game); + break; + case LAN_Game_Finder::GameClosed: + static_cast<Fullscreen_Menu_NetSetup*>(userdata)->game_closed (game); + break; + case LAN_Game_Finder::GameUpdated: + static_cast<Fullscreen_Menu_NetSetup*>(userdata)->game_updated (game); + break; + default: + abort (); + } } Index: fullscreen_menu_netsetup.h =================================================================== RCS file: /cvsroot/widelands/widelands/src/ui/ui_fs_menus/fullscreen_menu_netsetup.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- fullscreen_menu_netsetup.h 11 Dec 2004 17:45:34 -0000 1.3 +++ fullscreen_menu_netsetup.h 30 Dec 2004 21:37:12 -0000 1.4 @@ -21,8 +21,14 @@ #define __S__NETSETUP_H #include "fullscreen_menu_base.h" -#include "ui_editbox.h" +class UIEdit_Box; +class UITable; +class UITable_Entry; + +class LAN_Game_Finder; +class LAN_Open_Game; +struct LAN_Game_Info; class Fullscreen_Menu_NetSetup : public Fullscreen_Menu_Base { public: @@ -36,11 +42,25 @@ Fullscreen_Menu_NetSetup (); ~Fullscreen_Menu_NetSetup (); - const char* get_host_address () - { return hostname->get_text(); } + virtual void think(); + + bool get_host_address (ulong&, ushort&); + // return true if the selected or entered hostname is valid private: - UIEdit_Box* hostname; + UIEdit_Box* hostname; + UITable* opengames; + LAN_Game_Finder* discovery; + + void game_selected (int); + + static void discovery_callback (int, const LAN_Open_Game*, void*); + + void game_opened (const LAN_Open_Game*); + void game_closed (const LAN_Open_Game*); + void game_updated (const LAN_Open_Game*); + + void update_game_info (UITable_Entry*, const LAN_Game_Info&); }; #endif |