/*++ Copyright (c) 1995 Microsoft Corporation Module Name: qryparse.hxx Abstract: Author: Felix Wong [t-FelixW] 05-Nov-1996 ++*/ #ifndef _QRYPARSE_HXX #define _QRYPARSE_HXX #define BAIL_ON_FAILURE(hr) \ if (FAILED(hr)) { \ goto error; \ }\ #define MAXVAL 1000 #define QUERYNODE_INITIAL 2 #define QUERYNODE_INC 5 #define ATTRNODE_INITIAL 2 #define ATTRNODE_INC 2 enum snodetypes { SNODE_SZ, SNODE_NODE, SNODE_FILTER, SNODE_NULL }; enum query_symbols { QUERY_EQUAL, QUERY_NOT, QUERY_APPROX, QUERY_OR, QUERY_AND, QUERY_PRESENT, QUERY_STRING, QUERY_LE, QUERY_GE, QUERY_UNKNOWN }; enum search_scope { NDS_SCOPE_BASE, NDS_SCOPE_ONELEVEL, NDS_SCOPE_SUBTREE }; typedef struct _AttrNode { LPWSTR szName; DWORD dwType; BOOL fBinary; } AttrNode; class CQueryNode; class CStack; class CSyntaxNode; class CAttrList; class CQueryNode { public: CQueryNode(); ~CQueryNode(); HRESULT AddToFilterBuf( pFilter_Cursor_T pCur, CAttrList *pAttrList ); HRESULT SetToString(LPWSTR szValue); static HRESULT MapQueryToNDSType( DWORD dwType, nuint16 *pdwNDSType ); HRESULT AddChild(CQueryNode *pChild); static void N_FAR N_CDECL FreeFilterTokens( nuint32 syntax, nptr pVal ); DWORD _dwType; private: LPWSTR _szValue; CQueryNode **_rgQueryNode; DWORD _dwQueryNode; DWORD _dwQueryNodeMax; }; class CStack { public: CStack(); ~CStack(); HRESULT Push(CSyntaxNode*); HRESULT Pop(CSyntaxNode**); HRESULT Pop(); HRESULT Current(CSyntaxNode**); void Dump(); private: DWORD _dwStackIndex; CSyntaxNode* _Stack[MAXVAL]; }; // Helper functions HRESULT MakeNode( DWORD dwType, CQueryNode *pLQueryNode, CQueryNode *pRQueryNode, CQueryNode **ppQueryNodeReturn ); HRESULT MakeLeaf( LPWSTR szValue, CQueryNode **ppQuerynNodeReturn ); HRESULT Parse( LPWSTR szQuery, CQueryNode **ppNode, CAttrList **ppAttrList ); class CSyntaxNode { public: CSyntaxNode(); ~CSyntaxNode(); void SetNode(CQueryNode *pNode); void SetNode(LPWSTR szValue); void SetNode(DWORD dwFilterType); DWORD _dwToken; DWORD _dwState; DWORD _dwType; union { CQueryNode *_pNode; // Put in after reduction LPWSTR _szValue; // dwToken == ATTRTYPE|ATTRVAL DWORD _dwFilterType; // reduction of FT }; }; class CAttrList { public: CAttrList(); ~CAttrList(); HRESULT Add(LPWSTR szName); HRESULT CAttrList::SetupType(NDS_CONTEXT_HANDLE hADsContext); HRESULT GetType(LPWSTR szName, DWORD *pdwType); private: DWORD _dwAttrMax; DWORD _dwAttrCur; AttrNode* _rgAttr; }; HRESULT AdsNdsGenerateFilterBuffer( NDS_CONTEXT_HANDLE hADsContext, LPWSTR szSearchFilter, NDS_BUFFER_HANDLE *phFilterBuf ); #endif