/******************************************************************************* * * (C) COPYRIGHT MICROSOFT CORPORATION, 2000 * * TITLE: DESTDATA.H * * VERSION: 1.0 * * AUTHOR: ShaunIv * * DATE: 4/6/2000 * * DESCRIPTION: wrapper class to encapsulate plugins and directories * *******************************************************************************/ #ifndef __DESTDATA_H_INCLUDED #define __DESTDATA_H_INCLUDED #include #include #include "simidlst.h" #include "simstr.h" class CDestinationData { public: enum { APPEND_DATE_TO_PATH = 0x00000001, APPEND_TOPIC_TO_PATH = 0x00000002, DECORATION_MASK = 0x0000000F, SPECIAL_FOLDER = 0x00000020 }; struct CNameData { public: CSimpleString strDate; CSimpleString strTopic; CSimpleString strDateAndTopic; }; private: CSimpleIdList m_IdList; DWORD m_dwFlags; CNameData m_NameData; DWORD m_dwCsidl; HICON m_hSmallIcon; public: CDestinationData(void) : m_dwFlags(0), m_dwCsidl(0) { } CDestinationData( const CDestinationData &other ) : m_IdList(other.IdList()), m_dwFlags(other.Flags()), m_dwCsidl(other.Csidl()) { } void AssignFromIdList( const CSimpleIdList &idList, DWORD dwDecorationFlags ) { Destroy(); // // Here is the list of special folders we want to display // with their short names. Others will be stored as full paths // in PIDLs. // static const DWORD cs_SpecialFolders[] = { CSIDL_MYPICTURES, CSIDL_PERSONAL, CSIDL_COMMON_PICTURES }; // // Try to find a matching PIDL in the list. // for (int i=0;i(nCsidl)) { } DWORD Flags(void) const { return m_dwFlags; } DWORD Csidl(void) const { return m_dwCsidl; } CDestinationData &operator=( const CDestinationData &other ) { if (this != &other) { Destroy(); m_IdList = other.IdList(); m_dwFlags = other.Flags(); m_dwCsidl = other.Csidl(); } return *this; } ~CDestinationData(void) { Destroy(); } void Destroy(void) { m_IdList.Destroy(); m_dwFlags = 0; m_dwCsidl = 0; if (m_hSmallIcon) { DestroyIcon(m_hSmallIcon); m_hSmallIcon = NULL; } } const CSimpleIdList &IdList(void) const { return m_IdList; } bool IsSpecialFolder(void) const { if (m_dwFlags & SPECIAL_FOLDER) { return true; } return false; } bool operator==( const CDestinationData &other ) const { if (IsSpecialFolder() && other.IsSpecialFolder()) { if (Csidl() == other.Csidl()) { if ((Flags() & DECORATION_MASK) == (other.Flags() & DECORATION_MASK)) { return true; } } return false; } else if (m_IdList.Name() == other.IdList().Name()) { if ((Flags() & DECORATION_MASK) == (other.Flags() & DECORATION_MASK)) { return true; } } return false; } bool GetDecoration( CSimpleString &strResult, const CNameData &NameData ) const { if ((Flags() & DECORATION_MASK)==(APPEND_TOPIC_TO_PATH|APPEND_DATE_TO_PATH)) { strResult = NameData.strDateAndTopic; } else if ((Flags() & DECORATION_MASK)==APPEND_DATE_TO_PATH) { strResult = NameData.strDate; } else if ((Flags() & DECORATION_MASK)==APPEND_TOPIC_TO_PATH) { strResult = NameData.strTopic; } return (strResult.Length() != 0); } void AppendDecoration( CSimpleString &strResult, const CNameData &NameData ) const { if ((Flags() & DECORATION_MASK)==(APPEND_TOPIC_TO_PATH|APPEND_DATE_TO_PATH)) { strResult += TEXT("\\"); strResult += NameData.strDateAndTopic; } else if ((Flags() & DECORATION_MASK)==APPEND_DATE_TO_PATH) { strResult += TEXT("\\"); strResult += NameData.strDate; } else if ((Flags() & DECORATION_MASK)==APPEND_TOPIC_TO_PATH) { strResult += TEXT("\\"); strResult += NameData.strTopic; } } CSimpleString Path( const CNameData &NameData ) const { CSimpleString strResult; if (IsSpecialFolder()) { strResult = CSimpleIdList().GetSpecialFolder(NULL,m_dwCsidl|CSIDL_FLAG_CREATE).Name(); AppendDecoration( strResult, NameData ); } else { strResult = m_IdList.Name(); AppendDecoration( strResult, NameData ); } return strResult; } bool IsValidFileSystemPath( const CNameData &NameData ) const { bool bResult = true; CSimpleString strDecoration; if (GetDecoration( strDecoration, NameData )) { for (LPCTSTR pszCurr = strDecoration.String();pszCurr && *pszCurr && bResult;pszCurr = CharNext(pszCurr)) { if (*pszCurr == TEXT(':') || *pszCurr == TEXT('\\') || *pszCurr == TEXT('/') || *pszCurr == TEXT('?') || *pszCurr == TEXT('"') || *pszCurr == TEXT('<') || *pszCurr == TEXT('>') || *pszCurr == TEXT('|') || *pszCurr == TEXT('*')) { bResult = false; } } } return bResult; } bool operator!=( const CDestinationData &other ) const { return ((*this == other) == false); } bool IsValid(void) const { if (IsSpecialFolder()) { return true; } else { return m_IdList.IsValid(); } } HICON SmallIcon() { if (m_hSmallIcon) { return m_hSmallIcon; } if (IsValid()) { if (IsSpecialFolder()) { // // Get the folder's small icon // SHFILEINFO shfi = {0}; HIMAGELIST hShellImageList = reinterpret_cast(SHGetFileInfo( reinterpret_cast(CSimpleIdList().GetSpecialFolder(NULL,m_dwCsidl|CSIDL_FLAG_CREATE).IdList()), 0, &shfi, sizeof(shfi), SHGFI_SMALLICON | SHGFI_ICON | SHGFI_PIDL )); if (hShellImageList) { m_hSmallIcon = shfi.hIcon; } } else { // // Get the folder's small icon // SHFILEINFO shfi = {0}; HIMAGELIST hShellImageList = reinterpret_cast(SHGetFileInfo( reinterpret_cast(m_IdList.IdList()), 0, &shfi, sizeof(shfi), SHGFI_SMALLICON | SHGFI_ICON | SHGFI_PIDL )); if (hShellImageList) { m_hSmallIcon = shfi.hIcon; } } } return m_hSmallIcon; } CSimpleString DisplayName( const CNameData &NameData ) { CSimpleString strDisplayName; // // Get the folder's display name // if (IsSpecialFolder()) { SHFILEINFO shfi = {0}; if (SHGetFileInfo( reinterpret_cast(CSimpleIdList().GetSpecialFolder(NULL,m_dwCsidl|CSIDL_FLAG_CREATE).IdList()), 0, &shfi, sizeof(shfi), SHGFI_PIDL | SHGFI_DISPLAYNAME )) { strDisplayName = shfi.szDisplayName; } AppendDecoration( strDisplayName, NameData ); } else if (m_IdList.IsValid()) { TCHAR szPath[MAX_PATH]; if (SHGetPathFromIDList( m_IdList.IdList(), szPath )) { strDisplayName = szPath; } AppendDecoration( strDisplayName, NameData ); } return strDisplayName; } UINT RegistryDataSize(void) const { if (m_dwCsidl) { return sizeof(DWORD) + sizeof(DWORD); } else { return sizeof(DWORD) + sizeof(DWORD) + m_IdList.Size(); } } UINT GetRegistryData( PBYTE pData, UINT nLength ) const { UINT nResult = 0; if (pData) { if (nLength >= RegistryDataSize()) { if (IsSpecialFolder()) { CopyMemory(pData,&m_dwFlags,sizeof(DWORD)); pData += sizeof(DWORD); CopyMemory( pData, &m_dwCsidl, sizeof(DWORD)); } else { CopyMemory(pData,&m_dwFlags,sizeof(DWORD)); pData += sizeof(DWORD); DWORD dwSize = m_IdList.Size(); CopyMemory(pData,&dwSize,sizeof(DWORD)); pData += sizeof(DWORD); CopyMemory(pData,m_IdList.IdList(),dwSize); } nResult = RegistryDataSize(); } } return nResult; } UINT SetRegistryData( PBYTE pData, UINT nLength ) { UINT nResult = 0; Destroy(); if (pData) { // // Copy the flags // CopyMemory( &m_dwFlags, pData, sizeof(DWORD) ); pData += sizeof(DWORD); nLength -= sizeof(DWORD); // // If this is a web destination, we already have what we need // if (m_dwFlags & SPECIAL_FOLDER) { CopyMemory(&m_dwCsidl,pData,sizeof(DWORD)); nLength -= sizeof(DWORD); nResult = nLength; } else { DWORD dwPidlLength = 0; CopyMemory(&dwPidlLength,pData,sizeof(DWORD)); pData += sizeof(DWORD); nLength -= sizeof(DWORD); if (nLength >= dwPidlLength) { m_IdList = CSimpleIdList(pData,dwPidlLength); if (m_IdList.IsValid()) { nResult = nLength; } } } } return nResult; } }; #endif // __DESTDATA_H_INCLUDED