/**** SchmUtil.h Various common utility routines for the Schema Editor Snap-In. ****/ #include "cache.h" #include "cookie.h" #include "select.h" #ifndef __SCHMUTIL_H_INCLUDED__ #define __SCHMUTIL_H_INCLUDED__ // // uncomment to enable the negative numbers support // #define ENABLE_NEGATIVE_INT // Returns the full pathname of the .hlp file for this snapin CString GetHelpFilename(); // // The global list of class scope cookies. // class CCookieListEntry { public: CCookieListEntry() : pCookie( NULL ), pNext( this ), pBack( this ) { ; } ~CCookieListEntry() { ; } Cookie *pCookie; HSCOPEITEM hScopeItem; CCookieListEntry *pNext; CCookieListEntry *pBack; }; class CCookieList { public: CCookieList() : pHead( NULL ), pParentCookie( NULL ) { ; } ~CCookieList() { DeleteAll(); } VOID AddCookie( Cookie *pCookie, HSCOPEITEM hScope ); VOID InsertSortedDisplay( ComponentData *pScopeControl, SchemaObject *pNewClass ); bool DeleteCookie(Cookie* pCookie); void DeleteAll(); // // Data members. // Cookie *pParentCookie; HSCOPEITEM hParentScopeItem; CCookieListEntry *pHead; // // We provide no functions to walk this list. The // user of this list has to walk it manually. // }; // // Some schema magic numbers. // #define CLASS_TYPE_88 0 #define CLASS_TYPE_STRUCTURAL 1 #define CLASS_TYPE_ABSTRACT 2 #define CLASS_TYPE_AUXILIARY 3 #define ATTRIBUTE_OPTIONAL 1 #define ATTRIBUTE_MANDATORY 2 // // Global DS class and attribute strings. // extern LPWSTR g_DisplayName; extern LPWSTR g_ClassFilter; extern LPWSTR g_AttributeFilter; extern LPWSTR g_Description; extern LPWSTR g_MayContain; extern LPWSTR g_MustContain; extern LPWSTR g_SystemMayContain; extern LPWSTR g_SystemMustContain; extern LPWSTR g_AuxiliaryClass; extern LPWSTR g_SystemAuxiliaryClass; extern LPWSTR g_SubclassOf; extern LPWSTR g_ObjectClassCategory; extern LPWSTR g_ObjectClass; extern LPWSTR g_CN; extern LPWSTR g_ClassSearchRequest; extern LPWSTR g_AttribSearchRequest; extern LPWSTR g_omSyntax; extern LPWSTR g_AttributeSyntax; extern LPWSTR g_omObjectClass; extern LPWSTR g_SystemOnly; extern LPWSTR g_Superiors; extern LPWSTR g_SystemSuperiors; extern LPWSTR g_GlobalClassID; extern LPWSTR g_GlobalAttributeID; extern LPWSTR g_RangeUpper; extern LPWSTR g_RangeLower; extern LPWSTR g_ShowInAdvViewOnly; extern LPWSTR g_IsSingleValued; extern LPWSTR g_IndexFlag; extern LPWSTR g_UpdateSchema; extern LPWSTR g_isDefunct; extern LPWSTR g_GCReplicated; extern LPWSTR g_DefaultAcl; extern LPWSTR g_DefaultCategory; extern LPWSTR g_systemFlags; extern LPWSTR g_fsmoRoleOwner; extern LPWSTR g_allowedChildClassesEffective; extern LPWSTR g_allowedAttributesEffective; // // ******************************************************************* // These are loaded from the resources as they need to be localizable. // ******************************************************************* // // // Global strings for our static nodes. // extern CString g_strSchmMgmt; extern CString g_strClasses; extern CString g_strAttributes; // // Strings for various object types. // extern CString g_88Class; extern CString g_StructuralClass; extern CString g_AuxClass; extern CString g_AbstractClass; extern CString g_MandatoryAttribute; extern CString g_OptionalAttribute; extern CString g_Yes; extern CString g_No; extern CString g_Unknown; extern CString g_Defunct; extern CString g_Active; // // Message strings. // extern CString g_NoDescription; extern CString g_NoName; extern CString g_MsgBoxErr; extern CString g_MsgBoxWarn; extern CString g_SysClassString; extern CString g_SysAttrString; // // Utility function declarations. // void LoadGlobalCookieStrings( ); VOID DebugTrace( LPWSTR Format, ... ); INT DoErrMsgBox( HWND hwndParent, BOOL fError, UINT wIdString ); INT DoErrMsgBox( HWND hwndParent, BOOL fError, PCWSTR pszError ); VOID DoExtErrMsgBox( VOID ); // INVALID_POINTER is returned by CListBox::GetItemDataPtr() in case of an error. extern const VOID * INVALID_POINTER; // add items from the VT_ARRAY|VT_BSTR variant to the listbox HRESULT InsertEditItems( HWND hwnd, VARIANT *AdsResult ); // as above but takes a CListBox& inline HRESULT InsertVariantEditItems( CListBox& refListBox, VARIANT *AdsResult ) { return InsertEditItems( refListBox.m_hWnd, AdsResult ); } // add items from stringlist to the listbox HRESULT InsertEditItems( CListBox& refListBox, CStringList& refstringlist ); // Add items from the listbox to the stringlist, skipping those // from the exclusion stringlist if one is present HRESULT RetrieveEditItemsWithExclusions( CListBox& refListBox, CStringList& refstringlist, CStringList* pstringlistExclusions = NULL ); // Helper function for octet string comparisson BOOL IsEqual( ADS_OCTET_STRING * ostr1, ADS_OCTET_STRING * ostr2 ); UINT GetSyntaxOrdinal( PCTSTR attributeSyntax, UINT omSyntax, ADS_OCTET_STRING * omObjectClass ); // add items from the VT_ARRAY|VT_BSTR variant to the stringlist HRESULT VariantToStringList( VARIANT& refvar, CStringList& refstringlist ); // Creates a new VT_ARRAY|VT_BSTR variant from the stringlist HRESULT StringListToVariant( VARIANT& refvar, CStringList& refstringlist ); HRESULT StringListToColumnList( ComponentData* pScopeControl, CStringList& refstringlist, ListEntry **ppNewList ); // // The menu command ids. // enum MENU_COMMAND { CLASSES_CREATE_CLASS = 0, ATTRIBUTES_CREATE_ATTRIBUTE, SCHEMA_RETARGET, SCHEMA_EDIT_FSMO, SCHEMA_REFRESH, SCHEMA_SECURITY, NEW_CLASS, NEW_ATTRIBUTE, MENU_LAST_COMMAND }; // // The menu strings. // extern CString g_MenuStrings[MENU_LAST_COMMAND]; extern CString g_StatusStrings[MENU_LAST_COMMAND]; // // Schema Object Syntax Descriptor class // class CSyntaxDescriptor { public: CSyntaxDescriptor( UINT nResourceID, BOOL fIsSigned, // Should the range be signed or unsigned number? BOOL fIsANRCapable, PCTSTR pszAttributeSyntax, UINT nOmSyntax, DWORD dwOmObjectClass, LPBYTE pOmObjectClass ) : m_nResourceID(nResourceID), m_fIsSigned(fIsSigned), m_fIsANRCapable(fIsANRCapable), m_pszAttributeSyntax(pszAttributeSyntax), m_nOmSyntax(nOmSyntax) { ASSERT( nResourceID ); ASSERT( (!pszAttributeSyntax && !nOmSyntax) || // either both are given (pszAttributeSyntax && nOmSyntax) ); // or both are 0 ASSERT( (!dwOmObjectClass && !pOmObjectClass) || // either both are given (dwOmObjectClass && pOmObjectClass) ); // or both are 0 m_octstrOmObjectClass.dwLength = dwOmObjectClass; m_octstrOmObjectClass.lpValue = pOmObjectClass; }; UINT m_nResourceID; BOOL m_fIsSigned; BOOL m_fIsANRCapable; PCTSTR m_pszAttributeSyntax; UINT m_nOmSyntax; ADS_OCTET_STRING m_octstrOmObjectClass; CString m_strSyntaxName; }; extern CSyntaxDescriptor g_Syntax[]; extern const UINT SCHEMA_SYNTAX_UNKNOWN; extern const LPWSTR g_UINT32_FORMAT; extern const LPWSTR g_INT32_FORMAT; // // ADS Provider Specific Extended Error // const HRESULT ADS_EXTENDED_ERROR = HRESULT_FROM_WIN32(ERROR_EXTENDED_ERROR); CString GetErrorMessage( HRESULT hr, BOOL fTryADSIExtError = FALSE ); HRESULT GetLastADsError( HRESULT hr, CString& refErrorMsg, CString& refName ); // // string to dword conversion utils, verification, etc. // const DWORD cchMinMaxRange = 11; // the largest numbers possible in the Range settings const DWORD cchMaxOID = 1024; const BOOL GETSAFEINT_ALLOW_CANCEL = TRUE; const HRESULT S_VALUE_MODIFIED = S_FALSE; const WCHAR g_chSpace = TEXT(' '); const WCHAR g_chNegativeSign = TEXT('-'); const WCHAR g_chPeriod = TEXT('.'); void DDXV_VerifyAttribRange( CDataExchange *pDX, BOOL fIsSigned, UINT idcLower, CString & strLower, UINT idcUpper, CString & strUpper ); INT64 DDXV_SigUnsigINT32Value( CDataExchange *pDX, BOOL fIsSigned, UINT idc, CString & str ); HRESULT GetSafeSignedDWORDFromString( CWnd * pwndParent, DWORD & lDst, CString & strSrc, BOOL fIsSigned, BOOL fAllowCancel = FALSE); HRESULT GetSafeINT32FromString( CWnd * pwndParent, INT64 & llDst, CString & strSrc, BOOL fIsSigned, BOOL fAllowCancel); BOOL IsValidNumber32( INT64 & llVal, BOOL fIsSigned ); BOOL IsValidNumberString( CString & str ); inline BOOL IsCharNumeric( WCHAR ch ) { return IsCharAlphaNumeric( ch ) && !IsCharAlpha( ch ); } ///////////////////////////////////////////////////////////////////////////// // CParsedEdit is a specialized CEdit control that only allows characters // of the number type ( signed/unsigned can be set dynamically ) // originally from the MFC samples class CParsedEdit : public CEdit { public: enum EditType { EDIT_TYPE_INVALID = 0, // should never be used, must be the first type EDIT_TYPE_GENERIC, EDIT_TYPE_INT32, EDIT_TYPE_UINT32, EDIT_TYPE_OID, EDIT_TYPE_LAST // should never be used, must be the last type }; private: EditType m_editType; public: // Construction CParsedEdit( EditType et ) { SetEditType( et ); } // subclassed construction BOOL SubclassEdit( UINT nID, CWnd* pParent, int cchMaxTextSize ); // 0 == unlimited // Edit box type protected: static BOOL IsNumericType( EditType et ) { return EDIT_TYPE_INT32 == et || EDIT_TYPE_UINT32 == et; } static BOOL IsValidEditType( EditType et ) { return EDIT_TYPE_INVALID < et && et < EDIT_TYPE_LAST; } BOOL IsInitialized() const { return IsValidEditType( m_editType ); } // can the current type be changed to et? BOOL IsCompatibleType( EditType et ) { ASSERT( IsValidEditType( et ) ); return !IsInitialized() || // everything is ok et == GetEditType() || // no change ( IsNumericType(GetEditType()) && // allow sign/unsign IsNumericType(et)) ; } // switch void SetEditType( EditType et ) { ASSERT( IsValidEditType(et) ); ASSERT( IsCompatibleType(et) ); m_editType = et; } public: EditType GetEditType() const { ASSERT( IsInitialized() ); // initialized? return m_editType; } // IsSigned access functions BOOL FIsSigned() const { ASSERT( IsNumericType(GetEditType()) ); return EDIT_TYPE_INT32 == GetEditType(); } void SetSigned( BOOL fIsSigned ) { ASSERT( IsInitialized() ); SetEditType( fIsSigned ? EDIT_TYPE_INT32 : EDIT_TYPE_UINT32 ); } // Implementation protected: //{{AFX_MSG(CParsedEdit) afx_msg void OnChar(UINT, UINT, UINT); // for character validation //}}AFX_MSG DECLARE_MESSAGE_MAP() }; /////////////////////////////////////////////////////////////////////////////// // Search a list of PCTSTR for a strValue, returns TRUE if found // rgszList[] last element must be NULL // // puIndex - optional pointer, will be set to the position of the value if found. // BOOL IsInList( PCTSTR rgszList[], const CString & strValue, UINT * puIndex = NULL ); // // Determine if the object pointed to by pIADsObject is category 1 object. // HRESULT IsCategory1Object( IADs *pIADsObject, BOOL & fIsCategory1 ); // // Determine if the object pointed to by pIADsObject is a constructed object. // HRESULT IsConstructedObject( IADs *pIADsObject, BOOL & fIsConstructed ); // // Read object's System Attribute // HRESULT GetSystemAttributes( IADs *pIADsObject, LONG &fSysAttribs ); // // // class CDialogControlsInfo { public: UINT m_nID; LPCTSTR m_pszAttributeName; BOOL m_fIsEditBox; }; HRESULT DissableReadOnlyAttributes( CWnd * pwnd, IADs *pIADsObject, const CDialogControlsInfo * pCtrls, UINT cCtrls ); HRESULT GetStringListElement( IADs *pIADsObject, LPWSTR *lppPathNames, CStringList &strlist ); // // Validate an OID string format // bool OIDHasValidFormat (PCWSTR pszOidValue, int& rErrorTypeStrID); HRESULT DeleteObject( const CString& path, Cookie* pcookie, PCWSTR pszClass); #endif