⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 phone.c

📁 功能丰富的串口通讯程序
💻 C
📖 第 1 页 / 共 5 页
字号:
/*    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 + -