|
|
1.1 root 1: /* Synchronet Control Panel (GUI Borland C++ Builder Project for Win32) */
2:
1.1.1.2 ! root 3: /* $Id: NodeFormUnit.cpp,v 1.26 2004/10/18 00:04:41 rswindell Exp $ */
1.1 root 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: * *
1.1.1.2 ! root 9: * Copyright 2004 Rob Swindell - http://www.synchro.net/copyright.html *
1.1 root 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: #include <io.h>
40: #include <stdio.h>
1.1.1.2 ! root 41: #include <sys/stat.h>
! 42: #include <sys/locking.h>
1.1 root 43: #include <fcntl.h>
44: #include <share.h>
45: #include "NodeFormUnit.h"
46: #include "UserMsgFormUnit.h"
47: #include "SpyFormUnit.h"
48: #include "sbbs.h"
49: #include "nodedefs.h"
50: #include "userdat.h"
51: #include "ringbuf.h"
52: //---------------------------------------------------------------------------
53: #pragma package(smart_init)
54: #pragma resource "*.dfm"
55: TNodeForm *NodeForm;
56: //---------------------------------------------------------------------------
57: __fastcall TNodeForm::TNodeForm(TComponent* Owner)
58: : TForm(Owner)
59: {
60: MainForm->bbs_startup.node_spybuf
61: =(RingBuf**)calloc(1,sizeof(RingBuf*)*MAX_NODES);
62: }
63: //---------------------------------------------------------------------------
64: void __fastcall TNodeForm::FormHide(TObject *Sender)
65: {
1.1.1.2 ! root 66: MainForm->ViewNodes->Checked=false;
1.1 root 67: }
68: //---------------------------------------------------------------------------
1.1.1.2 ! root 69: int __fastcall TNodeForm::getnodedat(int node_num, node_t* node, int* file)
! 70: {
! 71: char errmsg[128];
! 72: int err;
1.1 root 73:
1.1.1.2 ! root 74: if((err=::getnodedat(&MainForm->cfg,node_num,node,file))!=0) {
! 75: sprintf(errmsg,"getnodedat returned %d",err);
! 76: Application->MessageBox(errmsg
! 77: ,"ERROR",MB_OK|MB_ICONEXCLAMATION);
! 78: }
1.1 root 79:
1.1.1.2 ! root 80: return(err);
! 81: }
! 82: //---------------------------------------------------------------------------
! 83: int __fastcall TNodeForm::putnodedat(int node_num, node_t* node, int file)
1.1 root 84: {
1.1.1.2 ! root 85: char errmsg[128];
! 86: int err;
! 87:
! 88: if((err=::putnodedat(&MainForm->cfg,node_num,node, file))!=0) {
! 89: sprintf(errmsg,"putnodedat(%d) returned %d",file,err);
! 90: Application->MessageBox(errmsg
! 91: ,"ERROR",MB_OK|MB_ICONEXCLAMATION);
! 92: }
1.1 root 93:
1.1.1.2 ! root 94: return(err);
1.1 root 95: }
96: //---------------------------------------------------------------------------
97:
98: char* username(int usernumber,char *strin)
99: {
100: char str[256];
101: char c;
102: int file;
103:
104: if(usernumber<1) {
105: strcpy(strin,"UNKNOWN USER");
106: return(strin);
107: }
108: sprintf(str,"%suser/name.dat",MainForm->cfg.data_dir);
109: if((file=_sopen(str,O_RDONLY,SH_DENYWR,S_IWRITE))==-1) {
110: return("<!ERROR opening name.dat>");
111: }
112: if(filelength(file)<(long)((long)usernumber*(LEN_ALIAS+2))) {
113: close(file);
114: strcpy(strin,"UNKNOWN USER");
115: return(strin);
116: }
117: lseek(file,(long)((long)(usernumber-1)*(LEN_ALIAS+2)),SEEK_SET);
118: read(file,strin,LEN_ALIAS);
119: close(file);
120: for(c=0;c<LEN_ALIAS;c++)
121: if(strin[c]==ETX) break;
122: strin[c]=0;
123: if(!c)
124: strcpy(strin,"DELETED USER");
125: return(strin);
126: }
127:
128: void __fastcall TNodeForm::TimerTick(TObject *Sender)
129: {
130: static int nodedab;
1.1.1.2 ! root 131: char str[256];
! 132: char status[128];
! 133: int i,n,rd,digits=1;
1.1 root 134: node_t node;
135:
1.1.1.2 ! root 136: if(!Visible)
! 137: return;
! 138:
1.1 root 139: if(nodedab<1) {
1.1.1.2 ! root 140: char path[MAX_PATH+1];
! 141: sprintf(path,"%sNODE.DAB",MainForm->global.ctrl_dir);
! 142: nodedab=_sopen(path,O_RDONLY|O_BINARY|O_CREAT, SH_DENYNONE, S_IREAD|S_IWRITE);
1.1 root 143: if(nodedab==-1) {
144: ListBox->Items->Clear();
1.1.1.2 ! root 145: ListBox->Items->Add("Error "+AnsiString(errno)+" opening NODE.DAB");
1.1 root 146: return;
147: }
148: }
1.1.1.2 ! root 149: if(MainForm->cfg.sys_nodes>9)
! 150: digits++;
! 151: if(MainForm->cfg.sys_nodes>99)
! 152: digits++;
! 153: if(MainForm->cfg.sys_nodes>999)
! 154: digits++;
1.1 root 155: for(n=0;n<MainForm->cfg.sys_nodes;n++) {
156: lseek(nodedab, n*sizeof(node_t), SEEK_SET);
157: if(eof(nodedab))
158: break;
1.1.1.2 ! root 159: #ifdef USE_LOCKING
! 160: if(locking(nodedab, LK_NBLCK, sizeof(node_t))!=0)
! 161: continue;
! 162: #endif
! 163: memset(&node,0,sizeof(node_t));
! 164: rd=read(nodedab,&node, sizeof(node_t));
! 165: #ifdef USE_LOCKING
1.1 root 166: lseek(nodedab, n*sizeof(node_t), SEEK_SET);
167: locking(nodedab, LK_UNLCK, sizeof(node_t));
1.1.1.2 ! root 168: #endif
! 169:
! 170: if(rd!=sizeof(node_t))
! 171: continue;
! 172:
! 173: sprintf(str,"%*d %s"
! 174: ,digits
! 175: ,n+1
! 176: ,nodestatus(&MainForm->cfg,&node,status,sizeof(status)));
1.1 root 177: AnsiString Str=AnsiString(str);
178: if(ListBox->Items->Count<n+1)
179: ListBox->Items->Add(Str);
1.1.1.2 ! root 180: else if(ListBox->Items->Strings[n]!=Str) {
! 181: bool selected=ListBox->Selected[n]; // save selected state
1.1 root 182: ListBox->Items->Strings[n]=str;
1.1.1.2 ! root 183: ListBox->Selected[n]=selected; // restore
! 184: }
! 185: }
! 186: if(n!=MainForm->cfg.sys_nodes) { /* read error or something */
! 187: close(nodedab);
! 188: nodedab=-1;
1.1 root 189: }
190: Timer->Enabled=true;
191: }
192: //---------------------------------------------------------------------------
193:
194:
195:
196: void __fastcall TNodeForm::InterruptNodeButtonClick(TObject *Sender)
197: {
198: int i;
1.1.1.2 ! root 199: int file;
1.1 root 200: node_t node;
201:
202: for(i=0;i<ListBox->Items->Count;i++)
203: if(ListBox->Selected[i]==true) {
1.1.1.2 ! root 204: if(getnodedat(i+1,&node,&file))
! 205: break;
1.1 root 206: node.misc^=NODE_INTR;
1.1.1.2 ! root 207: if(putnodedat(i+1,&node,file))
! 208: break;
1.1 root 209: }
1.1.1.2 ! root 210: TimerTick(Sender);
1.1 root 211: }
212: //---------------------------------------------------------------------------
213:
214: void __fastcall TNodeForm::LockNodeButtonClick(TObject *Sender)
215: {
216: int i;
1.1.1.2 ! root 217: int file;
1.1 root 218: node_t node;
219:
220: for(i=0;i<ListBox->Items->Count;i++)
221: if(ListBox->Selected[i]==true) {
1.1.1.2 ! root 222: if(getnodedat(i+1,&node,&file))
! 223: break;
1.1 root 224: node.misc^=NODE_LOCK;
1.1.1.2 ! root 225: if(putnodedat(i+1,&node,file))
! 226: break;
1.1 root 227: }
1.1.1.2 ! root 228: TimerTick(Sender);
1.1 root 229: }
230: //---------------------------------------------------------------------------
231:
232: void __fastcall TNodeForm::RerunNodeButtonClick(TObject *Sender)
233: {
234: int i;
1.1.1.2 ! root 235: int file;
1.1 root 236: node_t node;
237:
238: for(i=0;i<ListBox->Items->Count;i++)
239: if(ListBox->Selected[i]==true) {
1.1.1.2 ! root 240: if(getnodedat(i+1,&node,&file))
! 241: break;
1.1 root 242: node.misc^=NODE_RRUN;
1.1.1.2 ! root 243: if(putnodedat(i+1,&node,file))
! 244: break;
1.1 root 245: }
1.1.1.2 ! root 246: TimerTick(Sender);
1.1 root 247: }
248:
249: //---------------------------------------------------------------------------
250:
251:
252: void __fastcall TNodeForm::SelectAllMenuItemClick(TObject *Sender)
253: {
254: int i;
255:
256: for(i=0;i<ListBox->Items->Count;i++)
257: ListBox->Selected[i]=true;
258:
259: }
260: //---------------------------------------------------------------------------
261:
262: void __fastcall TNodeForm::DownButtonClick(TObject *Sender)
263: {
264: int i;
1.1.1.2 ! root 265: int file;
1.1 root 266: node_t node;
267:
268: for(i=0;i<ListBox->Items->Count;i++)
269: if(ListBox->Selected[i]==true) {
1.1.1.2 ! root 270: if(getnodedat(i+1,&node,&file))
! 271: break;
1.1 root 272: if(node.status==NODE_WFC)
273: node.status=NODE_OFFLINE;
274: else if(node.status==NODE_OFFLINE)
275: node.status=NODE_WFC;
276: else
277: node.misc^=NODE_DOWN;
1.1.1.2 ! root 278: if(putnodedat(i+1,&node,file))
! 279: break;
1.1 root 280: }
1.1.1.2 ! root 281: TimerTick(Sender);
1.1 root 282: }
283: //---------------------------------------------------------------------------
284:
285: void __fastcall TNodeForm::ClearErrorButtonClick(TObject *Sender)
286: {
287: int i;
1.1.1.2 ! root 288: int file;
1.1 root 289: node_t node;
290:
291: for(i=0;i<ListBox->Items->Count;i++)
292: if(ListBox->Selected[i]==true) {
1.1.1.2 ! root 293: if(getnodedat(i+1,&node,&file))
! 294: break;
1.1 root 295: node.errors=0;
1.1.1.2 ! root 296: if(putnodedat(i+1,&node,file))
! 297: break;
1.1 root 298: }
1.1.1.2 ! root 299: TimerTick(Sender);
1.1 root 300: }
301: //---------------------------------------------------------------------------
302:
303: void __fastcall TNodeForm::ChatButtonClick(TObject *Sender)
304: {
305: char str[512];
306: char name[128];
307: int i;
308: node_t node;
309:
310: for(i=0;i<ListBox->Items->Count;i++)
311: if(ListBox->Selected[i]==true) {
1.1.1.2 ! root 312: if(getnodedat(i+1,&node,NULL))
! 313: break;
1.1 root 314: if(node.status==NODE_WFC || node.status>NODE_QUIET)
315: continue;
316: sprintf(str,"%sCHAT %s %s %d %s"
317: ,MainForm->cfg.exec_dir
318: ,MainForm->cfg.ctrl_dir
319: ,MainForm->cfg.node_path[i]
320: ,i+1
321: ,username(node.useron,name)
322: );
323: WinExec(str,SW_SHOWNORMAL);
324: }
1.1.1.2 ! root 325: TimerTick(Sender);
1.1 root 326: }
327: //---------------------------------------------------------------------------
328:
329: void __fastcall TNodeForm::SpyButtonClick(TObject *Sender)
330: {
331: int i;
332:
333: for(i=0;i<ListBox->Items->Count;i++)
334: if(ListBox->Selected[i]==true) {
335: if(SpyForms[i]==NULL) {
336: Application->CreateForm(__classid(TSpyForm), &SpyForms[i]);
337: SpyForms[i]->inbuf=&MainForm->bbs_startup.node_inbuf[i];
338: SpyForms[i]->outbuf=&MainForm->bbs_startup.node_spybuf[i];
339: SpyForms[i]->Caption="Node "+AnsiString(i+1);
340: }
341: SpyForms[i]->Show();
342: }
1.1.1.2 ! root 343: TimerTick(Sender);
1.1 root 344: }
345: //---------------------------------------------------------------------------
346:
347: void __fastcall TNodeForm::UserEditButtonClick(TObject *Sender)
348: {
349: int i;
350: char str[128];
351: node_t node;
352:
353: for(i=0;i<ListBox->Items->Count;i++)
354: if(ListBox->Selected[i]==true) {
1.1.1.2 ! root 355: if(getnodedat(i+1,&node,NULL))
! 356: break;
1.1 root 357: if(node.useron==0)
358: continue;
359: sprintf(str,"%sUSEREDIT %s %d"
360: ,MainForm->cfg.exec_dir
361: ,MainForm->cfg.data_dir
362: ,node.useron);
363: WinExec(str,SW_SHOWNORMAL);
364: }
1.1.1.2 ! root 365: TimerTick(Sender);
1.1 root 366: }
367: //---------------------------------------------------------------------------
368:
369: void __fastcall TNodeForm::UserMsgButtonClick(TObject *Sender)
370: {
371: int i;
372: node_t node;
373:
374: Application->CreateForm(__classid(TUserMsgForm), &UserMsgForm);
375: UserMsgForm->Memo->Text="\1n\1y\1hMessage From Sysop:\1w ";
376: UserMsgForm->Memo->SelStart=UserMsgForm->Memo->Text.Length();
377: if(UserMsgForm->ShowModal()==mrOk) {
378: UserMsgForm->Memo->Lines->Add("");
379: for(i=0;i<ListBox->Items->Count;i++)
380: if(ListBox->Selected[i]==true) {
1.1.1.2 ! root 381: if(getnodedat(i+1,&node,NULL))
! 382: break;
1.1 root 383: if(node.useron==0)
384: continue;
385: putsmsg(&MainForm->cfg,node.useron
386: ,UserMsgForm->Memo->Text.c_str());
387: }
388: }
389: delete UserMsgForm;
1.1.1.2 ! root 390: TimerTick(Sender);
! 391: }
! 392: //---------------------------------------------------------------------------
! 393:
! 394: void __fastcall TNodeForm::RefreshMenuItemClick(TObject *Sender)
! 395: {
! 396: ListBox->Clear();
! 397: TimerTick(Sender);
1.1 root 398: }
399: //---------------------------------------------------------------------------
400:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.