////////////////////////////////////////////////////////////////////////////// // // File: util.cpp // // Description: // // Copyright (c) 2000 Microsoft Corp. // ////////////////////////////////////////////////////////////////////////////// // App Includes #include "precomp.h" #include "main.h" #include "resource.h" #include #include ////////////////////////// Function Prototypes //////////////////////////////// int CALLBACK ChangeDirectoryCallback(HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData); /////////////////////////// // GVAR_LOCAL // // Global Variable // static struct GVAR_LOCAL { HKEY hRootKey; } GVAR_LOCAL = { NULL }; /////////////////////////////// // Util::Init // HRESULT Util::Init(HINSTANCE hInstance) { HRESULT hr = S_OK; if (SUCCEEDED(hr)) { LRESULT lr = NOERROR; DWORD dwDisposition = 0; lr = RegCreateKeyEx(HKEY_LOCAL_MACHINE, REG_KEY_PROJECTOR, NULL, NULL, 0, KEY_ALL_ACCESS, NULL, &GVAR_LOCAL.hRootKey, &dwDisposition); if (lr != NOERROR) { DBG_ERR(("InitApp, failed to open registry key")); hr = E_FAIL; } } return hr; } /////////////////////////////// // Util::Term // HRESULT Util::Term(void) { RegCloseKey(GVAR_LOCAL.hRootKey); GVAR_LOCAL.hRootKey = NULL; return S_OK; } /////////////////////////////// // GetMyPicturesFolder // HRESULT Util::GetMyPicturesFolder(TCHAR *pszFolder, DWORD cchFolder) { HRESULT hr = S_OK; // set the directory of the images. hr = SHGetFolderPath(NULL, CSIDL_MYPICTURES, NULL, 0, pszFolder); return hr; } /////////////////////////////// // GetProgramFilesFolder // HRESULT Util::GetProgramFilesFolder(TCHAR *pszFolder, DWORD cchFolder) { HRESULT hr = S_OK; // set the directory of the images. hr = SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL, 0, pszFolder); return hr; } /////////////////////////////// // Util::GetAppDirs // HRESULT Util::GetAppDirs(TCHAR *pszDeviceDir, DWORD cchDeviceDir, TCHAR *pszImageDir, DWORD cchImageDir) { HRESULT hr = S_OK; ASSERT(pszDeviceDir != NULL); ASSERT(pszImageDir != NULL); ASSERT(cchDeviceDir > 0); ASSERT(cchImageDir > 0); if ((pszDeviceDir == NULL) || (pszImageDir == NULL) || (cchDeviceDir == 0) || (cchImageDir == 0)) { return E_INVALIDARG; } // preload the image dir buffer with the "My Pictures" path // so that it is set as the default directory if we don't // have an overriding one in the registry. if (SUCCEEDED(hr)) { hr = GetMyPicturesFolder(pszImageDir, cchImageDir); } // preload the device dir buffer with the "Program Files\MSProjector" // install path so that it is set as the default directory if we don't // have an overriding one in the registry. if (SUCCEEDED(hr)) { hr = GetProgramFilesFolder(pszDeviceDir, cchDeviceDir); } if (SUCCEEDED(hr)) { if (pszDeviceDir[_tcslen(pszDeviceDir) - 1] != '\\') { _tcscat(pszDeviceDir, _T("\\")); } _tcscat(pszDeviceDir, DEFAULT_INSTALL_PATH); } if (SUCCEEDED(hr)) { // get the image dir. hr = GetRegString(REG_VAL_IMAGE_DIR, pszImageDir, cchImageDir, TRUE); if (FAILED(hr)) { DBG_ERR(("GetAppDirs, failed to get/set image directory. " "This should never happen")); ASSERT(FALSE); } // get the device dir hr = GetRegString(REG_VAL_DEVICE_DIR, pszDeviceDir, cchDeviceDir, TRUE); if (FAILED(hr)) { DBG_ERR(("GetAppDirs, failed to get/set image directory. " "This should never happen")); ASSERT(FALSE); } } return hr; } /////////////////////////////// // Util::GetRegString // HRESULT Util::GetRegString(const TCHAR *pszValueName, TCHAR *pszDir, DWORD cchDir, BOOL bSetIfNotExist) { HRESULT hr = S_OK; ASSERT(pszValueName != NULL); ASSERT(pszDir != NULL); ASSERT(cchDir > 0); if ((pszValueName == NULL) || (pszDir == NULL) || (cchDir <= 0)) { return E_INVALIDARG; } if (SUCCEEDED(hr)) { LRESULT lr = NOERROR; DWORD dwType = REG_SZ; lr = RegQueryValueEx(GVAR_LOCAL.hRootKey, pszValueName, NULL, &dwType, (BYTE*) pszDir, &cchDir); if (lr != NOERROR) { if (bSetIfNotExist) { // we need the number of bytes we are writing to the registry. DWORD dwLength = _tcslen(pszDir) * sizeof(TCHAR) + 1; lr = RegSetValueEx(GVAR_LOCAL.hRootKey, pszValueName, NULL, REG_SZ, (BYTE*) pszDir, dwLength); } else { hr = E_FAIL; DBG_ERR(("GetRegString, failed to get '%ls' from registry, hr = 0x%08lx", pszValueName, hr)); } } } return hr; } /////////////////////////////// // Util::SetRegString // HRESULT Util::SetRegString(const TCHAR *pszValueName, TCHAR *pszDir, DWORD cchDir) { HRESULT hr = S_OK; ASSERT(pszValueName != NULL); ASSERT(pszDir != NULL); ASSERT(cchDir > 0); if ((pszValueName == NULL) || (pszDir == NULL) || (cchDir <= 0)) { return E_INVALIDARG; } if (SUCCEEDED(hr)) { LRESULT lr = NOERROR; DWORD dwLength = _tcslen(pszDir) * sizeof(TCHAR) + 1; // we need the number of bytes we are writing to the registry. lr = RegSetValueEx(GVAR_LOCAL.hRootKey, pszValueName, NULL, REG_SZ, (BYTE*) pszDir, dwLength); if (lr != NOERROR) { hr = E_FAIL; DBG_ERR(("SetRegString, failed to set '%ls' to registry, hr = 0x%08lx", pszValueName, hr)); } } return hr; } /////////////////////////////// // Util::GetRegDWORD // HRESULT Util::GetRegDWORD(const TCHAR *pszValueName, DWORD *pdwValue, BOOL bSetIfNotExist) { HRESULT hr = S_OK; ASSERT(pszValueName != NULL); ASSERT(pdwValue != NULL); if ((pszValueName == NULL) || (pdwValue == NULL)) { return E_INVALIDARG; } if (SUCCEEDED(hr)) { LRESULT lr = NOERROR; DWORD dwType = REG_DWORD; DWORD dwSize = sizeof(DWORD); lr = RegQueryValueEx(GVAR_LOCAL.hRootKey, pszValueName, NULL, &dwType, (BYTE*) pdwValue, &dwSize); if (lr != NOERROR) { if (bSetIfNotExist) { // we need the number of bytes we are writing to the registry. lr = RegSetValueEx(GVAR_LOCAL.hRootKey, pszValueName, NULL, REG_SZ, (BYTE*) pdwValue, dwSize); } else { hr = E_FAIL; DBG_ERR(("GetRegDWORD, failed to get '%ls' from registry, hr = 0x%08lx", pszValueName, hr)); } } } return hr; } /////////////////////////////// // Util::SetRegDWORD // HRESULT Util::SetRegDWORD(const TCHAR *pszValueName, DWORD dwValue) { HRESULT hr = S_OK; ASSERT(pszValueName != NULL); if (pszValueName == NULL) { return E_INVALIDARG; } if (SUCCEEDED(hr)) { LRESULT lr = NOERROR; // we need the number of bytes we are writing to the registry. lr = RegSetValueEx(GVAR_LOCAL.hRootKey, pszValueName, NULL, REG_DWORD, (BYTE*) &dwValue, sizeof(DWORD)); if (lr != NOERROR) { hr = E_FAIL; DBG_ERR(("SetRegDWORD, failed to set '%ls' to registry, hr = 0x%08lx", pszValueName, hr)); } } return hr; } /////////////////////////////// // Util::BrowseForDirectory // bool Util::BrowseForDirectory(HWND hWnd, const TCHAR *pszPrompt, TCHAR *pszDirectory, DWORD cchDirectory) { bool bResult = false; LPMALLOC pMalloc = NULL; LPITEMIDLIST pidlSharedPictures = NULL; HRESULT hr = SHGetMalloc(&pMalloc); if (SUCCEEDED(hr)) { hr = SHGetFolderLocation(NULL, CSIDL_COMMON_PICTURES, NULL, 0, &pidlSharedPictures); } if (SUCCEEDED(hr)) { TCHAR szDisplayName[_MAX_PATH + 1] = {0}; TCHAR szDirectory[_MAX_PATH + 1] = {0}; BROWSEINFO BrowseInfo = {0}; BrowseInfo.hwndOwner = hWnd; BrowseInfo.pidlRoot = pidlSharedPictures; BrowseInfo.pszDisplayName = szDisplayName; BrowseInfo.lpszTitle = pszPrompt; BrowseInfo.ulFlags = BIF_RETURNONLYFSDIRS; BrowseInfo.lpfn = ChangeDirectoryCallback; BrowseInfo.lParam = (LPARAM)szDirectory; BrowseInfo.iImage = 0; LPITEMIDLIST pidl = SHBrowseForFolder(&BrowseInfo); if (pidl != NULL) { TCHAR szResult[MAX_PATH + 1] = {0}; if (SHGetPathFromIDList(pidl, szResult)) { _tcsncpy(pszDirectory, szResult, cchDirectory); bResult = true; } pMalloc->Free(pidl); pidl = NULL; } } if (pidlSharedPictures) { pMalloc->Free(pidlSharedPictures); pidlSharedPictures = NULL; } if (pMalloc) { pMalloc->Release(); pMalloc = NULL; } return bResult; } /////////////////////////////// // ChangeDirectoryCallback // int CALLBACK ChangeDirectoryCallback(HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData ) { if (uMsg == BFFM_INITIALIZED) { SendMessage(hWnd, BFFM_SETSELECTION, 1, (LPARAM)lpData ); } return 0; } /////////////////////////////// // Util::FormatTime // HRESULT Util::FormatTime(HINSTANCE hInstance, UINT nTotalSeconds, TCHAR *pszTime, DWORD cchTime) { ASSERT(pszTime != NULL); HRESULT hr = S_OK; int iResult = 0; TCHAR szString[255 + 1] = {0}; UINT nMinutes = nTotalSeconds / 60; UINT nSeconds = nTotalSeconds % 60; UINT uiStrResID = 0; if (pszTime == NULL) { return E_INVALIDARG; } if (nMinutes == 0) { if (nSeconds == 1) { uiStrResID = IDS_SECOND; } else { uiStrResID = IDS_SECONDS; } } else if (nSeconds == 0) { if (nMinutes == 1) { uiStrResID = IDS_MINUTE; } else { uiStrResID = IDS_MINUTES; } } else if ((nMinutes == 1) && (nSeconds == 1)) { uiStrResID = IDS_MINUTE_AND_SECOND; } else if (nMinutes == 1) { uiStrResID = IDS_MINUTE_AND_SECONDS; } else if (nSeconds == 1) { uiStrResID = IDS_MINUTES_AND_SECOND; } else { uiStrResID = IDS_MINUTES_AND_SECONDS; } if (uiStrResID != 0) { iResult = ::LoadString(hInstance, uiStrResID, szString, sizeof(szString) / sizeof(TCHAR)); } if (iResult != 0) { if (nMinutes == 0) { _sntprintf(pszTime, cchTime, szString, nSeconds); } else if (nSeconds == 0) { _sntprintf(pszTime, cchTime, szString, nMinutes); } else { _sntprintf(pszTime, cchTime, szString, nMinutes, nSeconds); } } return hr; } /////////////////////////////// // Util::FormatScale // HRESULT Util::FormatScale(HINSTANCE hInstance, DWORD dwImageScaleFactor, TCHAR *pszScale, DWORD cchScale) { ASSERT(pszScale != NULL); HRESULT hr = S_OK; int iResult = 0; TCHAR szString[255 + 1] = {0}; UINT uiStrResID = IDS_PERCENT; if (pszScale == NULL) { return E_INVALIDARG; } if (uiStrResID != 0) { iResult = ::LoadString(hInstance, uiStrResID, szString, sizeof(szString) / sizeof(TCHAR)); } if (iResult != 0) { _sntprintf(pszScale, cchScale, szString, dwImageScaleFactor); } return hr; } /////////////////////////////// // EndsWithChar // static BOOL EndsWithChar( LPCTSTR psz, TCHAR c ) { TCHAR* pszLast = _tcsrchr( (TCHAR*)psz, c ); // find last occurence of char in psz return(( NULL != pszLast ) && ( *_tcsinc( pszLast ) == _T('\0') ) ); } /////////////////////////////// // StripTrailingChar // static void StripTrailingChar(TCHAR* input, TCHAR c) { while (EndsWithChar(input, c)) { TCHAR* p = input + _tcsclen(input) - 1; *p = _T('\0'); } return; } /////////////////////////////// // GetString // BOOL Util::GetString(HINSTANCE hInstance, INT iStrResID, TCHAR *pszString, DWORD cchString, ...) { TCHAR szFmtString[255 + 1] = {0}; INT iResult = 0; va_list vaList; BOOL bSuccess = FALSE; iResult = ::LoadString(hInstance, iStrResID, szFmtString, sizeof(szFmtString) / sizeof(TCHAR)); if (iResult != 0) { va_start(vaList, cchString); _vsntprintf(pszString, cchString - 1, szFmtString, vaList); va_end(vaList); bSuccess = TRUE; } else { bSuccess = FALSE; } return bSuccess; } /////////////////////////////// // DoesDirExist // BOOL Util::DoesDirExist( LPCTSTR pszPath ) { TCHAR szTemp[MAX_PATH] = {0}; _tcscpy( szTemp, pszPath ); StripTrailingChar( szTemp, _T('\\') ); DWORD dw = GetFileAttributes( szTemp ); return((dw != 0xFFFFFFFF) && (dw & FILE_ATTRIBUTE_DIRECTORY) ); }