Open-Source-Software-Entwicklung und Downloads

Browse Subversion Repository

Diff of /trunk/teraterm/teraterm/telnet.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 3226 by maya, Tue Mar 24 09:37:20 2009 UTC revision 3227 by maya, Tue Mar 24 15:10:33 2009 UTC
# Line 1  Line 1 
1  /* Tera Term  /* Tera Term
2   Copyright(C) 1994-1998 T. Teranishi   Copyright(C) 1994-1998 T. Teranishi
3   All rights reserved. */   All rights reserved. */
4    
5  /* TERATERM.EXE, TELNET routines */  /* TERATERM.EXE, TELNET routines */
6    
7  #include "teraterm.h"  #include "teraterm.h"
8  #include "tttypes.h"  #include "tttypes.h"
9  #include <stdio.h>  #include <stdio.h>
10  #include <string.h>  #include <string.h>
11  #include "ttcommon.h"  #include "ttcommon.h"
12  #include "ttwinman.h"  #include "ttwinman.h"
13  #include "commlib.h"  #include "commlib.h"
14  #include <time.h>  #include <time.h>
15  #include <process.h>  #include <process.h>
16    
17  #include "telnet.h"  #include "telnet.h"
18  #include "tt_res.h"  #include "tt_res.h"
19    
20  int TelStatus;  int TelStatus;
21    
22  enum OptStatus {No, Yes, WantNo, WantYes};  enum OptStatus {No, Yes, WantNo, WantYes};
23  enum OptQue {Empty, Opposite};  enum OptQue {Empty, Opposite};
24    
25  typedef struct {  typedef struct {
26    BOOL Accept;    BOOL Accept;
27    enum OptStatus Status;    enum OptStatus Status;
28    enum OptQue Que;    enum OptQue Que;
29  } TelOpt;  } TelOpt;
30  typedef TelOpt *PTelOpt;  typedef TelOpt *PTelOpt;
31    
32  typedef struct {  typedef struct {
33    TelOpt MyOpt[MaxTelOpt+1];    TelOpt MyOpt[MaxTelOpt+1];
34    TelOpt HisOpt[MaxTelOpt+1];    TelOpt HisOpt[MaxTelOpt+1];
35    BYTE SubOptBuff[51];    BYTE SubOptBuff[51];
36    int SubOptCount;    int SubOptCount;
37    BOOL SubOptIAC;    BOOL SubOptIAC;
38    BOOL ChangeWinSize;    BOOL ChangeWinSize;
39    POINT WinSize;    POINT WinSize;
40    int LogFile;    int LogFile;
41  } TelRec;  } TelRec;
42  typedef TelRec *PTelRec;  typedef TelRec *PTelRec;
43    
44  static TelRec tr;  static TelRec tr;
45    
46  static HANDLE keepalive_thread = (HANDLE)-1L;  static HANDLE keepalive_thread = (HANDLE)-1L;
47  static HWND keepalive_dialog = NULL;  static HWND keepalive_dialog = NULL;
48  int nop_interval = 0;  int nop_interval = 0;
49    
50  void DefaultTelRec()  void DefaultTelRec()
51  {  {
52    int i;    int i;
53    
54    for (i=0 ; i <= MaxTelOpt ; i++)    for (i=0 ; i <= MaxTelOpt ; i++)
55    {    {
56      tr.MyOpt[i].Accept = FALSE;      tr.MyOpt[i].Accept = FALSE;
57      tr.MyOpt[i].Status = No;      tr.MyOpt[i].Status = No;
58      tr.MyOpt[i].Que = Empty;      tr.MyOpt[i].Que = Empty;
59      tr.HisOpt[i].Accept = FALSE;      tr.HisOpt[i].Accept = FALSE;
60      tr.HisOpt[i].Status = No;      tr.HisOpt[i].Status = No;
61      tr.HisOpt[i].Que = Empty;      tr.HisOpt[i].Que = Empty;
62    }    }
63    
64    tr.SubOptCount = 0;    tr.SubOptCount = 0;
65    tr.SubOptIAC = FALSE;    tr.SubOptIAC = FALSE;
66    tr.ChangeWinSize = FALSE;    tr.ChangeWinSize = FALSE;
67  }  }
68    
69  void InitTelnet()  void InitTelnet()
70  {  {
71    TelStatus = TelIdle;    TelStatus = TelIdle;
72    
73    DefaultTelRec();    DefaultTelRec();
74    tr.MyOpt[BINARY].Accept = TRUE;    tr.MyOpt[BINARY].Accept = TRUE;
75    tr.HisOpt[BINARY].Accept = TRUE;    tr.HisOpt[BINARY].Accept = TRUE;
76    tr.MyOpt[SGA].Accept = TRUE;    tr.MyOpt[SGA].Accept = TRUE;
77    tr.HisOpt[SGA].Accept = TRUE;    tr.HisOpt[SGA].Accept = TRUE;
78    tr.HisOpt[ECHO].Accept = TRUE;    tr.HisOpt[ECHO].Accept = TRUE;
79    tr.MyOpt[TERMTYPE].Accept = TRUE;    tr.MyOpt[TERMTYPE].Accept = TRUE;
80    tr.MyOpt[NAWS].Accept = TRUE;    tr.MyOpt[NAWS].Accept = TRUE;
81    tr.HisOpt[NAWS].Accept = TRUE;    tr.HisOpt[NAWS].Accept = TRUE;
82    tr.WinSize.x = ts.TerminalWidth;    tr.WinSize.x = ts.TerminalWidth;
83    tr.WinSize.y = ts.TerminalHeight;    tr.WinSize.y = ts.TerminalHeight;
84    
85    if ((ts.LogFlag & LOG_TEL) != 0)    if ((ts.LogFlag & LOG_TEL) != 0)
86      tr.LogFile = _lcreat("TELNET.LOG",0);      tr.LogFile = _lcreat("TELNET.LOG",0);
87    else    else
88      tr.LogFile = 0;      tr.LogFile = 0;
89  }  }
90    
91  void EndTelnet()  void EndTelnet()
92  {  {
93    if (tr.LogFile != 0)    if (tr.LogFile != 0)
94    {    {
95      tr.LogFile = 0;      tr.LogFile = 0;
96      _lclose(tr.LogFile);      _lclose(tr.LogFile);
97    }    }
98    
99    TelStopKeepAliveThread();    TelStopKeepAliveThread();
100  }  }
101    
102  void TelWriteLog1(BYTE b)  void TelWriteLog1(BYTE b)
103  {  {
104    BYTE Temp[3];    BYTE Temp[3];
105    BYTE Ch;    BYTE Ch;
106    
107    Temp[0] = 0x20;    Temp[0] = 0x20;
108    Ch = b / 16;    Ch = b / 16;
109    if (Ch <= 9)    if (Ch <= 9)
110      Ch = Ch + 0x30;      Ch = Ch + 0x30;
111    else    else
112      Ch = Ch + 0x37;      Ch = Ch + 0x37;
113    Temp[1] = Ch;    Temp[1] = Ch;
114    
115    Ch = b & 15;    Ch = b & 15;
116    if (Ch <= 9)    if (Ch <= 9)
117      Ch = Ch + 0x30;      Ch = Ch + 0x30;
118    else    else
119      Ch = Ch + 0x37;      Ch = Ch + 0x37;
120    Temp[2] = Ch;    Temp[2] = Ch;
121    _lwrite(tr.LogFile,Temp,3);    _lwrite(tr.LogFile,Temp,3);
122  }  }
123    
124  void TelWriteLog(PCHAR Buf, int C)  void TelWriteLog(PCHAR Buf, int C)
125  {  {
126    int i;    int i;
127    
128    _lwrite(tr.LogFile,"\015\012>",3);    _lwrite(tr.LogFile,"\015\012>",3);
129    for (i = 0 ; i<= C-1 ; i++)    for (i = 0 ; i<= C-1 ; i++)
130      TelWriteLog1(Buf[i]);      TelWriteLog1(Buf[i]);
131  }  }
132    
133  void SendBack(BYTE a, BYTE b)  void SendBack(BYTE a, BYTE b)
134  {  {
135    BYTE Str3[3];    BYTE Str3[3];
136    
137    Str3[0] = IAC;    Str3[0] = IAC;
138    Str3[1] = a;    Str3[1] = a;
139    Str3[2] = b;    Str3[2] = b;
140    CommRawOut(&cv,Str3,3);    CommRawOut(&cv,Str3,3);
141    if (tr.LogFile!=0)    if (tr.LogFile!=0)
142      TelWriteLog(Str3,3);      TelWriteLog(Str3,3);
143  }  }
144    
145  void SendWinSize()  void SendWinSize()
146  {  {
147    int i;    int i;
148    BYTE TmpBuff[21];    BYTE TmpBuff[21];
149    
150    i = 0;    i = 0;
151    
152    TmpBuff[i] = IAC;    TmpBuff[i] = IAC;
153    i++;    i++;
154    TmpBuff[i] = SB;    TmpBuff[i] = SB;
155    i++;    i++;
156    TmpBuff[i] = NAWS;    TmpBuff[i] = NAWS;
157    i++;    i++;
158    TmpBuff[i] = HIBYTE(tr.WinSize.x);    TmpBuff[i] = HIBYTE(tr.WinSize.x);
159    i++;    i++;
160   /* if (LOBYTE(tr.WinSize.x) == IAC)   /* if (LOBYTE(tr.WinSize.x) == IAC)
161    {    {
162      tr.SendBackBuff[i] = IAC;      tr.SendBackBuff[i] = IAC;
163      i++;      i++;
164    } */    } */
165    TmpBuff[i] = LOBYTE(tr.WinSize.x);    TmpBuff[i] = LOBYTE(tr.WinSize.x);
166    i++;    i++;
167    TmpBuff[i] = HIBYTE(tr.WinSize.y);    TmpBuff[i] = HIBYTE(tr.WinSize.y);
168    i++;    i++;
169   /* if (LOBYTE(tr.WinSize.y) == IAC)   /* if (LOBYTE(tr.WinSize.y) == IAC)
170    {    {
171      tr.SendBackBuff[i] = IAC;      tr.SendBackBuff[i] = IAC;
172      i++;      i++;
173    } */    } */
174    TmpBuff[i] = LOBYTE(tr.WinSize.y);    TmpBuff[i] = LOBYTE(tr.WinSize.y);
175    i++;    i++;
176    TmpBuff[i] = IAC;    TmpBuff[i] = IAC;
177    i++;    i++;
178    TmpBuff[i]= SE;    TmpBuff[i]= SE;
179    i++;    i++;
180    
181    CommRawOut(&cv,TmpBuff,i);    CommRawOut(&cv,TmpBuff,i);
182    if (tr.LogFile!=0)    if (tr.LogFile!=0)
183      TelWriteLog(TmpBuff,i);      TelWriteLog(TmpBuff,i);
184  }  }
185    
186  void ParseTelIAC(BYTE b)  void ParseTelIAC(BYTE b)
187  {  {
188    switch (b) {    switch (b) {
189      case SE: break;      case SE: break;
190      case NOP:      case NOP:
191      case DM:      case DM:
192      case BREAK:      case BREAK:
193      case IP:      case IP:
194      case AO:      case AO:
195      case AYT:      case AYT:
196      case EC:      case EC:
197      case EL:      case EL:
198      case GOAHEAD:      case GOAHEAD:
199        TelStatus = TelIdle;        TelStatus = TelIdle;
200        break;        break;
201      case SB:      case SB:
202        TelStatus = TelSB;        TelStatus = TelSB;
203        tr.SubOptCount = 0;        tr.SubOptCount = 0;
204        break;        break;
205      case WILLTEL:      case WILLTEL:
206        TelStatus = TelWill;        TelStatus = TelWill;
207        break;        break;
208      case WONTTEL:      case WONTTEL:
209        TelStatus = TelWont;        TelStatus = TelWont;
210        break;        break;
211      case DOTEL:      case DOTEL:
212        TelStatus = TelDo;        TelStatus = TelDo;
213        break;        break;
214      case DONTTEL:      case DONTTEL:
215        TelStatus = TelDont;        TelStatus = TelDont;
216        break;        break;
217      case IAC:      case IAC:
218        TelStatus = TelIdle;        TelStatus = TelIdle;
219        break;        break;
220      default:      default:
221        TelStatus = TelIdle;        TelStatus = TelIdle;
222    }    }
223  }  }
224    
225  void ParseTelSB(BYTE b)  void ParseTelSB(BYTE b)
226  {  {
227    BYTE TmpStr[51];    BYTE TmpStr[51];
228    int i;    int i;
229    
230    if (tr.SubOptIAC)    if (tr.SubOptIAC)
231    {    {
232      tr.SubOptIAC = FALSE;      tr.SubOptIAC = FALSE;
233      switch (b) {      switch (b) {
234        case SE:        case SE:
235          if ((tr.MyOpt[TERMTYPE].Status == Yes) &&          if ((tr.MyOpt[TERMTYPE].Status == Yes) &&
236              (tr.SubOptCount >= 2) &&              (tr.SubOptCount >= 2) &&
237              (tr.SubOptBuff[0] == TERMTYPE) &&              (tr.SubOptBuff[0] == TERMTYPE) &&
238              (tr.SubOptBuff[1] == 1))              (tr.SubOptBuff[1] == 1))
239          {          {
240  #if 1  #if 1
241            _snprintf_s(TmpStr, sizeof(TmpStr), _TRUNCATE, "%c%c%c%c%s%c%c", IAC, SB, TERMTYPE, 0, ts.TermType, IAC, SE);            _snprintf_s(TmpStr, sizeof(TmpStr), _TRUNCATE, "%c%c%c%c%s%c%c", IAC, SB, TERMTYPE, 0, ts.TermType, IAC, SE);
242            // 4 バイト目に 0 が入るので、ずらして長さをとる            // 4 バイト目に 0 が入るので、ずらして長さをとる
243            i = strlen(TmpStr + 4) + 4;            i = strlen(TmpStr + 4) + 4;
244  #else  #else
245            TmpStr[0] = IAC;            TmpStr[0] = IAC;
246            TmpStr[1] = SB;            TmpStr[1] = SB;
247            TmpStr[2] = TERMTYPE;            TmpStr[2] = TERMTYPE;
248            TmpStr[3] = 0;            TmpStr[3] = 0;
249            strcpy(&TmpStr[4],ts.TermType);            strcpy(&TmpStr[4],ts.TermType);
250            i = 4 + strlen(ts.TermType);            i = 4 + strlen(ts.TermType);
251            TmpStr[i] = IAC;            TmpStr[i] = IAC;
252            i++;            i++;
253            TmpStr[i] = SE;            TmpStr[i] = SE;
254            i++;            i++;
255  #endif  #endif
256            CommRawOut(&cv,TmpStr,i);            CommRawOut(&cv,TmpStr,i);
257    
258            if (tr.LogFile!=0)            if (tr.LogFile!=0)
259              TelWriteLog(TmpStr,i);              TelWriteLog(TmpStr,i);
260          }          }
261          else if ( /* (tr.HisOpt[NAWS].Status == Yes) && */          else if ( /* (tr.HisOpt[NAWS].Status == Yes) && */
262                   (tr.SubOptCount >= 5) &&                   (tr.SubOptCount >= 5) &&
263                   (tr.SubOptBuff[0] == NAWS))                   (tr.SubOptBuff[0] == NAWS))
264          {          {
265            tr.WinSize.x = tr.SubOptBuff[1]*256+            tr.WinSize.x = tr.SubOptBuff[1]*256+
266                           tr.SubOptBuff[2];                           tr.SubOptBuff[2];
267            tr.WinSize.y = tr.SubOptBuff[3]*256+            tr.WinSize.y = tr.SubOptBuff[3]*256+
268                           tr.SubOptBuff[4];                           tr.SubOptBuff[4];
269            tr.ChangeWinSize = TRUE;            tr.ChangeWinSize = TRUE;
270          }          }
271          tr.SubOptCount = 0;          tr.SubOptCount = 0;
272          TelStatus = TelIdle;          TelStatus = TelIdle;
273          return ;          return ;
274        /* case IAC: braek; */        /* case IAC: braek; */
275        default:        default:
276          if (tr.SubOptCount >= sizeof(tr.SubOptBuff)-1)          if (tr.SubOptCount >= sizeof(tr.SubOptBuff)-1)
277          {          {
278            tr.SubOptCount = 0;            tr.SubOptCount = 0;
279            TelStatus = TelIdle;            TelStatus = TelIdle;
280            return;            return;
281          }          }
282          else {          else {
283            tr.SubOptBuff[tr.SubOptCount] = IAC;            tr.SubOptBuff[tr.SubOptCount] = IAC;
284            tr.SubOptCount++;            tr.SubOptCount++;
285            if (b==IAC)            if (b==IAC)
286            {            {
287              tr.SubOptIAC = TRUE;              tr.SubOptIAC = TRUE;
288              return;              return;
289            }            }
290          }          }
291      }      }
292    }    }
293    else    else
294      if (b==IAC)      if (b==IAC)
295      {      {
296        tr.SubOptIAC = TRUE;        tr.SubOptIAC = TRUE;
297        return;        return;
298      }      }
299    
300    if (tr.SubOptCount >= sizeof(tr.SubOptBuff)-1)    if (tr.SubOptCount >= sizeof(tr.SubOptBuff)-1)
301    {    {
302      tr.SubOptCount = 0;      tr.SubOptCount = 0;
303      tr.SubOptIAC = FALSE;      tr.SubOptIAC = FALSE;
304      TelStatus = TelIdle;      TelStatus = TelIdle;
305    }    }
306    else {    else {
307      tr.SubOptBuff[tr.SubOptCount] = b;      tr.SubOptBuff[tr.SubOptCount] = b;
308      tr.SubOptCount++;      tr.SubOptCount++;
309    }    }
310  }  }
311    
312  void ParseTelWill(BYTE b)  void ParseTelWill(BYTE b)
313  {  {
314    if (b <= MaxTelOpt)    if (b <= MaxTelOpt)
315    {    {
316      switch (tr.HisOpt[b].Status) {      switch (tr.HisOpt[b].Status) {
317        case No:        case No:
318          if (tr.HisOpt[b].Accept)          if (tr.HisOpt[b].Accept)
319          {          {
320            SendBack(DOTEL,b);            SendBack(DOTEL,b);
321            tr.HisOpt[b].Status = Yes;            tr.HisOpt[b].Status = Yes;
322          }          }
323          else          else
324            SendBack(DONTTEL,b);            SendBack(DONTTEL,b);
325          break;          break;
326        
327        case WantNo:        case WantNo:
328          switch (tr.HisOpt[b].Que) {          switch (tr.HisOpt[b].Que) {
329            case Empty:            case Empty:
330              tr.HisOpt[b].Status = No;              tr.HisOpt[b].Status = No;
331              break;              break;
332            case Opposite:            case Opposite:
333              tr.HisOpt[b].Status = Yes;              tr.HisOpt[b].Status = Yes;
334              break;              break;
335          }          }
336          break;          break;
337    
338        case WantYes:        case WantYes:
339          switch (tr.HisOpt[b].Que) {          switch (tr.HisOpt[b].Que) {
340            case Empty:            case Empty:
341              tr.HisOpt[b].Status = Yes;              tr.HisOpt[b].Status = Yes;
342              break;              break;
343            case Opposite:            case Opposite:
344              tr.HisOpt[b].Status = WantNo;              tr.HisOpt[b].Status = WantNo;
345              tr.HisOpt[b].Que = Empty;              tr.HisOpt[b].Que = Empty;
346              SendBack(DONTTEL,b);              SendBack(DONTTEL,b);
347              break;              break;
348          }          }
349          break;          break;
350      }      }
351    }    }
352    else    else
353      SendBack(DONTTEL,b);      SendBack(DONTTEL,b);
354    
355    switch (b) {    switch (b) {
356      case ECHO:      case ECHO:
357        if (ts.TelEcho>0)        if (ts.TelEcho>0)
358          switch (tr.HisOpt[ECHO].Status) {          switch (tr.HisOpt[ECHO].Status) {
359            case Yes:            case Yes:
360              ts.LocalEcho = 0;              ts.LocalEcho = 0;
361              break;              break;
362            case No:            case No:
363              ts.LocalEcho = 1;              ts.LocalEcho = 1;
364              break;              break;
365          }          }
366        break;        break;
367      case BINARY:      case BINARY:
368        switch (tr.HisOpt[BINARY].Status) {        switch (tr.HisOpt[BINARY].Status) {
369          case Yes:          case Yes:
370            cv.TelBinRecv = TRUE;            cv.TelBinRecv = TRUE;
371            break;            break;
372          case No:          case No:
373            cv.TelBinRecv = FALSE;            cv.TelBinRecv = FALSE;
374            break;            break;
375        }        }
376        break;        break;
377    }    }
378    TelStatus = TelIdle;    TelStatus = TelIdle;
379  }  }
380    
381  void ParseTelWont(BYTE b)  void ParseTelWont(BYTE b)
382  {  {
383    if (b <= MaxTelOpt)    if (b <= MaxTelOpt)
384    {    {
385      switch (tr.HisOpt[b].Status) {      switch (tr.HisOpt[b].Status) {
386        case Yes:        case Yes:
387          tr.HisOpt[b].Status = No;          tr.HisOpt[b].Status = No;
388          SendBack(DONTTEL,b);          SendBack(DONTTEL,b);
389          break;          break;
390    
391        case WantNo:        case WantNo:
392          switch (tr.HisOpt[b].Que) {          switch (tr.HisOpt[b].Que) {
393            case Empty:            case Empty:
394              tr.HisOpt[b].Status = No;              tr.HisOpt[b].Status = No;
395              break;              break;
396            case Opposite:            case Opposite:
397              tr.HisOpt[b].Status = WantYes;              tr.HisOpt[b].Status = WantYes;
398              tr.HisOpt[b].Que = Empty;              tr.HisOpt[b].Que = Empty;
399              SendBack(DOTEL,b);              SendBack(DOTEL,b);
400              break;              break;
401          }          }
402          break;          break;
403    
404        case WantYes:        case WantYes:
405          switch (tr.HisOpt[b].Que) {          switch (tr.HisOpt[b].Que) {
406            case Empty:            case Empty:
407              tr.HisOpt[b].Status = No;              tr.HisOpt[b].Status = No;
408              break;              break;
409            case Opposite:            case Opposite:
410              tr.HisOpt[b].Status = No;              tr.HisOpt[b].Status = No;
411              tr.HisOpt[b].Que = Empty;              tr.HisOpt[b].Que = Empty;
412              break;              break;
413          }          }
414          break;          break;
415      }      }
416    }    }
417    else    else
418      SendBack(DONTTEL,b);      SendBack(DONTTEL,b);
419    
420    switch (b) {    switch (b) {
421      case ECHO:      case ECHO:
422        if (ts.TelEcho>0)        if (ts.TelEcho>0)
423          switch (tr.HisOpt[ECHO].Status) {          switch (tr.HisOpt[ECHO].Status) {
424            case Yes:            case Yes:
425              ts.LocalEcho = 0;              ts.LocalEcho = 0;
426              break;              break;
427            case No:            case No:
428              ts.LocalEcho = 1;              ts.LocalEcho = 1;
429              break;              break;
430          }          }
431          break;          break;
432      case BINARY:      case BINARY:
433        switch (tr.HisOpt[BINARY].Status) {        switch (tr.HisOpt[BINARY].Status) {
434          case Yes:          case Yes:
435            cv.TelBinRecv = TRUE;            cv.TelBinRecv = TRUE;
436            break;            break;
437          case No:          case No:
438            cv.TelBinRecv = FALSE;            cv.TelBinRecv = FALSE;
439            break;            break;
440        }        }
441        break;        break;
442    }    }
443    TelStatus = TelIdle;    TelStatus = TelIdle;
444  }  }
445    
446  void ParseTelDo(BYTE b)  void ParseTelDo(BYTE b)
447  {  {
448    if (b <= MaxTelOpt)    if (b <= MaxTelOpt)
449    {    {
450      switch (tr.MyOpt[b].Status) {      switch (tr.MyOpt[b].Status) {
451        case No:        case No:
452          if (tr.MyOpt[b].Accept)          if (tr.MyOpt[b].Accept)
453          {          {
454            tr.MyOpt[b].Status = Yes;            tr.MyOpt[b].Status = Yes;
455            SendBack(WILLTEL,b);            SendBack(WILLTEL,b);
456          }          }
457          else          else
458            SendBack(WONTTEL,b);            SendBack(WONTTEL,b);
459          break;          break;
460    
461        case WantNo:        case WantNo:
462          switch (tr.MyOpt[b].Que) {          switch (tr.MyOpt[b].Que) {
463            case Empty:            case Empty:
464              tr.MyOpt[b].Status = No;              tr.MyOpt[b].Status = No;
465              break;              break;
466            case Opposite:            case Opposite:
467              tr.MyOpt[b].Status = Yes;              tr.MyOpt[b].Status = Yes;
468              break;              break;
469          }          }
470          break;          break;
471    
472        case WantYes:        case WantYes:
473          switch (tr.MyOpt[b].Que) {          switch (tr.MyOpt[b].Que) {
474            case Empty:            case Empty:
475              tr.MyOpt[b].Status = Yes;              tr.MyOpt[b].Status = Yes;
476              break;              break;
477            case Opposite:            case Opposite:
478              tr.MyOpt[b].Status = WantNo;              tr.MyOpt[b].Status = WantNo;
479              tr.MyOpt[b].Que = Empty;              tr.MyOpt[b].Que = Empty;
480              SendBack(WONTTEL,b);              SendBack(WONTTEL,b);
481              break;              break;
482          }          }
483          break;          break;
484      }      }
485    }    }
486    else    else
487      SendBack(WONTTEL,b);      SendBack(WONTTEL,b);
488    
489    switch (b) {    switch (b) {
490      case BINARY:      case BINARY:
491        switch (tr.MyOpt[BINARY].Status) {        switch (tr.MyOpt[BINARY].Status) {
492          case Yes:          case Yes:
493            cv.TelBinSend = TRUE;            cv.TelBinSend = TRUE;
494            break;            break;
495          case No:          case No:
496            cv.TelBinSend = FALSE;            cv.TelBinSend = FALSE;
497            break;            break;
498        }        }
499        break;        break;
500      case NAWS:      case NAWS:
501        if (tr.MyOpt[NAWS].Status==Yes)        if (tr.MyOpt[NAWS].Status==Yes)
502          SendWinSize();          SendWinSize();
503        break;        break;
504    }    }
505    TelStatus = TelIdle;    TelStatus = TelIdle;
506  }  }
507    
508  void ParseTelDont(BYTE b)  void ParseTelDont(BYTE b)
509  {  {
510    if (b <= MaxTelOpt)    if (b <= MaxTelOpt)
511    {    {
512      switch (tr.MyOpt[b].Status) {      switch (tr.MyOpt[b].Status) {
513        case Yes:        case Yes:
514          tr.MyOpt[b].Status = No;          tr.MyOpt[b].Status = No;
515          SendBack(WONTTEL,b);          SendBack(WONTTEL,b);
516          break;          break;
517    
518        case WantNo:        case WantNo:
519          switch (tr.MyOpt[b].Que) {          switch (tr.MyOpt[b].Que) {
520            case Empty:            case Empty:
521              tr.MyOpt[b].Status = No;              tr.MyOpt[b].Status = No;
522              break;              break;
523            case Opposite:            case Opposite:
524              tr.MyOpt[b].Status = WantYes;              tr.MyOpt[b].Status = WantYes;
525              tr.MyOpt[b].Que = Empty;              tr.MyOpt[b].Que = Empty;
526              SendBack(WILLTEL,b);              SendBack(WILLTEL,b);
527              break;              break;
528          }          }
529          break;          break;
530    
531        case WantYes:        case WantYes:
532          switch (tr.MyOpt[b].Que) {          switch (tr.MyOpt[b].Que) {
533            case Empty:            case Empty:
534              tr.MyOpt[b].Status = No;              tr.MyOpt[b].Status = No;
535              break;              break;
536            case Opposite:            case Opposite:
537              tr.MyOpt[b].Status = No;              tr.MyOpt[b].Status = No;
538              tr.MyOpt[b].Que = Empty;              tr.MyOpt[b].Que = Empty;
539              break;              break;
540          }          }
541          break;          break;
542      }      }
543    }    }
544    else    else
545      SendBack(WONTTEL,b);      SendBack(WONTTEL,b);
546    
547    switch (b) {    switch (b) {
548      case BINARY:      case BINARY:
549        switch (tr.MyOpt[BINARY].Status) {        switch (tr.MyOpt[BINARY].Status) {
550          case Yes:          case Yes:
551            cv.TelBinSend = TRUE;            cv.TelBinSend = TRUE;
552            break;            break;
553          case No:          case No:
554            cv.TelBinSend = FALSE;            cv.TelBinSend = FALSE;
555            break;            break;
556        }        }
557        break;        break;
558    }    }
559    TelStatus = TelIdle;    TelStatus = TelIdle;
560  }  }
561    
562  void ParseTel(BOOL *Size, int *nx, int *ny)  void ParseTel(BOOL *Size, int *nx, int *ny)
563  {  {
564    BYTE b;    BYTE b;
565    int c;    int c;
566    
567    c = CommReadRawByte(&cv,&b);    c = CommReadRawByte(&cv,&b);
568    
569    while ((c>0) && (cv.TelMode))    while ((c>0) && (cv.TelMode))
570    {    {
571      if (tr.LogFile!=0)      if (tr.LogFile!=0)
572      {      {
573        if (TelStatus==TelIAC)        if (TelStatus==TelIAC)
574        {        {
575          _lwrite(tr.LogFile,"\015\012<",3);          _lwrite(tr.LogFile,"\015\012<",3);
576          TelWriteLog1(0xff);          TelWriteLog1(0xff);
577        }        }
578        TelWriteLog1(b);        TelWriteLog1(b);
579      }      }
580    
581      tr.ChangeWinSize = FALSE;      tr.ChangeWinSize = FALSE;
582    
583      switch (TelStatus) {      switch (TelStatus) {
584        case TelIAC: ParseTelIAC(b); break;        case TelIAC: ParseTelIAC(b); break;
585        case TelSB: ParseTelSB(b); break;        case TelSB: ParseTelSB(b); break;
586        case TelWill: ParseTelWill(b); break;        case TelWill: ParseTelWill(b); break;
587        case TelWont: ParseTelWont(b); break;        case TelWont: ParseTelWont(b); break;
588        case TelDo: ParseTelDo(b); break;        case TelDo: ParseTelDo(b); break;
589        case TelDont: ParseTelDont(b); break;        case TelDont: ParseTelDont(b); break;
590        case TelNop: TelStatus = TelIdle; break;        case TelNop: TelStatus = TelIdle; break;
591      }      }
592      if (TelStatus == TelIdle) cv.TelMode = FALSE;      if (TelStatus == TelIdle) cv.TelMode = FALSE;
593    
594      if (cv.TelMode) c = CommReadRawByte(&cv,&b);      if (cv.TelMode) c = CommReadRawByte(&cv,&b);
595    }    }
596    
597    *Size = tr.ChangeWinSize;    *Size = tr.ChangeWinSize;
598    *nx = tr.WinSize.x;    *nx = tr.WinSize.x;
599    *ny = tr.WinSize.x;    *ny = tr.WinSize.x;
600  }  }
601    
602  void TelEnableHisOpt(BYTE b)  void TelEnableHisOpt(BYTE b)
603  {  {
604    if (b <= MaxTelOpt)    if (b <= MaxTelOpt)
605    {    {
606      switch (tr.HisOpt[b].Status) {      switch (tr.HisOpt[b].Status) {
607        case No:        case No:
608          tr.HisOpt[b].Status = WantYes;          tr.HisOpt[b].Status = WantYes;
609          SendBack(DOTEL,b);          SendBack(DOTEL,b);
610          break;          break;
611    
612        case WantNo:        case WantNo:
613          if (tr.HisOpt[b].Que==Empty)          if (tr.HisOpt[b].Que==Empty)
614            tr.HisOpt[b].Que = Opposite;            tr.HisOpt[b].Que = Opposite;
615          break;          break;
616    
617        case WantYes:        case WantYes:
618          if (tr.HisOpt[b].Que==Opposite)          if (tr.HisOpt[b].Que==Opposite)
619            tr.HisOpt[b].Que = Empty;            tr.HisOpt[b].Que = Empty;
620          break;          break;
621      }      }
622    }    }
623  }  }
624    
625  void TelDisableHisOpt(BYTE b)  void TelDisableHisOpt(BYTE b)
626  {  {
627    if (b <= MaxTelOpt)    if (b <= MaxTelOpt)
628    {    {
629      switch (tr.HisOpt[b].Status) {      switch (tr.HisOpt[b].Status) {
630        case Yes:        case Yes:
631          tr.HisOpt[b].Status = WantNo;          tr.HisOpt[b].Status = WantNo;
632          SendBack(DONTTEL,b);          SendBack(DONTTEL,b);
633          break;          break;
634    
635        case WantNo:        case WantNo:
636          if (tr.HisOpt[b].Que==Opposite)          if (tr.HisOpt[b].Que==Opposite)
637            tr.HisOpt[b].Que = Empty;            tr.HisOpt[b].Que = Empty;
638          break;          break;
639    
640        case WantYes:        case WantYes:
641          if (tr.HisOpt[b].Que==Empty)          if (tr.HisOpt[b].Que==Empty)
642            tr.HisOpt[b].Que = Opposite;            tr.HisOpt[b].Que = Opposite;
643          break;          break;
644      }      }
645    }    }
646  }  }
647    
648  void TelEnableMyOpt(BYTE b)  void TelEnableMyOpt(BYTE b)
649  {  {
650    if (b <= MaxTelOpt)    if (b <= MaxTelOpt)
651    {    {
652      switch (tr.MyOpt[b].Status) {      switch (tr.MyOpt[b].Status) {
653        case No:        case No:
654          tr.MyOpt[b].Status = WantYes;          tr.MyOpt[b].Status = WantYes;
655          SendBack(WILLTEL,b);          SendBack(WILLTEL,b);
656          break;          break;
657    
658        case WantNo:        case WantNo:
659          if (tr.MyOpt[b].Que==Empty)          if (tr.MyOpt[b].Que==Empty)
660            tr.MyOpt[b].Que = Opposite;            tr.MyOpt[b].Que = Opposite;
661          break;          break;
662    
663        case WantYes:        case WantYes:
664          if (tr.MyOpt[b].Que==Opposite)          if (tr.MyOpt[b].Que==Opposite)
665            tr.MyOpt[b].Que = Empty;            tr.MyOpt[b].Que = Empty;
666          break;          break;
667      }      }
668    }    }
669  }  }
670    
671  void TelDisableMyOpt(BYTE b)  void TelDisableMyOpt(BYTE b)
672  {  {
673    if (b <= MaxTelOpt)    if (b <= MaxTelOpt)
674    {    {
675      switch (tr.MyOpt[b].Status) {      switch (tr.MyOpt[b].Status) {
676        case Yes:        case Yes:
677          tr.MyOpt[b].Status = WantNo;          tr.MyOpt[b].Status = WantNo;
678          SendBack(WONTTEL,b);          SendBack(WONTTEL,b);
679          break;          break;
680    
681        case WantNo:        case WantNo:
682          if (tr.MyOpt[b].Que==Opposite)          if (tr.MyOpt[b].Que==Opposite)
683            tr.MyOpt[b].Que = Empty;            tr.MyOpt[b].Que = Empty;
684          break;          break;
685    
686        case WantYes:        case WantYes:
687          if (tr.MyOpt[b].Que==Empty)          if (tr.MyOpt[b].Que==Empty)
688            tr.MyOpt[b].Que = Opposite;            tr.MyOpt[b].Que = Opposite;
689          break;          break;
690      }      }
691    }    }
692  }  }
693    
694  void TelInformWinSize(int nx, int ny)  void TelInformWinSize(int nx, int ny)
695  {  {
696    if ((tr.MyOpt[NAWS].Status==Yes) &&    if ((tr.MyOpt[NAWS].Status==Yes) &&
697        ((nx!=tr.WinSize.x) ||        ((nx!=tr.WinSize.x) ||
698         (ny!=tr.WinSize.y)))         (ny!=tr.WinSize.y)))
699    {    {
700      tr.WinSize.x = nx;      tr.WinSize.x = nx;
701      tr.WinSize.y = ny;      tr.WinSize.y = ny;
702      SendWinSize();      SendWinSize();
703    }    }
704  }  }
705    
706  void TelSendAYT()  void TelSendAYT()
707  {  {
708    BYTE Str[2];    BYTE Str[2];
709    
710    Str[0] = IAC;    Str[0] = IAC;
711    Str[1] = AYT;    Str[1] = AYT;
712    CommRawOut(&cv,Str,2);    CommRawOut(&cv,Str,2);
713    CommSend(&cv);    CommSend(&cv);
714    if (tr.LogFile!=0)    if (tr.LogFile!=0)
715      TelWriteLog(Str,2);      TelWriteLog(Str,2);
716  }  }
717    
718  void TelSendBreak()  void TelSendBreak()
719  {  {
720    BYTE Str[2];    BYTE Str[2];
721    
722    Str[0] = IAC;    Str[0] = IAC;
723    Str[1] = BREAK;    Str[1] = BREAK;
724    CommRawOut(&cv,Str,2);    CommRawOut(&cv,Str,2);
725    CommSend(&cv);    CommSend(&cv);
726    if (tr.LogFile!=0)    if (tr.LogFile!=0)
727      TelWriteLog(Str,2);      TelWriteLog(Str,2);
728  }  }
729    
730  void TelChangeEcho()  void TelChangeEcho()
731  {  {
732    if (ts.LocalEcho==0)    if (ts.LocalEcho==0)
733      TelEnableHisOpt(ECHO);      TelEnableHisOpt(ECHO);
734    else    else
735      TelDisableHisOpt(ECHO);      TelDisableHisOpt(ECHO);
736  }  }
737    
738  void TelSendNOP()  void TelSendNOP()
739  {  {
740    BYTE Str[2];    BYTE Str[2];
741    
742    Str[0] = IAC;    Str[0] = IAC;
743    Str[1] = NOP;    Str[1] = NOP;
744    CommRawOut(&cv,Str,2);    CommRawOut(&cv,Str,2);
745    CommSend(&cv);    CommSend(&cv);
746    if (tr.LogFile!=0)    if (tr.LogFile!=0)
747      TelWriteLog(Str,2);      TelWriteLog(Str,2);
748  }  }
749    
750  #define WM_SEND_HEARTBEAT (WM_USER + 1)  #define WM_SEND_HEARTBEAT (WM_USER + 1)
751    
752  static LRESULT CALLBACK telnet_heartbeat_dlg_proc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)  static LRESULT CALLBACK telnet_heartbeat_dlg_proc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
753  {  {
754    
755          switch (msg) {          switch (msg) {
756                  case WM_INITDIALOG:                  case WM_INITDIALOG:
757                          return FALSE;                          return FALSE;
758    
759                  case WM_SEND_HEARTBEAT:                  case WM_SEND_HEARTBEAT:
760                          TelSendNOP();                          TelSendNOP();
761                          return TRUE;                          return TRUE;
762                          break;                          break;
763    
764                  case WM_COMMAND:                  case WM_COMMAND:
765                          switch (wp) {                          switch (wp) {
766                          }                          }
767    
768                          switch (LOWORD(wp)) {                          switch (LOWORD(wp)) {
769                                  case IDOK:                                  case IDOK:
770                                          {                                          {
771                                          return TRUE;                                          return TRUE;
772                                          }                                          }
773    
774                                  case IDCANCEL:                                  case IDCANCEL:
775                                          EndDialog(hWnd, 0);                                          EndDialog(hWnd, 0);
776                                          return TRUE;                                          return TRUE;
777                                  default:                                  default:
778                                          return FALSE;                                          return FALSE;
779                          }                          }
780                          break;                          break;
781    
782                  case WM_CLOSE:                  case WM_CLOSE:
783                          // closeボタンが押下されても window が閉じないようにする。                          // closeボタンが押下されても window が閉じないようにする。
784                          return TRUE;                          return TRUE;
785    
786                  case WM_DESTROY:                  case WM_DESTROY:
787                          return TRUE;                          return TRUE;
788    
789                  default:                  default:
790                          return FALSE;                          return FALSE;
791          }          }
792          return TRUE;          return TRUE;
793  }  }
794    
795    
796  static unsigned _stdcall TelKeepAliveThread(void *dummy) {  static unsigned _stdcall TelKeepAliveThread(void *dummy) {
797    static int instance = 0;    static int instance = 0;
798    
799    if (instance > 0)    if (instance > 0)
800      return 0;      return 0;
801    instance++;    instance++;
802    
803    while (cv.Open && nop_interval > 0) {    while (cv.Open && nop_interval > 0) {
804      if (time(NULL) >= cv.LastSendTime + nop_interval) {      if (time(NULL) >= cv.LastSendTime + nop_interval) {
805                  SendMessage(keepalive_dialog, WM_SEND_HEARTBEAT, 0, 0);                  SendMessage(keepalive_dialog, WM_SEND_HEARTBEAT, 0, 0);
806      }      }
807    
808      Sleep(100);      Sleep(100);
809    }    }
810    instance--;    instance--;
811    return 0;    return 0;
812  }  }
813    
814  void TelStartKeepAliveThread() {  void TelStartKeepAliveThread() {
815    unsigned tid;    unsigned tid;
816    
817    if (ts.TelKeepAliveInterval > 0) {    if (ts.TelKeepAliveInterval > 0) {
818      nop_interval = ts.TelKeepAliveInterval;      nop_interval = ts.TelKeepAliveInterval;
819    
820          // モードレスダイアログを追加 (2007.12.26 yutaka)          // モードレスダイアログを追加 (2007.12.26 yutaka)
821          keepalive_dialog = CreateDialog(hInst, MAKEINTRESOURCE(IDD_BROADCAST_DIALOG),          keepalive_dialog = CreateDialog(hInst, MAKEINTRESOURCE(IDD_BROADCAST_DIALOG),
822                 HVTWin, (DLGPROC)telnet_heartbeat_dlg_proc);                 HVTWin, (DLGPROC)telnet_heartbeat_dlg_proc);
823    
824      keepalive_thread = (HANDLE)_beginthreadex(NULL, 0, TelKeepAliveThread, NULL, 0, &tid);      keepalive_thread = (HANDLE)_beginthreadex(NULL, 0, TelKeepAliveThread, NULL, 0, &tid);
825      if (keepalive_thread == (HANDLE)-1) {      if (keepalive_thread == (HANDLE)-1) {
826        nop_interval = 0;        nop_interval = 0;
827      }      }
828    }    }
829  }  }
830    
831  void TelStopKeepAliveThread() {  void TelStopKeepAliveThread() {
832    if (keepalive_thread != (HANDLE)-1L) {    if (keepalive_thread != (HANDLE)-1L) {
833      nop_interval = 0;      nop_interval = 0;
834      WaitForSingleObject(keepalive_thread, INFINITE);      WaitForSingleObject(keepalive_thread, INFINITE);
835      CloseHandle(keepalive_thread);      CloseHandle(keepalive_thread);
836      keepalive_thread = (HANDLE)-1L;      keepalive_thread = (HANDLE)-1L;
837    
838          DestroyWindow(keepalive_dialog);          DestroyWindow(keepalive_dialog);
839    }    }
840  }  }
841    
842  void TelUpdateKeepAliveInterval() {  void TelUpdateKeepAliveInterval() {
843    if (cv.Open && cv.TelFlag && ts.TCPPort==ts.TelPort) {    if (cv.Open && cv.TelFlag && ts.TCPPort==ts.TelPort) {
844      if (ts.TelKeepAliveInterval > 0 && keepalive_thread == (HANDLE)-1)      if (ts.TelKeepAliveInterval > 0 && keepalive_thread == (HANDLE)-1)
845        TelStartKeepAliveThread();        TelStartKeepAliveThread();
846      else if (ts.TelKeepAliveInterval == 0 && keepalive_thread != (HANDLE)-1)      else if (ts.TelKeepAliveInterval == 0 && keepalive_thread != (HANDLE)-1)
847        TelStopKeepAliveThread();        TelStopKeepAliveThread();
848      else      else
849        nop_interval = ts.TelKeepAliveInterval;        nop_interval = ts.TelKeepAliveInterval;
850    }    }
851  }  }

Legend:
Removed from v.3226  
changed lines
  Added in v.3227

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26