#include ".\ftpnetwork.h" CFtpNetwork::CFtpNetwork(void) { m_hInetSession = NULL; //ÀÎÅÍ³Ý ¼¼¼Ç ÇÚµé m_hFtpConnection = NULL; //Ftp ¿¬°á ÇÚµé ZeroMemory( m_szIP, FTP_ADDRESS_SIZE ); ZeroMemory( m_szID, DEFAULT_BUFFER_SIZE ); //ID ZeroMemory( m_szPass, DEFAULT_BUFFER_SIZE ); //PASSWORD m_fnMsgCallBack = NULL; } CFtpNetwork::~CFtpNetwork(void) { } BOOL CFtpNetwork::Connect( TCHAR* pszIP, int nPort, TCHAR* pszID, TCHAR* pszPass, DWORD &ErrorCode ) { m_hInetSession = InternetOpen("UPDATE_FTP", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); if (m_hInetSession == NULL) { ErrorCode = GetLastError(); return FALSE; } //IP°ËÁõ if ( (strcmp(pszIP, "") == 0) || (pszIP == NULL) ) { ZeroMemory( m_szIP, FTP_ADDRESS_SIZE ); return FALSE; } else strncpy( m_szIP, pszIP, FTP_ADDRESS_SIZE ); //Port°ËÁõ if( nPort <= 0 || nPort > 60000 ) { m_nPort = 0; return FALSE; } else m_nPort = nPort; //ID°ËÁõ if ( (strcmp(pszID, "") == 0) || (pszID == NULL) ) { ZeroMemory( m_szID, DEFAULT_BUFFER_SIZE ); return FALSE; } else strncpy( m_szID, pszID, DEFAULT_BUFFER_SIZE ); //PASSWORD °ËÁõ if ( (strcmp(pszPass, "") == 0) || (pszPass == NULL) ) { ZeroMemory( m_szPass, DEFAULT_BUFFER_SIZE ); return FALSE; } else strncpy( m_szPass, pszPass, DEFAULT_BUFFER_SIZE ); //FTP ¿¬°á m_hFtpConnection =InternetConnect(m_hInetSession, m_szIP, m_nPort, m_szID, m_szPass, INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0); if(m_hFtpConnection == NULL) { ErrorCode = GetLastError(); return FALSE; } return TRUE; } void CFtpNetwork::DisConnect() { if( !m_hFtpConnection ) InternetCloseHandle( m_hFtpConnection ); if( !m_hInetSession ) InternetCloseHandle( m_hInetSession ); m_hFtpConnection = NULL; m_hInetSession = NULL; } //ÇöÀç ¼³Á¤µÈ FTPÀÇ µð·ºÅ丮 ³»¿¡¼­ ÆÄÀÏÀ» ã¾Æ¼­, ÆÄÀÏÀÇ Å©±â¿Í ½Ã°£Á¤º¸¸¦ ¾ò´Â´Ù. //¸®ÅϰªÀÌ FALSEÀ̸é, ÆÄÀÏÀ» ãÁö ¸øÇѰæ¿ìÀÌ´Ù. BOOL CFtpNetwork::GetFileInfo( const TCHAR* pszFile, WIN32_FIND_DATA& info ) { if( !m_hFtpConnection ) return FALSE; if( (strcmp( pszFile, "" ) == 0) || (pszFile == NULL) ) return FALSE; HINTERNET hFind; BOOL bResult = TRUE; hFind = FtpFindFirstFile( m_hFtpConnection, "*.*", &info, 0, 0 ); if( hFind != NULL ) { //NULLÀÌ ¾Æ´Ï¸é ÃÖÃÊÀÇ ÆÄÀÏ(¶Ç´Â Æú´õ)¸¦ ã¾Ò´Ù.. do { if( strcmp( info.cFileName, pszFile ) == 0 ) //ã´Â ÆÄÀÏÀ̸é.. { InternetCloseHandle( hFind ); return TRUE; } } while( bResult = InternetFindNextFile( hFind, &info ) ); } else { DWORD dwError = GetLastError(); if( dwError == ERROR_INTERNET_EXTENDED_ERROR ) { char buf[DEFAULT_BUFFER_SIZE]; DWORD dwLen = DEFAULT_BUFFER_SIZE; InternetGetLastResponseInfo( &dwError, buf, &dwLen ); } } InternetCloseHandle( hFind ); return FALSE; } BOOL CFtpNetwork::SetDirectory( const TCHAR* pszDir ) //FTPÀÇ µð·ºÅ丮¸¦ ¼³Á¤ÇÑ´Ù. { return FtpSetCurrentDirectory( m_hFtpConnection, pszDir ); } BOOL CFtpNetwork::GetDirectory( TCHAR* pszDir, DWORD dwSize ) //ÇöÀç FTPÀÇ µð·ºÅ丮¸¦ °¡Á®¿Â´Ù. { return FtpGetCurrentDirectory( m_hFtpConnection, pszDir, &dwSize ); } HINTERNET CFtpNetwork::OpenFtpFile( TCHAR* pszFile ) { HINTERNET hRemoteFile; INT iCount = MAX_RETRY_OPENFILE; while(iCount--) { hRemoteFile = ::FtpOpenFile( m_hFtpConnection, pszFile, GENERIC_READ, FTP_TRANSFER_TYPE_BINARY | INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE, 0);//(DWORD)this); if( hRemoteFile == NULL ) Sleep(100); else break; } if( iCount < 1 ) //ÆÄÀÏÀ» ãÀ»¼ö ¾øÀ¸¸é.. return NULL; return hRemoteFile; } // ¿ø°ÝÁöÀÇ ÆÄÀÏÀÇ ³»¿ëÀ» ·ÎÄà ÆÄÀÏ¿¡ ±â·ÏÇÑ´Ù. // hRemoteFile : ´Ù¿î¹ÞÀ» FTP¼­¹öÀÇ ÆÄÀÏ À̸§ // hRemoteFileLength : ¿ø°ÝÁö ÆÄÀÏ Å©±â. // hLocalFile : ·ÎÄÿ¡ ±â·ÏÇÒ ÆÄÀÏÀÇ À̸§ // ÆÄÀÏÀÇ ´Ù¿î·Îµå ÁøÇà»óȲÀ» ¾Ë±â À§Çؼ­, hLocalFile¿¡ ¾²´Â ¹æ¹ýÀ» ÅÃÇß´Ù. BOOL CFtpNetwork::DownloadFile( const HINTERNET hRemoteFile, DWORD dwRemoteFileLength, HANDLE hLocalFile ) { DWORD dwNowRecvBytes, dwNowWrittenBytes, dwTotalWrittenBytes; dwNowRecvBytes = dwNowWrittenBytes = dwTotalWrittenBytes = 0; //1. ÆÄÀÏ ´Ù¿î·Îµå //ÆÄÀÏÀÌ ¿ø°Ý¼­¹ö¿¡ Á¸ÀçÇϴµ¥, Å©±â°¡ 0Àΰæ¿ì´Â TRUE¸¦ ¸®ÅÏÇϴ°ÍÀ¸·Î ÇÑ´Ù. if( dwRemoteFileLength > 0 ) { while(TRUE) { if ( !InternetReadFile( hRemoteFile, m_szFtpBuffer, sizeof(m_szFtpBuffer), &dwNowRecvBytes) ) return FALSE; if ( !WriteFile( hLocalFile, m_szFtpBuffer, dwNowRecvBytes, &dwNowWrittenBytes, NULL ) ) return FALSE; dwTotalWrittenBytes += dwNowWrittenBytes; // ÇöÀç±îÁö ¾²¿©Áø ÆÄÀÏÀÇ ¿ë·®ÀÌ Àüü ÆÄÀÏÀÇ ¿ë·®º¸´Ù °°°Å³ª Å©´Ù¸é... if ( dwTotalWrittenBytes >= dwRemoteFileLength ) break; } } else if( dwRemoteFileLength < 0 ) return FALSE; return TRUE; } //ÇØ´ç À©µµ¿ì·Î Á¤º¸ Ãâ·Â ÄÚµå Æ÷ÇÔÇÏ´Â ÇÔ¼ö BOOL CFtpNetwork::DownloadFile( const HINTERNET hRemoteFile, WIN32_FIND_DATA& RemoteInfo, HANDLE hLocalFile ) { DWORD dwNowRecvBytes, dwNowWrittenBytes, dwTotalWrittenBytes; dwNowRecvBytes = dwNowWrittenBytes = dwTotalWrittenBytes = 0; //1. ÆÄÀÏ ´Ù¿î·Îµå //ÆÄÀÏÀÌ ¿ø°Ý¼­¹ö¿¡ Á¸ÀçÇϴµ¥, Å©±â°¡ 0Àΰæ¿ì´Â TRUE¸¦ ¸®ÅÏÇϴ°ÍÀ¸·Î ÇÑ´Ù. if( RemoteInfo.nFileSizeLow > 0 ) { while(TRUE) { if ( !InternetReadFile( hRemoteFile, m_szFtpBuffer, sizeof(m_szFtpBuffer), &dwNowRecvBytes) ) return FALSE; if ( !WriteFile( hLocalFile, m_szFtpBuffer, dwNowRecvBytes, &dwNowWrittenBytes, NULL ) ) return FALSE; dwTotalWrittenBytes += dwNowWrittenBytes; //ÇöÀç ÆÄÀÏÀÇ ´Ù¿î·Îµå Á¤º¸ Ãâ·Â m_UpdateFileInfo.SetFileName( RemoteInfo.cFileName ); m_UpdateFileInfo.SetNowFileSize( dwTotalWrittenBytes ); m_UpdateFileInfo.SetWholeFileSize( RemoteInfo.nFileSizeLow ); AddMessage( WM_FILE_DOWNLOAD_WORKING, &m_UpdateFileInfo ); // ÇöÀç±îÁö ¾²¿©Áø ÆÄÀÏÀÇ ¿ë·®ÀÌ Àüü ÆÄÀÏÀÇ ¿ë·®º¸´Ù °°°Å³ª Å©´Ù¸é... if ( dwTotalWrittenBytes >= RemoteInfo.nFileSizeLow ) break; } } else if( RemoteInfo.nFileSizeLow < 0 ) return FALSE; return TRUE; } void CFtpNetwork::GetIP( TCHAR* pszIP, int nSize ) { ZeroMemory( pszIP, nSize ); strncpy( pszIP, m_szIP, nSize ); } void CFtpNetwork::AddMessage( UINT uMsg, VOID* pData ) { if( !m_fnMsgCallBack ) return; m_fnMsgCallBack( uMsg, (VOID*)pData ); } BOOL CFtpNetwork::IsConnectFTP() { if( m_hFtpConnection ) return TRUE; else return FALSE; } VOID CFtpNetwork::SetMsgCallBack( fnMsgCallBack CallBack ) { if( !CallBack ) return; m_fnMsgCallBack = CallBack; }