Annotation of sbbs/sbbs3/chat/mainformunit.cpp, revision 1.1.1.1

1.1       root        1: /* MainFormUnit.cpp */
                      2: 
                      3: /* Local sysop chat module (GUI Borland C++ Builder Project for Win32) */
                      4: 
                      5: /* $Id: MainFormUnit.cpp,v 1.3 2000/11/03 01:03:51 rswindell Exp $ */
                      6: 
                      7: /****************************************************************************
                      8:  * @format.tab-size 4          (Plain Text/Source Code File Header)                    *
                      9:  * @format.use-tabs true       (see http://www.synchro.net/ptsc_hdr.html)              *
                     10:  *                                                                                                                                                     *
                     11:  * Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html         *
                     12:  *                                                                                                                                                     *
                     13:  * This program is free software; you can redistribute it and/or                       *
                     14:  * modify it under the terms of the GNU General Public License                         *
                     15:  * as published by the Free Software Foundation; either version 2                      *
                     16:  * of the License, or (at your option) any later version.                                      *
                     17:  * See the GNU General Public License for more details: gpl.txt or                     *
                     18:  * http://www.fsf.org/copyleft/gpl.html                                                                                *
                     19:  *                                                                                                                                                     *
                     20:  * Anonymous FTP access to the most recent released source is available at     *
                     21:  * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net     *
                     22:  *                                                                                                                                                     *
                     23:  * Anonymous CVS access to the development source and modification history     *
                     24:  * is available at cvs.synchro.net:/cvsroot/sbbs, example:                                     *
                     25:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs login                       *
                     26:  *     (just hit return, no password is necessary)                                                     *
                     27:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src                *
                     28:  *                                                                                                                                                     *
                     29:  * For Synchronet coding style and modification guidelines, see                                *
                     30:  * http://www.synchro.net/source.html                                                                          *
                     31:  *                                                                                                                                                     *
                     32:  * You are encouraged to submit any modifications (preferably in Unix diff     *
                     33:  * format) via e-mail to [email protected]                                                                      *
                     34:  *                                                                                                                                                     *
                     35:  * Note: If this box doesn't appear square, then you need to fix your tabs.    *
                     36:  ****************************************************************************/
                     37: 
                     38: //---------------------------------------------------------------------------
                     39: 
                     40: #include <vcl.h>
                     41: #include <io.h>
                     42: #include <sys\stat.h>
                     43: #include <fcntl.h>
                     44: #include <share.h>
                     45: #include <sys/locking.h>
                     46: #include <vcl\Registry.hpp>    /* TRegistry */
                     47: #pragma hdrstop
                     48: 
                     49: #include "gen_defs.h"       /* BS and DEL */
                     50: 
                     51: #define PCHAT_LEN 1000         /* Size of Private chat file */
                     52: #define REG_KEY "\\Software\\Swindell\\Synchronet Chat\\"
                     53: 
                     54: #include "MainFormUnit.h"
                     55: //---------------------------------------------------------------------------
                     56: #pragma package(smart_init)
                     57: #pragma resource "*.dfm"
                     58: TMainForm *MainForm;
                     59: extern int      node_num;
                     60: extern char     ctrl_dir[];
                     61: extern char     node_dir[];
                     62: extern char     user_name[];
                     63: //---------------------------------------------------------------------------
                     64: __fastcall TMainForm::TMainForm(TComponent* Owner)
                     65:     : TForm(Owner)
                     66: {
                     67:     in=-1;
                     68:     out=-1;
                     69:     nodedab=-1;
                     70: }
                     71: bool __fastcall TMainForm::ToggleChat(bool on)
                     72: {
                     73:     int         n=node_num-1;
                     74:     static int  org_act;
                     75: 
                     76:     if(nodedab==-1)
                     77:         return(false);
                     78: 
                     79:     lseek(nodedab, n*sizeof(node_t), SEEK_SET);
                     80:     int i=locking(nodedab, LK_LOCK, sizeof(node_t));
                     81:     if(i) {
                     82:         Remote->Lines->Add("!Error "+AnsiString(i)+" reading record for"
                     83:             "node "+AnsiString(node_num));
                     84:         return(false);
                     85:     }
                     86:     read(nodedab, &node, sizeof(node_t));
                     87:     if(on) {
                     88:         org_act=node.action;
                     89:         if(org_act==NODE_PCHT)
                     90:             org_act=NODE_MAIN;
                     91:         node.misc|=NODE_LCHAT;
                     92:     } else {
                     93:         node.action=org_act;
                     94:         node.misc&=~NODE_LCHAT;
                     95:     }
                     96: 
                     97:     lseek(nodedab, n*sizeof(node_t), SEEK_SET);
                     98:     write(nodedab, &node, sizeof(node_t));
                     99:     lseek(nodedab, n*sizeof(node_t), SEEK_SET);
                    100:     locking(nodedab, LK_UNLCK, sizeof(node_t));
                    101: 
                    102:     return(true);
                    103: }
                    104: //---------------------------------------------------------------------------
                    105: void __fastcall TMainForm::FormShow(TObject *Sender)
                    106: {
                    107:     char    path[MAX_PATH+1];
                    108:     char*   p;
                    109: 
                    110:     Caption="Waiting for "
                    111:         +AnsiString(user_name)+" on Node "+AnsiString(node_num);
                    112: 
                    113:     wsprintf(path,"%sNODE.DAB",ctrl_dir);
                    114:     nodedab=_sopen(path,O_RDWR|O_BINARY|O_CREAT, SH_DENYNONE,S_IREAD|S_IWRITE);
                    115: 
                    116:     if(nodedab==-1) {
                    117:         Remote->Lines->Add("!Error opening NODE.DAB");
                    118:         return;
                    119:     }
                    120: 
                    121:     ToggleChat(true);
                    122: 
                    123:        wsprintf(path,"%sLCHAT.DAB",node_dir);
                    124:        if((out=_sopen(path,O_RDWR|O_CREAT|O_BINARY,O_DENYNONE
                    125:                ,S_IREAD|S_IWRITE))==-1) {
                    126:                Remote->Lines->Add("!Error opening LCHAT.DAB");
                    127:                return; }
                    128: 
                    129:        wsprintf(path,"%sCHAT.DAB",node_dir);
                    130: #if 0
                    131:        if(!fexist(path))               /* Wait while it's created for the first time */
                    132:                mswait(2000);
                    133: #endif
                    134: 
                    135:        if((in=_sopen(path,O_RDWR|O_CREAT|O_BINARY,O_DENYNONE
                    136:                ,S_IREAD|S_IWRITE))==-1) {
                    137:                close(out);
                    138:                Remote->Lines->Add("!Error opening CHAT.DAB");
                    139:                return;
                    140:     }
                    141: 
                    142:        if((p=(char *)MALLOC(PCHAT_LEN))==NULL) {
                    143:                close(in);
                    144:                close(out);
                    145:                Remote->Lines->Add("!Error allocating memory");
                    146:                return;
                    147:     }
                    148:        memset(p,0,PCHAT_LEN);
                    149:        write(in,p,PCHAT_LEN);
                    150:        write(out,p,PCHAT_LEN);
                    151:        FREE(p);
                    152:        lseek(in,0L,SEEK_SET);
                    153:        lseek(out,0L,SEEK_SET);
                    154: 
                    155:     Timer->Enabled=true;
                    156: }
                    157: //---------------------------------------------------------------------------
                    158: void __fastcall TMainForm::FormClose(TObject *Sender, TCloseAction &Action)
                    159: {
                    160:     ToggleChat(false);
                    161: 
                    162:     if(in!=-1)
                    163:         close(in);
                    164:     if(out!=-1)
                    165:         close(out);
                    166:     if(nodedab!=-1)
                    167:         close(nodedab);
                    168: 
                    169:     // Write Registry keys
                    170:        TRegistry* Registry=new TRegistry;
                    171:     if(!Registry->OpenKey(REG_KEY,true)) {
                    172:        Application->MessageBox("Error opening registry key"
                    173:                ,REG_KEY,MB_OK|MB_ICONEXCLAMATION);
                    174:         Application->Terminate();
                    175:     }
                    176:        Registry->WriteInteger("FormHeight",Height);
                    177:        Registry->WriteInteger("FormWidth",Width);
                    178:     Registry->WriteInteger("RemoteHeight",Remote->Height);
                    179: 
                    180:     Registry->CloseKey();
                    181:     delete Registry;
                    182: 
                    183: }
                    184: //---------------------------------------------------------------------------
                    185: void __fastcall TMainForm::LocalKeyPress(TObject *Sender, char &Key)
                    186: {
                    187:     char c;
                    188: 
                    189:     if(out==-1 || Local->ReadOnly==true) {
                    190:         Beep();
                    191:         return;
                    192:     }
                    193:     read(out,&c,1);
                    194:     lseek(out,-1L,SEEK_CUR);
                    195:     if(!c)             /* hasn't wrapped */
                    196:         write(out,&Key,1);
                    197:     else {
                    198:         if(!tell(out))
                    199:             lseek(out,0L,SEEK_END);
                    200:         lseek(out,-1L,SEEK_CUR);
                    201:         c=0;
                    202:         write(out,&c,1);
                    203:         lseek(out,-1L,SEEK_CUR);
                    204:     }
                    205:     if(tell(out)>=PCHAT_LEN)
                    206:         lseek(out,0L,SEEK_SET);
                    207: }
                    208: //---------------------------------------------------------------------------
                    209: void __fastcall TMainForm::InputTimerTick(TObject *Sender)
                    210: {
                    211:     char ch=0;
                    212: 
                    213:     Timer->Interval=100;
                    214: 
                    215:     while(in!=-1) {
                    216:         if(tell(in)>=PCHAT_LEN)
                    217:             lseek(in,0L,SEEK_SET);
                    218:         read(in,&ch,1);
                    219:         lseek(in,-1L,SEEK_CUR);
                    220:         if(!ch)
                    221:             break;                                       /* char from other node */
                    222: 
                    223:         Timer->Interval=1;
                    224:         
                    225:         /* Got char, display it */
                    226:         if(ch=='\r')
                    227:             Remote->Lines->Add("");
                    228:         else if(ch==BS || ch==DEL) {  // backspace
                    229:             Remote->Text
                    230:                 =Remote->Text.SetLength(Remote->Text.Length()-1);
                    231:             /* Need to scroll window down here */
                    232:         } else {
                    233:             Remote->SelLength=0;
                    234:             Remote->SelStart=Remote->Text.Length();
                    235:             Remote->SelText=AnsiString(ch);
                    236:         }
                    237: 
                    238:         /* mark char as rx'd */
                    239:         ch=0;
                    240:         write(in,&ch,1);
                    241:     }
                    242: }
                    243: //---------------------------------------------------------------------------
                    244: void __fastcall TMainForm::TimerTick(TObject *Sender)
                    245: {
                    246:     if(nodedab==-1)
                    247:         return;
                    248: 
                    249:     int n=node_num-1;
                    250:     lseek(nodedab, n*sizeof(node_t), SEEK_SET);
                    251:     read(nodedab, &node, sizeof(node_t));
                    252:     if(node.misc&NODE_LCHAT)
                    253:         ;
                    254:     else if(Local->ReadOnly==true) {
                    255:         MainForm->Caption=AnsiString(user_name)+" on Node "
                    256:             +AnsiString(node_num);
                    257:         Local->ReadOnly=false;
                    258:     }
                    259:     else if(!node.status || node.status>NODE_QUIET || node.action!=NODE_PCHT) {
                    260:         OutputDebugString("CHAT: User Disconnected\r\n");
                    261:         MainForm->Caption=MainForm->Caption+" - Disconnected!";
                    262:         Timer->Enabled=false;
                    263:         Local->ReadOnly=true;
                    264:     }
                    265: }
                    266: //---------------------------------------------------------------------------
                    267: 
                    268: void __fastcall TMainForm::FormCreate(TObject *Sender)
                    269: {
                    270:     // Read Registry keys
                    271:        TRegistry* Registry=new TRegistry;
                    272:     if(!Registry->OpenKey(REG_KEY,true)) {
                    273:        Application->MessageBox("Error opening registry key"
                    274:                ,REG_KEY,MB_OK|MB_ICONEXCLAMATION);
                    275:         Application->Terminate();
                    276:     }
                    277:        if(Registry->ValueExists("FormHeight"))
                    278:                Height=Registry->ReadInteger("FormHeight");
                    279:        if(Registry->ValueExists("FormWidth"))
                    280:                Width=Registry->ReadInteger("FormWidth");
                    281:        if(Registry->ValueExists("RemoteHeight"))
                    282:                Remote->Height=Registry->ReadInteger("RemoteHeight");
                    283: 
                    284:     Registry->CloseKey();
                    285:     delete Registry;
                    286: 
                    287: }
                    288: //---------------------------------------------------------------------------
                    289: 

unix.superglobalmegacorp.com

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