📄 phone.c
字号:
/* phone.c -- Phonebook and dialing directory routines Copyright (C) 1996 Nadav Cohen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.*/#include "phone.h"#include "screen.h"#include <stdlib.h>#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>#include <fcntl.h>#include <stdio.h>#include <string.h>#include "list.h"#include "config.h"#include "menu.h"#include "window.h"#include "modem.h"#include <time.h>#include <ctype.h>#include "terminal.h"#include "log.h"#include "utils.h"#include "error.h"#include "filemgr.h"tTermPhoneHeadRec TermHeader;tTelixPhoneHeadRec TelixHeader;tList *PhoneBook;tTermPhoneRec *TermCurrentPos, *TermLastPos;int TermCurrentNumber, TermLastScrPos;int DialRetries, WhichBook, DialerConnect;char *CurrentPhonebook, PhonebookChanged, ConnectMatch;tTermPhoneRec *CurrentEntry;char TranslateToTerminate[17]={0,0,1,0,0,1,2,2,4,3,3,4,0,0,0,2};char TranslateToTelix[6] = {4, 2, 3, 4, 1, 2};long int TelixBaud[8] = {300, 2400, 4800, 9600, 19200, 38400, 57600, 115200};char TelixParity[5] = {'N', 'E', 'O', 'M', ' '};void CreateClearEntry(tTermPhoneRec *Entry){ Entry->Name[0] = 0; Entry->Number[0] = 0; Entry->Device = 0; Entry->Baud = Integers[Bauds1]; Entry->Parity = 78; Entry->Databits = 8; Entry->Stopbits = 1; Entry->Keyboard[0] = 0; Entry->Terminal = 0; Entry->DialSuffix = 1; Entry->DialPrefix = 1; Entry->Password[0] = 0; Entry->Open = 0; Entry->Closed = 0; Entry->User = 1; Entry->Comment1[0] = 0; Entry->Comment2[0] = 0; Entry->LoginScript = 0; Entry->Downloaddir = 0; Entry->Translate[0] = 0; Entry->Capture[0] = 0; Entry->Note[0] =0; Entry->LocalEcho = 0; Entry->StripHigh = 0; Entry->RcvdBSdest = 1; Entry->Color = 7; Entry->Juldate = 0; Entry->Calcmin = 0; Entry->Connects = 0; Entry->SecUsed = 0; Entry->UploadKb = 0; Entry->DownloadKb = 0; Entry->Costs = 0; Entry->LastCosts = 0; Entry->Tag = 0; Entry->Protocol = 'Z'; Entry->Flags = 0;}int ReadTerminate(char *Filename, WINDOW *Window){ int BookHandle, i; tTermPhoneRec *Tmp; char Temp[250]; if ((BookHandle = open(Filename, O_RDONLY)) < 0) return EOPEN; read(BookHandle, &Temp, 101); TermHeader.Encrypted = Temp[0]; if (TermHeader.Encrypted == 1) DisplayMessage(Window, "Phonebook is encrypted", 2); else{ memcpy(&TermHeader.Seed, &Temp[1], 4); memcpy(&TermHeader.Version, &Temp[5], 6); memcpy(&TermHeader.Comment, &Temp[11], 31); memcpy(&TermHeader.Num, &Temp[42], 2); TermHeader.CurMonth = Temp[44]; memcpy(&TermHeader.MonthCosts, &Temp[45], 4*12); memcpy(&TermHeader.PhonePos, &Temp[93], 2); TermHeader.ScrPos = Temp[95]; TermHeader.WritePos = Temp[96]; memcpy(&TermHeader.RangeStart, &Temp[97], 2); memcpy(&TermHeader.RangeStop, &Temp[99], 2); PhoneBook = new tList();/* CurrentPhonebook = (char *)malloc(strlen(Strings[Phonebook])+1); strcpy(CurrentPhonebook, Strings[Phonebook]);*/ CurrentPhonebook = (char *)malloc(strlen(Filename)+1); strcpy(CurrentPhonebook, Filename); for (i=0; i<=TermHeader.Num; i++) { Tmp = new tTermPhoneRec; read(BookHandle, &Temp, 247); memcpy(&Tmp->Name, &Temp[0], 31); memcpy(&Tmp->Number, &Temp[31], 25); Tmp->Device = Temp[56]; memcpy(&Tmp->Baud, &Temp[57], 4); Tmp->Parity = Temp[61]; Tmp->Databits = Temp[62]; Tmp->Stopbits = Temp[63]; memcpy(&Tmp->Keyboard, &Temp[64], 9); Tmp->Terminal = Temp[73]; Tmp->DialSuffix = Temp[74]; Tmp->DialPrefix = Temp[75]; memcpy(&Tmp->Password, &Temp[76], 25); memcpy(&Tmp->Open, &Temp[101], 2); memcpy(&Tmp->Closed, &Temp[103], 2); memcpy(&Tmp->User, &Temp[105], 1); memcpy(&Tmp->Comment1, &Temp[106], 41); memcpy(&Tmp->Comment2, &Temp[147], 41); Tmp->LoginScript = Temp[188]; Tmp->Downloaddir = Temp[189]; memcpy(&Tmp->Translate, &Temp[190], 9); memcpy(&Tmp->Capture, &Temp[199], 9); memcpy(&Tmp->Note, &Temp[208], 9); Tmp->LocalEcho = Temp[217]; Tmp->StripHigh = Temp[218]; Tmp->RcvdBSdest = Temp[219]; Tmp->Color = Temp[220]; memcpy(&Tmp->Juldate, &Temp[221], 2); memcpy(&Tmp->Calcmin, &Temp[223], 2); memcpy(&Tmp->Connects, &Temp[225], 2); memcpy(&Tmp->SecUsed, &Temp[227], 4); memcpy(&Tmp->UploadKb, &Temp[231], 4); memcpy(&Tmp->DownloadKb, &Temp[235], 4); memcpy(&Tmp->Costs, &Temp[239], 4); memcpy(&Tmp->LastCosts, &Temp[243], 4); Tmp->Tag = 0; PhoneBook->Add(Tmp); } if (Integers[StartInTop]){ TermHeader.PhonePos = 1; TermCurrentPos = TermLastPos = (tTermPhoneRec *)PhoneBook->Base->Next; TermCurrentNumber = 1; TermHeader.ScrPos = 0; TermLastScrPos = 0; } else { TermCurrentPos = TermLastPos = (tTermPhoneRec *)PhoneBook->Base->Next; for (i=1;i<TermHeader.PhonePos-TermHeader.ScrPos;i++) TermCurrentPos = (tTermPhoneRec *)TermCurrentPos->Next; TermCurrentNumber = TermHeader.PhonePos-TermHeader.ScrPos+1; TermLastScrPos = --TermHeader.ScrPos; } } close(BookHandle); WhichBook = 0; return 0;}int WriteTerminate(char *Filename){ int BookHandle, i; tTermPhoneRec *Tmp; char Temp[250]; if (TermHeader.Encrypted == 0){ if ((BookHandle = open(Filename, O_RDWR | O_CREAT | O_TRUNC)) < 0) return EOPEN; Temp[0] = TermHeader.Encrypted; memcpy(&Temp[1], &TermHeader.Seed, 4); memcpy(&Temp[5], &TermHeader.Version, 6); memcpy(&Temp[11], &TermHeader.Comment, 31); memcpy(&Temp[42], &TermHeader.Num, 2); Temp[44] = TermHeader.CurMonth; memcpy(&Temp[45], &TermHeader.MonthCosts, 4*12); memcpy(&Temp[93], &TermHeader.PhonePos, 2); Temp[95] = TermHeader.ScrPos; Temp[96] = TermHeader.WritePos; memcpy(&Temp[97], &TermHeader.RangeStart, 2); memcpy(&Temp[99], &TermHeader.RangeStop, 2); write(BookHandle, &Temp, 101); Tmp = (tTermPhoneRec *)PhoneBook->Base; for (i=0; i<=TermHeader.Num; i++) { memcpy(&Temp[0], &Tmp->Name, 31); memcpy(&Temp[31], &Tmp->Number, 25); Temp[56] = Tmp->Device; memcpy(&Temp[57], &Tmp->Baud, 4); Temp[61] = Tmp->Parity; Temp[62] = Tmp->Databits; Temp[63] = Tmp->Stopbits; memcpy(&Temp[64], &Tmp->Keyboard, 9); Temp[73] = Tmp->Terminal; Temp[74] = Tmp->DialSuffix; Temp[75] = Tmp->DialPrefix; memcpy(&Temp[76], &Tmp->Password, 25); memcpy(&Temp[101], &Tmp->Open, 2); memcpy(&Temp[103], &Tmp->Closed, 2); Temp[105] = Tmp->User; memcpy(&Temp[106], &Tmp->Comment1, 41); memcpy(&Temp[147], &Tmp->Comment2, 41); Temp[188] = Tmp->LoginScript; Temp[189] = Tmp->Downloaddir; memcpy(&Temp[190], &Tmp->Translate, 9); memcpy(&Temp[199], &Tmp->Capture, 9); memcpy(&Temp[208], &Tmp->Note, 9); Temp[217] = Tmp->LocalEcho; Temp[218] = Tmp->StripHigh; Temp[219] = Tmp->RcvdBSdest; Temp[220] = Tmp->Color; memcpy(&Temp[221], &Tmp->Juldate, 2); memcpy(&Temp[223], &Tmp->Calcmin, 2); memcpy(&Temp[225], &Tmp->Connects, 2); memcpy(&Temp[227], &Tmp->SecUsed, 4); memcpy(&Temp[231], &Tmp->UploadKb, 4); memcpy(&Temp[235], &Tmp->DownloadKb, 4); memcpy(&Temp[239], &Tmp->Costs, 4); memcpy(&Temp[243], &Tmp->LastCosts, 4); write(BookHandle, &Temp, 247); Tmp = (tTermPhoneRec *)Tmp->Next; } close(BookHandle); } return 0;}int ReadTelix(char *Filename){ int BookHandle, i; tTelixPhoneRec *Tmp; tTermPhoneRec *Temp; char TempBuffer[250]; if ((BookHandle = open(Filename, O_RDONLY)) < 0) return EOPEN; /* CurrentPhonebook = (char *)malloc(strlen(Strings[Phonebook])+1); strcpy(CurrentPhonebook, Strings[Phonebook]);*/ CurrentPhonebook = (char *)malloc(strlen(Filename)+1); strcpy(CurrentPhonebook, Filename); read(BookHandle, &TempBuffer, 64); memcpy(&TelixHeader.Reserved1, &TempBuffer, 6); memcpy(&TelixHeader.Num, &TempBuffer[6], 2); memcpy(&TelixHeader.Reserved2, &TempBuffer[8], 56); TermHeader.Num = TelixHeader.Num-1; TermHeader.RangeStart = 0; TermHeader.RangeStop = TelixHeader.Num; TermHeader.ScrPos = 1; TermHeader.PhonePos = 1; TermHeader.WritePos = 1; PhoneBook = new tList(); Tmp = new tTelixPhoneRec; Temp = new tTermPhoneRec; memset(Temp, 0, sizeof(tTermPhoneRec)); PhoneBook->Add(Temp); CreateClearEntry(Temp); for (i=0; i<=TermHeader.Num; i++) { Temp = new tTermPhoneRec; read(BookHandle, &TempBuffer, 86); memcpy(&Tmp->Name, &TempBuffer[0], 25); memcpy(&Tmp->Number, &TempBuffer[25], 17); Tmp->Baud = TempBuffer[42]; Tmp->Parity = TempBuffer[43]; Tmp->Databits = TempBuffer[44]; Tmp->Stopbits = TempBuffer[45]; memcpy(&Tmp->Script, &TempBuffer[46], 12); memcpy(&Tmp->LastCalled, &TempBuffer[58], 6); memcpy(&Tmp->Connects, &TempBuffer[64], 2); Tmp->Terminal = TempBuffer[66]; Tmp->Protocol = TempBuffer[67]; Tmp->Flags = TempBuffer[68]; memcpy(&Tmp->Reserved, &TempBuffer[69], 2); Tmp->Prefix = TempBuffer[71]; memcpy(&Tmp->Password, &TempBuffer[72], 14); memset(Temp, 0, sizeof(tTermPhoneRec)); memcpy(&Temp->Name[1], Tmp->Name, sizeof(Tmp->Name)); Temp->Name[0] = strlen(&Temp->Name[1]); memcpy(&Temp->Number[1], Tmp->Number, sizeof(Tmp->Number)); Temp->Number[0] = strlen(&Temp->Number[1]); memcpy(&Temp->Password[1], Tmp->Password, sizeof(Tmp->Password)); Temp->Password[0] = strlen(&Temp->Password[1]); Temp->Baud = TelixBaud[Tmp->Baud-1]; Temp->Parity = TelixParity[Tmp->Parity]; Temp->Databits = Tmp->Databits; Temp->Stopbits = Tmp->Stopbits; Temp->Terminal = Tmp->Terminal; Temp->Connects = Tmp->Connects; Temp->DialPrefix = Tmp->Prefix-1; Temp->Protocol = Tmp->Protocol; Temp->User = 1; Temp->LocalEcho = Tmp->Flags & 1; Temp->StripHigh = Tmp->Flags & 16; Temp->Tag = 0; PhoneBook->Add(Temp); } close(BookHandle); TermCurrentPos = TermLastPos = (tTermPhoneRec *)PhoneBook->Base->Next; for (i=1;i<TermHeader.PhonePos-TermHeader.ScrPos;i++) TermCurrentPos = (tTermPhoneRec *)TermCurrentPos->Next; TermCurrentNumber = TermHeader.PhonePos-TermHeader.ScrPos+1; TermLastScrPos = --TermHeader.ScrPos; WhichBook = 1; return 0;}int WriteTelix(char *Filename){ int BookHandle, i, j; tTelixPhoneRec *Tmp; tTermPhoneRec *Temp; char TempBuffer[250]; if ((BookHandle = open(Filename, O_RDWR | O_CREAT | O_TRUNC)) < 0) return EOPEN; TelixHeader.Num = TermHeader.Num+1; memcpy(&TempBuffer, &TelixHeader.Reserved1, 6); memcpy(&TempBuffer[6], &TelixHeader.Num, 2); memcpy(&TempBuffer[8], TelixHeader.Reserved2, 56); write(BookHandle, &TempBuffer, 64); Tmp = new tTelixPhoneRec; Temp = (tTermPhoneRec *)PhoneBook->Base->Next; for (i=0; i<=TermHeader.Num; i++) { memset(Tmp, 0, sizeof(tTelixPhoneRec)); memcpy(Tmp->Name, &Temp->Name[1], Temp->Name[0]); memcpy(Tmp->Number, &Temp->Number[1], Temp->Number[0]); memcpy(Tmp->Password, &Temp->Password[1], Temp->Password[0]); for (j=0;j<8;j++) if (TelixBaud[j] == Temp->Baud) Tmp->Baud = j; for (j=0;j<5;j++) if (TelixParity[j] == Temp->Parity) Tmp->Parity = j; Tmp->Databits = Temp->Databits; Tmp->Stopbits = Temp->Stopbits; Tmp->Terminal = Temp->Terminal; Tmp->Connects = Temp->Connects; Tmp->Prefix = Temp->DialPrefix+1; Tmp->Protocol = Temp->Protocol; Tmp->Flags = Temp->Flags; if (Temp->LocalEcho) Tmp->Flags |= 1; else Tmp->Flags &= ~1; if (Temp->StripHigh) Tmp->Flags |= 16; else Tmp->Flags &= ~16; memcpy(&TempBuffer, &Tmp->Name, 25); memcpy(&TempBuffer[25], &Tmp->Number, 17); TempBuffer[42] = Tmp->Baud; TempBuffer[43] = Tmp->Parity; TempBuffer[44] = Tmp->Databits; TempBuffer[45] = Tmp->Stopbits; memcpy(&TempBuffer[46], &Tmp->Script, 12); memcpy(&TempBuffer[58], &Tmp->LastCalled, 6); memcpy(&TempBuffer[64], &Tmp->Connects, 2); TempBuffer[66] = Tmp->Terminal; TempBuffer[67] = Tmp->Protocol; TempBuffer[68] = Tmp->Flags; memcpy(&TempBuffer[69], &Tmp->Reserved, 2); TempBuffer[71] = Tmp->Prefix; memcpy(&TempBuffer[72], &Tmp->Password, 14); write(BookHandle, &TempBuffer, 86); Temp = (tTermPhoneRec *)Temp->Next; } delete Tmp; close(BookHandle); return 0;}void SavePhonebook(){ switch(WhichBook){ case 0: if (WriteTerminate(CurrentPhonebook) < 0) WindowError(PhoneScreen, "Unable to write phonebook"); break; case 1: if (WriteTelix(CurrentPhonebook) < 0) WindowError(PhoneScreen, "Unable to write phonebook"); break; default:break; }}void Dots(char *Pwd){ int i; for (i=0;i<(int)strlen(Pwd);i++) Pwd[i]='.';}void Swap(tTermPhoneRec *First, tTermPhoneRec *Second){ tTermPhoneRec *Next, *Prev; if (First->Next == Second){ Next = (tTermPhoneRec *)Second->Next; Second->Next = First; Second->Prev = First->Prev; First->Next = Next; First->Prev = Second; } else if (Second->Next == First){ Next = (tTermPhoneRec *)First->Next; First->Next = Second; First->Prev = Second->Prev; Second->Next = Next; Second->Prev = First;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -