#include "StdAfx.h"
|
#include "TaskItemData.h"
|
#include "PromptDownloadDlg.h"
|
#include "PromptUpdateDlg.h"
|
|
|
CTaskItemData::CTaskItemData(void)
|
{
|
m_pOwner = NULL;
|
m_nPort = OIUPS_DEFAULT_PORT;
|
m_nFileSPort = OIFILE_DEFAULT_PORT;
|
m_hCheckAppPackVer = INVALID_HANDLE_VALUE;
|
m_bTasking = false;
|
|
m_dwLastErrCode = 0;
|
m_strFileSFlag = _T("");
|
m_strUserSession = _T("");
|
m_strkAppPackXml = _T("");
|
m_strAppProcName= _T("");
|
m_nVerPrompt = 0;
|
m_pDlgOIUpsProgress = NULL;
|
m_bIsStartDownload = false;
|
m_dtLastDownloading = CHighTime::GetPresentTime( true );
|
}
|
|
CTaskItemData::~CTaskItemData(void)
|
{
|
CleanData( );
|
}
|
|
void CTaskItemData::operator=( CTaskItemData &item )
|
{
|
m_strID = item.m_strID;
|
|
m_strServer = item.m_strServer;
|
m_nPort = item.m_nPort;
|
|
m_strAppFlag = item.m_strAppFlag;
|
m_strCurVer = item.m_strCurVer;
|
|
m_strLoginName = item.m_strLoginName;
|
m_strUserName = item.m_strUserName;
|
m_strUserSession = item.m_strUserSession;
|
|
m_strFileSIP = item.m_strFileSIP;
|
m_nFileSPort = item.m_nFileSPort;
|
m_strFileSFlag = item.m_strFileSFlag;
|
|
m_pOwner = item.m_pOwner;
|
m_bTasking = item.IsTasking( );
|
|
}
|
|
void CTaskItemData::CleanData( )
|
{
|
if(m_hCheckAppPackVer != INVALID_HANDLE_VALUE )
|
{
|
CloseHandle( m_hCheckAppPackVer );
|
m_hCheckAppPackVer = INVALID_HANDLE_VALUE;
|
}
|
if(m_pDlgOIUpsProgress)
|
{
|
if(m_pDlgOIUpsProgress->IsWindow())
|
{
|
m_pDlgOIUpsProgress->DestroyWindow();
|
}
|
m_pDlgOIUpsProgress = NULL;
|
}
|
m_dwLastErrCode = 0;
|
}
|
void CTaskItemData::SetDownloading( )
|
{
|
m_dtLastDownloading = CHighTime::GetPresentTime( true );
|
}
|
CHighTime CTaskItemData::GetLastDownloadingTime( )
|
{
|
return m_dtLastDownloading;
|
}
|
bool CTaskItemData::IsStartDownload( )
|
{
|
return m_bIsStartDownload;
|
}
|
bool CTaskItemData::IsTasking( )
|
{
|
return m_bTasking;
|
}
|
CString CTaskItemData::GetLastErrInfo( )
|
{
|
return m_strLastErrInfo;
|
}
|
|
DWORD CTaskItemData::GetLastErrCode( )
|
{
|
return m_dwLastErrCode;
|
}
|
|
long CTaskItemData::DoStartTask( )
|
{
|
long nReturn = 0;
|
|
if ( m_bTasking )
|
return false;
|
|
m_dwLastErrCode = 0;
|
m_bTasking = true;
|
unsigned int nThreadID;
|
if(m_hCheckAppPackVer == INVALID_HANDLE_VALUE )
|
{
|
m_hCheckAppPackVer = (HANDLE)::_beginthreadex(0, 0, CheckAppPackVerThread, (void*)this, 0, &nThreadID);
|
}
|
//nReturn = StartTask(
|
return 0;
|
}
|
|
// 0-Éý¼¶³É¹¦£»1-ûÓÐа汾£»2-Éý¼¶Ê§°Ü£»3-È¡ÏûÉý¼¶
|
long CTaskItemData::StartTask( )
|
{
|
long nReturn = 0;
|
CString strXML;
|
CString strError;
|
DWORD dwErrCode = 0;
|
InitClientMgr( );
|
m_strLastErrInfo.Empty( );
|
m_strkAppPackXml = _T("");
|
dwErrCode = m_UpdateWebMgr.CheckAppVersion( m_strAppFlag, m_strCurVer, strXML,m_strFileSFlag );
|
if ( dwErrCode != 0 )
|
{
|
strError =m_UpdateWebMgr.GetLastErrInfo();
|
m_strLastErrInfo.Format( _T("»ñÈ¡¼ì²âÉý¼¶ÐÅϢʧ°Ü£¬ÔÒòÊÇ£º%s"), strError );
|
m_dwLastErrCode = dwErrCode;
|
m_bTasking = false;
|
nReturn = 2;
|
if(m_nVerPrompt)
|
{
|
CString strCheckVerFailed;
|
strCheckVerFailed.Format(_T("%s,´íÎóÂ룺%d"),strError,m_dwLastErrCode);
|
CUpsAppPackItem itemAppPack;
|
itemAppPack.m_strVer = m_strCurVer;
|
itemAppPack.m_strName = m_strAppProcName;
|
// ÌáʾûÓÐа汾
|
HWND hWnd = ::GetDesktopWindow();
|
CPromptDownloadDlg dlg;
|
dlg.SetData( &itemAppPack ,strCheckVerFailed, FALSE);
|
dlg.DoModal( );
|
}
|
if ( m_pOwner && m_pOwner->IsWindow( ) )
|
{
|
m_pOwner->SendMessage( WM_ENDTASK, (WPARAM)&m_strID, nReturn );
|
return nReturn;
|
}
|
}
|
else
|
{
|
m_strkAppPackXml = strXML;
|
}
|
if ( m_pOwner && m_pOwner->IsWindow( ) )
|
{
|
m_pOwner->SendMessage( WM_CHECKAPPPACKVER_RES, (WPARAM)this, 0 );
|
}
|
m_hCheckAppPackVer = INVALID_HANDLE_VALUE;
|
return nReturn;
|
}
|
|
bool CTaskItemData::InitClientMgr( )
|
{
|
BOOL bReturn = true;
|
DWORD dwErrorCode = 0;
|
|
m_strLastErrInfo.Empty( );
|
m_UpdateWebMgr.SetServerInfo( m_strServer, m_nPort );
|
m_UpdateWebMgr.SetUserInfo( m_strLoginName, m_strUserName,m_strUserSession );
|
return true;
|
}
|
unsigned int _stdcall CTaskItemData::CheckAppPackVerThread( LPVOID lpv )
|
{
|
CTaskItemData *pItem = (CTaskItemData*)lpv;
|
if( !pItem)
|
{
|
_endthreadex( 0 );
|
return 1;
|
}
|
try
|
{
|
pItem->StartTask();
|
}
|
catch(...)
|
{
|
return 1;
|
}
|
_endthreadex( 0 );
|
return 0;
|
}
|
long CTaskItemData::CheckAppPackVer( )
|
{
|
CString strXML;
|
CString strError;
|
DWORD dwErrCode = 0;
|
CString strFileServer;
|
CString strFileID, strFileName;
|
CString strFilePath;
|
int nFilePort;
|
CString strCheckVerFailed = _T("");
|
nFilePort = OIFILE_DEFAULT_PORT;
|
strXML = m_strkAppPackXml;
|
if ( strXML.IsEmpty( ) )
|
{
|
if(m_dwLastErrCode != 0)
|
{
|
if(m_nVerPrompt)
|
{
|
strCheckVerFailed.Format(_T("%s,´íÎóÂ룺%d"),m_strLastErrInfo,m_dwLastErrCode);
|
CUpsAppPackItem itemAppPack;
|
itemAppPack.m_strVer = m_strCurVer;
|
itemAppPack.m_strName = m_strAppProcName;
|
// ÌáʾûÓÐа汾
|
HWND hWnd = ::GetDesktopWindow();
|
CPromptDownloadDlg dlg;
|
dlg.SetData( &itemAppPack ,strCheckVerFailed, FALSE);
|
dlg.DoModal( );
|
}
|
m_bTasking = false;
|
if ( m_pOwner && m_pOwner->IsWindow( ) )
|
{
|
m_pOwner->SendMessage( WM_ENDTASK, (WPARAM)&m_strID, 2 );
|
}
|
return 1;
|
}
|
else
|
{
|
if(m_nVerPrompt)
|
{
|
CUpsAppPackItem itemAppPack;
|
itemAppPack.m_strName = m_strAppProcName;
|
itemAppPack.m_strVer = m_strCurVer;
|
// ÌáʾûÓÐа汾
|
HWND hWnd = ::GetDesktopWindow();
|
CPromptDownloadDlg dlg;
|
dlg.SetData( &itemAppPack ,_T(""), FALSE);
|
dlg.DoModal( );
|
}
|
m_bTasking = false;
|
if ( m_pOwner && m_pOwner->IsWindow( ) )
|
{
|
m_pOwner->SendMessage( WM_ENDTASK, (WPARAM)&m_strID, 2 );
|
}
|
return 0;
|
}
|
}
|
// ½âÎöXML¸ñʽ
|
CUpsAppPackItem itemAppPack;
|
if( !ParseAppPackXMLItem( strXML, &itemAppPack ) )
|
{
|
m_strLastErrInfo.Format( _T("½âÎöXML¸ñʽʧ°Ü£¬XML£º%s"), strXML );
|
if(m_nVerPrompt)
|
{
|
strCheckVerFailed.Format(_T("%s"),m_strLastErrInfo);
|
CUpsAppPackItem itemAppPack;
|
itemAppPack.m_strVer = m_strCurVer;
|
itemAppPack.m_strName = m_strAppProcName;
|
// ÌáʾûÓÐа汾
|
HWND hWnd = ::GetDesktopWindow();
|
CPromptDownloadDlg dlg;
|
dlg.SetData( &itemAppPack ,strCheckVerFailed, FALSE);
|
dlg.DoModal( );
|
}
|
m_bTasking = false;
|
if ( m_pOwner && m_pOwner->IsWindow( ) )
|
{
|
int nReturn;
|
m_pOwner->SendMessage( WM_ENDTASK, (WPARAM)&m_strID, 2 );
|
}
|
return 2;
|
}
|
if( !itemAppPack.m_bIsForcible)
|
{
|
// Ìáʾ¸üÐÂ
|
HWND hWnd = ::GetDesktopWindow();
|
CPromptDownloadDlg dlg;
|
dlg.SetData( &itemAppPack);
|
if ( dlg.DoModal( ) != IDOK )
|
{
|
m_bTasking = false;
|
if ( m_pOwner && m_pOwner->IsWindow( ) )
|
{
|
m_pOwner->SendMessage( WM_ENDTASK, (WPARAM)&m_strID, 3 );
|
}
|
return 0;
|
}
|
}
|
// ÏÂÔØÎļþ¸üÐÂ
|
m_strLastErrInfo = _T("");
|
strFileServer = itemAppPack.m_strFileSIP;
|
strFileID = itemAppPack.m_strFileID;
|
nFilePort = itemAppPack.m_nFileSPort;
|
if ( strFileServer.IsEmpty( ) )
|
strFileServer = m_strServer;
|
if ( nFilePort <= 0 )
|
{
|
nFilePort = OIFILE_DEFAULT_PORT;
|
}
|
strFileName.Format( _T("%s_%s.exe"), strFileID, itemAppPack.m_strVer );
|
m_pDlgOIUpsProgress = new CUpdateProgressDlg();
|
m_pDlgOIUpsProgress->m_pTaskItemData = this;
|
m_pDlgOIUpsProgress->m_pOwner = m_pOwner;
|
m_pDlgOIUpsProgress->m_strID = m_strID;
|
m_pDlgOIUpsProgress->m_strAppProcName = m_strAppProcName;
|
m_pDlgOIUpsProgress->SetServerInfo(strFileServer, nFilePort);
|
m_pDlgOIUpsProgress->SetUserInfo(m_strLoginName, m_strUserName);
|
m_pDlgOIUpsProgress->SetFileInfo(strFileID, strFileName);
|
m_pDlgOIUpsProgress->SetForcible(itemAppPack.m_bIsForcible);
|
m_pDlgOIUpsProgress->Create(NULL);
|
m_pDlgOIUpsProgress->CenterWindow(GetDesktopWindow());
|
m_pDlgOIUpsProgress->SendMessage(WM_INITDIALOG);
|
m_pDlgOIUpsProgress->ShowWindow(SW_SHOWDEFAULT);
|
SetDownloading( );
|
m_bIsStartDownload = true;
|
m_pDlgOIUpsProgress->ShowWindow( SW_SHOW );
|
return 0;
|
}
|
|
BOOL CTaskItemData::ParseAppPackXMLItem( CString strXml,CUpsAppPackItem *pItem)
|
{
|
COIXMLParser xmlParser;
|
IXMLDOMElementPtr ptrBody;
|
IXMLDOMNodePtr ptrNode,ptrNext;
|
IXMLDOMNodePtr ptrNode2,ptrNext2;
|
CString strNodeName,strNodeValue,strAttrValue;
|
int nAttrValue;
|
CString strFileID = _T("");
|
CString strFileSFlag = _T("");
|
|
if ( strXml.IsEmpty( ) )
|
return FALSE;
|
if( !xmlParser.ParseXMLStr(strXml, ptrBody) )
|
{
|
return FALSE;
|
}
|
pItem->m_strFileID = _T("");
|
COIXMLParser::GetNodeContent(ptrBody, strNodeName, strNodeValue);
|
if(strNodeName.CompareNoCase(_T("Body")) != 0)
|
return FALSE;
|
ptrBody->get_firstChild( &ptrNode);
|
while(ptrNode)
|
{
|
COIXMLParser::GetNodeContent(ptrNode, strNodeName, strNodeValue);
|
if(strNodeName.CompareNoCase(_T("Pack")) == 0)
|
{
|
if( COIXMLParser::GetNodeAttrValue(ptrNode, _T("AppFlag"),strAttrValue ))
|
{
|
pItem->m_strAppFlag = strAttrValue;
|
}
|
if( COIXMLParser::GetNodeAttrValue(ptrNode, _T("Ver"),strAttrValue ))
|
{
|
pItem->m_strVer = strAttrValue;
|
}
|
if( COIXMLParser::GetNodeAttrValue(ptrNode, _T("Date"),strAttrValue ))
|
{
|
pItem->m_strCreateTime = strAttrValue;
|
}
|
if( COIXMLParser::GetNodeAttrValue(ptrNode, _T("Forced"),nAttrValue ))
|
{
|
pItem->m_bIsForcible = nAttrValue == 1 ? TRUE : FALSE;
|
}
|
ptrNode->get_firstChild( &ptrNode2);
|
while(ptrNode2)
|
{
|
COIXMLParser::GetNodeContent(ptrNode2, strNodeName, strNodeValue);
|
if(strNodeName.CompareNoCase(_T("Name")) == 0)
|
{
|
pItem->m_strName = strNodeValue;
|
}
|
else if(strNodeName.CompareNoCase(_T("Desc")) == 0)
|
{
|
pItem->m_strDesc = strNodeValue;
|
}
|
ptrNode2->get_nextSibling( &ptrNext2);
|
ptrNode2 = ptrNext2;
|
}
|
}
|
if(strNodeName.CompareNoCase(_T("MFileS")) == 0)
|
{
|
if( COIXMLParser::GetNodeAttrValue(ptrNode, _T("IP"),strAttrValue ))
|
{
|
pItem->m_strFileSIP = strAttrValue;
|
}
|
if( COIXMLParser::GetNodeAttrValue(ptrNode, _T("Port"),nAttrValue ))
|
{
|
pItem->m_nFileSPort = nAttrValue;
|
}
|
if( COIXMLParser::GetNodeAttrValue(ptrNode, _T("FileID"),strAttrValue ))
|
{
|
strFileID = strAttrValue;
|
}
|
}
|
if(strNodeName.CompareNoCase(_T("FileS")) == 0)
|
{
|
if( COIXMLParser::GetNodeAttrValue(ptrNode, _T("Flag"),strAttrValue ))
|
{
|
strFileSFlag = strAttrValue;
|
}
|
if( COIXMLParser::GetNodeAttrValue(ptrNode, _T("FileID"),strAttrValue ))
|
{
|
pItem->m_strFileID = strAttrValue;
|
}
|
}
|
ptrNode->get_nextSibling( &ptrNext);
|
ptrNode = ptrNext;
|
}
|
if(pItem->m_strFileID.IsEmpty())
|
{
|
pItem->m_strFileID = strFileID;
|
}
|
else
|
{
|
pItem->m_strFileSIP = m_strFileSIP;
|
pItem->m_nFileSPort = m_nFileSPort;
|
}
|
if(pItem->m_strFileSIP.IsEmpty())
|
pItem->m_strFileSIP = m_strServer;
|
return TRUE;
|
}
|