?? ctelnetview.cpp
字號:
// CTelnetView.cpp : implementation of the CTelnetView class
//
#include "stdafx.h"
#include "CTelnet.h"
#include "CTelnetDoc.h"
#include "CTelnetView.h"
#include "MainFrm.h"
#include "ClientSocket.h"
#include "Process.h"
#include "HostDialog.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern CMultiDocTemplate * pDocTemplate;
/////////////////////////////////////////////////////////////////////////////
// CTelnetView
IMPLEMENT_DYNCREATE(CTelnetView, CScrollView)
BEGIN_MESSAGE_MAP(CTelnetView, CScrollView)
//{{AFX_MSG_MAP(CTelnetView)
ON_WM_CHAR()
ON_WM_SIZE()
ON_WM_ERASEBKGND()
ON_WM_KEYDOWN()
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
ON_COMMAND(ID_FILE_NEW, OnFileNew)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTelnetView construction/destruction
CTelnetView::CTelnetView()
{
cTextColor = RGB(0,200,000);
cBackgroundColor = RGB(000,000,000);
cSock = NULL;
bOptionsSent = FALSE;
TempCounter = 0;
cCursX = 0;
CurrentXX=0;
CurrentYY=0;
IfOutput=false;
// OffsetNum=0;
for(int x = 0; x < 80; x++)
{
for(int y = 0; y < bufferLines; y++)
{
cText[x][y] = ' ';
}
}
}
CTelnetView::~CTelnetView()
{
if(cSock != NULL)
delete cSock;
cSock = NULL;
}
BOOL CTelnetView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CScrollView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CTelnetView drawing
void CTelnetView::OnDraw(CDC* pDC)
{
CTelnetDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC->SelectObject(GetStockObject(ANSI_FIXED_FONT));
DrawCursor(pDC,FALSE);
DoDraw(pDC);
DrawCursor(pDC,TRUE);
}
void CTelnetView::DoDraw(CDC* pDC)
{
CString strLine;
BOOL bSkip = FALSE;
CRect clip;
pDC->GetClipBox(clip);
clip.top -= dtY;
pDC->SetTextColor(cTextColor);
// pDC->SetBkColor(cBackgroundColor);
// CurrentXX=0;
char text[2] = {0x00, 0x00};
for(int y = 0; y < bufferLines; y++)
{
//if(y * dtY >= clip.top)
//{
for(int x = 0; x < 80; x++)
{
text[0] = cText[x][y];
if(text[0] == 27)
bSkip = TRUE;
if(!bSkip)
strLine += text[0];
if(text[0] == 'm' && bSkip)
bSkip = FALSE;
}
pDC->TextOut(0, y * dtY, strLine);
strLine.Empty();
//}
}
}
void CTelnetView::OnInitialUpdate()
{
CSize sizeTotal;
// TODO: calculate the total size of this view
sizeTotal.cx = dtX * 80 + 3;
sizeTotal.cy = dtY * bufferLines + 3;
SetScrollSizes(MM_TEXT, sizeTotal);
//SetWindowPos(NULL,0,0,sizeTotal.cx,sizeTotal.cy,SWP_NOMOVE);
// ScrollToPosition(CPoint(0, bufferLines * 1000)); //go way past the end
CScrollView::OnInitialUpdate();
}
/////////////////////////////////////////////////////////////////////////////
// CTelnetView printing
BOOL CTelnetView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CTelnetView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CTelnetView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CTelnetView diagnostics
#ifdef _DEBUG
void CTelnetView::AssertValid() const
{
CScrollView::AssertValid();
}
void CTelnetView::Dump(CDumpContext& dc) const
{
CScrollView::Dump(dc);
}
CTelnetDoc* CTelnetView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CTelnetDoc)));
return (CTelnetDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CTelnetView message handlers
//接收分析數據
void CTelnetView::ProcessMessage(CClientSocket * pSock)
{
if(!IsWindow(m_hWnd)) return;
if(!IsWindowVisible()) return;
//保存數據到m_bBuf
int nBytes = pSock->Receive(m_bBuf ,ioBuffSize );
if(nBytes != SOCKET_ERROR)
{
int ndx = 0;
//每次讀入一行數據
while(GetLine(m_bBuf, nBytes, ndx) != TRUE);
//進行協商
ProcessOptions();
MessageReceived(m_strNormalText);
}
m_strLine.Empty();
m_strResp.Empty();
}
//進行協商
void CTelnetView::ProcessOptions()
{
CString m_strTemp;
CString m_strOption;
unsigned char ch;
int ndx;
int ldx;
BOOL bScanDone = FALSE;
m_strTemp = m_strLine;
while(!m_strTemp.IsEmpty() && bScanDone != TRUE)
{
ndx = m_strTemp.Find(IAC);
if(ndx != -1)
{
m_strNormalText += m_strTemp.Left(ndx);
ch = m_strTemp.GetAt(ndx + 1);
switch(ch)
{
case DO:
case DONT:
case WILL:
case WONT:
m_strOption = m_strTemp.Mid(ndx, 3);
m_strTemp = m_strTemp.Mid(ndx + 3);
m_strNormalText = m_strTemp.Left(ndx);
m_ListOptions.AddTail(m_strOption);
break;
case IAC:
m_strNormalText = m_strTemp.Left(ndx);
m_strTemp = m_strTemp.Mid(ndx + 1);
break;
case SB:
m_strNormalText = m_strTemp.Left(ndx);
ldx = Find(m_strTemp, SE);
m_strOption = m_strTemp.Mid(ndx, ldx);
m_ListOptions.AddTail(m_strOption);
m_strTemp = m_strTemp.Mid(ldx);
//AfxMessageBox(m_strOption,MB_OK);
break;
default:
bScanDone = TRUE;
}
}
else
{
m_strNormalText = m_strTemp;
bScanDone = TRUE;
}
}
RespondToOptions();
}
void CTelnetView::RespondToOptions()
{
CString strOption;
while(!m_ListOptions.IsEmpty())
{
strOption = m_ListOptions.RemoveHead();
ArrangeReply(strOption);
}
DispatchMessage(m_strResp);
m_strResp.Empty();
}
void CTelnetView::ArrangeReply(CString strOption)
{
unsigned char Verb;
unsigned char Option;
unsigned char Modifier;
unsigned char ch;
BOOL bDefined = FALSE;
if(strOption.GetLength() < 3) return;
Verb = strOption.GetAt(1);
Option = strOption.GetAt(2);
switch(Option)
{
case 1: //回顯
case 3: // Suppress Go-Ahead
bDefined = TRUE;
break;
}
m_strResp += IAC;
if(bDefined == TRUE)
{
switch(Verb)
{
case DO:
ch = WILL;
m_strResp += ch;
m_strResp += Option;
break;
case DONT:
ch = WONT;
m_strResp += ch;
m_strResp += Option;
break;
case WILL:
ch = DO;
m_strResp += ch;
m_strResp += Option;
break;
case WONT:
ch = DONT;
m_strResp += ch;
m_strResp += Option;
break;
case SB:
Modifier = strOption.GetAt(3);
if(Modifier == SEND)
{
ch = SB;
m_strResp += ch;
m_strResp += Option;
m_strResp += IS;
m_strResp += IAC;
m_strResp += SE;
}
break;
}
}
else
{
switch(Verb)
{
case DO:
ch = WONT;
m_strResp += ch;
m_strResp += Option;
break;
case DONT:
ch = WONT;
m_strResp += ch;
m_strResp += Option;
break;
case WILL:
ch = DONT;
m_strResp += ch;
m_strResp += Option;
break;
case WONT:
ch = DONT;
m_strResp += ch;
m_strResp += Option;
break;
}
}
}
//發送數據
void CTelnetView::DispatchMessage(CString strText)
{
ASSERT(cSock);
cSock->Send(strText, strText.GetLength());
}
//獲得一行數據
BOOL CTelnetView::GetLine( unsigned char * bytes, int nBytes, int& ndx )
{
BOOL bLine = FALSE;
while ( bLine == FALSE && ndx < nBytes )
{
unsigned char ch = bytes[ndx];
//原來設計的時候要去掉回車換行的,但是后來發現不能去掉
switch( ch )
{
case '\r': //
m_strLine += "\r"; //回車
break;
case '\n': // 行結尾
m_strLine += "\n";
break;
default: // 其他數據
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -