// Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved
// MOFWizCtl.h : Declaration of the CMOFWizCtrl OLE control class.

class CMofGenSheet;
class CMyPropertyPage1;
class CMyPropertyPage3;
class CMyPropertyPage4;
class CWrapListCtrl;

void ErrorMsg
		(CString *pcsUserMsg, SCODE sc, IWbemClassObject *pErrorObject, BOOL bLog, CString *pcsLogMsg, 
		char *szFile, int nLine, BOOL bNotification = FALSE, UINT uType = MB_ICONEXCLAMATION);
	
void LogMsg
		(CString *pcsLogMsg, char *szFile, int nLine);

/////////////////////////////////////////////////////////////////////////////
// CMOFWizCtrl : See MOFWizCtl.cpp for implementation.

class CMOFWizCtrl : public COleControl
{
	DECLARE_DYNCREATE(CMOFWizCtrl)

// Constructor
public:
	CMOFWizCtrl();
	CString &GetMofDir(){return m_csMofDir;}
	CString &GetMofFile(){return m_csMofFile;}
	CStringArray &GetClasses() {return m_csaClassNames;}
	CByteArray &GetClassIndicators() {return m_cbaIndicators;}
	CStringArray *&GetInstances() {return m_pcsaInstances;}
	IWbemServices *GetServices(){return m_pServices;}
	void FinishMOFTargets();
	CString GetSDKDirectory();
// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CMOFWizCtrl)
	public:
	virtual void OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid);
	virtual void DoPropExchange(CPropExchange* pPX);
	virtual void OnResetState();
	virtual BOOL PreTranslateMessage(MSG* pMsg);
	protected:
	virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
	virtual void OnSetClientSite( );
	//}}AFX_VIRTUAL

// Implementation
protected:
	~CMOFWizCtrl();
	CString m_csNameSpace;
	DECLARE_OLECREATE_EX(CMOFWizCtrl)    // Class factory and guid
	DECLARE_OLETYPELIB(CMOFWizCtrl)      // GetTypeInfo
	DECLARE_PROPPAGEIDS(CMOFWizCtrl)     // Property page IDs
	DECLARE_OLECTLTYPE(CMOFWizCtrl)		// Type name and misc status

	CToolTipCtrl m_ttip;

	BOOL m_bInitDraw;
	HICON m_hMOFWiz;
	HICON m_hMOFWizSel;
	CImageList *m_pcilImageList;
	int m_nImage;
	
	IWbemServices *m_pServices;
	IWbemServices *InitServices
		(CString *pcsNameSpace);
	IWbemServices *GetIWbemServices(CString &rcsNamespace);

	SCODE m_sc;
	BOOL m_bUserCancel;

	SCODE MakeSafeArray(SAFEARRAY FAR ** pRet, VARTYPE vt, int iLen);
	SCODE PutStringInSafeArray
		(SAFEARRAY FAR * psa,CString *pcs, int iIndex);
	SCODE CMOFWizCtrl::GetStringFromSafeArray
		(SAFEARRAY FAR * psa,CString *pcs, int iIndex);

	CStringArray m_csaClassNames;
	CByteArray m_cbaIndicators;
	CStringArray *m_pcsaInstances;

	void MOFEntry
		(CString *pcsMofName, 
		IWbemClassObject *pObject, int nIndex, BOOL &bFirst, BOOL bWriteInstances);
	void WriteInstances(IWbemClassObject *pIWbemClassObject,
			   CString *pcsMofName, int nIndex, BOOL &bFirst);

	CString m_csMofDir;
	CString m_csMofFile;
	CString GetClassName(IWbemClassObject *pClass);
	CString GetSuperClassName(IWbemClassObject *pClass);
	CString GetBSTRProperty 
		(IWbemClassObject * pInst, CString *pcsProperty);
	void ReleaseErrorObject(IWbemClassObject *&rpErrorObject);
	void DoubleSlash(CString &csNamespace);
	CMofGenSheet *m_pcgsPropertySheet;
	BOOL OnWizard(CStringArray *pcsaClasses);
	BOOL m_bMOFIsEmpty;

	void RelayEvent(UINT message, WPARAM wParam, LPARAM lParam);

	void InvokeHelp();

	CString GetMachineName();
	CString GetPCMachineName();
	CString GetNamespaceMachineName();

	int WriteData(CString &csOutputString);
	BOOL OpenMofFile(CString &rcsPath);
	CString FixUpCrForUNICODE(CString &rcsMof);
	CString m_csEndl;
	BOOL m_bUnicode;
	FILE *m_pfOut;  

	void CommentOutDefinition(CString &rcsMof);

// Message maps
	//{{AFX_MSG(CMOFWizCtrl)
	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
	afx_msg void OnSize(UINT nType, int cx, int cy);
	afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
	afx_msg void OnDestroy();
	afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
	afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
	afx_msg void OnMouseMove(UINT nFlags, CPoint point);
	afx_msg void OnKillFocus(CWnd* pNewWnd);
	afx_msg void OnSetFocus(CWnd* pOldWnd);
	afx_msg BOOL OnEraseBkgnd(CDC* pDC);
	afx_msg void OnMove(int x, int y);
	//}}AFX_MSG
	afx_msg long FireGenerateMOFMessage (UINT uParam, LONG lParam);
	DECLARE_MESSAGE_MAP()

// Dispatch maps
	//{{AFX_DISPATCH(CMOFWizCtrl)
	afx_msg VARIANT GetMOFTargets();
	afx_msg void SetMOFTargets(const VARIANT FAR& newValue);
	//}}AFX_DISPATCH
	DECLARE_DISPATCH_MAP()

	afx_msg void AboutBox();

// Event maps
	//{{AFX_EVENT(CMOFWizCtrl)
	void FireGenerateMOFs()
		{FireEvent(eventidGenerateMOFs,EVENT_PARAM(VTS_NONE));}
	void FireGetIWbemServices(LPCTSTR lpctstrNamespace, VARIANT FAR* pvarUpdatePointer, VARIANT FAR* pvarServices, VARIANT FAR* pvarSC, VARIANT FAR* pvarUserCancel)
		{FireEvent(eventidGetIWbemServices,EVENT_PARAM(VTS_BSTR  VTS_PVARIANT  VTS_PVARIANT  VTS_PVARIANT  VTS_PVARIANT), lpctstrNamespace, pvarUpdatePointer, pvarServices, pvarSC, pvarUserCancel);}
	//}}AFX_EVENT
	DECLARE_EVENT_MAP()
	friend class CMyPropertyPage1;
	friend class CMyPropertyPage3;
	friend class CMyPropertyPage4;
	friend class CWrapListCtrl;
// Dispatch and event IDs
public:
	enum {
	//{{AFX_DISP_ID(CMOFWizCtrl)
	dispidMOFTargets = 1L,
	eventidGenerateMOFs = 1L,
	eventidGetIWbemServices = 2L,
	//}}AFX_DISP_ID
	};

private:
	void GenClassDef(LPCTSTR pszMofFile, const CMapStringToPtr& mapClassGen, CMapStringToPtr& mapClassDef, LPCTSTR pszClass, BOOL& bFirst);
	void WriteClassDef(const CString& sMofFile, IWbemClassObject *pco, BOOL& bFirst);
	void WriteMOFCommentHeader(const CString& sMofFile, IWbemClassObject *pco);
};