~swag/armagetronad/0.2.9-sty+ct+ap-fork

« back to all changes in this revision

Viewing changes to src/tron/gServerFavorites.cpp

  • Committer: luke-jr
  • Date: 2006-05-29 01:55:42 UTC
  • Revision ID: svn-v3-list-QlpoOTFBWSZTWZvbKhsAAAdRgAAQABK6798QIABURMgAAaeoNT1TxT1DQbKaeobXKiyAmlWT7Y5MkdJOtXDtB7w7DOGFBHiOBxaUIu7HQyyQSvxdyRThQkJvbKhs:7d95bf1e-0414-0410-9756-b78462a59f44:armagetronad%2Fbranches%2F0.2.8%2Farmagetronad:4612
Unify tags/branches of modules released together

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 
 
3
*************************************************************************
 
4
 
 
5
ArmageTron -- Just another Tron Lightcycle Game in 3D.
 
6
Copyright (C) 2000  Manuel Moos (manuel@moosnet.de)
 
7
 
 
8
**************************************************************************
 
9
 
 
10
This program is free software; you can redistribute it and/or
 
11
modify it under the terms of the GNU General Public License
 
12
as published by the Free Software Foundation; either version 2
 
13
of the License, or (at your option) any later version.
 
14
 
 
15
This program is distributed in the hope that it will be useful,
 
16
but WITHOUT ANY WARRANTY; without even the implied warranty of
 
17
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
18
GNU General Public License for more details.
 
19
 
 
20
You should have received a copy of the GNU General Public License
 
21
along with this program; if not, write to the Free Software
 
22
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
23
  
 
24
***************************************************************************
 
25
 
 
26
*/
 
27
 
 
28
#include "rSDL.h"
 
29
 
 
30
#include "gServerFavorites.h"
 
31
 
 
32
#include "gLogo.h"
 
33
#include "gGame.h"
 
34
 
 
35
#include "uMenu.h"
 
36
 
 
37
#include "tConfiguration.h"
 
38
 
 
39
#include "gServerBrowser.h"
 
40
#include "nServerInfo.h"
 
41
 
 
42
#ifdef CONNECTION_STRESS
 
43
static bool sg_ConnectionStress = false;
 
44
#endif
 
45
 
 
46
#include <sstream>
 
47
 
 
48
enum { NUM_FAVORITES = 10 };
 
49
 
 
50
//! favorite server information, just to connect
 
51
class gServerInfoFavorite: public nServerInfoBase
 
52
{
 
53
public:
 
54
    // construct a server directly with connection name and port
 
55
    gServerInfoFavorite( tString const & connectionName, unsigned int port )
 
56
    {
 
57
        nServerInfoBase::SetConnectionName( connectionName );
 
58
        nServerInfoBase::SetPort( port );
 
59
    };
 
60
};
 
61
 
 
62
static tString sg_ConfName( int ID, char const * name )
 
63
{
 
64
    std::stringstream s;
 
65
    s << "BOOKMARK_" << ID+1 << name;
 
66
 
 
67
    return tString( s.str().c_str() );
 
68
}
 
69
 
 
70
//! server favorite: holds connection info and configuration items
 
71
class gServerFavorite
 
72
{
 
73
public:
 
74
    friend class gServerFavoritesHolder;
 
75
 
 
76
    //! constructor
 
77
    gServerFavorite( int ID )
 
78
            : name_( "" )
 
79
            , port_( sn_defaultPort )
 
80
            , index_( ID )
 
81
            , confName_( sg_ConfName( ID, "_NAME") ,name_ )
 
82
            , confAddress_( sg_ConfName( ID, "_ADDRESS"), address_ )
 
83
            , confPort( sg_ConfName( ID, "_PORT"), port_ )
 
84
    {
 
85
    };
 
86
 
 
87
    //! connects to the server
 
88
    void Connect()
 
89
    {
 
90
        gServerInfoFavorite fav( address_, port_ );
 
91
 
 
92
        gLogo::SetDisplayed(false);
 
93
 
 
94
        ConnectToServer( &fav );
 
95
    }
 
96
 
 
97
    //! returns the index in the favorite holder
 
98
    int GetIndex()
 
99
    {
 
100
        return index_;
 
101
    }
 
102
public:
 
103
    tString         name_;        //!< the human readable name
 
104
    tString         address_;     //!< connection address
 
105
    int             port_;        //!< port to connect to
 
106
 
 
107
private:
 
108
    int             index_;       //!< index in favorite holder
 
109
 
 
110
    tConfItemLine confName_;      //!< configuration item holding the name
 
111
    tConfItemLine confAddress_;   //!< configuration item holding the address
 
112
    tConfItem<int> confPort;      //!< configuration item holding the port
 
113
};
 
114
 
 
115
//! server favorites management class: holds an array of servers
 
116
class gServerFavoritesHolder
 
117
{
 
118
public:
 
119
    gServerFavoritesHolder()
 
120
            :custom(-1)
 
121
    {
 
122
        // generate favorites
 
123
        for (int i = NUM_FAVORITES-1; i>=0; --i )
 
124
            favorites[i] = new gServerFavorite( i );
 
125
    }
 
126
 
 
127
    ~gServerFavoritesHolder()
 
128
    {
 
129
        // destroy favorites
 
130
        for (int i = NUM_FAVORITES-1; i>=0; --i )
 
131
            delete favorites[i];
 
132
    }
 
133
 
 
134
    //! returns the favorite server info with the given index
 
135
    gServerFavorite & GetFavorite( int index )
 
136
    {
 
137
        if ( index == -1 )
 
138
            return custom;
 
139
 
 
140
        tASSERT( index >=0 && index < NUM_FAVORITES );
 
141
        tASSERT( favorites[index] );
 
142
        return *favorites[index];
 
143
    }
 
144
private:
 
145
    // regular bookmarks
 
146
    gServerFavorite * favorites[NUM_FAVORITES];
 
147
 
 
148
    // custom connect server
 
149
    gServerFavorite custom;
 
150
};
 
151
 
 
152
// server bookmarks
 
153
static gServerFavoritesHolder sg_holder;
 
154
 
 
155
//! edit submenu item quitting the parent menu when it's done
 
156
class gMenuItemEditSubmenu: public uMenuItemSubmenu
 
157
{
 
158
public:
 
159
    gMenuItemEditSubmenu(uMenu *M,uMenu *s,
 
160
                         const tOutput& help)
 
161
            : uMenuItemSubmenu( M, s, help )
 
162
    {}
 
163
 
 
164
    //! enters the submenu
 
165
    virtual void Enter()
 
166
    {
 
167
        // delegate to base
 
168
        uMenuItemSubmenu::Enter();
 
169
 
 
170
        // exit the parent menu (so we don't have to update the edit menu)
 
171
        menu->Exit();
 
172
    }
 
173
};
 
174
 
 
175
//! connect to a favorite server
 
176
static void sg_ConnectFavorite( int ID )
 
177
{
 
178
    sg_holder.GetFavorite(ID).Connect();
 
179
}
 
180
 
 
181
//! conglomerate of menus and entries for custom connect
 
182
class gCustomConnectEntries
 
183
{
 
184
public:
 
185
    void Generate( gServerFavorite & fav, uMenu * menu )
 
186
    {
 
187
        // prepare output reading "Edit <server name>"
 
188
        // create menu items (autodeleted when the edit menu is killed)
 
189
        tNEW(uMenuItemFunctionInt) ( menu,"$network_custjoin_connect_text" ,"$network_custjoin_connect_help" ,&sg_ConnectFavorite, fav.GetIndex() );
 
190
        tNEW(uMenuItemInt)         ( menu,"$network_custjoin_port_text","$network_custjoin_port_help", fav.port_, gServerBrowser::lowPort, gServerBrowser::highPort);
 
191
        tNEW(uMenuItemString)      ( menu,"$bookmarks_menu_address","$bookmarks_menu_address_help",fav.address_);
 
192
    }
 
193
 
 
194
    gCustomConnectEntries()
 
195
    {
 
196
    }
 
197
 
 
198
    gCustomConnectEntries( gServerFavorite & fav, uMenu * menu )
 
199
    {
 
200
        Generate( fav, menu );
 
201
    }
 
202
 
 
203
    ~gCustomConnectEntries()
 
204
    {
 
205
    }
 
206
 
 
207
private:
 
208
};
 
209
 
 
210
//! conglomerate of menus and entries
 
211
class gServerFavoriteMenuEntries: public gCustomConnectEntries
 
212
{
 
213
public:
 
214
    gServerFavoriteMenuEntries( gServerFavorite & fav, uMenu & edit_menu )
 
215
    {
 
216
        // prepare output reading "Edit <server name>"
 
217
        tOutput fe;
 
218
        tString serverName = tColoredString::RemoveColors(fav.name_);
 
219
        if ( serverName == "" || serverName == "Empty" )
 
220
        {
 
221
            std::stringstream s;
 
222
            s << "Server " << fav.GetIndex()+1;
 
223
 
 
224
            serverName = s.str().c_str();
 
225
        }
 
226
        fe.SetTemplateParameter(1, serverName);
 
227
        fe << "$bookmarks_menu_edit_slot";
 
228
 
 
229
        // create edit menu
 
230
        edit_     = tNEW(uMenu)                (fe);
 
231
        editmenu_ = tNEW(gMenuItemEditSubmenu) ( &edit_menu, edit_, fe);
 
232
 
 
233
        Generate( fav, edit_ );
 
234
 
 
235
        tNEW(uMenuItemString)      ( edit_,"$bookmarks_menu_name","$bookmarks_menu_name_help",fav.name_);
 
236
    }
 
237
 
 
238
    ~gServerFavoriteMenuEntries()
 
239
    {
 
240
        delete editmenu_; editmenu_ = 0;
 
241
        delete edit_; edit_ = 0;
 
242
    }
 
243
 
 
244
private:
 
245
    uMenu     * edit_;
 
246
    uMenuItem * editmenu_;
 
247
};
 
248
 
 
249
static void sg_GenerateConnectionItems();
 
250
 
 
251
// Edit servers submenu funcion
 
252
static void sg_EditServers()
 
253
{
 
254
    int i;
 
255
 
 
256
    // create menu
 
257
    uMenu edit_menu("$bookmarks_menu_edit");
 
258
 
 
259
    // create menu entries
 
260
    gServerFavoriteMenuEntries * entries[ NUM_FAVORITES ];
 
261
    for ( i = NUM_FAVORITES-1; i>=0; --i )
 
262
        entries[i] = tNEW( gServerFavoriteMenuEntries )( sg_holder.GetFavorite(i), edit_menu );
 
263
 
 
264
    // enter menu
 
265
    edit_menu.Enter();
 
266
 
 
267
    // delete menu entries
 
268
    for ( i = NUM_FAVORITES-1; i>=0; --i )
 
269
        delete entries[i];
 
270
 
 
271
    // regenerate parent menu
 
272
    sg_GenerateConnectionItems();
 
273
}
 
274
 
 
275
// ugly hack: functions clearing and filling the connection menu
 
276
static uMenu * sg_connectionMenu = 0;
 
277
static uMenuItem * sg_connectionMenuItemKeep = 0;
 
278
static void sg_ClearConnectionItems()
 
279
{
 
280
    tASSERT( sg_connectionMenu );
 
281
 
 
282
    // delete old connection items
 
283
    for ( int i = sg_connectionMenu->NumItems()-1; i>=0; --i )
 
284
    {
 
285
        uMenuItem * item = sg_connectionMenu->Item(i);
 
286
        if ( item != sg_connectionMenuItemKeep )
 
287
            delete item;
 
288
    }
 
289
}
 
290
static void sg_GenerateConnectionItems()
 
291
{
 
292
    tASSERT( sg_connectionMenu );
 
293
 
 
294
    // delete old connection items
 
295
    sg_ClearConnectionItems();
 
296
 
 
297
    // create new connection items
 
298
    for ( int i = NUM_FAVORITES-1; i>=0; --i )
 
299
    {
 
300
        gServerFavorite & fav = sg_holder.GetFavorite(i);
 
301
 
 
302
        if (fav.name_ != "" && fav.name_ != "Empty" && fav.address_ != "")
 
303
        {
 
304
            tOutput fc; // Connect to "favn_name"
 
305
            fc.SetTemplateParameter(1,tColoredString::RemoveColors(fav.name_) );
 
306
            fc << "$bookmarks_menu_connect";
 
307
 
 
308
            tNEW(uMenuItemFunctionInt)(sg_connectionMenu ,fc ,"$network_custjoin_connect_help" ,&sg_ConnectFavorite, i );
 
309
        }
 
310
    }
 
311
}
 
312
 
 
313
//!TODO for 3.0 or 3.1: phase out this legacy support
 
314
static tString sg_customServerName("");
 
315
static tConfItemLine sg_serverName_ci("CUSTOM_SERVER_NAME",sg_customServerName);
 
316
static int sg_clientPort = 4534;
 
317
static tConfItem<int> sg_cport("CLIENT_PORT",sg_clientPort);
 
318
 
 
319
//! transfer old custom server name to favorite
 
320
static void sg_TransferCustomServer()
 
321
{
 
322
    if ( sg_customServerName != "" )
 
323
    {
 
324
        // add custom connect server to favorites
 
325
        gServerInfoFavorite server( sg_customServerName, sg_clientPort );
 
326
        gServerFavorites::AddFavorite( &server );
 
327
 
 
328
        // clear custom connect server
 
329
        sg_customServerName = "";
 
330
    }
 
331
}
 
332
 
 
333
// *********************************************************************************************
 
334
// *
 
335
// *    FavoritesMenu
 
336
// *
 
337
// *********************************************************************************************
 
338
//!
 
339
//!
 
340
// *********************************************************************************************
 
341
 
 
342
void gServerFavorites::FavoritesMenu( void )
 
343
{
 
344
    sg_TransferCustomServer();
 
345
 
 
346
    uMenu net_menu("$bookmarks_menu");
 
347
    sg_connectionMenu = & net_menu;
 
348
 
 
349
    uMenuItemFunction edit(&net_menu,"$bookmarks_menu_edit", "$bookmarks_menu_edit_help",&sg_EditServers);
 
350
    sg_connectionMenuItemKeep = & edit;
 
351
 
 
352
    sg_GenerateConnectionItems();
 
353
    net_menu.Enter();
 
354
    sg_ClearConnectionItems();
 
355
 
 
356
    sg_connectionMenuItemKeep = NULL;
 
357
    sg_connectionMenu = NULL;
 
358
}
 
359
 
 
360
// *********************************************************************************************
 
361
// *
 
362
// *    CustomConnectMenu
 
363
// *
 
364
// *********************************************************************************************
 
365
//!
 
366
//!
 
367
// *********************************************************************************************
 
368
 
 
369
void gServerFavorites::CustomConnectMenu( void )
 
370
{
 
371
    sg_TransferCustomServer();
 
372
 
 
373
    uMenu net_menu("$network_custjoin_text");
 
374
    sg_connectionMenu = & net_menu;
 
375
 
 
376
    gServerFavorite & fav = sg_holder.GetFavorite(-1);
 
377
 
 
378
    // create menu entries
 
379
    gCustomConnectEntries submenu( fav, &net_menu );
 
380
 
 
381
    net_menu.Enter();
 
382
}
 
383
 
 
384
// *********************************************************************************************
 
385
// *
 
386
// *    AddFavorite
 
387
// *
 
388
// *********************************************************************************************
 
389
//!
 
390
//!             @param  server   the server to add to the favorites
 
391
//!     @return true if successful, false if favorite list is full
 
392
//!
 
393
// *********************************************************************************************
 
394
 
 
395
bool gServerFavorites::AddFavorite( nServerInfoBase const * server )
 
396
{
 
397
    if ( !server )
 
398
        return false;
 
399
 
 
400
    for ( int i = NUM_FAVORITES-1; i>=0; --i )
 
401
    {
 
402
        gServerFavorite & fav = sg_holder.GetFavorite(i);
 
403
 
 
404
        if (fav.name_ == "" || fav.name_ == "Empty")
 
405
        {
 
406
            fav.name_ = tColoredString::RemoveColors(server->GetName());
 
407
            fav.address_ = server->GetConnectionName();
 
408
            fav.port_ = server->GetPort();
 
409
 
 
410
            return true;
 
411
        }
 
412
    }
 
413
 
 
414
    return false;
 
415
}
 
416
 
 
417
// *********************************************************************************************
 
418
// *
 
419
// *    IsFavorite
 
420
// *
 
421
// *********************************************************************************************
 
422
//!
 
423
//!             @param  server  server to check whether it is bookmarked
 
424
//!             @return             true if the server is in the list of favorites
 
425
//!
 
426
// *********************************************************************************************
 
427
 
 
428
bool gServerFavorites::IsFavorite( nServerInfoBase const * server )
 
429
{
 
430
    if ( !server )
 
431
        return false;
 
432
 
 
433
    for ( int i = NUM_FAVORITES-1; i>=0; --i )
 
434
    {
 
435
        gServerFavorite & fav = sg_holder.GetFavorite(i);
 
436
 
 
437
        if (fav.name_ != "" && fav.name_ != "Empty" && fav.address_ == server->GetConnectionName() && fav.port_ == static_cast< int >( server->GetPort() ) )
 
438
        {
 
439
            return true;
 
440
        }
 
441
    }
 
442
 
 
443
    return false;
 
444
}
 
445
 
 
446