// InternetUpdate.cpp: implementation of the CInternetUpdate class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "cp_main.h" #include "InternetUpdate.h" #include #include "ProgressWnd.h" #include "io.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif #define HTTPBUFLEN 512 // Size of HTTP Buffer... ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CInternetUpdate::CInternetUpdate() { } CInternetUpdate::~CInternetUpdate() { } //BOOL CInternetUpdate::CheckForUpdate(HWND hParent, BOOL bCheckForPrevUpdate, BOOL bShowNoUpdatesDlg) //{ // m_bShowMessages = bShowNoUpdatesDlg; // m_hParent = hParent; // // CTime Now = CTime::GetCurrentTime(); // struct tm ptmTemp; // tm tmNow = *(Now.GetLocalTm(&ptmTemp)); // long lCurrentDayOfYear = tmNow.tm_yday; // // RemoveOldUpdateFile(); // // if(bCheckForPrevUpdate) // { // if(!CGetSetOptions::GetCheckForUpdates()) // return FALSE; // // long lLastUpdateDay = CGetSetOptions::GetLastUpdate(); // // if(lCurrentDayOfYear - lLastUpdateDay < 10) // return FALSE; // // //if the last time we check was today return // if(lLastUpdateDay == lCurrentDayOfYear) // return FALSE; // } // // CGetSetOptions::SetLastUpdate(lCurrentDayOfYear); // // BOOL bRet = FALSE; // // m_lRunningVersion = GetRunningVersion(); // m_lUpdateVersion = GetUpdateVersion(); // // if(m_lUpdateVersion > m_lRunningVersion) // { // CString csMessage; // csMessage.Format( _T("%s, %s\n") // _T("%s, %s\n\n") // _T("%s"), // theApp.m_Language.GetString("Updates_Available", "Updates available for Ditto.\nVisit ditto-cp.sourceforge.net for details\n\nRunning Version"), // GetVersionString(m_lRunningVersion), // theApp.m_Language.GetString("Update_Version", "Update Version"), // GetVersionString(m_lUpdateVersion), // theApp.m_Language.GetString("Download_Update", "Download updated version?")); // // if(MessageBox(hParent, csMessage, _T("Ditto"), MB_YESNO) == IDYES) // { // CString csFile = DownloadUpdate(); // // if(!csFile.IsEmpty()) // { // CloseHandle(theApp.m_hMutex); // Sleep(100); // ShellExecute(NULL, NULL, csFile, NULL, NULL, SW_SHOWNORMAL); // } // // bRet = TRUE; // } // } // else if(m_bShowMessages) // { // MessageBox(hParent, theApp.m_Language.GetString("No_Updates", "No updates available"), _T("Ditto"), MB_OK); // } // // return bRet; //} //BOOL CInternetUpdate::RemoveOldUpdateFile() //{ // CString csFile = CGetSetOptions::GetPath(PATH_UPDATE_FILE); // csFile += "DittoSetup.exe"; // // BOOL bRet = TRUE; // if(FileExists(csFile)) // { // bRet = ::DeleteFile(csFile); // } // // return bRet; //} CString CInternetUpdate::GetVersionString(VersionInfo version) { CString csLine; csLine.Format(_T("%02i.%02i.%02i.%02i"), version.Major, version.Minor, version.Revision, version.Build); return csLine; } VersionInfo CInternetUpdate::GetRunningVersion() { VersionInfo verInfo; CString csFileName = CGetSetOptions::GetExeFileName(); DWORD dwSize, dwHandle; LPBYTE lpData; UINT iBuffSize; VS_FIXEDFILEINFO *lpFFI; long ver; dwSize = GetFileVersionInfoSize(csFileName.GetBuffer(csFileName.GetLength()), &dwHandle); if(dwSize != 0) { csFileName.ReleaseBuffer(); if((lpData=(unsigned char *)malloc(dwSize)) != NULL) { if(GetFileVersionInfo(csFileName.GetBuffer(csFileName.GetLength()), dwHandle, dwSize, lpData) != 0) { if(VerQueryValue(lpData, _T("\\"), (LPVOID*)&lpFFI, &iBuffSize) != 0) { if(iBuffSize > 0) { verInfo.Major = (lpFFI->dwProductVersionMS >> 16) & 0xffff; verInfo.Minor = (lpFFI->dwProductVersionMS >> 0) & 0xffff; verInfo.Revision = (lpFFI->dwProductVersionLS >> 16) & 0xffff; verInfo.Build = (lpFFI->dwProductVersionLS >> 0) & 0xffff; } } } free(lpData); } } return(verInfo); } //long CInternetUpdate::GetUpdateVersion() //{ // char httpbuff[HTTPBUFLEN]; // // //Try to get a path from the regestry // CString csPath = CGetSetOptions::GetUpdateFilePath(); // // //if nothing there get the default // if(csPath.IsEmpty()) // { // csPath = "ditto-cp.sourceforge.net/Update3/DittoVersion.txt"; // } // // CString csUrl = "http://" + csPath; // // CString csFile = CGetSetOptions::GetPath(PATH_UPDATE_FILE); // csFile += "DittoVersion.txt"; // // bool bError = false; // CStdioFile *remotefile = NULL; // // long lReturn = -1; // try // { // CInternetSession mysession; // remotefile = mysession.OpenURL(csUrl,1,INTERNET_FLAG_TRANSFER_BINARY|INTERNET_FLAG_RELOAD); // if(!remotefile) // return 0; // // CFile myfile(csFile, CFile::modeCreate|CFile::modeWrite|CFile::typeBinary); // // UINT unBytesRead = 0; // UINT unTotalBytes = 0; // // while (unBytesRead = remotefile->Read(httpbuff, HTTPBUFLEN)) // { // unTotalBytes += unBytesRead; // myfile.Write(httpbuff, unBytesRead); // // if(!remotefile) // { // unTotalBytes = 0; // break; // } // } // // myfile.Close(); // // if(unTotalBytes) // { // CStdioFile file; // if(file.Open(csFile, CFile::modeRead|CFile::typeText)) // { // CString csVersion; // if(file.ReadString(csVersion)) // { // file.Close(); // lReturn = ATOL(csVersion); // } // } // } // } // catch(CInternetException *pEX) // { // bError = true; // pEX->Delete(); // } // catch(CFileException *e) // { // bError = true; // e->Delete(); // } // catch(...) // { // bError = true; // csFile.Empty(); // } // // if(bError) // { // if(m_bShowMessages) // { // MessageBox(m_hParent, _T("Error Connecting."), _T("Ditto"), MB_OK); // m_bShowMessages = FALSE; // } // } // // if(remotefile) // { // remotefile->Close(); // // delete remotefile; // remotefile = NULL; // } // // if(FileExists(csFile)) // CFile::Remove(csFile); // // return lReturn; //} //CString CInternetUpdate::DownloadUpdate() //{ // char httpbuff[HTTPBUFLEN]; // // //Try to get a path from the regestry // CString csPath = CGetSetOptions::GetUpdateInstallPath(); // // //if nothing there get the default // if(csPath.IsEmpty()) // { // csPath = "ditto-cp.sourceforge.net/U3/DittoSetup.exe"; // } // // // CString csUrl = "http://" + csPath; // // CString csFile = CGetSetOptions::GetPath(PATH_UPDATE_FILE); // csFile += "DittoSetup.exe"; // // long lReturn = -1; // CHttpFile *RemoteFile = NULL; // // try // { // CInternetSession mysession; // // RemoteFile = (CHttpFile*)mysession.OpenURL(csUrl,1,INTERNET_FLAG_TRANSFER_BINARY|INTERNET_FLAG_RELOAD); // if(!RemoteFile) // return ""; // // //Get the file size // DWORD dFileSize; // RemoteFile->QueryInfo(HTTP_QUERY_CONTENT_LENGTH, dFileSize); // // //Set up the progress wnd // CProgressWnd progress; // progress.Create(CWnd::FromHandlePermanent(m_hParent), _T("Ditto Update")); // progress.SetRange(0, dFileSize, HTTPBUFLEN); // progress.SetText(_T("Downloading Ditto Update ...")); // // //Create the file to put the info in // CFile myfile(csFile, CFile::modeCreate|CFile::modeWrite|CFile::typeBinary); // // UINT unBytesRead = 0; // UINT unTotalBytes = 0; // // //Read in the file // while (unBytesRead = RemoteFile->Read(httpbuff, HTTPBUFLEN)) // { // progress.StepIt(); // progress.PeekAndPump(); // if(progress.Cancelled()) // { // csFile.Empty(); // break; // } // // unTotalBytes += unBytesRead; // myfile.Write(httpbuff, unBytesRead); // // if(!RemoteFile) // { // MessageBox(m_hParent, _T("Error Downloading update."), _T("Ditto"), MB_OK); // csFile = ""; // break; // } // } // // myfile.Close(); // } // catch(CInternetException *pEX) // { // MessageBox(m_hParent, _T("Error Downloading update."), _T("Ditto"), MB_OK); // csFile.Empty(); // pEX->Delete(); // } // catch(CFileException *e) // { // MessageBox(m_hParent, _T("Error Downloading update."), _T("Ditto"), MB_OK); // csFile.Empty(); // e->Delete(); // } // catch(...) // { // MessageBox(m_hParent, _T("Error Downloading update."), _T("Ditto"), MB_OK); // csFile.Empty(); // } // // if(RemoteFile) // { // RemoteFile->Close(); // delete RemoteFile; // RemoteFile = NULL; // } // // return csFile; //}