|
|
1.1 root 1: /* Synchronet Control Panel (GUI Borland C++ Builder Project for Win32) */
2:
3: /* $Id: ConfigWizardUnit.cpp,v 1.21 2006/09/24 20:05:20 deuce Exp $ */
4:
5: /****************************************************************************
6: * @format.tab-size 4 (Plain Text/Source Code File Header) *
7: * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) *
8: * *
9: * Copyright 2005 Rob Swindell - http://www.synchro.net/copyright.html *
10: * *
11: * This program is free software; you can redistribute it and/or *
12: * modify it under the terms of the GNU General Public License *
13: * as published by the Free Software Foundation; either version 2 *
14: * of the License, or (at your option) any later version. *
15: * See the GNU General Public License for more details: gpl.txt or *
16: * http://www.fsf.org/copyleft/gpl.html *
17: * *
18: * Anonymous FTP access to the most recent released source is available at *
19: * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net *
20: * *
21: * Anonymous CVS access to the development source and modification history *
22: * is available at cvs.synchro.net:/cvsroot/sbbs, example: *
23: * cvs -d :pserver:[email protected]:/cvsroot/sbbs login *
24: * (just hit return, no password is necessary) *
25: * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src *
26: * *
27: * For Synchronet coding style and modification guidelines, see *
28: * http://www.synchro.net/source.html *
29: * *
30: * You are encouraged to submit any modifications (preferably in Unix diff *
31: * format) via e-mail to [email protected] *
32: * *
33: * Note: If this box doesn't appear square, then you need to fix your tabs. *
34: ****************************************************************************/
35: //---------------------------------------------------------------------------
36:
37: #include "sbbs.h"
38: #include <vcl.h>
39: #pragma hdrstop
40:
41: #include "MainFormUnit.h"
42: #include "ConfigWizardUnit.h"
43: #include <stdio.h> // sprintf
44: #include <winsock.h> // addresses and such
45:
46: //---------------------------------------------------------------------------
47: #pragma package(smart_init)
48: #pragma resource "*.dfm"
49:
50: #define ILLEGAL_FILENAME_CHARS "\\/|<>+[]:=\";,%"
51: #define ILLEGAL_QWKID_CHARS "*?" ILLEGAL_FILENAME_CHARS
52:
53: char ctrl_dir[MAX_PATH+1];
54: short tz_val[]= {
55: 0
56: ,AST
57: ,EST
58: ,CST
59: ,MST
60: ,PST
61: ,YST
62: ,HST
63: ,BST
64: ,MID
65: ,VAN
66: ,EDM
67: ,WIN
68: ,BOG
69: ,CAR
70: ,RIO
71: ,FER
72: ,AZO
73: ,LON
74: ,BER
75: ,ATH
76: ,MOS
77: ,DUB
78: ,KAB
79: ,KAR
80: ,BOM
81: ,KAT
82: ,DHA
83: ,BAN
84: ,HON
85: ,TOK
86: ,SYD
87: ,NOU
88: ,WEL
89: };
90:
91: char* tz_str[]={
92: "Universal (UTC/GMT)"
93: ,"U.S. - Atlantic"
94: ,"U.S. - Eastern"
95: ,"U.S. - Central"
96: ,"U.S. - Mountain"
97: ,"U.S. - Pacific"
98: ,"U.S. - Yukon"
99: ,"U.S. - Hawaii/Alaska"
100: ,"U.S. - Bering"
101: ,"Midway"
102: ,"Vancouver"
103: ,"Edmonton"
104: ,"Winnipeg"
105: ,"Bogota"
106: ,"Caracas"
107: ,"Rio de Janeiro"
108: ,"Fernando de Noronha"
109: ,"Azores"
110: ,"London"
111: ,"Berlin"
112: ,"Athens"
113: ,"Moscow"
114: ,"Dubai"
115: ,"Kabul"
116: ,"Karachi"
117: ,"Bombay"
118: ,"Kathmandu"
119: ,"Dhaka"
120: ,"Bangkok"
121: ,"Hong Kong"
122: ,"Tokyo"
123: ,"Sydney"
124: ,"Noumea"
125: ,"Wellington"
126: };
127:
128: //---------------------------------------------------------------------------
129: __fastcall TConfigWizard::TConfigWizard(TComponent* Owner)
130: : TForm(Owner)
131: {
132: }
133: //---------------------------------------------------------------------------
134: void __fastcall TConfigWizard::FormShow(TObject *Sender)
135: {
136: char str[512];
137: int i;
138: int status;
139:
140: Application->BringToFront();
141:
142: memset(&scfg,0,sizeof(scfg));
143: SAFECOPY(scfg.ctrl_dir,MainForm->global.ctrl_dir);
144: scfg.size=sizeof(scfg);
145: char error[256];
146: SAFECOPY(error,UNKNOWN_LOAD_ERROR);
147: if(!load_cfg(&scfg,NULL,FALSE,error)) {
148: Application->MessageBox(error,"ERROR Loadin Configuration"
149: ,MB_OK|MB_ICONEXCLAMATION);
150: Close();
151: return;
152: }
153:
154: if(scfg.new_install) {
155: TIME_ZONE_INFORMATION tz;
156: memset(&tz,0,sizeof(tz));
157: DWORD tzRet=GetTimeZoneInformation(&tz);
158:
159: /* Convert to SMB tz format */
160: scfg.sys_timezone=0;
161: if(tz.Bias>0) {
162: switch(tz.Bias|US_ZONE) {
163: case AST:
164: case EST:
165: case CST:
166: case MST:
167: case PST:
168: case YST:
169: case HST:
170: case BST:
171: scfg.sys_timezone=tz.Bias|US_ZONE;
172: if(tzRet==TIME_ZONE_ID_DAYLIGHT)
173: scfg.sys_timezone|=DAYLIGHT;
174: break;
175: default:
176: scfg.sys_timezone=tz.Bias|WESTERN_ZONE;
177: break;
178: }
179: } else if(tz.Bias<0)
180: scfg.sys_timezone=(-tz.Bias)|EASTERN_ZONE;
181: #if 0
182: /* Get DNS Server Address */
183: str_list_t dns_list = getNameServerList();
184: if(dns_list!=NULL) {
185: SAFECOPY(MainForm->mail_startup.dns_server,dns_list[0]);
186: freeNameServerList(dns_list);
187: }
188: #endif
189: } else {
190: SystemNameEdit->Text=AnsiString(scfg.sys_name);
191: SystemLocationEdit->Text=AnsiString(scfg.sys_location);
192: SysopNameEdit->Text=AnsiString(scfg.sys_op);
193: SystemPasswordEdit->Text=AnsiString(scfg.sys_pass);
194: InternetAddressComboBox->Text=AnsiString(scfg.sys_inetaddr);
195: QWKIDEdit->Text=AnsiString(scfg.sys_id);
196: QNetTaglineEdit->Text=AnsiString(scfg.qnet_tagline);
197: AllNodesTelnetCheckBox->Checked
198: =(scfg.sys_nodes==MainForm->bbs_startup.last_node);
199: }
200:
201: NewUsersCheckBox->Checked=!(scfg.sys_misc&SM_CLOSED);
202: FeedbackCheckBox->Checked=scfg.node_valuser;
203: AliasesCheckBox->Checked=scfg.uq&UQ_ALIASES;
204: NewUsersCheckBoxClick(Sender);
205:
206: if(scfg.sys_misc&SM_USRVDELM)
207: DeletedEmailYesButton->Checked=true;
208: else if(scfg.sys_misc&SM_SYSVDELM)
209: DeletedEmailSysopButton->Checked=true;
210: else
211: DeletedEmailNoButton->Checked=true;
212:
213: // DNSAddressEdit->Text=MainForm->mail_startup.dns_server;
214: MaxMailUpDown->Position=MainForm->mail_startup.max_clients;
215: MaxFtpUpDown->Position=MainForm->ftp_startup.max_clients;
216: MaxWebUpDown->Position=MainForm->web_startup.max_clients;
217: NodesUpDown->Position=scfg.sys_nodes;
218:
219: for(i=0;i<sizeof(tz_str)/sizeof(tz_str[0]);i++) {
220: char str[128];
221: if(tz_val[i] && !(tz_val[i]&US_ZONE))
222: sprintf(str,"%c%u:%02u %s"
223: ,tz_val[i]&WESTERN_ZONE ? '-':'+'
224: ,(tz_val[i]&0xfff)/60
225: ,(tz_val[i]&0xfff)%60
226: ,tz_str[i]
227: );
228: else
229: strcpy(str,tz_str[i]);
230: TimeZoneComboBox->Items->Add(str);
231: }
232: sprintf(str,"Other (%s)",smb_zonestr(scfg.sys_timezone,NULL));
233: TimeZoneComboBox->Items->Add(str);
234:
235: for(i=0;i<sizeof(tz_val)/sizeof(tz_val[0]);i++)
236: if((scfg.sys_timezone&((short)~DAYLIGHT))==tz_val[i])
237: break;
238: TimeZoneComboBox->ItemIndex=i;
239: DaylightCheckBox->Enabled=scfg.sys_timezone&US_ZONE;
240: DaylightCheckBox->Checked=scfg.sys_timezone&DAYLIGHT;
241: if(scfg.sys_misc&SM_MILITARY)
242: Time24hrRadioButton->Checked=true;
243: else
244: Time12hrRadioButton->Checked=true;
245: if(scfg.sys_misc&SM_EURODATE)
246: DateEuRadioButton->Checked=true;
247: else
248: DateUsRadioButton->Checked=true;
249:
250: WizNotebook->PageIndex=0;
251: ProgressBar->Max=WizNotebook->Pages->Count-1;
252: IllegalCharsLabel->Caption="Illegal characters: '"
253: ILLEGAL_QWKID_CHARS "'";
254:
255: NextButton->Enabled=true;
256: }
257: //---------------------------------------------------------------------------
258: void __fastcall TConfigWizard::NextButtonClick(TObject *Sender)
259: {
260: if(ProgressBar->Position==ProgressBar->Max) /* Finished */
261: {
262: // Write Registry keys
263: if(AllNodesTelnetCheckBox->Checked)
264: MainForm->bbs_startup.last_node=NodesUpDown->Position;
265: MainForm->ftp_startup.max_clients=MaxFtpUpDown->Position;
266: MainForm->mail_startup.max_clients=MaxMailUpDown->Position;
267: MainForm->web_startup.max_clients=MaxWebUpDown->Position;
268: // strcpy(MainForm->mail_startup.dns_server,DNSAddressEdit->Text.c_str());
269:
270: MainForm->SaveIniSettings(Sender);
271:
272: // Write CNF files
273: strcpy(scfg.sys_name,SystemNameEdit->Text.c_str());
274: strcpy(scfg.sys_id,QWKIDEdit->Text.c_str());
275: strcpy(scfg.sys_location,SystemLocationEdit->Text.c_str());
276: strcpy(scfg.sys_op,SysopNameEdit->Text.c_str());
277: strcpy(scfg.sys_pass,SystemPasswordEdit->Text.c_str());
278: strcpy(scfg.sys_inetaddr,InternetAddressComboBox->Text.c_str());
279: strcpy(scfg.qnet_tagline,QNetTaglineEdit->Text.c_str());
280: scfg.sys_nodes=NodesUpDown->Position;
281: if(TimeZoneComboBox->ItemIndex>=0
282: && TimeZoneComboBox->ItemIndex<=sizeof(tz_val)/sizeof(tz_val[0]))
283: scfg.sys_timezone=tz_val[TimeZoneComboBox->ItemIndex];
284: if(DaylightCheckBox->Checked)
285: scfg.sys_timezone|=DAYLIGHT;
286: if(Time24hrRadioButton->Checked)
287: scfg.sys_misc|=SM_MILITARY;
288: else
289: scfg.sys_misc&=~SM_MILITARY;
290: if(DateEuRadioButton->Checked)
291: scfg.sys_misc|=SM_EURODATE;
292: else
293: scfg.sys_misc&=~SM_EURODATE;
294: if(NewUsersCheckBox->Checked)
295: scfg.sys_misc&=~SM_CLOSED;
296: else
297: scfg.sys_misc|=SM_CLOSED;
298: if(AliasesCheckBox->Checked)
299: scfg.uq|=UQ_ALIASES;
300: else
301: scfg.uq&=~UQ_ALIASES;
302: scfg.node_valuser=FeedbackCheckBox->Checked;
303:
304: if(DeletedEmailYesButton->Checked)
305: scfg.sys_misc|=(SM_USRVDELM|SM_SYSVDELM);
306: else if(DeletedEmailNoButton->Checked)
307: scfg.sys_misc&=~(SM_USRVDELM|SM_SYSVDELM);
308: else {
309: scfg.sys_misc|=SM_SYSVDELM;
310: scfg.sys_misc&=~SM_USRVDELM;
311: }
312:
313: scfg.new_install=FALSE;
314: if(!save_cfg(&scfg,0)) {
315: Application->MessageBox("Error saving configuration"
316: ,"ERROR",MB_OK|MB_ICONEXCLAMATION);
317: } else
318: refresh_cfg(&scfg);
319:
320: Close();
321: return;
322: }
323: WizNotebook->PageIndex++;
324: ProgressBar->Position=WizNotebook->PageIndex;
325: if(ProgressBar->Position==ProgressBar->Max) /* Last page */
326: NextButton->Caption="&Finish";
327: }
328: //---------------------------------------------------------------------------
329: void __fastcall TConfigWizard::BackButtonClick(TObject *Sender)
330: {
331: WizNotebook->PageIndex--;
332: ProgressBar->Position=WizNotebook->PageIndex;
333: NextButton->Caption="&Next >";
334: }
335: //---------------------------------------------------------------------------
336: void __fastcall TConfigWizard::CancelButtonClick(TObject *Sender)
337: {
338: Close();
339: }
340: //---------------------------------------------------------------------------
341: void __fastcall TConfigWizard::LogoImageClick(TObject *Sender)
342: {
343: LogoImage->Visible=false;
344: ProgressBar->Visible=false;
345: }
346: //---------------------------------------------------------------------------
347: void __fastcall TConfigWizard::TitleLabelClick(TObject *Sender)
348: {
349: LogoImage->Visible=true;
350: ProgressBar->Visible=true;
351: }
352: //---------------------------------------------------------------------------
353: void __fastcall TConfigWizard::WizNotebookPageChanged(TObject *Sender)
354: {
355: TFont* current;
356:
357: switch(WizNotebook->PageIndex) {
358: case 0:
359: current=IntroductionLabel->Font;
360: NextButton->Enabled=true;
361: break;
362: case 1:
363: current=IdentificationLabel->Font;
364: // ActiveControl=SystemNameEdit;
365: if(!SysopNameEdit->Text.Length()) {
366: char username[41];
367: DWORD len=sizeof(username)-1;
368: GetUserName(username,&len);
369: SysopNameEdit->Text=AnsiString(username);
370: }
371: if(!SystemNameEdit->Text.Length()) {
372: char bbsname[41];
373: DWORD len=sizeof(bbsname)-1;
374: GetComputerName(bbsname,&len);
375: SystemNameEdit->Text=AnsiString(bbsname);
376: }
377: VerifyIdentification(Sender);
378: break;
379: case 2:
380: current=TimeLabel->Font;
381: NextButton->Enabled=true;
382: break;
383: case 3:
384: current=InternetLabel->Font;
385: if(!InternetAddressComboBox->Items->Count) {
386: WSADATA WSAData;
387: WSAStartup(MAKEWORD(1,1), &WSAData); /* req'd for gethostname */
388: if(scfg.sys_inetaddr[0])
389: InternetAddressComboBox->Items->Add(scfg.sys_inetaddr);
390: char hostname[128];
391: gethostname(hostname,sizeof(hostname)-1);
392: if(hostname[0]) {
393: InternetAddressComboBox->Items->Add(hostname);
394: HOSTENT* host=gethostbyname(hostname);
395: SOCKADDR_IN addr;
396: for(int i=0;host && host->h_addr_list[i];i++) {
397: addr.sin_addr.s_addr
398: =*((DWORD*)host->h_addr_list[i]);
399: InternetAddressComboBox->Items->Add(inet_ntoa(addr.sin_addr));
400: }
401: }
402: WSACleanup();
403: InternetAddressComboBox->ItemIndex=0;
404: }
405: VerifyInternetAddresses(Sender);
406: break;
407: case 4:
408: current=QWKLabel->Font;
409: if(!QWKIDEdit->Text.Length()) {
410: char bbsname[41];
411: char qwkid[9];
412: int len=0;
413: strcpy(bbsname,SystemNameEdit->Text.UpperCase().c_str());
414: for(char*p=bbsname;*p && len<8;p++) {
415: if(strchr(ILLEGAL_QWKID_CHARS,*p))
416: continue;
417: if(!len && isdigit(*p))
418: continue;
419: if(*p<=' ')
420: continue;
421: qwkid[len++]=*p;
422: }
423: qwkid[len]=0;
424: QWKIDEdit->Text=AnsiString(qwkid);
425: }
426: if(!QNetTaglineEdit->Text.Length()) {
427: QNetTaglineEdit->Text = SystemNameEdit->Text +
428: " - " + InternetAddressComboBox->Text;
429: }
430: VerifyQWK(Sender);
431: break;
432: case 5:
433: current=MaximumsLabel->Font;
434: NextButton->Enabled=true;
435: break;
436: case 6:
437: current=OptionsLabel->Font;
438: NextButton->Enabled=true;
439: break;
440: case 7:
441: current=VerifyLabel->Font;
442: VerifyPassword(Sender);
443: if(!NextButton->Enabled)
444: ActiveControl=SysPassVerifyEdit;
445: break;
446: case 8:
447: current=CompleteLabel->Font;
448: break;
449: default:
450: return;
451: }
452:
453: /* default to inactive */
454: IntroductionLabel->Font->Color=clGray;
455: IdentificationLabel->Font->Color=clGray;
456: QWKLabel->Font->Color=clGray;
457: TimeLabel->Font->Color=clGray;
458: InternetLabel->Font->Color=clGray;
459: MaximumsLabel->Font->Color=clGray;
460: OptionsLabel->Font->Color=clGray;
461: VerifyLabel->Font->Color=clGray;
462: CompleteLabel->Font->Color=clGray;
463:
464: /* active */
465: current->Color=clYellow;
466:
467: BackButton->Enabled=WizNotebook->PageIndex;
468: }
469: //---------------------------------------------------------------------------
470: void __fastcall TConfigWizard::VerifyIdentification(TObject *Sender)
471: {
472: NextButton->Enabled=(SystemNameEdit->Text.Length()
473: && SystemLocationEdit->Text.Length()
474: && SysopNameEdit->Text.Length()
475: && SystemPasswordEdit->Text.Length()
476: );
477: }
478: //---------------------------------------------------------------------------
479: void __fastcall TConfigWizard::VerifyPassword(TObject *Sender)
480: {
481: NextButton->Enabled=(SystemPasswordEdit->Text==SysPassVerifyEdit->Text);
482: }
483: //---------------------------------------------------------------------------
484: void __fastcall TConfigWizard::VerifyQWK(TObject *Sender)
485: {
486: char qwk_id[9];
487:
488: SAFECOPY(qwk_id,QWKIDEdit->Text.c_str());
489: NextButton->Enabled=(
490: strlen(qwk_id)>=2
491: && isalpha(qwk_id[0])
492: && strcspn(qwk_id,ILLEGAL_QWKID_CHARS)==strlen(qwk_id)
493: && QNetTaglineEdit->Text.Length());
494: }
495: //---------------------------------------------------------------------------
496: void __fastcall TConfigWizard::QNetTaglineEditKeyPress(TObject *Sender,
497: char &Key)
498: {
499: if(Key==1) /* Ctrl-A */
500: QNetTaglineEdit->SetSelTextBuf("\1");
501: }
502: //---------------------------------------------------------------------------
503:
504: void __fastcall TConfigWizard::VerifyInternetAddresses(TObject *Sender)
505: {
506: NextButton->Enabled=(InternetAddressComboBox->Text.Length()
507: // && DNSAddressEdit->Text.Length()
508: );
509: }
510: //---------------------------------------------------------------------------
511: void __fastcall TConfigWizard::TimeZoneComboBoxChange(TObject *Sender)
512: {
513: if(TimeZoneComboBox->ItemIndex>=0
514: && TimeZoneComboBox->ItemIndex<=sizeof(tz_val)/sizeof(tz_val[0]))
515: DaylightCheckBox->Enabled=tz_val[TimeZoneComboBox->ItemIndex]&US_ZONE;
516: else
517: DaylightCheckBox->Enabled=false;
518: if(!DaylightCheckBox->Enabled)
519: DaylightCheckBox->Checked=false;
520: }
521: //---------------------------------------------------------------------------
522:
523: void __fastcall TConfigWizard::NewUsersCheckBoxClick(TObject *Sender)
524: {
525: AliasesCheckBox->Enabled=NewUsersCheckBox->Checked;
526: FeedbackCheckBox->Enabled=NewUsersCheckBox->Checked;
527: }
528: //---------------------------------------------------------------------------
529:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.