//----------------------------------------------------------------------------- // // File: _report.h // Copyright (C) 1994-1997 Microsoft Corporation // All rights reserved. // // // //----------------------------------------------------------------------------- #ifndef LOCUTIL_REPORT_H #define LOCUTIL_REPORT_H #pragma once // // Throws away ALL messages. // class LTAPIENTRY CNullReport : public CReport { public: CNullReport() {}; virtual void IssueMessage(MessageSeverity, const CLString &strContext, const CLString &strMessage, CGoto *pGoto = NULL, CGotoHelp *pGotoHelp = NULL); }; // // This stuff is used for an implementation of CReport that will // 'buffer' messages. Use CBufferReporter if you don't want to // process messages until after the process producing them is done. // You can get the messages either by severity, or as a list of all // messages as they were issued. // struct ReportMessage { MessageSeverity sev; CLString strContext; CLString strMessage; SmartRef spGoto; SmartRef spGotoHelp; }; typedef CTypedPtrList MessageList; #pragma warning (disable:4251) class LTAPIENTRY CBufferReport : public CReport { public: CBufferReport(); void AssertValid(void) const; virtual void IssueMessage(MessageSeverity, const CLString &strContext, const CLString &strMessage, CGoto *pGoto = NULL, CGotoHelp *pGotoHelp = NULL); void Clear(void); NOTHROW const MessageList & GetNotes(void) const; NOTHROW const MessageList & GetWarnings(void) const; NOTHROW const MessageList & GetErrors(void) const; NOTHROW const MessageList & GetAborts(void) const; NOTHROW const MessageList & GetMessages(void) const; void DumpTo(CReport *) const; ~CBufferReport(); private: MessageList m_mlNotes; MessageList m_mlWarnings; MessageList m_mlErrors; MessageList m_mlAborts; mutable MessageList m_mlMessages; }; // // This reporter just send all its messages directly to a message box. // class LTAPIENTRY CMessageBoxReport : public CReport { public: CMessageBoxReport(); void AssertValid(void) const; virtual void IssueMessage(MessageSeverity, const CLString &strContext, const CLString &strMessage, CGoto *pGoto = NULL, CGotoHelp *pGotoHelp = NULL); ~CMessageBoxReport(); private: }; // // This reporter is used to send all messages to a file. // class LTAPIENTRY CFileReport : public CReport { public: CFileReport(); BOOL InitFileReport(const CLString &strFileName); virtual void Clear(void); virtual void IssueMessage(MessageSeverity, const CLString &strContext, const CLString &strMessage, CGoto *pGoto = NULL, CGotoHelp *pGotoHelp = NULL); ~CFileReport(); private: CFile m_OutputFile; }; // // This reporter is used for command line utilities. Output goes to stdout // class LTAPIENTRY CStdOutReport : public CReport { public: virtual void IssueMessage(MessageSeverity, const CLString &strContext, const CLString &strMessage, CGoto *pGoto = NULL, CGotoHelp *pGotoHelp = NULL); virtual void SetConfidenceLevel(ConfidenceLevel); private: BOOL m_fEnabled; }; // // This is used to 'redirect' messages to a single reporter. It's used // when several different reporters are required by the current // implementation, but the desired effect is that they all send their messages // to a common location. // // This class takes ownership of another Reporter, then uses reference // counting semantics to determine when to delete that reporter. // class LTAPIENTRY CRedirectReport : public CReport { public: CRedirectReport(); virtual void Activate(void); virtual void Clear(void); virtual void SetConfidenceLevel(ConfidenceLevel); virtual void IssueMessage(MessageSeverity, const CLString &strContext, const CLString &strMessage, CGoto *pGoto = NULL, CGotoHelp *pGotoHelp = NULL); // Used for initial attachment to a CReporter. NOTHROW void RedirectTo(CReport *pReport); // Used to share a single reporter among several CRedirectReporter's. NOTHROW void RedirectTo(CRedirectReport *pReport); ~CRedirectReport(); private: struct RedirectInfo { SmartPtr pReport; UINT uiRefCount; }; RedirectInfo *m_pRedirectInfo; void NOTHROW Detach(void); }; // // // This class is used to re-direct output through a reporter. It will // automatically call Clear() and Activate() the first time output is sent // to the reporter. If the usre calls Activate first on this reporter, then // no action is taken when something is output. // // class LTAPIENTRY CActivateReport : public CReport { public: CActivateReport(CReport *); virtual void IssueMessage(MessageSeverity, const CLString &strContext, const CLString &strMessage, CGoto *pGoto = NULL, CGotoHelp *pGotoHelp = NULL); void Activate(); void Clear(); private: BOOL m_fActivated; CReport *m_pReport; }; // // The following manage a global 'pool' of reporters that are used by // different components in the system. // Each reporter has to be distinct. Once the reporter has been 'added', // the global pool *owns* the reporter and will delete it. This is done by // ReleaseAllReporters(). // NOTHROW LTAPIENTRY void AddReport(COutputTabs::OutputTabs idx, CReport *pReport); NOTHROW LTAPIENTRY CReport * GetReport(COutputTabs::OutputTabs); NOTHROW LTAPIENTRY void ReleaseAllReports(); #include "_report.inl" #endif