/***************************************************************************** * * (C) COPYRIGHT MICROSOFT CORPORATION, 2000 * * TITLE: ImageLst.cpp * * VERSION: 1.0 * * DATE: 2000/11/14 * * DESCRIPTION: Manages Images Item List * *****************************************************************************/ #include #include #include "wiavideotest.h" static struct { UINT uiNumPicturesInList; BOOL bExitThread; HANDLE hItemListThread; } LOCAL_GVAR = { 0, FALSE, NULL }; typedef struct tagThreadArgs_t { BOOL bWiaDeviceListMode; union { struct { DWORD dwWiaCookie; IGlobalInterfaceTable *pGIT; } WiaItemList; struct { TCHAR szImagesDirectory[255 + 1]; } DShowItemList; }; } ThreadArgs_t; /****************************Local Function Prototypes********************/ void IncNumPicsInList(); DWORD WINAPI LoadListWithWiaItems(IGlobalInterfaceTable *pGIT, DWORD dwCookie); DWORD WINAPI LoadListWithFileItems(const TCHAR *pszImagesDirectory); DWORD WINAPI ItemListThreadProc(void *pArgs); /////////////////////////////// // IncNumPicsInList // void IncNumPicsInList() { InterlockedIncrement((LONG*) &LOCAL_GVAR.uiNumPicturesInList); SetDlgItemInt(APP_GVAR.hwndMainDlg, IDC_EDIT_NUM_PICTURES_TAKEN, LOCAL_GVAR.uiNumPicturesInList, FALSE); return; } /////////////////////////////// // ImageLst_PostAddImageRequest // HRESULT ImageLst_PostAddImageRequest(BSTR bstrNewImage) { HRESULT hr = S_OK; if (bstrNewImage == NULL) { return E_POINTER; } // // This will be freed by the AddImageToList function below. // BSTR bstrPosted = ::SysAllocString(bstrNewImage); PostMessage(APP_GVAR.hwndMainDlg, WM_CUSTOM_ADD_IMAGE, 0, (LPARAM)bstrPosted); return hr; } /////////////////////////////// // ImageLst_AddImageToList // HRESULT ImageLst_AddImageToList(BSTR bstrNewImage) { HRESULT hr = S_OK; TCHAR szNewImage[MAX_PATH] = {0}; if (bstrNewImage == NULL) { return E_POINTER; } if (hr == S_OK) { hr = AppUtil_ConvertToTCHAR((WCHAR*) bstrNewImage, szNewImage, sizeof(szNewImage) / sizeof(TCHAR)); } if (hr == S_OK) { // // Insert at the top of the list. // LRESULT lResult = 0; lResult = SendDlgItemMessage(APP_GVAR.hwndMainDlg, IDC_LIST_NEW_IMAGES, LB_ADDSTRING, 0, (LPARAM) szNewImage); WPARAM Index = (WPARAM) lResult; IncNumPicsInList(); SendDlgItemMessage(APP_GVAR.hwndMainDlg, IDC_LIST_NEW_IMAGES, LB_SETCURSEL, Index, 0); } if (bstrNewImage) { ::SysFreeString(bstrNewImage); } return hr; } /////////////////////////////// // LoadListWithWiaItems // DWORD WINAPI LoadListWithWiaItems(IGlobalInterfaceTable *pGIT, DWORD dwCookie) { HRESULT hr = S_OK; IWiaItem *pSelectedDevice = NULL; IEnumWiaItem *pIEnumItem = NULL; if ((pGIT == NULL) || (dwCookie == 0)) { return -1; } hr = pGIT->GetInterfaceFromGlobal(dwCookie, IID_IWiaItem, (void**)&pSelectedDevice); if (pSelectedDevice == NULL) { return -1; } hr = pSelectedDevice->EnumChildItems(&pIEnumItem); if (hr == S_OK) { hr = pIEnumItem->Reset(); } DWORD dwStartTime = 0; DWORD dwEndTime = 0; dwStartTime = timeGetTime(); if (hr == S_OK) { BOOL bDone = LOCAL_GVAR.bExitThread; while (!bDone) { IWiaItem *pIWiaItem = NULL; IWiaPropertyStorage *pStorage = NULL; TCHAR szItemName[MAX_PATH] = {0}; hr = pIEnumItem->Next(1, &pIWiaItem, NULL); if (LOCAL_GVAR.bExitThread) { // // Exit the thread // hr = E_FAIL; } if (hr == S_OK) { hr = pIWiaItem->QueryInterface(IID_IWiaPropertyStorage, (void**) &pStorage); } if (hr == S_OK) { PROPVARIANT pv; PropVariantInit(&pv); hr = WiaProc_GetProperty(pStorage, WIA_IPA_FULL_ITEM_NAME, &pv); if (pv.vt == VT_BSTR) { ImageLst_PostAddImageRequest(pv.bstrVal); } PropVariantClear(&pv); } if (pIWiaItem) { pIWiaItem->Release(); pIWiaItem = NULL; } if (pStorage) { pStorage->Release(); pStorage = NULL; } if (hr != S_OK) { bDone = TRUE; } else if (LOCAL_GVAR.bExitThread) { bDone = TRUE; } } } dwEndTime = timeGetTime(); SetDlgItemInt(APP_GVAR.hwndMainDlg, IDC_EDIT_LIST_LOAD_TIME, (UINT) abs(dwEndTime - dwStartTime), FALSE); if (pIEnumItem) { pIEnumItem->Release(); pIEnumItem = NULL; } return 0; } /////////////////////////////// // LoadListWithFileItems // DWORD WINAPI LoadListWithFileItems(const TCHAR *pszImagesDirectory) { HRESULT hr = S_OK; TCHAR szSearchPath[MAX_PATH + 1] = {0}; HANDLE hFindHandle = NULL; BOOL bDone = FALSE; WIN32_FIND_DATA FindData; if (pszImagesDirectory == NULL) { return -1; } _sntprintf(szSearchPath, sizeof(szSearchPath) / sizeof(TCHAR), TEXT("%s\\*.jpg"), pszImagesDirectory); hFindHandle = FindFirstFile(szSearchPath, &FindData); if (hFindHandle == INVALID_HANDLE_VALUE) { bDone = TRUE; } DWORD dwStartTime = 0; DWORD dwEndTime = 0; dwStartTime = timeGetTime(); while ((!bDone) && (!LOCAL_GVAR.bExitThread)) { BOOL bSuccess = FALSE; BSTR bstrFileName = NULL; TCHAR szFileName[_MAX_FNAME + MAX_PATH + 1] = {0}; WCHAR wszFileName[_MAX_FNAME + MAX_PATH + 1] = {0}; _sntprintf(szFileName, sizeof(szFileName) / sizeof(TCHAR), TEXT("%s\\%s"), pszImagesDirectory, FindData.cFileName); AppUtil_ConvertToWideString(szFileName, wszFileName, sizeof(wszFileName) / sizeof(WCHAR)); // // This is relased by the post processor function // bstrFileName = ::SysAllocString(wszFileName); ImageLst_PostAddImageRequest(bstrFileName); bSuccess = FindNextFile(hFindHandle, &FindData); if (!bSuccess) { bDone = TRUE; } } dwEndTime = timeGetTime(); SetDlgItemInt(APP_GVAR.hwndMainDlg, IDC_EDIT_LIST_LOAD_TIME, (UINT) abs(dwEndTime - dwStartTime), FALSE); if (hFindHandle) { FindClose(hFindHandle); hFindHandle = NULL; } return 0; } /////////////////////////////// // ItemListThreadProc // DWORD WINAPI ItemListThreadProc(void *pArgs) { HRESULT hr = S_OK; ThreadArgs_t *pThreadArgs = (ThreadArgs_t*) pArgs; if (pThreadArgs == NULL) { return -1; } if (pThreadArgs->bWiaDeviceListMode == TRUE) { LoadListWithWiaItems(pThreadArgs->WiaItemList.pGIT, pThreadArgs->WiaItemList.dwWiaCookie); if (pThreadArgs->WiaItemList.pGIT) { pThreadArgs->WiaItemList.pGIT->Release(); pThreadArgs->WiaItemList.pGIT = NULL; } } else { LoadListWithFileItems(pThreadArgs->DShowItemList.szImagesDirectory); } delete pThreadArgs; pThreadArgs = NULL; return 0; } /////////////////////////////// // ImageLst_PopulateWiaItemList // HRESULT ImageLst_PopulateWiaItemList(IGlobalInterfaceTable *pGIT, DWORD dwCookie) { HRESULT hr = S_OK; DWORD dwThreadID = 0; ThreadArgs_t *pArgs = NULL; if ((pGIT == NULL) || (dwCookie == 0)) { return E_POINTER; } LOCAL_GVAR.uiNumPicturesInList = 0; SetDlgItemInt(APP_GVAR.hwndMainDlg, IDC_EDIT_NUM_PICTURES_TAKEN, LOCAL_GVAR.uiNumPicturesInList, FALSE); SetDlgItemInt(APP_GVAR.hwndMainDlg, IDC_EDIT_LIST_LOAD_TIME, 0, FALSE); pArgs = new ThreadArgs_t; if (pArgs == NULL) { return E_OUTOFMEMORY; } ZeroMemory(pArgs, sizeof(*pArgs)); pGIT->AddRef(); pArgs->bWiaDeviceListMode = TRUE; pArgs->WiaItemList.pGIT = pGIT; pArgs->WiaItemList.dwWiaCookie = dwCookie; LOCAL_GVAR.bExitThread = FALSE; LOCAL_GVAR.hItemListThread = CreateThread(NULL, 0, ItemListThreadProc, (void*) pArgs, 0, &dwThreadID); return hr; } /////////////////////////////// // ImageLst_PopulateDShowItemList // HRESULT ImageLst_PopulateDShowItemList(const TCHAR *pszImagesDirectory) { HRESULT hr = S_OK; DWORD dwThreadID = 0; ThreadArgs_t *pArgs = NULL; if (pszImagesDirectory == NULL) { return E_POINTER; } LOCAL_GVAR.uiNumPicturesInList = 0; SetDlgItemInt(APP_GVAR.hwndMainDlg, IDC_EDIT_NUM_PICTURES_TAKEN, LOCAL_GVAR.uiNumPicturesInList, FALSE); SetDlgItemInt(APP_GVAR.hwndMainDlg, IDC_EDIT_LIST_LOAD_TIME, 0, FALSE); pArgs = new ThreadArgs_t; if (pArgs == NULL) { return E_OUTOFMEMORY; } ZeroMemory(pArgs, sizeof(*pArgs)); pArgs->bWiaDeviceListMode = FALSE; _tcsncpy(pArgs->DShowItemList.szImagesDirectory, pszImagesDirectory, sizeof(pArgs->DShowItemList.szImagesDirectory) / sizeof(TCHAR)); LOCAL_GVAR.bExitThread = FALSE; LOCAL_GVAR.hItemListThread = CreateThread(NULL, 0, ItemListThreadProc, (void*) pArgs, 0, &dwThreadID); return hr; } /////////////////////////////// // ImageLst_Clear // HRESULT ImageLst_Clear() { HRESULT hr = S_OK; // // Clear the New Image List // SendDlgItemMessage(APP_GVAR.hwndMainDlg, IDC_LIST_NEW_IMAGES, LB_RESETCONTENT, 0, 0); LOCAL_GVAR.uiNumPicturesInList = 0; SetDlgItemInt(APP_GVAR.hwndMainDlg, IDC_EDIT_NUM_PICTURES_TAKEN, LOCAL_GVAR.uiNumPicturesInList, FALSE); return hr; } /////////////////////////////// // ImageLst_CancelLoadAndWait // HRESULT ImageLst_CancelLoadAndWait(DWORD dwTimeout) { HRESULT hr = S_OK; if (LOCAL_GVAR.hItemListThread) { LOCAL_GVAR.bExitThread = TRUE; WaitForSingleObject(LOCAL_GVAR.hItemListThread, dwTimeout); } return hr; }