windows-nt/Source/XPSP1/NT/admin/snapin/schmmgmt/schmutil.h
2020-09-26 16:20:57 +08:00

533 lines
13 KiB
C++

/****
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