|
|
#ifndef __CITEMLST_H_INCLUDED
#define __CITEMLST_H_INCLUDED
#include <windows.h>
#include "wia.h"
#include "uicommon.h"
#include "simevent.h"
class CCameraItem { public: enum CDeleteState { Delete_Visible, Delete_Pending, Delete_Deleted };
private: CSimpleString m_strPreviewFileName; CComPtr<IWiaItem> m_pIWiaItem; CSimpleStringWide m_strwFullItemName; CCameraItem *m_pNext; CCameraItem *m_pChildren; CCameraItem *m_pParent; int m_nImageListIndex; int m_nCurrentPreviewPercentage; DWORD m_dwGlobalInterfaceTableCookie; CSimpleEvent m_CancelQueueEvent; CDeleteState m_DeleteState; LONG m_nItemType; LONG m_nItemRights;
private: //
// No implementation
//
CCameraItem(void); CCameraItem(const CCameraItem &); CCameraItem &operator=( const CCameraItem & );
public: explicit CCameraItem( IWiaItem *pIWiaItem ) : m_pIWiaItem(pIWiaItem), m_pNext(NULL), m_pChildren(NULL), m_pParent(NULL), m_nImageListIndex(-1), m_nCurrentPreviewPercentage(0), m_dwGlobalInterfaceTableCookie(0), m_CancelQueueEvent(true), m_DeleteState(Delete_Visible), m_nItemType(0), m_nItemRights(0) { WIA_PUSHFUNCTION(TEXT("CCameraItem::CCameraItem"));
AddItemToGlobalInterfaceTable(); WIA_TRACE((TEXT("Created CCameraItem(0x%08X)"),m_pIWiaItem.p));
PropStorageHelpers::GetProperty( m_pIWiaItem, WIA_IPA_FULL_ITEM_NAME, m_strwFullItemName );
PropStorageHelpers::GetProperty( m_pIWiaItem, WIA_IPA_ACCESS_RIGHTS, m_nItemRights );
}
HRESULT AddItemToGlobalInterfaceTable(void) { HRESULT hr = E_FAIL; if (Item()) { CComPtr<IGlobalInterfaceTable> pGlobalInterfaceTable; hr = CoCreateInstance( CLSID_StdGlobalInterfaceTable, NULL, CLSCTX_INPROC_SERVER, IID_IGlobalInterfaceTable, (void **)&pGlobalInterfaceTable); if (SUCCEEDED(hr)) { hr = pGlobalInterfaceTable->RegisterInterfaceInGlobal( Item(), IID_IWiaItem, &m_dwGlobalInterfaceTableCookie ); if (SUCCEEDED(hr)) { hr = S_OK; } } } return (hr); }
HRESULT RemoveItemFromGlobalInterfaceTable(void) { HRESULT hr = E_FAIL; if (Item()) { CComPtr<IGlobalInterfaceTable> pGlobalInterfaceTable; hr = CoCreateInstance( CLSID_StdGlobalInterfaceTable, NULL, CLSCTX_INPROC_SERVER, IID_IGlobalInterfaceTable, (void **)&pGlobalInterfaceTable); if (SUCCEEDED(hr)) { hr = pGlobalInterfaceTable->RevokeInterfaceFromGlobal( m_dwGlobalInterfaceTableCookie ); if (SUCCEEDED(hr)) { hr = S_OK; } } } return (hr); } DWORD GlobalInterfaceTableCookie(void) const { return m_dwGlobalInterfaceTableCookie; } ~CCameraItem(void) { WIA_PUSHFUNCTION(TEXT("CCameraItem::~CCameraItem")); WIA_TRACE((TEXT("Destroyed CCameraItem(0x%08X)"),m_pIWiaItem.p)); RemoveItemFromGlobalInterfaceTable(); m_pIWiaItem.Release(); if (m_strPreviewFileName.Length()) { DeleteFile( m_strPreviewFileName.String() ); m_strPreviewFileName = TEXT(""); } m_pNext = m_pChildren = m_pParent = NULL; m_nImageListIndex = 0; m_CancelQueueEvent.Signal(); m_CancelQueueEvent.Close(); } IWiaItem *Item(void) { return(m_pIWiaItem); } const IWiaItem *Item(void) const { return(m_pIWiaItem.p); } IWiaItem *Item(IWiaItem *pIWiaItem) { return(m_pIWiaItem = pIWiaItem); }
CDeleteState DeleteState(void) const { return m_DeleteState; } void DeleteState( CDeleteState DeleteState ) { m_DeleteState = DeleteState; }
int CurrentPreviewPercentage(void) const { return m_nCurrentPreviewPercentage; } int CurrentPreviewPercentage( int nCurrentPreviewPercentage ) { return (m_nCurrentPreviewPercentage = nCurrentPreviewPercentage); }
bool CreateCancelEvent(void) { m_nCurrentPreviewPercentage = 0; return m_CancelQueueEvent.Create(); } bool CloseCancelEvent(void) { m_nCurrentPreviewPercentage = 0; return m_CancelQueueEvent.Close(); } void SetCancelEvent(void) { m_CancelQueueEvent.Signal(); } void ResetCancelEvent(void) { m_CancelQueueEvent.Reset(); } CSimpleEvent &CancelQueueEvent(void) { return m_CancelQueueEvent; }
bool PreviewRequestPending(void) const { return (m_CancelQueueEvent.Event() != NULL); }
CSimpleString PreviewFileName(void) const { return m_strPreviewFileName; } const CSimpleString &PreviewFileName( const CSimpleString &strPreviewFileName ) { return (m_strPreviewFileName = strPreviewFileName); }
int ImageListIndex(void) const { return(m_nImageListIndex); }
int ImageListIndex( int nImageListIndex ) { return (m_nImageListIndex = nImageListIndex); }
LONG ItemType(void) { if (!Item()) { return 0; } if (!m_nItemType) { Item()->GetItemType(&m_nItemType); } return m_nItemType; }
LONG ItemRights() const { return m_nItemRights; }
bool IsFolder(void) { return ((ItemType() & WiaItemTypeFolder) != 0); }
bool IsImage(void) { return ((ItemType() & WiaItemTypeImage) != 0); }
CSimpleStringWide FullItemName(void) const { return m_strwFullItemName; }
bool operator==( const CCameraItem &other ) { return(Item() == other.Item()); }
const CCameraItem *Next(void) const { return(m_pNext); } CCameraItem *Next(void) { return(m_pNext); } CCameraItem *Next( CCameraItem *pNext ) { return(m_pNext = pNext); }
const CCameraItem *Children(void) const { return(m_pChildren); } CCameraItem *Children(void) { return(m_pChildren); } CCameraItem *Children( CCameraItem *pChildren ) { return(m_pChildren = pChildren); }
const CCameraItem *Parent(void) const { return(m_pParent); } CCameraItem *Parent(void) { return(m_pParent); } CCameraItem *Parent( CCameraItem *pParent ) { return(m_pParent = pParent); } };
class CCameraItemList { private: CCameraItem *m_pRoot; public: CCameraItemList(void) : m_pRoot(NULL) { } ~CCameraItemList(void) { Destroy(m_pRoot); m_pRoot = NULL; } void Destroy( CCameraItem *pRoot ) { while (pRoot) { Destroy(pRoot->Children()); CCameraItem *pCurr = pRoot; pRoot = pRoot->Next(); delete pCurr; } } const CCameraItem *Root(void) const { return(m_pRoot); } CCameraItem *Root(void) { return(m_pRoot); } CCameraItem *Root( CCameraItem *pRoot ) { return(m_pRoot = pRoot); } static CCameraItem *Find( CCameraItem *pRoot, const CCameraItem *pNode ) { for (CCameraItem *pCurr = pRoot;pCurr;pCurr = pCurr->Next()) { if (pCurr->DeleteState() != CCameraItem::Delete_Deleted) { if (*pCurr == *pNode) return(pCurr); if (pCurr->Children()) { CCameraItem *pFind = Find( pCurr->Children(), pNode ); if (pFind) return pFind; } } } return(NULL); } CCameraItem *Find( CCameraItem *pNode ) { return(Find( m_pRoot, pNode )); } static CCameraItem *Find( CCameraItem *pRoot, IWiaItem *pItem ) { for (CCameraItem *pCurr = pRoot;pCurr;pCurr = pCurr->Next()) { if (pCurr->DeleteState() != CCameraItem::Delete_Deleted) { if (pCurr->Item() == pItem) return(pCurr); if (pCurr->Children()) { CCameraItem *pFind = Find( pCurr->Children(), pItem ); if (pFind) return pFind; } } } return(NULL); } CCameraItem *Find( IWiaItem *pItem ) { return(Find( m_pRoot, pItem )); } static CCameraItem *Find( CCameraItem *pRoot, DWORD dwGlobalInterfaceTableCookie ) { for (CCameraItem *pCurr = pRoot;pCurr;pCurr = pCurr->Next()) { if (pCurr->DeleteState() != CCameraItem::Delete_Deleted) { if (pCurr->GlobalInterfaceTableCookie() == dwGlobalInterfaceTableCookie) return(pCurr); if (pCurr->Children()) { CCameraItem *pFind = Find( pCurr->Children(), dwGlobalInterfaceTableCookie ); if (pFind) return pFind; } } } return(NULL); } CCameraItem *Find( DWORD dwGlobalInterfaceTableCookie ) { return(Find( m_pRoot, dwGlobalInterfaceTableCookie )); } CCameraItem *Find( CCameraItem *pRoot, const CSimpleBStr &bstrFullItemName ) { CSimpleStringWide strwTemp;
for (CCameraItem *pCurr = pRoot;pCurr && bstrFullItemName.BString();pCurr = pCurr->Next()) { if (pCurr->DeleteState() != CCameraItem::Delete_Deleted) { strwTemp = pCurr->FullItemName();
if (wcscmp(strwTemp, bstrFullItemName) == 0) { return pCurr; } if (pCurr->Children()) { CCameraItem *pFind = Find( pCurr->Children(), bstrFullItemName ); if (pFind) return pFind; } } } return NULL; } CCameraItem *Find( const CSimpleBStr &bstrFullItemName ) { return Find( m_pRoot, bstrFullItemName ); } void Add( CCameraItem *pParent, CCameraItem *pNewCameraItemNode ) { WIA_PUSHFUNCTION(TEXT("CCameraItemList::Add")); WIA_TRACE((TEXT("Root(): 0x%08X"), Root())); if (pNewCameraItemNode) { if (!Root()) { Root(pNewCameraItemNode); pNewCameraItemNode->Parent(NULL); pNewCameraItemNode->Children(NULL); pNewCameraItemNode->Next(NULL); } else { if (!pParent) { CCameraItem *pCurr=Root(); while (pCurr && pCurr->Next()) { pCurr=pCurr->Next(); } if (pCurr) { pCurr->Next(pNewCameraItemNode); } pNewCameraItemNode->Next(NULL); pNewCameraItemNode->Children(NULL); pNewCameraItemNode->Parent(NULL); } else if (!pParent->Children()) { pParent->Children(pNewCameraItemNode); pNewCameraItemNode->Next(NULL); pNewCameraItemNode->Children(NULL); pNewCameraItemNode->Parent(pParent); } else { CCameraItem *pCurr=pParent->Children(); while (pCurr && pCurr->Next()) { pCurr=pCurr->Next(); } if (pCurr) { pCurr->Next(pNewCameraItemNode); } pNewCameraItemNode->Next(NULL); pNewCameraItemNode->Children(NULL); pNewCameraItemNode->Parent(pParent); } } } } };
#endif //__CITEMLST_H_INCLUDED
|