www.pudn.com > WZ_UpdateModule_DLL.rar > FtpUpdate.cpp
#include "WZ_UM.h"
#include "ReadScript.h"
WZ_DECLAREDLL CWZFtpUpdateModule::CWZFtpUpdateModule ()
{
m_hUpdateThread = NULL;
m_hCheckThread = NULL;
m_nCheckThreadID = 0;
m_bConnected = FALSE;
}
WZ_DECLAREDLL CWZFtpUpdateModule::CWZFtpUpdateModule (LPSTR lpszIPADDR, WORD wPORT, LPSTR lpszID, LPSTR lpszPASS)
: CWZUpdateModule (lpszIPADDR, wPORT, lpszID, lpszPASS)
{
m_hUpdateThread = NULL;
m_hCheckThread = NULL;
m_nCheckThreadID = 0;
m_bConnected = FALSE;
}
WZ_DECLAREDLL CWZFtpUpdateModule::~CWZFtpUpdateModule ()
{
}
WZ_DECLAREDLL BOOL CWZFtpUpdateModule::Connect ()
{
AddEvent( EVENT_CONNECTING );
m_iCurrentState = STATE_CONNECTING;
// error check
if (! strcmp (m_szIPADDR, ""))
{
m_iCurrentState = STATE_DISCONNECTED;
return FALSE;
}
if (! m_wPORT)
m_wPORT = PORT_FTP;
m_hINET_SESSION = InternetOpen("UPDATE_FTP", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
if (m_hINET_SESSION == NULL)
{
// "ÀÎÅÍ³Ý ¿¬°á ½ÇÆÐ"
m_iCurrentState = STATE_DISCONNECTED;
SetLastErrorMsg(CWZUpdateModule::ERROR_SYSTEM, GetLastError());
return FALSE;
}
m_hFTP_CONNECTION =InternetConnect(m_hINET_SESSION, m_szIPADDR, m_wPORT, m_szID, m_szPASS, INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
if (m_hFTP_CONNECTION==NULL)
{
// "FTP ¿¡ Á¢¼ÓÇÒ ¼ö ¾ø½À´Ï´Ù."
InternetCloseHandle(m_hINET_SESSION);
m_iCurrentState = STATE_DISCONNECTED;
AddEvent( EVENT_CONNECT_FAIL );
return FALSE;
}
m_iCurrentState = STATE_CONNECTED;
m_bConnected = TRUE;
AddEvent( EVENT_CONNECT_SUCCESS );
//Connect Check Thread
/*
m_nCheckThreadID = 2;
m_hCheckThread = (HANDLE) _beginthreadex (NULL, NULL, CheckConnectThread, (LPVOID) this, 0, &m_nCheckThreadID);
if (m_hCheckThread == INVALID_HANDLE_VALUE)
{
if (m_lpFN_EventCallbackProc)
{
SetLastErrorMsg(CWZUpdateModule::ERROR_SYSTEM, GetLastError());
return FALSE;
}
}
*/
return TRUE;
}
WZ_DECLAREDLL BOOL CWZFtpUpdateModule::Connect (LPSTR lpszIPADDR, WORD wPORT, LPSTR lpszID, LPSTR lpszPASS)
{
strcpy (m_szIPADDR, lpszIPADDR);
m_wPORT = wPORT;
if (!lpszID)
strcpy (m_szID, "");
else
strcpy (m_szID, lpszID);
if (!lpszPASS)
strcpy (m_szPASS, "");
else
strcpy (m_szPASS, lpszPASS);
return this->Connect();
}
//ÀÌ ºÎºÐÀº StartUpdate¸¦ È£ÃâÇßÀ»¶§¿Í
//È£ÃßÇÏÁö ¾Ê¾ÒÀ» ¶§·Î ±¸ºÐÇØ¾ß µÇÁö ¾ÊÀ»±î?
WZ_DECLAREDLL VOID CWZFtpUpdateModule::Disconnect ()
{
m_iCurrentState = STATE_DISCONNECTED;
m_bCancelUpdate = TRUE;
m_bUseEventProc = FALSE;
BOOL bPass = FALSE;
WaitForSingleObject( m_hUpdateThread, 1000 );
if( m_hFTP_CONNECTION )
{
InternetCloseHandle(m_hFTP_CONNECTION);
m_hFTP_CONNECTION = NULL;
}
if( m_hINET_SESSION )
{
InternetCloseHandle(m_hINET_SESSION);
m_hINET_SESSION = NULL;
}
m_bCancelUpdate = FALSE;
m_bUseEventProc = TRUE;
if( m_bConnected )
{
AddEvent( EVENT_DISCONNECT );
m_bConnected = FALSE;
}
}
//lpszLocalPath : ÆÄÀÏÀ̸§ÀÌ Æ÷ÇÔµÇÁö ¾ÊÀº ¼ø¼öÇÑ ·ÎÄà °æ·Î
//lpszRemoteFilePath : ÆÄÀÏÀ̸§ÀÌ Æ÷ÇÔµÈ °æ·Î
WZ_DECLAREDLL BOOL CWZFtpUpdateModule::DownloadFile (LPSTR lpszRemoteFilePath, LPSTR lpszLocalPath)
{
eRESULT_CONSTANT eResult;
HANDLE hLocalFile = INVALID_HANDLE_VALUE;
HINTERNET hFTP_FILE = NULL;
//1. ¿ø°Ý¼¹ö °æ·Î¸¦ ºÐ¼®ÇÑ´Ù.
CHAR lpszRemoteDir[MAX_PATH];
CHAR lpszRemoteFileName[MAX_PATH];
GetSplitFilePath( lpszRemoteFilePath, lpszRemoteDir, lpszRemoteFileName );
// 2. ÇÔ¼öÀ̸§ : MakeLocalFileName
CHAR lpszRealLocalFilePath [MAX_PATH];
GetLocalFileName( lpszLocalPath, lpszRemoteFileName, lpszRealLocalFilePath );
//3. ÆÄÀÏ »óÅ ±¸Á¶Ã¼¿¡ ÇöÀç ¹ÞÀ» ÆÄÀÏÀ̸§ ÀúÀå
ZeroMemory(m_strtUpdatingFileInfo.szFileName, sizeof(m_strtUpdatingFileInfo.szFileName) );
strcpy( m_strtUpdatingFileInfo.szFileName, lpszRemoteFileName );
__try
{
hLocalFile = MakeLocalFile( lpszRealLocalFilePath );
if(hLocalFile == NULL)
return FALSE;
//////////////////////////////////////////////////////////////////////////
// ¿ø°ÝÁö ÀÛ¾÷ Æú´õ ¼³Á¤
SetRemoteDirectory( lpszRemoteDir );
//////////////////////////////////////////////////////////////////////////
// ¿ø°ÝÁö ÆÄÀÏÁ¤º¸ ¾ò±â
DWORD dwFileLength = 0;
FILETIME fileTime;
BOOL bRet = GetRemoteFileInfo( lpszRemoteFileName, dwFileLength, fileTime );
if( bRet == FALSE ) // TRUE¸¦ Çϴ°ÍÀº FALSE¸¦ ¸®ÅÏÇÒ °æ¿ì ERROR¸¦ ¹ß»ýÇϱ⠶§¹®ÀÌ´Ù.
return FALSE; // ±Ô¾à¿¡ ÆÄÀÏÀÇ Å©±â°¡ 0ÀΰÍÀº ´Ù¿î·Îµå ÇÏÁö ¾Ê´Â´Ù´Â °ÍÀ» Æ÷ÇÔÇÏÀÚ.
//////////////////////////////////////////////////////////////////////////
// ·ÎÄÿ¡ ¼¹ö¿¡¼ ´Ù¿î ¹ÞÀ¸·Á´Â ÆÄÀÏÀÌ ÀÖ´ÂÁö ºñ±³.. ÆÄÀÏ À̸§/³¯Â¥ ºñ±³
//////////////////////////////////////////////////////////////////////////
// 3 . ¿ø°ÝÁö ÆÄÀÏ ¿±â
hFTP_FILE = OpenRemoteFile( lpszRemoteFileName );
if( hFTP_FILE == NULL )
{
DeleteFile (lpszRealLocalFilePath);
return FALSE; // ÆÄÀÏ Çϳª¸¸ ½ÇÆÐÇØµµ ´Ù¿î·Îµå¸¦ ¸ØÃã´Ù.
}
// »óÅ ¾Ë¸² »ç¿ëÀÚ ÇÔ¼ö°¡ ÁöÁ¤µÇ¾ú´Ù¸é ¿©±â·Î ÇöÀçÀÇ »óŸ¦ ¾Ë¸°´Ù.(´Ù¿î·Îµå ½ÃÀÛ)
AddEvent( EVENT_FILEDOWNLOAD_START );
//////////////////////////////////////////////////////////////////////////
// ¿ø°ÝÁö ÆÄÀÏ ¾ò±â
eResult = GetRemoteFile( hFTP_FILE, hLocalFile, dwFileLength );
if( eResult != RESULT_DOWNLOAD_SUCCESS )
{
// ÆÄÀÏ ¾ò±â¿¡ ½ÇÆÐÇϸé, ÇöÀç ¸¸µé¾îÁø ·ÎÄà ÆÄÀϵµ »èÁ¦ÇÑ´Ù.
DeleteFile (lpszRealLocalFilePath);
return FALSE;
}
//·ÎÄÃÆÄÀÏ¿¡ ½Ã°£ ¼³Á¤
SetFileTime(hLocalFile, NULL, NULL, &fileTime);
// »óÅ ¾Ë¸² »ç¿ëÀÚ ÇÔ¼ö°¡ ÁöÁ¤µÇ¾ú´Ù¸é ¿©±â·Î ÇöÀçÀÇ »óŸ¦ ¾Ë¸°´Ù.(´Ù¿î·Îµå ³¡)
AddEvent( EVENT_FILEDOWNLOAD_END );
}
__finally
{
if (hFTP_FILE)
InternetCloseHandle(hFTP_FILE);
if (hLocalFile != INVALID_HANDLE_VALUE)
CloseHandle(hLocalFile);
}
return TRUE;
}
WZ_DECLAREDLL BOOL CWZFtpUpdateModule::GetSplitFilePath(const char* pszFilePath, char* pszDir, char* pszFile)
{
char pszFileName[MAX_PATH];
char pszFileExt[MAX_PATH];
//¿©±â¼ ¼¹öÆú´õ Á¶°ÇÀÌ µû¸¥´Ù.
//¼¹öÀÇ Æú´õ´Â ·çÆ®¿¡¼ ÇÏÀ§ 1´Ü°è ±îÁö¸¸ Á¸ÀçÇÑ´Ù.
_splitpath(pszFilePath, NULL, pszDir, pszFileName, pszFileExt );
if(pszDir == NULL || (strcmp(pszDir, "") == 0) )
wsprintf(pszDir, "\\");
wsprintf( pszFile, "%s%s", pszFileName, pszFileExt);
return TRUE;
}
WZ_DECLAREDLL BOOL CWZFtpUpdateModule::GetLocalFileName(const char* pszLocalPath, const char* pszRemoteFileName, char* pszLocalFilePath)
{
// ¿©±â¼ ·ÎÄà ÆÄÀÏÀ̸§ÀÌ ¾ø´Ù¸é ¿ø°ÝÆÄÀÏÀ̸§°ú µ¿ÀÏÇÏ°Ô ¸¸µç´Ù.
if ( (!pszLocalPath) || (! strcmp(pszLocalPath, "")))
wsprintf(pszLocalFilePath, ".\\%s", pszRemoteFileName);
else
{
// ³¡¿¡ \ ÀÌ ÀÖ´ÂÁö ¾ø´ÂÁö °Ë»çÇØ¼ Àû¿ëÇÑ´Ù.
if (pszLocalPath[strlen(pszLocalPath)-1] != '\\')
wsprintf (pszLocalFilePath, "%s\\%s", pszLocalPath, pszRemoteFileName );
else
wsprintf (pszLocalFilePath, "%s%s", pszLocalPath, pszRemoteFileName);
}
return TRUE;
}
WZ_DECLAREDLL HANDLE CWZFtpUpdateModule::MakeLocalFile(const char* pszLocalFilePath)
{
//if( _access(pszLocalFilePath, 0) == 0 ) //¸¸ÀÏÇöÁ¦ ·ÎÄÃÆÄÀÏÀÌ Á¸ÀçÇϸé.
//{
// BOOL bRet = DeleteFile (pszLocalFilePath);
// if(bRet == FALSE)
// {
// MessageBox (NULL, "ÆÄÀÏ»èÁ¦ ½ÇÆÐ", "¸Þ¼¼Áö", MB_OK);
// }
//}
HANDLE hLocalFile = CreateFile(pszLocalFilePath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if (hLocalFile == INVALID_HANDLE_VALUE)
{
SetLastErrorMsg(CWZUpdateModule::ERROR_SYSTEM, GetLastError());
MessageBox (HWND_DESKTOP, this->GetLastErrorMsg(), "Local File Create Error", MB_OK);
return NULL;
}
return hLocalFile;
}
//pszRemoteDirÀº ·çÆ®¿¡ .\ ÀÌ·± °ÍÀÌ ¾ÈºÙ´Â´Ù.
//pszRemoteDirÀº ·çÆ®¿¡¼ ºÎÅÍÀÇ °æ·ÎÀÌ´Ù.
//·çÆ®´Â ¾Æ¹«°Íµµ ¾È ºÙ´Â´Ù.
//¸¸ÀÏ .\AgentServer\\sss °æ·Î¿¡ ÀÖ´Â sss Æú´õ¸¦ ¼¼ÆÃÇÏ°í ½ÍÀ¸¸é..
//pszRemoteDirÀº AgentServer\\sss ÀÌ µÇ¾î¾ß ÇÑ´Ù.
WZ_DECLAREDLL BOOL CWZFtpUpdateModule::SetRemoteDirectory(const char* pszRemoteDir)
{
DWORD dwSize = 128;
BOOL bSuccess = FALSE;
//1. ·çÆ®·Î ¼³Á¤
bSuccess = FtpSetCurrentDirectory( m_hFTP_CONNECTION, "/" );
bSuccess = FtpSetCurrentDirectory( m_hFTP_CONNECTION, pszRemoteDir );
if(!bSuccess)
{
//MessageBox( NULL, szDir, "ÇöÀçµð·ºÅ丮", MB_OK );
// Á¦ÀÏ Ã³À½ »©°í´Â ´ç¿¬È÷ ½ÇÆÐÇÑ´Ù.
// ½ÇÆÐÇÏ´Â ÀÌÀ¯´Â ÇöÀçµð·ºÅ丮´Â " /00.00.04 " ÀÌ·±½ÄÀ¸·Î ¼³Á¤µÇ¾î Àִµ¥,
// ³»°¡ ¼³Á¤ÇÒ µð·ºÅ丮´Â ".\00.00.04\ " ÀÌ·±½ÄÀ¸·Î ¼³Á¤ÇÏ·Á°í ÇÑ´Ù.
// ¸¸ÀÏ ÀÌ·¸°Ô Çϸé /00.00.04/00.00.04 µð·ºÅ丮¸¦ ã°Ô µÇ¹Ç·Î
//DWORD dwError;
//char szMsg[128];
//DWORD nSize = sizeof(szMsg);
//InternetGetLastResponseInfo( &dwError, szMsg, &nSize );
//MessageBox( NULL, szMsg, NULL, MB_OK );
}
else
{
//MessageBox( NULL, szDir, "ÇöÀçµð·ºÅ丮", MB_OK );
//MessageBox( NULL, lpszRemoteDir, "¹Ù²Ü µð·ºÅ丮", MB_OK );
}
return bSuccess;
}
WZ_DECLAREDLL BOOL CWZFtpUpdateModule::GetRemoteFileInfo(const char* pszRemoteFile, DWORD& dwFileLength, FILETIME& fileTime)
{
dwFileLength = 0;
WIN32_FIND_DATA wfd;
//°í»ýÇß´Ù... --+++
//FtpFindFirstFile ÀÌ ÇÔ¼ö´Â (µÎ¹øÂ° ÀÎÀÚ¿¡ ¹«¾ùÀ» ³Öµç..) ¹«Á¶°Ç ÇöÀç ¼¼ÆÃµÈ µð·ºÅ丮ÀÇ Á¦ÀÏù¹øÂ° ÆÄÀÏ(¶Ç´Â µð·ºÅ丮)
//À̸§À» °¡Áö°í ¿Â´Ù. ù¹øÂ° ÆÄÀÏ(µð·ºÅ丮) Á¤º¸´Â wfd¿¡ ÀúÀåµÈ´Ù.
//ÆÄÀÏÀÌ ¾øÀ¸¸é NULL ÀÌ ¸®ÅϵȴÙ.
HINTERNET hFind = ::FtpFindFirstFile(m_hFTP_CONNECTION, "*.*", &wfd, 0, 0);
if( hFind == NULL )
{
INT iErrno = GetLastError();
if (iErrno != ERROR_INTERNET_EXTENDED_ERROR)
{
SetLastErrorMsg(CWZUpdateModule::ERROR_SYSTEM, iErrno);
return -1; //Çڵ鿡 ¹®Á¦°¡ ÀÖ´Â °æ¿ìÀÌ´Ù.
}
}
else
{
BOOL bRet = FALSE;
do
{
// ¿ø°ÝÁöÀÇ ÆÄÀÏÀ̸§°ú, ÇöÀç ãÀº ÆÄÀÏÀ̸§ÀÌ °°´Ù¸é...
if( strcmp(wfd.cFileName, pszRemoteFile) == 0 )
{
dwFileLength = wfd.nFileSizeLow;
fileTime = wfd.ftLastWriteTime;
bRet = TRUE;
break;
}
}while( bRet = InternetFindNextFile( hFind, &wfd ) );
if(bRet == FALSE) //ÆÄÀÏÀ» ãÁö ¸øÇѰæ¿ì
{
if( ERROR_NO_MORE_FILES == GetLastError() )
{
TCHAR szMsg[128];
_snprintf( szMsg, 128, "%s ÆÄÀÏÀÌ ¾ø½À´Ï´Ù.", pszRemoteFile );
MessageBox( NULL, szMsg, NULL, MB_OK );
}
return FALSE;
}
else // ÆÄÀÏÀº ã¾Ò´Âµ¥..
{
if( wfd.dwFileAttributes != FILE_ATTRIBUTE_NORMAL )
{
char szError[128];
wsprintf(szError, "¹öÀüÁ¤º¸ ÆÄÀÏÀ» ÀÐÀ»¼ö ¾ø½À´Ï´Ù. ÆÄÀÏ ¼Ó¼º = %d", wfd.dwFileAttributes );
MessageBox( NULL, szError, NULL, MB_OK );
InternetCloseHandle(hFind);
return FALSE;
}
}
InternetCloseHandle(hFind);
}
return TRUE;
}
WZ_DECLAREDLL HINTERNET CWZFtpUpdateModule::OpenRemoteFile(const char* pszRemoteFile)
{
HINTERNET hRemoteFile;
INT iCount = MAX_RETRY_DOWNLOADING;
while(iCount--)
{
hRemoteFile = ::FtpOpenFile(m_hFTP_CONNECTION, pszRemoteFile, GENERIC_READ, FTP_TRANSFER_TYPE_BINARY |
INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE, 0);//(DWORD)this);
if( hRemoteFile == NULL )
{
// ¿¡·¯
m_strtUpdatingFileInfo.iErrorCode = GetLastError();
Sleep(100);
}
else
{
break;
}
}
if( iCount < 1 )
{
// ÆÄÀÏÀ» ãÀ»¼ö ¾ø´Ù.
AddEvent( EVENT_FILE_NOTFOUND );
return NULL;
}
return hRemoteFile;
}
//¿ø°ÝÁö¿¡ ÀÖ´Â ÆÄÀÏÀ» °¡Á®¿Â´Ù.(´Ù¿î·Îµå ÇÑ´Ù.)
WZ_DECLAREDLL eRESULT_CONSTANT CWZFtpUpdateModule::GetRemoteFile(const HINTERNET hRemoteFile, const HANDLE hLocalFile, DWORD dwFileLength)
{
DWORD dwNowRecvBytes, dwNowWrittenBytes, dwTotalWrittenBytes;
dwNowRecvBytes = dwNowWrittenBytes = dwTotalWrittenBytes = 0;
m_strtUpdatingFileInfo.uWholeFileSize = dwFileLength;
m_strtUpdatingFileInfo.uNowFileSize = 0;
int nZeroCount = 0;
if(dwFileLength > 0)
{
while(TRUE)
{
if ( !InternetReadFile(hRemoteFile, m_FTP_cBUFFER, sizeof(m_FTP_cBUFFER), &dwNowRecvBytes) )
{
SetLastErrorMsg(CWZUpdateModule::ERROR_SYSTEM, GetLastError());
MessageBox (HWND_DESKTOP, "InternetReadFile() error", "¿¡·¯¿¡·¯", MB_OK);
ZeroMemory( m_FTP_cBUFFER, MAX_BUFFER );
return RESULT_DOWNLOAD_FAIL;
}
if( dwNowRecvBytes == 0)
nZeroCount++;
if( nZeroCount >= 2)
{
AddEvent( EVENT_FILEDOWNLOAD_FAIL );
return RESULT_DOWNLOAD_FAIL;
}
// ¸¸ÀÏ ÀÌ ·çƾÀ» ½ÇÇàÇÏ´Â µµÁß¿¡ FTP¼¹ö¿Í ¿¬°áÀÌ ²÷¾îÁö¸é, Àú ÇÔ¼ö¿¡¼ FALSE¸¦ ¸®ÅÏÇÏ´Â °ÍÀÌ
// ¾Æ´Ï¶ó, dwNowRecvBytes°¡ 0ÀÌ ¸®ÅϵȴÙ. ±×·¡µµ, ¿¡·¯°¡ ¾Æ´Ò¼öµµ ÀÖÀ¸¹Ç·Î, 2¹ø 0ÀÌ ³ª¿À¸é,
// ·çƾÀ» ºüÁ® ³ª¿À´Â °ÍÀ¸·Î ÇÑ´Ù.
if ( !WriteFile (hLocalFile, m_FTP_cBUFFER, dwNowRecvBytes, &dwNowWrittenBytes, NULL) )
{
SetLastErrorMsg(CWZUpdateModule::ERROR_SYSTEM, GetLastError());
MessageBox (HWND_DESKTOP, "WriteFile() error", "¿¡·¯¿¡·¯", MB_OK);
return RESULT_DOWNLOAD_FAIL;
}
dwTotalWrittenBytes += dwNowWrittenBytes;
m_strtUpdatingFileInfo.uNowFileSize = dwTotalWrittenBytes;
AddEvent( EVENT_FILEDOWNLOAD_WORKING );
// ÇöÀç±îÁö ¾²¿©Áø ÆÄÀÏÀÇ ¿ë·®ÀÌ Àüü ÆÄÀÏÀÇ ¿ë·®º¸´Ù °°°Å³ª Å©´Ù¸é...
if ( dwTotalWrittenBytes >= dwFileLength)
break;
if( m_bCancelUpdate )
{
m_bCancelUpdate = FALSE;
return RESULT_DOWNLOAD_STOP;
}
}
}
else if(dwFileLength == 0)
{
return RESULT_DOWNLOAD_SUCCESS;
}
else
{
// ¿ø°ÝÁö ÆÄÀÏ Å©±â°¡ 0º¸´Ù ÀÛ´Ù.
SetLastErrorMsg(CWZUpdateModule::ERROR_SYSTEM, GetLastError());
return RESULT_DOWNLOAD_FAIL;
}
return RESULT_DOWNLOAD_SUCCESS;
}
//ÆÄÀÏ ¸®½ºÆ®¿¡ ÀÖ´Â ÆÄÀϵéÀ» ´Ù¿î ¹Þ´Â´Ù.
//¿ø·¡ ¸®½ºÆ®ÆÄÀÏ À̸§Àº °íÁ¤Àε¥.. ±×³É ÀÎÀÚ·Î ½áÁØ´Ù.
WZ_DECLAREDLL BOOL CWZFtpUpdateModule::DownloadFilesOnFileList( char* pszRemoteDirPath )
{
// ·ÎÄÿ¡ ¸®½ºÆ® ÆÄÀÏÀ» ´Ù¿î ¹Þ¾ÒÀ¸¸é, ¹Ýµå½Ã ½ÇÇàÆÄÀÏ °æ·Î¿¡ ÀÖ´Ù. µû¶ó¼ À̸§¸¸ ½áÁØ´Ù.
if(( SMDFile = fopen( DEFAULT_FILELIST_FILE, "r" ) ) == NULL )
{
MessageBox (HWND_DESKTOP, "can't open update-list file", "error", MB_OK | MB_ICONERROR);
return FALSE;
}
string strLocalRelativeDirPath; //·ÎÄà ÀúÀå µð·ºÅ丮 »ó´ë°æ·Î
// ÆÄÀÏ ¸®½ºÆ®¸¦ ºÐ¼®Çؼ, ÆÄÀÏ ¸®½ºÆ®¿¡ ÀÖ´Â ÆÄÀϵéÀ» ´Ù¿î ¹Þ´Â ±¸¹®..
while( TRUE )
{
SMDToken Token;
//GetTokenÇÏ°Ô µÇ¸é SMDFile¿¡ Á¤ÀÇµÈ ÆÄÀÏÀ» ÀÐ¾î¼ Token°ú TokenString¿¡ °ªÀ» ¸®ÅÏÇÏ°Ô µÈ´Ù.
Token = (*GetToken)();
if( Token == END )
break;
if( Token == NAME ) // ÆÄÀÏÀ̸§ÀÎ °æ¿ì
{
// ¿ø°ÝÁö È£½ºÆ®ÀÇ Àüü°æ·ÎÀ̸§
CHAR szCurrentRemoteFilePath[MAX_PATH];
ZeroMemory( szCurrentRemoteFilePath, MAX_PATH );
wsprintf(szCurrentRemoteFilePath, "%s\\%s", pszRemoteDirPath, TokenString);
string strAbsoluteDirPath;
GetLocalDownAbsoluteDir( strLocalRelativeDirPath, strAbsoluteDirPath ) ;
//////////////////////////////////////////////////////////////////////////
// ÇöÀç ÀÌ ÆÄÀÏÀ» ´Ù¿î ¹ÞÀºÀûÀÌ ÀÖ´ÂÁö üũ..
// 1. ¼¹öÆÄÀϰú ¶È°°Àº ·ÎÄÃÆÄÀÏÀÌ ÀÖ´ÂÁö üũ
string strLocalFilePath;
strLocalFilePath = strAbsoluteDirPath;
strLocalFilePath += TokenString;
BOOL bRet = CanDownloadFile( strLocalFilePath, TokenString );
if(bRet == TRUE) //´Ù¿î·Îµå ÇØµµ µÈ´Ù¸é..
{
if ( !DownloadFile(szCurrentRemoteFilePath, const_cast(strAbsoluteDirPath.data()) ) )
return FALSE;
}
else //´Ù¿î·Îµå ÇÏÁö ¾Ê¾Æµµ µÈ´Ù¸é.. ÀÌ¹Ì Áö³¹ø¿¡ ´Ù¿î ¹ÞÀº ÆÄÀÏÀÌ´Ù.
continue;
// ÆÄÀÏ ´Ù¿î·Îµå°¡ ¼º°øÇßÀ¸¹Ç·Î ÆÄÀÏ °³¼ö¸¦ Çϳª Áõ°¡½ÃÄÑ ÁØ´Ù.
m_strtUpdatingFileInfo.uNowFileNum++;
}
if( Token == NUMBER ) // Æú´õÀ̸§ÀÎ °æ¿ì
{
// 0ÀÌ¸é Æú´õ¸¦ »ý¼ºÇ϶ó´Â ¸í·ÉÀ̹ǷÎ, 0 ´ÙÀ½¿¡ ³ª¿À´Â °ªÀ» Àоî¾ß ÇÑ´Ù.
// ±× °ªÀÌ Æú´õ ¸íÀÌ´Ù.
Token = (*GetToken)();
strLocalRelativeDirPath = "\\";
strLocalRelativeDirPath += TokenString;
string strAbsoluteDirPath;
GetLocalDownAbsoluteDir( strLocalRelativeDirPath, strAbsoluteDirPath ) ;
CreateDirectory (strAbsoluteDirPath.data(), NULL); // ·ÎÄà µð·ºÅ丮 »ý¼º
}
}
return TRUE;
}
//·ÎÄà ÆÄÀϰú ¼¹öÆÄÀÏÀ» ºñ±³ÇÏ¿© ´Ù¿î ¹ÞÀ»Áö ¾È ¹ÞÀ»Áö¸¦ °áÁ¤ÇÑ´Ù.
//TRUE : ÆÄÀÏÀ» ´Ù¿î ¹Þ´Â´Ù.
//FALSE : ÆÄÀÏÀ» ´Ù¿î ¹ÞÁö ¾Ê´Â´Ù.
WZ_DECLAREDLL BOOL CWZFtpUpdateModule::CanDownloadFile(string strLocalFilePath, string strRemoteFileName)
{
//////////////////////////////////////////////////////////////////////////
// ÇöÀç ÀÌ ÆÄÀÏÀ» ´Ù¿î ¹ÞÀºÀûÀÌ ÀÖ´ÂÁö üũ..
// 1. ¼¹öÆÄÀϰú ¶È°°Àº ·ÎÄÃÆÄÀÏÀÌ ÀÖ´ÂÁö üũ
HANDLE hFile = CreateFile( strLocalFilePath.data(), GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
if( hFile != INVALID_HANDLE_VALUE ) //ÆÄÀÏÀÌ Á¸ÀçÇÑ´Ù.
{
// 2. ¿ø°ÝÁö ÆÄÀÏ Á¤º¸
DWORD dwFileLength;
FILETIME fileTime, localFileTime;
GetRemoteFileInfo( strRemoteFileName.data(), dwFileLength, fileTime);
//3. ·ÎÄÃÆÄÀÏ Á¤º¸ Àоî¿À±â
GetFileTime( hFile, NULL, NULL, &localFileTime );
// Á¤º¸¸¦ ´Ù ÀоúÀ¸´Ï, ÇÚµéÀ» ´Ý´Â´Ù.
CloseHandle( hFile );
// µÎ ÆÄÀÏÀÇ ½Ã°£ÀÌ µ¿ÀÏÇÏÁö ¾Ê´Ù.
if( ( fileTime.dwHighDateTime != localFileTime.dwHighDateTime ) ||
( fileTime.dwLowDateTime != localFileTime.dwLowDateTime ) )
{
return TRUE;
}
else //½Ã°£¸¶Á® µ¿ÀÏÇÏ´Ù¸é... ÆÄÀÏÀÇ Å©±â ºñ±³
{
FILE* pFile = fopen(strLocalFilePath.data(), "r");
long nLen = _filelength( _fileno(pFile) );
fclose(pFile);
return FALSE;
if( nLen == dwFileLength) //ÆÄÀÏÀÇ Å©±â°¡ °°´Ù¸é..
return FALSE; //ÆÄÀÏÀ» ´Ù¿î ¹ÞÁö ¾Ê´Â´Ù.
else
return TRUE;
}
}
else //ÆÄÀÏÀÌ Á¸Àç ÇÏÁö ¾ÊÀ¸¸é..
{
return TRUE;
}
//////////////////////////////////////////////////////////////////////////
}
//¼¹ö¿ÍÀÇ ¿¬°á »óŸ¦ üũÇÏ´Â ¾²·¹µå
//¿¬°áÀ» üũÇÏ´Â ÇÔ¼ö°¡ ¾ø±â ¶§¹®¿¡ ÇöÀç ¼¹öÀÇ µð·ºÅ丮¸¦ °¡Á®¿À´Â ÇÔ¼ö·Î üũÇÑ´Ù.
WZ_DECLAREDLL unsigned __stdcall CWZFtpUpdateModule::CheckConnectThread(LPVOID lpParam)
{
CWZFtpUpdateModule* lpWZUM = (CWZFtpUpdateModule*) lpParam;
while( lpWZUM->m_bConnected )
{
Sleep(1000);
HINTERNET hConnection = InternetConnect( lpWZUM->m_hINET_SESSION, lpWZUM->m_szIPADDR, lpWZUM->m_wPORT,
lpWZUM->m_szID, lpWZUM->m_szPASS, INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
if (hConnection == NULL) //Ftp¿¡ ¿¬°áÇÒ¼ö ¾ø½À´Ï´Ù.
{
lpWZUM->m_bConnected = FALSE;
char szError[512];
wsprintf( szError, "¼¹ö¿Í ¿¬°áÇÒ¼ö ¾ø½À´Ï´Ù. ErrorCode = %d", GetLastError() );
MessageBox(NULL, szError, "¾Ë¸²", MB_OK);
lpWZUM->AddEvent( EVENT_DISCONNECT );
}
else
{
InternetCloseHandle( hConnection );
}
}
return 0;
}