#ifndef __query_h #define __query_h // // Resource IDs used for the menus // // File menu #define DSQH_FILE_CONTEXT_FIRST (CQID_MINHANDLERMENUID + 0x0000) #define DSQH_FILE_CONTEXT_LAST (CQID_MINHANDLERMENUID + 0x0fff) #define DSQH_FILE_OPENCONTAINER (CQID_MINHANDLERMENUID + 0x1001) #define DSQH_FILE_PROPERTIES (CQID_MINHANDLERMENUID + 0x1002) #define DSQH_FILE_CREATESHORTCUT (CQID_MINHANDLERMENUID + 0x1003) #define DSQH_FILE_SAVEQUERY (CQID_MINHANDLERMENUID + 0x1004) // Edit menu #define DSQH_EDIT_SELECTALL (CQID_MINHANDLERMENUID + 0x1100) #define DSQH_EDIT_INVERTSELECTION (CQID_MINHANDLERMENUID + 0x1101) // View menu #define DSQH_VIEW_FILTER (CQID_MINHANDLERMENUID + 0x1200) #define DSQH_VIEW_LARGEICONS (CQID_MINHANDLERMENUID + 0x1201) #define DSQH_VIEW_SMALLICONS (CQID_MINHANDLERMENUID + 0x1202) #define DSQH_VIEW_LIST (CQID_MINHANDLERMENUID + 0x1203) #define DSQH_VIEW_DETAILS (CQID_MINHANDLERMENUID + 0x1204) #define DSQH_VIEW_ARRANGEICONS (CQID_MINHANDLERMENUID + 0x1205) #define DSQH_VIEW_REFRESH (CQID_MINHANDLERMENUID + 0x1206) #define DSQH_VIEW_PICKCOLUMNS (CQID_MINHANDLERMENUID + 0x1207) #define DSQH_VIEW_ARRANGEFIRST (CQID_MINHANDLERMENUID + 0x1280) #define DSQH_VIEW_ARRANGELAST (CQID_MINHANDLERMENUID + 0x12FF) // Help menu #define DSQH_HELP_CONTENTS (CQID_MINHANDLERMENUID + 0x1300) #define DSQH_HELP_WHATISTHIS (CQID_MINHANDLERMENUID + 0x1301) #define DSQH_HELP_ABOUT (CQID_MINHANDLERMENUID + 0x1302) // Extra background verbs #define DSQH_BG_SELECT (CQID_MINHANDLERMENUID + 0x1400) // Filter verbs #define DSQH_CLEARFILTER (CQID_MINHANDLERMENUID + 0x1500) #define DSQH_CLEARALLFILTERS (CQID_MINHANDLERMENUID + 0x1501) // // CDsQueryHandler global information // // // The bg thread communicates with the view using the following messages // #define DSQVM_ADDRESULTS (WM_USER+0) // lParam = HDPA containing results #define DSQVM_FINISHED (WM_USER+1) // lParam = fMaxResult // // Column DSA contains these items // #define PROPERTY_ISUNDEFINED 0x00000000 // property is undefined #define PROPERTY_ISUNKNOWN 0x00000001 // only operator is exacly #define PROPERTY_ISSTRING 0x00000002 // starts with, ends with, is exactly, not equal #define PROPERTY_ISNUMBER 0x00000003 // greater, less, equal, not equal #define PROPERTY_ISBOOL 0x00000004 // equal, not equal #define DEFAULT_WIDTH 20 #define DEFAULT_WIDTH_DESCRIPTION 40 typedef struct { INT iPropertyType; // type of property union { LPTSTR pszText; // iPropertyType == PROPERTY_ISSTRING INT iValue; // iPropertyType == PROPERTY_ISNUMBER }; } COLUMNVALUE, * LPCOLUMNVALUE; typedef struct { BOOL fHasColumnHandler:1; // column handler specified? LPWSTR pProperty; // property name LPTSTR pHeading; // column heading INT cx; // width of column (% of view) INT fmt; // formatting information INT iPropertyType; // type of property UINT idOperator; // currently selected operator COLUMNVALUE filter; // the filter applied CLSID clsidColumnHandler; // CLSID and IDsQueryColumnHandler objects IDsQueryColumnHandler* pColumnHandler; } COLUMN, * LPCOLUMN; typedef struct { LPWSTR pObjectClass; // object class (UNICODE) LPWSTR pPath; // directory object (UNICODE) INT iImage; // image / == -1 if none BOOL fIsContainer:1; // object is a container (used later) COLUMNVALUE aColumn[1]; // column data } QUERYRESULT, * LPQUERYRESULT; STDAPI CDsQuery_CreateInstance(IUnknown* punkOuter, IUnknown** ppunk, LPCOBJECTINFO poi); // // The outside world commmunicates with the thread using messages (sent via PostThreadMessage). // #define RVTM_FIRST (WM_USER) #define RVTM_LAST (WM_USER+32) #define RVTM_STOPQUERY (WM_USER) // wParam = 0, lParam =0 #define RVTM_REFRESH (WM_USER+1) // wParam = 0, lParam = 0 #define RVTM_SETCOLUMNTABLE (WM_USER+2) // wParam = 0, lParam = HDSA columns // // THREADINITDATA strucutre, this is passed when the query thread is being // created, it contains all the parameters required to issue the query, // and populate the view. // typedef struct { DWORD dwReference; // reference value for query LPWSTR pQuery; // base filter to be applied LPWSTR pScope; // scope to search LPWSTR pServer; // server to target LPWSTR pUserName; // user name and password to authenticate with LPWSTR pPassword; BOOL fShowHidden:1; // show hidden objects in results HWND hwndView; // handle of our result view to be filled HDSA hdsaColumns; // column table } THREADINITDATA, * LPTHREADINITDATA; // // Query thread, this is passed the THREADINITDATA structure // DWORD WINAPI QueryThread(LPVOID pThreadParams); VOID QueryThread_FreeThreadInitData(LPTHREADINITDATA* ppTID); STDAPI CQueryThreadCH_CreateInstance(IUnknown* punkOuter, IUnknown** ppunk, LPCOBJECTINFO poi); // // Scope logic // #define OBJECT_NAME_FROM_SCOPE(pDsScope)\ ((LPWSTR)ByteOffset(pDsScope, pDsScope->dwOffsetADsPath)) #define OBJECT_CLASS_FROM_SCOPE(pDsScope)\ ((LPWSTR)(!pDsScope->dwOffsetClass ? NULL : ByteOffset(pDsScope, pDsScope->dwOffsetClass))) typedef struct { CQSCOPE cq; // all scopes must have this as a header INT iIndent; // indent DWORD dwOffsetADsPath; // offset to scope DWORD dwOffsetClass; // offset to class of scope / = 0 if none WCHAR szStrings[1]; // string data (all UNICODE) } DSQUERYSCOPE, * LPDSQUERYSCOPE; typedef struct { HWND hwndFrame; // frame window to display message boxes on LPWSTR pDefaultScope; // scope for this object LPWSTR pServer; // server to target LPWSTR pUserName; // user name and password to authenticate with LPWSTR pPassword; } SCOPETHREADDATA, * LPSCOPETHREADDATA; #define GC_OBJECTCLASS L"domainDNS" // objectClass used for GC objects HRESULT GetGlobalCatalogPath(LPCWSTR pszServer, LPWSTR pszPath, INT cchBuffer); HRESULT AddScope(HWND hwndFrame, INT index, INT iIndent, LPWSTR pPath, LPWSTR pObjectClass, BOOL fSelect); HRESULT AllocScope(LPCQSCOPE* ppScope, INT iIndent, LPWSTR pPath, LPWSTR pObjectClass); DWORD WINAPI AddScopesThread(LPVOID pThreadParams); // // helpers for all to use // VOID MergeMenu(HMENU hMenu, HMENU hMenuToInsert, INT iIndex); HRESULT BindToPath(LPWSTR pszPath, REFIID riid, LPVOID* ppObject); INT FreeQueryResultCB(LPVOID pItem, LPVOID pData); VOID FreeQueryResult(LPQUERYRESULT pResult, INT cColumns); VOID FreeColumnValue(LPCOLUMNVALUE pColumnValue); INT FreeColumnCB(LPVOID pItem, LPVOID pData); VOID FreeColumn(LPCOLUMN pColumn); DWORD PropertyIsFromAttribute(LPCWSTR pszAttributeName, IDsDisplaySpecifier *pdds); BOOL MatchPattern(LPTSTR pString, LPTSTR pPattern); HRESULT EnumClassAttributes(IDsDisplaySpecifier *pdds, LPCWSTR pszObjectClass, LPDSENUMATTRIBUTES pcbEnum, LPARAM lParam); HRESULT GetFriendlyAttributeName(IDsDisplaySpecifier *pdds, LPCWSTR pszObjectClass, LPCWSTR pszAttributeName, LPWSTR pszBuffer, UINT cch); HRESULT GetColumnHandlerFromProperty(LPCOLUMN pColumn, LPWSTR pProperty); HRESULT GetPropertyFromColumn(LPWSTR* ppProperty, LPCOLUMN pColumn); STDAPI ADsPathToIdList(LPITEMIDLIST* ppidl, LPWSTR pPath, LPWSTR pObjectClass, BOOL fRelative); #endif