/****************************************************************************** Copyright (c) 2001 Microsoft Corporation Module Name: dlutil.h Abstract: header for download library ******************************************************************************/ #ifndef DLUTIL_H #define DLUTIL_H #include #include #include /////////////////////////////////////////////////////////////////////////////// // const defines & typedefs #define UNLEN 256 // need to define this here cuz winhttp.h doesn't define it and we get dupe // definitions if we try to include wininet.h just to get it. #ifndef INTERNET_MAX_URL_LENGTH #define INTERNET_MAX_URL_LENGTH 2200 #endif const DWORD c_cbDownloadBuffer = 32 * 1024; // 32k const DWORD c_cbDownloadBufferLite = 4 * 1024; // 4k const DWORD c_dwRetryTimeLimitInmsWinHttp = 2 * 60 * 1000; // 120s (2m) const DWORD c_dwRetryTimeLimitInmsWiuInet = 10 * 1000; // 10s const DWORD c_cMaxRetries = 3; const WCHAR c_wszUserAgent[] = L"Industry Update Control"; const char c_szUserAgent[] = "Industry Update Control"; const DWORD c_cchMaxURLSize = INTERNET_MAX_URL_LENGTH; #ifdef UNICODE #define c_tszUserAgent c_wszUserAgent #else #define c_tszUserAgent c_szUserAgent #endif typedef BOOL (__stdcall *pfn_ReadDataFromSite)(HINTERNET, LPVOID, DWORD, LPDWORD); /////////////////////////////////////////////////////////////////////////////// // macro defines #define sizeofSTRW(wsz) (sizeof(wsz) / sizeof(WCHAR)) #define sizeofSTRA(sz) (sizeof(sz)) #define sizeofSTRT(sz) (sizeof(sz) / sizeof(TCHAR)) /////////////////////////////////////////////////////////////////////////////// // necessary classes class CAutoCritSec { private: #if defined(DEBUG) || defined(DBG) DWORD m_dwOwningThread; DWORD m_cLocks; #endif CRITICAL_SECTION m_cs; BOOL m_fInit; public: CAutoCritSec(void) { m_fInit = WUInitializeCriticalSectionAndSpinCount(&m_cs, 0x8000FA0); #if defined(DEBUG) || defined(DBG) m_cLocks = 0; m_dwOwningThread = 0; #endif } ~CAutoCritSec(void) { #if defined(DEBUG) || defined(DBG) if (m_cLocks > 0 || m_dwOwningThread != 0) { // can't do logging here cuz this could be run during DllMain } #endif if (m_fInit) DeleteCriticalSection(&m_cs); } BOOL Lock(void) { LOG_Block("CAutoCritSec::Lock()"); if (m_fInit) { EnterCriticalSection(&m_cs); #if defined(DEBUG) || defined(DBG) m_cLocks++; m_dwOwningThread = GetCurrentThreadId(); #endif } else { LOG_Internet(_T("CAutoCritSec not initialized during Lock.")); } return m_fInit; } BOOL Unlock(void) { LOG_Block("CAutoCritSec::Unlock()"); if (m_fInit) { #if defined(DEBUG) || defined(DBG) if (m_cLocks == 0) LOG_Internet(_T("CAutoCritSec: trying to unlock when lock count is 0")); else m_cLocks--; if (m_dwOwningThread != GetCurrentThreadId()) { LOG_Internet(_T("CAutoCritSec: lock not owned by current thread: Owning thread: %d. Current thread: %d"), m_dwOwningThread, GetCurrentThreadId()); } if (m_cLocks == 0) m_dwOwningThread = 0; #endif LeaveCriticalSection(&m_cs); } else { LOG_Internet(_T("CAutoCritSec not initialized during Unlock.")); } return m_fInit; } }; /////////////////////////////////////////////////////////////////////////////// // prototypes BOOL IsServerFileDifferentW(FILETIME &ftServerTime, DWORD dwServerFileSize, LPCWSTR wszLocalFile); BOOL IsServerFileDifferentA(FILETIME &ftServerTime, DWORD dwServerFileSize, LPCSTR szLocalFile); #ifdef UNICODE #define IsServerFileDifferent IsServerFileDifferentW #else #define IsServerFileDifferent IsServerFileDifferentA #endif // !UNICODE HRESULT PerformDownloadToFile(pfn_ReadDataFromSite pfnRead, HINTERNET hRequest, HANDLE hFile, DWORD cbFile, DWORD cbBuffer, HANDLE *rghEvents, DWORD cEvents, PFNDownloadCallback fpnCallback, LPVOID pCallbackData, DWORD *pcbDownloaded); HRESULT StartWinInetDownload(HMODULE hmodWinInet, LPCTSTR pszServerUrl, LPCTSTR pszLocalPath, DWORD *pdwDownloadedBytes, HANDLE *hQuitEvents, UINT nQuitEventCount, PFNDownloadCallback fpnCallback, LPVOID pCallbackData, DWORD dwFlags, DWORD cbDownloadBuffer); HRESULT IsFileHtml(LPCTSTR pszFileName); #endif