// View.cpp : implementation of the CMiniFTPView class
//
#include "stdafx.h"
#include "miniftp.h"
#include "Doc.h"
#include "View.h"
//#include "cwinsock.h" // in this files .h
#include "mainfrm.h"
#include "conndlg.h"
#include "XportDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define WM_WINSOCK_EVENT_FRAME_CONTROL (WM_USER+4) // for winsock messages
#define WM_WINSOCK_EVENT_VU_CONTROL (WM_USER+4+10) // for winsock messages
#define WM_WINSOCK_EVENT_FRAME_LISTEN (WM_USER+6) // for winsock messages
#define WM_WINSOCK_EVENT_VU_LISTEN (WM_USER+6+10) // for winsock messages
#define WM_WINSOCK_EVENT_FRAME_DATA (WM_USER+8) // for winsock messages
#define WM_WINSOCK_EVENT_VU_DATA (WM_USER+8+10) // for winsock messages
/////////////////////////////////////////////////////////////////////////////
// CMiniFTPView
IMPLEMENT_DYNCREATE(CMiniFTPView, CEditView)
BEGIN_MESSAGE_MAP(CMiniFTPView, CEditView)
//{{AFX_MSG_MAP(CMiniFTPView)
ON_COMMAND(ID_CONNECT, OnConnect)
ON_COMMAND(ID_CLOSECONN, OnCloseconn)
ON_COMMAND(ID_CLEARVIEW, OnClearview)
ON_UPDATE_COMMAND_UI(ID_CLOSECONN, OnUpdateCloseconn)
ON_UPDATE_COMMAND_UI(ID_CONNECT, OnUpdateConnect)
ON_WM_TIMER()
ON_COMMAND(ID_FSETTINGS, OnFsettings)
//}}AFX_MSG_MAP
ON_MESSAGE(WM_WINSOCK_EVENT_VU_CONTROL,OnWinsockEventControl)
ON_MESSAGE(WM_WINSOCK_EVENT_VU_LISTEN,OnWinsockEventListen)
ON_MESSAGE(WM_WINSOCK_EVENT_VU_DATA,OnWinsockEventData)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMiniFTPView construction/destruction
CMiniFTPView::CMiniFTPView()
{
WSAData WsaData;
int ret = WSAStartup(0x0101, &WsaData);
if( ret != 0 )
{
AfxMessageBox("WSAStartup failed");
}
m_sktControl = INVALID_SOCKET;
m_sktListen = INVALID_SOCKET;
m_sktData = INVALID_SOCKET;
//m_pWinsockControl = NULL;
//m_pWinsockListen = NULL;
//m_pWinsockData = NULL;
m_nState = 0;
m_pXferFilePointer = NULL;
m_bTimerOn = FALSE;
m_bWaitingForTimeout = FALSE;
MakeSafeState();
m_nRadioASCII = AfxGetApp()->GetProfileInt("Setting", "ASCII", 0);
m_sExportFileName = AfxGetApp()->GetProfileString("Setting", "Name", "RETRFILE.txt");
}
void CMiniFTPView::MakeSafeState(void)
{
if( m_bWaitingForTimeout )
{
KillTimer( ID_MYTIMEOUT );
}
m_bWaitingForTimeout = FALSE;
if( m_bTimerOn )
{
KillTimer( ID_MYTIMER );
}
m_bTimerOn = FALSE;
m_nState = 0;
if( m_pXferFilePointer != NULL)
{
fclose( m_pXferFilePointer );
m_pXferFilePointer = NULL;
}
//m_bInTransit = FALSE;
//m_bStartLogon = FALSE;
//m_bStartCommand = FALSE;
m_bReplyReceived = FALSE;
//m_bCommandToSend = FALSE;
m_bTimerOn = FALSE;
m_bBusy = FALSE;
m_bWaitingForTimeout = FALSE;
strcpy(m_szCommandToServer, "" );
m_bSavingFile = FALSE;
m_bFileHasBeenSaved = FALSE;
m_bStoringFile = FALSE;
m_bFileHasBeenStored = FALSE;
}
CMiniFTPView::~CMiniFTPView()
{
if( m_sktData != INVALID_SOCKET )
{
closesocket(m_sktData);
}
if( m_sktListen != INVALID_SOCKET )
{
closesocket(m_sktListen);
}
if( m_sktControl != INVALID_SOCKET )
{
closesocket(m_sktControl);
}
WSACleanup();
}
BOOL CMiniFTPView::PreCreateWindow(CREATESTRUCT& cs)
{
BOOL bPreCreated = CEditView::PreCreateWindow(cs);
cs.style &= ~(ES_AUTOHSCROLL|WS_HSCROLL); // Enable word-wrapping
cs.style |= ES_READONLY; // make read only - it is a log window
return bPreCreated;
}
/////////////////////////////////////////////////////////////////////////////
// CMiniFTPView drawing
void CMiniFTPView::OnDraw(CDC* pDC)
{
CMiniFTPDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
}
/////////////////////////////////////////////////////////////////////////////
// CMiniFTPView diagnostics
#ifdef _DEBUG
void CMiniFTPView::AssertValid() const
{
CEditView::AssertValid();
}
void CMiniFTPView::Dump(CDumpContext& dc) const
{
CEditView::Dump(dc);
}
CMiniFTPDoc* CMiniFTPView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMiniFTPDoc)));
return (CMiniFTPDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMiniFTPView message handlers
/////////////////////////////////////////////////////////////////////////////
void CMiniFTPView::Log(const char * szBuffer)
{
int nChars=GetWindowTextLength(); // get the index of the last line
// point end of document
GetEditCtrl().SetSel( nChars,nChars );
GetEditCtrl().ReplaceSel((LPCSTR)szBuffer); // display text
// defeat the final "save document" dialog on app exit
GetDocument()->SetModifiedFlag(FALSE);
}
/////////////////////////////////////////////////////////////////////////////
void CMiniFTPView::OnTimer(UINT nIDEvent)
{
if( nIDEvent == ID_MYTIMER)
{
StateMachine();
}
else if( nIDEvent == ID_MYTIMEOUT)
{
MakeSafeState();
Log("\r\nMiniFTP Status>Client Timeout\r\n\r\n");
}
}
////////////////////////////////////////////////////////////////////////////
// the major sequencer for client/server stuff
void CMiniFTPView::StateMachine(void)
{
CString sOut;
switch ( m_nState ) // which state are we in now ?
{
case 0:
if( !m_sCommandList.IsEmpty() && !m_bBusy )
{
m_bBusy = TRUE;
SetTimer(ID_MYTIMEOUT, 30000, NULL);
m_bWaitingForTimeout = TRUE;
m_bReplyReceived = FALSE;
sOut = m_sCommandList.GetHead();
m_sCommandList.RemoveHead();
DoCommand( sOut );
m_nState = 1;
}
break;
case 1:
if( m_bReplyReceived )
{
m_bReplyReceived = FALSE;
m_nState = 0;
KillTimer(ID_MYTIMEOUT);
m_bWaitingForTimeout = FALSE;
if( m_sCommandList.IsEmpty() )
{
KillTimer(ID_MYTIMER);
m_bTimerOn =FALSE;
}
m_bBusy = FALSE;
}
break;
}
}
/////////////////////////////////////////////////////////////////////////////
void CMiniFTPView::DisplaySktRead( char * szBuffer )
{
char * str=strtok(szBuffer,"\n");
while( str && *str)
{
Log((const char *)str);
int nLen = strlen(str);
int nCount = (int)(str-szBuffer)+nLen;
if( nCount != NUM1024 )
{
Log("\r\n");
}
else
{
ASSERT( nCount == NUM1024 );
char c = *(szBuffer + NUM1024 -1);
if( c == '\n' )
{
Log("\r\n");
}
}
str=strtok((char *)NULL,"\n");
}
}
/////////////////////////////////////////////////////////////////////////////
LONG CMiniFTPView::OnWinsockEventControl (WPARAM wParam, LPARAM lParam)
{
ASSERT( m_sktControl == wParam );
memset( m_szControlReplyBuffer, 0, NUM1024+2);
// this memset trick avoids having strtok insert a wild \0 somewhere bad
// it is guaranteed to find a \n (the delimiter in this case) before
// running off into other memory
memset( m_szControlReplyBuffer+NUM1024, '\n', 1);
CString sOut;
switch ( WSAGETSELECTEVENT(lParam) ) // which message arrived?
{
case FD_CLOSE:
sOut.Format( "\r\nMiniFTP Status>Control Connection closed by server (socket %d)\r\n\r\n", wParam);
Log(sOut);
m_sktControl = INVALID_SOCKET;
break;
case FD_READ:
recv( m_sktControl, m_szControlReplyBuffer, NUM1024, 0 );
DisplaySktRead( m_szControlReplyBuffer );
m_bReplyReceived = TRUE;
break;
case FD_ACCEPT:
/*ASSERT(m_pWinsockListen != NULL);
sTemp = m_pWinsockListen->Accept(NULL,NULL);*/
//sTemp = m_pWinsockListen->GetWSocket();
/*ASSERT(sTemp != INVALID_SOCKET);
m_pWinsockData->SetSocket(sTemp);
m_pWinsockData->SetSockOpt(SOL_SOCKET,SO_LINGER,0,0);
m_pWinsockData->SetSockOpt(SOL_SOCKET,SO_REUSEADDR,0,0);
m_pWinsockData->SetSockOpt(SOL_SOCKET,SO_KEEPALIVE,0,0);
m_pWinsockData->SetSockOpt(SOL_SOCKET,SO_OOBINLINE,0,0);*/
//m_pWinsockListen->CloseSocket();
// its a window so destroy it f
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论















格式:x-rar 资源大小:507.4KB















收起资源包目录


























































共 54 条
- 1
资源评论

- yjw1989c20122012-04-21不是基于对话框的工程 编译能成功

hangyu628
- 粉丝: 14
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 大数据背景下的信息处理技术分析与研究.docx
- mssqlserver2000企业安装教程.doc
- 促进大数据发展行动纲要.doc
- 徐水职教中心计算机专业的教材建设及设计问题.docx
- 软件销售技巧销售话术.doc
- 软件测试技术基础CH.ppt
- 中小型餐厅无线监控网络一体化解决方案.doc
- 斜齿轮传动计算机辅助设计VB.doc
- 天津工程技术师范学院数控机床与编程试题库附答案.doc
- 基于百度文字识别 API 的身份证银行卡驾驶证行驶证快速识别工具
- 创新基金网络工作系统培训.docx
- 基于MATLAB的通信系统的方案设计书与仿真.doc
- 通信技术概论信号能量谱密度与功率谱密度.doc
- 大数据时代大学生思想政治教育探析.docx
- 计算机软件考试考生的报考动机研究.docx
- 电子商务(图书)微观环境研究分析.doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制
