Annotation of sbbs/sbbs3/ctrl/nodeformunit.cpp, revision 1.1.1.2

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: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.