|
|
1.1 root 1: /* Synchronet Control Panel (GUI Borland C++ Builder Project for Win32) */
2:
3: /* $Id: ConfigWizardUnit.cpp,v 1.19 2004/12/30 08:11:40 rswindell 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 2004 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 <vcl.h>
38: #pragma hdrstop
39:
40: #include "MainFormUnit.h"
41: #include "ConfigWizardUnit.h"
42: #include <stdio.h> // sprintf
43: #include <winsock.h> // addresses and such
44: #include <iphlpapi.h> // GetNetworkParams
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:
182: /* Get DNS Server Address */
183: #if 0 /* Old way */
184: sprintf(str,"%s /c ipconfig /all > %sipconfig.txt"
185: ,getenv("COMSPEC"),scfg.ctrl_dir);
186: WinExec(str,SW_HIDE); /* there's got to be a better way! */
187: Sleep(1500); /* give ipconfig time to run */
188: sprintf(str,"%sipconfig.txt",scfg.ctrl_dir);
189: FILE* fp=fopen(str,"r");
190: if(fp==NULL) {
191: sprintf(error,"Error %d (%s) opening %s"
192: ,errno,strerror(errno),str);
193: Application->MessageBox(error
194: ,"ERROR",MB_OK|MB_ICONEXCLAMATION);
195: } else {
196: char* p;
197: if(fp!=NULL) {
198: while(!feof(fp)) {
199: if(!fgets(str,sizeof(str),fp))
200: break;
201: #if 0
202: Application->MessageBox(str
203: ,"DEBUG",MB_OK|MB_ICONEXCLAMATION);
204: #endif
205: p=str;
206: while(*p && *p<=' ') p++;
207: if(!strnicmp(p,"DNS Servers",11) && (p=strchr(p,':'))!=NULL) {
208: p++;
209: while(*p && *p<=' ') p++;
210: truncsp(p);
211: if((*p)==0)
212: continue;
213: SAFECOPY(MainForm->mail_startup.dns_server,p);
214: break;
215: }
216: }
217: fclose(fp);
218: }
219: }
220: #else /* New way (finally!) */
221: FIXED_INFO* FixedInfo=NULL;
222: ULONG FixedInfoLen=0;
223: if(GetNetworkParams(FixedInfo,&FixedInfoLen) == ERROR_BUFFER_OVERFLOW) {
224: FixedInfo=(FIXED_INFO*)malloc(FixedInfoLen);
225: if(GetNetworkParams(FixedInfo,&FixedInfoLen) == ERROR_SUCCESS)
226: SAFECOPY(MainForm->mail_startup.dns_server
227: ,FixedInfo->DnsServerList.IpAddress.String);
228: if(FixedInfo!=NULL)
229: free(FixedInfo);
230: }
231: #endif
232: } else {
233: SystemNameEdit->Text=AnsiString(scfg.sys_name);
234: SystemLocationEdit->Text=AnsiString(scfg.sys_location);
235: SysopNameEdit->Text=AnsiString(scfg.sys_op);
236: SystemPasswordEdit->Text=AnsiString(scfg.sys_pass);
237: InternetAddressComboBox->Text=AnsiString(scfg.sys_inetaddr);
238: QWKIDEdit->Text=AnsiString(scfg.sys_id);
239: QNetTaglineEdit->Text=AnsiString(scfg.qnet_tagline);
240: AllNodesTelnetCheckBox->Checked
241: =(scfg.sys_nodes==MainForm->bbs_startup.last_node);
242: }
243:
244: NewUsersCheckBox->Checked=!(scfg.sys_misc&SM_CLOSED);
245: FeedbackCheckBox->Checked=scfg.node_valuser;
246: AliasesCheckBox->Checked=scfg.uq&UQ_ALIASES;
247: NewUsersCheckBoxClick(Sender);
248:
249: if(scfg.sys_misc&SM_USRVDELM)
250: DeletedEmailYesButton->Checked=true;
251: else if(scfg.sys_misc&SM_SYSVDELM)
252: DeletedEmailSysopButton->Checked=true;
253: else
254: DeletedEmailNoButton->Checked=true;
255:
256: DNSAddressEdit->Text=MainForm->mail_startup.dns_server;
257: MaxMailUpDown->Position=MainForm->mail_startup.max_clients;
258: MaxFtpUpDown->Position=MainForm->ftp_startup.max_clients;
259: MaxWebUpDown->Position=MainForm->web_startup.max_clients;
260: NodesUpDown->Position=scfg.sys_nodes;
261:
262: for(i=0;i<sizeof(tz_str)/sizeof(tz_str[0]);i++) {
263: char str[128];
264: if(tz_val[i] && !(tz_val[i]&US_ZONE))
265: sprintf(str,"%c%u:%02u %s"
266: ,tz_val[i]&WESTERN_ZONE ? '-':'+'
267: ,(tz_val[i]&0xfff)/60
268: ,(tz_val[i]&0xfff)%60
269: ,tz_str[i]
270: );
271: else
272: strcpy(str,tz_str[i]);
273: TimeZoneComboBox->Items->Add(str);
274: }
275: sprintf(str,"Other (%s)",smb_zonestr(scfg.sys_timezone,NULL));
276: TimeZoneComboBox->Items->Add(str);
277:
278: for(i=0;i<sizeof(tz_val)/sizeof(tz_val[0]);i++)
279: if((scfg.sys_timezone&((short)~DAYLIGHT))==tz_val[i])
280: break;
281: TimeZoneComboBox->ItemIndex=i;
282: DaylightCheckBox->Enabled=scfg.sys_timezone&US_ZONE;
283: DaylightCheckBox->Checked=scfg.sys_timezone&DAYLIGHT;
284: if(scfg.sys_misc&SM_MILITARY)
285: Time24hrRadioButton->Checked=true;
286: else
287: Time12hrRadioButton->Checked=true;
288: if(scfg.sys_misc&SM_EURODATE)
289: DateEuRadioButton->Checked=true;
290: else
291: DateUsRadioButton->Checked=true;
292:
293: WizNotebook->PageIndex=0;
294: ProgressBar->Max=WizNotebook->Pages->Count-1;
295: IllegalCharsLabel->Caption="Illegal characters: '"
296: ILLEGAL_QWKID_CHARS "'";
297:
298: NextButton->Enabled=true;
299: }
300: //---------------------------------------------------------------------------
301: void __fastcall TConfigWizard::NextButtonClick(TObject *Sender)
302: {
303: if(ProgressBar->Position==ProgressBar->Max) /* Finished */
304: {
305: // Write Registry keys
306: if(AllNodesTelnetCheckBox->Checked)
307: MainForm->bbs_startup.last_node=NodesUpDown->Position;
308: MainForm->ftp_startup.max_clients=MaxFtpUpDown->Position;
309: MainForm->mail_startup.max_clients=MaxMailUpDown->Position;
310: MainForm->web_startup.max_clients=MaxWebUpDown->Position;
311: strcpy(MainForm->mail_startup.dns_server,DNSAddressEdit->Text.c_str());
312:
313: MainForm->SaveIniSettings(Sender);
314:
315: // Write CNF files
316: strcpy(scfg.sys_name,SystemNameEdit->Text.c_str());
317: strcpy(scfg.sys_id,QWKIDEdit->Text.c_str());
318: strcpy(scfg.sys_location,SystemLocationEdit->Text.c_str());
319: strcpy(scfg.sys_op,SysopNameEdit->Text.c_str());
320: strcpy(scfg.sys_pass,SystemPasswordEdit->Text.c_str());
321: strcpy(scfg.sys_inetaddr,InternetAddressComboBox->Text.c_str());
322: strcpy(scfg.qnet_tagline,QNetTaglineEdit->Text.c_str());
323: scfg.sys_nodes=NodesUpDown->Position;
324: if(TimeZoneComboBox->ItemIndex>=0
325: && TimeZoneComboBox->ItemIndex<=sizeof(tz_val)/sizeof(tz_val[0]))
326: scfg.sys_timezone=tz_val[TimeZoneComboBox->ItemIndex];
327: if(DaylightCheckBox->Checked)
328: scfg.sys_timezone|=DAYLIGHT;
329: if(Time24hrRadioButton->Checked)
330: scfg.sys_misc|=SM_MILITARY;
331: else
332: scfg.sys_misc&=~SM_MILITARY;
333: if(DateEuRadioButton->Checked)
334: scfg.sys_misc|=SM_EURODATE;
335: else
336: scfg.sys_misc&=~SM_EURODATE;
337: if(NewUsersCheckBox->Checked)
338: scfg.sys_misc&=~SM_CLOSED;
339: else
340: scfg.sys_misc|=SM_CLOSED;
341: if(AliasesCheckBox->Checked)
342: scfg.uq|=UQ_ALIASES;
343: else
344: scfg.uq&=~UQ_ALIASES;
345: scfg.node_valuser=FeedbackCheckBox->Checked;
346:
347: if(DeletedEmailYesButton->Checked)
348: scfg.sys_misc|=(SM_USRVDELM|SM_SYSVDELM);
349: else if(DeletedEmailNoButton->Checked)
350: scfg.sys_misc&=~(SM_USRVDELM|SM_SYSVDELM);
351: else {
352: scfg.sys_misc|=SM_SYSVDELM;
353: scfg.sys_misc&=~SM_USRVDELM;
354: }
355:
356: scfg.new_install=FALSE;
357: if(!save_cfg(&scfg,0)) {
358: Application->MessageBox("Error saving configuration"
359: ,"ERROR",MB_OK|MB_ICONEXCLAMATION);
360: } else
361: refresh_cfg(&scfg);
362:
363: Close();
364: return;
365: }
366: WizNotebook->PageIndex++;
367: ProgressBar->Position=WizNotebook->PageIndex;
368: if(ProgressBar->Position==ProgressBar->Max) /* Last page */
369: NextButton->Caption="&Finish";
370: }
371: //---------------------------------------------------------------------------
372: void __fastcall TConfigWizard::BackButtonClick(TObject *Sender)
373: {
374: WizNotebook->PageIndex--;
375: ProgressBar->Position=WizNotebook->PageIndex;
376: NextButton->Caption="&Next >";
377: }
378: //---------------------------------------------------------------------------
379: void __fastcall TConfigWizard::CancelButtonClick(TObject *Sender)
380: {
381: Close();
382: }
383: //---------------------------------------------------------------------------
384: void __fastcall TConfigWizard::LogoImageClick(TObject *Sender)
385: {
386: LogoImage->Visible=false;
387: ProgressBar->Visible=false;
388: }
389: //---------------------------------------------------------------------------
390: void __fastcall TConfigWizard::TitleLabelClick(TObject *Sender)
391: {
392: LogoImage->Visible=true;
393: ProgressBar->Visible=true;
394: }
395: //---------------------------------------------------------------------------
396: void __fastcall TConfigWizard::WizNotebookPageChanged(TObject *Sender)
397: {
398: TFont* current;
399:
400: switch(WizNotebook->PageIndex) {
401: case 0:
402: current=IntroductionLabel->Font;
403: NextButton->Enabled=true;
404: break;
405: case 1:
406: current=IdentificationLabel->Font;
407: // ActiveControl=SystemNameEdit;
408: if(!SysopNameEdit->Text.Length()) {
409: char username[41];
410: DWORD len=sizeof(username)-1;
411: GetUserName(username,&len);
412: SysopNameEdit->Text=AnsiString(username);
413: }
414: if(!SystemNameEdit->Text.Length()) {
415: char bbsname[41];
416: DWORD len=sizeof(bbsname)-1;
417: GetComputerName(bbsname,&len);
418: SystemNameEdit->Text=AnsiString(bbsname);
419: }
420: VerifyIdentification(Sender);
421: break;
422: case 2:
423: current=TimeLabel->Font;
424: NextButton->Enabled=true;
425: break;
426: case 3:
427: current=InternetLabel->Font;
428: if(!InternetAddressComboBox->Items->Count) {
429: WSADATA WSAData;
430: WSAStartup(MAKEWORD(1,1), &WSAData); /* req'd for gethostname */
431: if(scfg.sys_inetaddr[0])
432: InternetAddressComboBox->Items->Add(scfg.sys_inetaddr);
433: char hostname[128];
434: gethostname(hostname,sizeof(hostname)-1);
435: if(hostname[0]) {
436: InternetAddressComboBox->Items->Add(hostname);
437: HOSTENT* host=gethostbyname(hostname);
438: SOCKADDR_IN addr;
439: for(int i=0;host && host->h_addr_list[i];i++) {
440: addr.sin_addr.s_addr
441: =*((DWORD*)host->h_addr_list[i]);
442: InternetAddressComboBox->Items->Add(inet_ntoa(addr.sin_addr));
443: }
444: }
445: WSACleanup();
446: InternetAddressComboBox->ItemIndex=0;
447: }
448: VerifyInternetAddresses(Sender);
449: break;
450: case 4:
451: current=QWKLabel->Font;
452: if(!QWKIDEdit->Text.Length()) {
453: char bbsname[41];
454: char qwkid[9];
455: int len=0;
456: strcpy(bbsname,SystemNameEdit->Text.UpperCase().c_str());
457: for(char*p=bbsname;*p && len<8;p++) {
458: if(strchr(ILLEGAL_QWKID_CHARS,*p))
459: continue;
460: if(!len && isdigit(*p))
461: continue;
462: if(*p<=' ')
463: continue;
464: qwkid[len++]=*p;
465: }
466: qwkid[len]=0;
467: QWKIDEdit->Text=AnsiString(qwkid);
468: }
469: if(!QNetTaglineEdit->Text.Length()) {
470: QNetTaglineEdit->Text = SystemNameEdit->Text +
471: " - " + InternetAddressComboBox->Text;
472: }
473: VerifyQWK(Sender);
474: break;
475: case 5:
476: current=MaximumsLabel->Font;
477: NextButton->Enabled=true;
478: break;
479: case 6:
480: current=OptionsLabel->Font;
481: NextButton->Enabled=true;
482: break;
483: case 7:
484: current=VerifyLabel->Font;
485: VerifyPassword(Sender);
486: if(!NextButton->Enabled)
487: ActiveControl=SysPassVerifyEdit;
488: break;
489: case 8:
490: current=CompleteLabel->Font;
491: break;
492: default:
493: return;
494: }
495:
496: /* default to inactive */
497: IntroductionLabel->Font->Color=clGray;
498: IdentificationLabel->Font->Color=clGray;
499: QWKLabel->Font->Color=clGray;
500: TimeLabel->Font->Color=clGray;
501: InternetLabel->Font->Color=clGray;
502: MaximumsLabel->Font->Color=clGray;
503: OptionsLabel->Font->Color=clGray;
504: VerifyLabel->Font->Color=clGray;
505: CompleteLabel->Font->Color=clGray;
506:
507: /* active */
508: current->Color=clYellow;
509:
510: BackButton->Enabled=WizNotebook->PageIndex;
511: }
512: //---------------------------------------------------------------------------
513: void __fastcall TConfigWizard::VerifyIdentification(TObject *Sender)
514: {
515: NextButton->Enabled=(SystemNameEdit->Text.Length()
516: && SystemLocationEdit->Text.Length()
517: && SysopNameEdit->Text.Length()
518: && SystemPasswordEdit->Text.Length()
519: );
520: }
521: //---------------------------------------------------------------------------
522: void __fastcall TConfigWizard::VerifyPassword(TObject *Sender)
523: {
524: NextButton->Enabled=(SystemPasswordEdit->Text==SysPassVerifyEdit->Text);
525: }
526: //---------------------------------------------------------------------------
527: void __fastcall TConfigWizard::VerifyQWK(TObject *Sender)
528: {
529: char qwk_id[9];
530:
531: SAFECOPY(qwk_id,QWKIDEdit->Text.c_str());
532: NextButton->Enabled=(
533: strlen(qwk_id)>=2
534: && isalpha(qwk_id[0])
535: && strcspn(qwk_id,ILLEGAL_QWKID_CHARS)==strlen(qwk_id)
536: && QNetTaglineEdit->Text.Length());
537: }
538: //---------------------------------------------------------------------------
539: void __fastcall TConfigWizard::QNetTaglineEditKeyPress(TObject *Sender,
540: char &Key)
541: {
542: if(Key==1) /* Ctrl-A */
543: QNetTaglineEdit->SetSelTextBuf("\1");
544: }
545: //---------------------------------------------------------------------------
546:
547: void __fastcall TConfigWizard::VerifyInternetAddresses(TObject *Sender)
548: {
549: NextButton->Enabled=(InternetAddressComboBox->Text.Length()
550: && DNSAddressEdit->Text.Length());
551: }
552: //---------------------------------------------------------------------------
553: void __fastcall TConfigWizard::TimeZoneComboBoxChange(TObject *Sender)
554: {
555: if(TimeZoneComboBox->ItemIndex>=0
556: && TimeZoneComboBox->ItemIndex<=sizeof(tz_val)/sizeof(tz_val[0]))
557: DaylightCheckBox->Enabled=tz_val[TimeZoneComboBox->ItemIndex]&US_ZONE;
558: else
559: DaylightCheckBox->Enabled=false;
560: if(!DaylightCheckBox->Enabled)
561: DaylightCheckBox->Checked=false;
562: }
563: //---------------------------------------------------------------------------
564:
565: void __fastcall TConfigWizard::NewUsersCheckBoxClick(TObject *Sender)
566: {
567: AliasesCheckBox->Enabled=NewUsersCheckBox->Checked;
568: FeedbackCheckBox->Enabled=NewUsersCheckBox->Checked;
569: }
570: //---------------------------------------------------------------------------
571:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.