1 /*
2  * src/cliSetup.c, part of Complete Goban (game program)
3  * Copyright (C) 1995 William Shubert
4  * See "configure.h.in" for more copyright information.
5  */
6 
7 #include <wms.h>
8 #include <but/but.h>
9 #include <abut/msg.h>
10 #include <wms/clp.h>
11 #include <wms/str.h>
12 #include <but/textin.h>
13 #include "../cgoban.h"
14 #include "setup.h"
15 #include "../msg.h"
16 #include "login.h"
17 
18 
19 /**********************************************************************
20  * Forward Declarations
21  **********************************************************************/
22 static ButOut  loginDestroyed(void *packet);
23 static ButOut  cancelPressed(But *but);
24 static ButOut  okPressed(But *but);
25 static ButOut  newUser(But *but, const char *user);
26 static ButOut  newPassword(But *but, const char *pass);
27 
28 
29 /**********************************************************************
30  * Functions
31  **********************************************************************/
32 
cliSetup_create(Cgoban * cg,int serverNum)33 CliSetup  *cliSetup_create(Cgoban *cg, int serverNum)  {
34   CliSetup  *c;
35   Str  title;
36   AbutMsgTin  tins[2];
37   AbutMsgOpt  buttons[3];
38 
39   /* Necessary reference to server.c.  See "server.h" for an explanation. */
40   cliServer_create();
41 
42   assert(MAGIC(cg));
43   str_init(&title);
44   c = wms_malloc(sizeof(CliSetup));
45   MAGIC_SET(c);
46   c->cd = cliData_create(cg, serverNum, NULL, NULL);
47   c->userClp = clp_lookup(cg->clp, "client.username");
48   c->passwordClp = clp_lookup(cg->clp, "client.password");
49   c->serverNum = serverNum;
50   str_print(&title, "%s Setup", c->cd->serverName);
51   tins[0].name = msg_usernameColon;
52   tins[0].def = clpEntry_getStrNum(c->userClp, serverNum);
53   tins[0].callback = newUser;
54   tins[0].flags = 0;
55   tins[1].name = msg_passwordColon;
56   tins[1].def = clpEntry_getStrNum(c->passwordClp, serverNum);
57   tins[1].callback = newPassword;
58   tins[1].flags = abutMsgTinFlags_secret;
59   buttons[0].name = msg_help;
60   buttons[0].callback = cgoban_createHelpWindow;
61   buttons[0].packet = &help_cliSetup;
62   buttons[0].keyEq = cg_help;
63   buttons[1].name = msg_cancel;
64   buttons[1].callback = cancelPressed;
65   buttons[1].packet = c;
66   buttons[1].keyEq = NULL;
67   buttons[2].name = msg_ok;
68   buttons[2].callback = okPressed;
69   buttons[2].packet = c;
70   buttons[2].keyEq = cg_return;
71   c->login = abutMsg_winOptInCreate(cg->abut, str_chars(&title),
72 				    msg_loginDesc[c->cd->server],
73 				    loginDestroyed, c, 3, buttons, 2, tins);
74   str_deinit(&title);
75   return(c);
76 }
77 
78 
newUser(But * but,const char * user)79 static ButOut  newUser(But *but, const char *user)  {
80   CliSetup  *setup = but_packet(but);
81 
82   assert(MAGIC(setup));
83   but_setFlags(setup->login->tins[1], BUT_KEYED);
84   return(0);
85 }
86 
87 
newPassword(But * but,const char * pass)88 static ButOut  newPassword(But *but, const char *pass)  {
89   CliSetup  *setup = but_packet(but);
90 
91   assert(MAGIC(setup));
92   return(okPressed(setup->login->buts[2]));
93 }
94 
95 
cliSetup_destroy(CliSetup * c)96 void  cliSetup_destroy(CliSetup *c)  {
97   assert(MAGIC(c));
98   if (c->login)  {
99     abutMsg_destroy(c->login, FALSE);
100     c->login = NULL;
101   }
102   cliData_decRef(c->cd);
103   MAGIC_UNSET(c);
104   wms_free(c);
105 }
106 
107 
loginDestroyed(void * packet)108 static ButOut  loginDestroyed(void *packet)  {
109   CliSetup  *c = packet;
110 
111   assert(MAGIC(c));
112   c->login = NULL;
113   cliSetup_destroy(c);
114   return(0);
115 }
116 
117 
cancelPressed(But * but)118 static ButOut  cancelPressed(But *but)  {
119   CliSetup  *c = but_packet(but);
120 
121   assert(MAGIC(c));
122   butWin_destroy(c->login->win);
123   return(0);
124 }
125 
126 
okPressed(But * but)127 static ButOut  okPressed(But *but)  {
128   CliSetup  *c = but_packet(but);
129   ButOut  result = 0;
130   const char  *user, *pass;
131 
132   assert(MAGIC(c));
133   user = butTextin_get(abutMsg_tin(c->login, 0));
134   pass = butTextin_get(abutMsg_tin(c->login, 1));
135   clpEntry_setStrNum(c->userClp, user, c->serverNum);
136   clpEntry_setStrNum(c->passwordClp, pass, c->serverNum);
137   str_copyChars(&c->cd->userName, user);
138   if (!cliLogin_create(c->cd, user, pass))
139     result = BUTOUT_ERR;
140   cliSetup_destroy(c);
141   return(result);
142 }
143 
144 
cliSetup_createGmp(Cgoban * cg,int serverNum,const char * username,const char * password,const CliActions * actions,void * packet)145 void  cliSetup_createGmp(Cgoban *cg, int serverNum,
146 			 const char *username, const char *password,
147 			 const CliActions *actions, void *packet)  {
148   CliData  *data;
149 
150   data = cliData_create(cg, serverNum, actions, packet);
151   str_copyChars(&data->userName, username);
152   cliLogin_create(data, username, password);
153 }
154