////////////////////////////////////////////////////////////////////////////////////////
// File: AxeRuntime.h
//
// Abstract: This file contains definitions that are consumed by AXE Runtime (assessments).
//
// (c) Microsoft. All rights reserved.
////////////////////////////////////////////////////////////////////////////////////////


#if defined( _MSC_VER )
#pragma once
#endif  // _MSC_VER

#if !defined( AXERUNTIME_H )
#define AXERUNTIME_H

#if NTDDI_VERSION >= NTDDI_WIN7

// This file is only for C++ clients. C is not supported.
//
#if !defined( __cplusplus )
#error C++ compiler required
#endif  // C++


////////////////////////////////////////////////////////////////////////////////////////
// Include files
////////////////////////////////////////////////////////////////////////////////////////

#include "AxeCore.h"


// The AXE Assessment APIs exist in the Microsoft::Assessments::Runtime namespace.
//
namespace Microsoft { namespace Assessments { namespace Runtime
{
    ////////////////////////////////////////////////////////////////////////////////////////
    // Constants
    ////////////////////////////////////////////////////////////////////////////////////////

    namespace EnvironmentVariable
    {
        static LPCWSTR const ExecutionPath      = L"AssessmentExecutionPath";
        static LPCWSTR const ResultsPath        = L"AssessmentResultsPath";
        static LPCWSTR const TempPath           = L"AssessmentTempPath";
        static LPCWSTR const JobFile            = L"AssessmentJobFile";
        static LPCWSTR const AxeBinaryPath      = L"AssessmentAxeBinPath";
        static LPCWSTR const UniqueSession      = L"AssessmentUniqueSession";
        static LPCWSTR const RebootIteration    = L"AssessmentRebootIteration";
        static LPCWSTR const RunIndex           = L"AssessmentRunIndex";
        static LPCWSTR const ExecutionArch      = L"AssessmentExecutionArchitecture";
        static LPCWSTR const SystemPath         = L"AssessmentSystemPath";
    }

    namespace SessionParameter
    {
        static LPCWSTR const ExecutionPath      = L"ExecutionPath";
        static LPCWSTR const ResultsPath        = L"ResultsPath";
        static LPCWSTR const TempPath           = L"TempPath";
        static LPCWSTR const JobFile            = L"JobFile";
        static LPCWSTR const AxeBinaryPath      = L"AxeBinPath";
        static LPCWSTR const UniqueSession      = L"UniqueSession";
        static LPCWSTR const RebootIteration    = L"RebootIteration";
        static LPCWSTR const RunIndex           = L"RunIndex";
        static LPCWSTR const ExecutionArch      = L"ExecutionArchitecture";
        static LPCWSTR const SystemPath         = L"SystemPath";
    }


    ////////////////////////////////////////////////////////////////////////////////////////
    // Forward declarations
    ////////////////////////////////////////////////////////////////////////////////////////

    struct Support;
    struct SystemState;
    struct ParameterSet;
    struct Parameter;
    struct ResultSnippet;
    struct ErrorWarningCollection;
    struct ErrorWarning;
    struct LogFileCollection;
    struct IterationCollection;
    struct Iteration;
    struct TestCaseCollection;
    struct TestCase;
    struct Subject;
    struct IssueCollection;
    struct Issue;
    struct AffectedMetricCollection;
    struct CategoryCollection;
    struct MetricThresholdCollection;
    struct MetricThreshold;
    struct MetricThresholdValueCollection;
    struct MetricThresholdValue;
    struct ActivityCollection;
    struct Activity;
    struct Trace;
    struct ParentCollection;
    struct MetricValueCollection;
    struct MetricValue;
    struct LinkCollection;
    struct Link;
    struct RelatedActivityCollection;
    struct ActivityReference;
    struct ReferenceCollection;
    struct IssueReference;



    ////////////////////////////////////////////////////////////////////////////////////////
    // Enumerations
    ////////////////////////////////////////////////////////////////////////////////////////

    enum AssessmentError
    {
        AssessmentErrorNone                             = 0,
        AssessmentErrorAlreadyInit                      = AXE_E_ALREADY_INIT,
        AssessmentErrorInternalError                    = AXE_E_INTERNAL_ERROR,
        AssessmentErrorUnknownWin32Error                = AXE_E_UNKNOWN_WIN32_ERROR,
        AssessmentErrorParameterConversionFailed        = AXE_E_PARAM_CONVERSION_FAILED,
        AssessmentErrorEngineNotRunning                 = AXE_E_ENGINE_NOT_RUNNING,
        AssessmentErrorParameterNotFound                = AXE_E_PARAMETER_NOT_FOUND
    };

    enum ParameterNamespace
    {
        ParameterNamespaceNone = 0,  // always first
        ParameterNamespaceAssessment,
        ParameterNamespaceJob,
        ParameterNamespaceSession,
        ParameterNamespaceInvalid  // always last
    };

    enum SystemSetting
    {
        SystemSettingNone                        = 0,
        SystemSettingFlagGetBool                 = /*0x00010000*/ 0x1 << 16,
        SystemSettingFlagSetBoolFalse            = /*0x01000000*/ 0x1 << 24,
        SystemSettingFlagSetBoolTrue             = /*0x02000000*/ 0x1 << 25,

        SystemSettingBatteryPresent              = /*0x00010001*/ 0x1 | SystemSettingFlagGetBool,
        SystemSettingOnACPower                   = /*0x00010002*/ 0x2 | SystemSettingFlagGetBool,
        SystemSettingElevated                    = /*0x00010003*/ 0x3 | SystemSettingFlagGetBool,
        SystemSettingPioModeOnSystemDrive        = /*0x00010004*/ 0x4 | SystemSettingFlagGetBool,
        SystemSettingUsingBasicDisplay           = /*0x00010005*/ 0x5 | SystemSettingFlagGetBool,
        SystemSettingIEPresent                   = /*0x00010006*/ 0x6 | SystemSettingFlagGetBool,
        SystemSettingAutoLogOnEnabled            = /*0x00010007*/ 0x7 | SystemSettingFlagGetBool,
        SystemSettingAntivirusActive             = /*0x00010008*/ 0x8 | SystemSettingFlagGetBool,
        SystemSettingKernelDebuggerEnabled       = /*0x00010009*/ 0x9 | SystemSettingFlagGetBool,
        SystemSettingDriverVerifierEnabled       = /*0x0001000A*/ 0xA | SystemSettingFlagGetBool,
        SystemSettingProblemDevicesExist         = /*0x0001000B*/ 0xB | SystemSettingFlagGetBool,
        SystemSettingPowerProfileMinSavings      = /*0x0201000C*/ 0xC | SystemSettingFlagGetBool | SystemSettingFlagSetBoolTrue,
        SystemSettingPowerProfileBalanced        = /*0x0201000D*/ 0xD | SystemSettingFlagGetBool | SystemSettingFlagSetBoolTrue,
        SystemSettingPowerProfileMaxSavings      = /*0x0201000E*/ 0xE | SystemSettingFlagGetBool | SystemSettingFlagSetBoolTrue,
        SystemSettingLowBatteryAction            = /*0x0301000F*/ 0xF | SystemSettingFlagGetBool | SystemSettingFlagSetBoolFalse | SystemSettingFlagSetBoolTrue,
        SystemSettingScreensaver                 = /*0x01010010*/ 0x10 | SystemSettingFlagGetBool | SystemSettingFlagSetBoolFalse,
        SystemSettingCriticalBatteryAction       = /*0x03010011*/ 0x11 | SystemSettingFlagGetBool | SystemSettingFlagSetBoolFalse | SystemSettingFlagSetBoolTrue,
        SystemSettingAutoSleepAC                 = /*0x03010012*/ 0x12 | SystemSettingFlagGetBool | SystemSettingFlagSetBoolFalse | SystemSettingFlagSetBoolTrue,
        SystemSettingAutoSleepDC                 = /*0x03010013*/ 0x13 | SystemSettingFlagGetBool | SystemSettingFlagSetBoolFalse | SystemSettingFlagSetBoolTrue,
        SystemSettingAutoHibernateAC             = /*0x03010014*/ 0x14 | SystemSettingFlagGetBool | SystemSettingFlagSetBoolFalse | SystemSettingFlagSetBoolTrue,
        SystemSettingAutoHibernateDC             = /*0x03010015*/ 0x15 | SystemSettingFlagGetBool | SystemSettingFlagSetBoolFalse | SystemSettingFlagSetBoolTrue,
        SystemSettingDisplayTimeoutAC            = /*0x03010016*/ 0x16 | SystemSettingFlagGetBool | SystemSettingFlagSetBoolFalse | SystemSettingFlagSetBoolTrue,
        SystemSettingDisplayTimeoutDC            = /*0x03010017*/ 0x17 | SystemSettingFlagGetBool | SystemSettingFlagSetBoolFalse | SystemSettingFlagSetBoolTrue,
        SystemSettingDisplayDimAC                = /*0x03010018*/ 0x18 | SystemSettingFlagGetBool | SystemSettingFlagSetBoolFalse | SystemSettingFlagSetBoolTrue,
        SystemSettingDisplayDimDC                = /*0x03010019*/ 0x19 | SystemSettingFlagGetBool | SystemSettingFlagSetBoolFalse | SystemSettingFlagSetBoolTrue,
        SystemSettingVolumeShadowCopy            = /*0x0301001A*/ 0x1A | SystemSettingFlagGetBool | SystemSettingFlagSetBoolFalse | SystemSettingFlagSetBoolTrue,
        SystemSettingWindowsAutoUpdate           = /*0x0101001B*/ 0x1B | SystemSettingFlagGetBool | SystemSettingFlagSetBoolFalse,
        SystemSettingWirelessAdaptersConnected   = /*0x0101001C*/ 0x1C | SystemSettingFlagGetBool | SystemSettingFlagSetBoolFalse,
        SystemSettingLockOnWakeAC                = /*0x0301001D*/ 0x1D | SystemSettingFlagGetBool | SystemSettingFlagSetBoolFalse | SystemSettingFlagSetBoolTrue,
        SystemSettingLockOnWakeDC                = /*0x0301001E*/ 0x1E | SystemSettingFlagGetBool | SystemSettingFlagSetBoolFalse | SystemSettingFlagSetBoolTrue,
        SystemSettingWakeOnTimerAC               = /*0x0301001F*/ 0x1F | SystemSettingFlagGetBool | SystemSettingFlagSetBoolFalse | SystemSettingFlagSetBoolTrue,
        SystemSettingWakeOnTimerDC               = /*0x03010020*/ 0x20 | SystemSettingFlagGetBool | SystemSettingFlagSetBoolFalse | SystemSettingFlagSetBoolTrue,
        SystemSettingHibernateOn                 = /*0x00010021*/ 0x21 | SystemSettingFlagGetBool,
        SystemSettingSuspendOn                   = /*0x00010022*/ 0x22 | SystemSettingFlagGetBool,
        SystemSettingFastStartupOn               = /*0x00010023*/ 0x23 | SystemSettingFlagGetBool,
        SystemSettingShowExtensions              = /*0x03010024*/ 0x24 | SystemSettingFlagGetBool | SystemSettingFlagSetBoolFalse | SystemSettingFlagSetBoolTrue,
        SystemSettingShowAllObjects              = /*0x03010025*/ 0x25 | SystemSettingFlagGetBool | SystemSettingFlagSetBoolFalse | SystemSettingFlagSetBoolTrue,
        SystemSettingScreenBackground            = /*0x01010026*/ 0x26 | SystemSettingFlagGetBool | SystemSettingFlagSetBoolFalse,
        SystemSettingIEFirstRun                  = /*0x01000027*/ 0x27 | SystemSettingFlagSetBoolFalse,
        SystemSettingScreensaverSecure           = /*0x03010028*/ 0x28 | SystemSettingFlagGetBool | SystemSettingFlagSetBoolFalse | SystemSettingFlagSetBoolTrue,
        SystemSettingTracingRunning              = /*0x00010029*/ 0x29 | SystemSettingFlagGetBool,
        SystemSettingAudioRenderDevicePresent    = /*0x0001002A*/ 0x2A | SystemSettingFlagGetBool,
        SystemSettingDisplayBootMenu             = /*0x0001002B*/ 0x2B | SystemSettingFlagGetBool,
        SystemSettingConnectedStandbyOn          = /*0x0001002C*/ 0x2C | SystemSettingFlagGetBool,
        SystemSettingAllowDisplayRequiredAC      = /*0x0301002D*/ 0x2D | SystemSettingFlagGetBool | SystemSettingFlagSetBoolFalse | SystemSettingFlagSetBoolTrue,
        SystemSettingAllowDisplayRequiredDC      = /*0x0301002E*/ 0x2E | SystemSettingFlagGetBool | SystemSettingFlagSetBoolFalse | SystemSettingFlagSetBoolTrue,
        SystemSettingAllowExecutionRequiredAC    = /*0x0301002F*/ 0x2F | SystemSettingFlagGetBool | SystemSettingFlagSetBoolFalse | SystemSettingFlagSetBoolTrue,
        SystemSettingAllowExecutionRequiredDC    = /*0x03010030*/ 0x30 | SystemSettingFlagGetBool | SystemSettingFlagSetBoolFalse | SystemSettingFlagSetBoolTrue,
        SystemSettingIEWarnOnIntranet            = /*0x03010031*/ 0x31 | SystemSettingFlagGetBool | SystemSettingFlagSetBoolFalse | SystemSettingFlagSetBoolTrue,
        SystemSettingLockScreen                  = /*0x03010032*/ 0x32 | SystemSettingFlagGetBool | SystemSettingFlagSetBoolFalse | SystemSettingFlagSetBoolTrue,
        SystemSettingWindowsGenuine              = /*0x00010033*/ 0x33 | SystemSettingFlagGetBool,
        SystemSettingRequiresKitsPolicyInstalled = /*0x00010034*/ 0x34 | SystemSettingFlagGetBool,
    };



    ////////////////////////////////////////////////////////////////////////////////////////
    // Interfaces
    ////////////////////////////////////////////////////////////////////////////////////////

    // Support interface
    //
    struct Support : public IUnknown
    {
        virtual HRESULT GetErrorText(
            _In_ HRESULT axeError,
            _Deref_out_ ErrorList** errorList) = 0;
        virtual HRESULT GetParameterSet(
            _In_ ParameterNamespace space,
            _Deref_out_ ParameterSet** params) = 0;
        virtual HRESULT ReportProgress(
            _In_ AxeProgressType progressType,
            _In_ UINT progressValue,
            _In_opt_z_ LPCWSTR progressMessage) const = 0;
        virtual HRESULT ReportProgress(
            _In_ AxeProgressType progressType,
            _In_ UINT progressValue,
            _In_opt_z_ LPCWSTR progressMessage,
            _Out_opt_ BOOL* cancelAssessment) const = 0;
        virtual HRESULT GetCancelEvent(
            _Out_ HANDLE* cancelEventHandle) const = 0;
        virtual HRESULT IsCanceled(
            _Out_ BOOL* cancelAssessment) const = 0;
        virtual HRESULT IsEngineRunning(
            _Out_ BOOL* engineRunning) const = 0;
        virtual HRESULT CreateLogger(
            _Deref_out_ Logging** log) = 0;
        virtual HRESULT ProcessIdleTasks(
            _Out_ HANDLE* idleTasksHandle) const = 0;
        virtual HRESULT SystemSettingCheckBoolean(
            _In_ SystemSetting setting,
            _Out_ BOOL* enabled) = 0;
        virtual HRESULT ManageSystemState(
            _In_z_ LPCWSTR fileName,
            _Deref_out_ SystemState** state) = 0;
        virtual HRESULT StartTracing(
            _In_z_ LPCWSTR profileFileName,
            _In_z_ LPCWSTR profileName) = 0;
        virtual HRESULT StopTracing(
            _In_z_ LPCWSTR profileFileName,
            _In_z_ LPCWSTR propertyName,
            _In_z_ LPCWSTR outputFileName) = 0;
        virtual HRESULT RegisterEventManifest() = 0;
        virtual HRESULT RegisterEventManifest(
            _In_z_ LPCWSTR manifestFileName,
            _In_z_ LPCWSTR moduleFileName) = 0;
        virtual HRESULT UnregisterEventManifest() = 0;
        virtual HRESULT UnregisterEventManifest(
            _In_z_ LPCWSTR manifestFileName) = 0;
        virtual HRESULT CreateResultSnippet(
            _Outptr_ ResultSnippet** resultSnippet) = 0;
        virtual HRESULT CreateResultSnippet(
            _In_z_ LPCWSTR resultsFile,
            _Outptr_ ResultSnippet** resultSnippet) = 0;
        virtual HRESULT StartTracingFromManifest(
            _In_z_ LPCWSTR profileName,
            _In_opt_z_ LPCWSTR traceTitle,
            _In_opt_z_ LPCWSTR traceDescription) = 0;
        virtual HRESULT StartTracingFromManifest(
            _In_ const GUID* guidAssessment,
            _In_z_ LPCWSTR profileName,
            _In_opt_z_ LPCWSTR traceTitle,
            _In_opt_z_ LPCWSTR traceDescription) = 0;
        virtual HRESULT StopTracingFromManifest(
            _In_z_ LPCWSTR outputFileName) = 0;
        virtual HRESULT CancelTracing() = 0;

        // For some reason this causes a "atlbase.h : error C1001: An internal error has occurred in the compiler." on x86,
        // so for now we can just comment it out.  This should be safe because the struct should only be deleted via the Release
        // method so there is no issue with needing a virtual destructor like the interfaces that don't inherit from IUnknown have.
        //
        //virtual ~Support(){}
    };

    struct SystemState : public IUnknown
    {
        virtual HRESULT RestoreAll() = 0;
        virtual HRESULT CheckBoolean(
            _In_ SystemSetting setting,
            _Out_ BOOL* enabled) = 0;
        virtual HRESULT SetBoolean(
            _In_ SystemSetting setting,
            _In_ BOOL enable) = 0;
        virtual HRESULT CheckRegistryValueString (
            _In_ HKEY keyRoot,
            _In_z_ LPCWSTR keyPath,
            _In_z_ LPCWSTR valueName,
            _Outptr_ LPWSTR* data) = 0;
        virtual HRESULT SetRegistryValueMultistring (
            _In_ HKEY keyRoot,
            _In_z_ LPCWSTR keyPath,
            _In_z_ LPCWSTR valueName,
            _In_z_ LPCWSTR data,
            _In_ ULONG length) = 0;
        virtual HRESULT CheckRegistryValueMultistring (
            _In_ HKEY keyRoot,
            _In_z_ LPCWSTR keyPath,
            _In_z_ LPCWSTR valueName,
            _Outptr_ LPWSTR* data,
            _Out_ ULONG* length) = 0;
        virtual HRESULT SetRegistryValueString (
            _In_ HKEY keyRoot,
            _In_z_ LPCWSTR keyPath,
            _In_z_ LPCWSTR valueName,
            _In_z_ LPCWSTR data) = 0;
        virtual HRESULT CheckRegistryValueUInt32 (
            _In_ HKEY keyRoot,
            _In_z_ LPCWSTR keyPath,
            _In_z_ LPCWSTR valueName,
            _Out_ ULONG* data) = 0;
        virtual HRESULT SetRegistryValueUInt32 (
            _In_ HKEY keyRoot,
            _In_z_ LPCWSTR keyPath,
            _In_z_ LPCWSTR valueName,
            _In_ ULONG data) = 0;
        virtual HRESULT CheckRegistryValueUInt64 (
            _In_ HKEY keyRoot,
            _In_z_ LPCWSTR keyPath,
            _In_z_ LPCWSTR valueName,
            _Out_ ULONGLONG* data) = 0;
        virtual HRESULT SetRegistryValueUInt64 (
            _In_ HKEY keyRoot,
            _In_z_ LPCWSTR keyPath,
            _In_z_ LPCWSTR valueName,
            _In_ ULONGLONG data) = 0;
        virtual ~SystemState(){}
    };

    // ParameterSet interface
    //
    struct ParameterSet
    {
        virtual HRESULT GetParameter(
            _In_z_ LPCWSTR parameterName,
            _Outptr_result_maybenull_ Parameter** parameter) const = 0;
        virtual ~ParameterSet(){}
    };

    // Parameter interface
    //
    struct Parameter
    {
        virtual HRESULT ToString(
            _Deref_out_z_ LPCWSTR* paramValue) const = 0;
        virtual HRESULT ToInt16(
            _Out_ SHORT* paramValue) const = 0;
        virtual HRESULT ToInt32(
            _Out_ LONG* paramValue) const = 0;
        virtual HRESULT ToInt64(
            _Out_ LONGLONG* paramValue) const = 0;
        virtual HRESULT ToUInt16(
            _Out_ USHORT* paramValue) const = 0;
        virtual HRESULT ToUInt32(
            _Out_ ULONG* paramValue) const = 0;
        virtual HRESULT ToUInt64(
            _Out_ ULONGLONG* paramValue) const = 0;
        virtual HRESULT ToBoolean(
            _Out_ BOOL* paramValue) const = 0;
        virtual HRESULT ToByte(
            _Out_ BYTE* paramValue) const = 0;
        virtual HRESULT ToSByte(
            _Out_ CHAR* paramValue) const = 0;
        virtual HRESULT ToChar(
            _Out_ WCHAR* paramValue) const = 0;
        virtual HRESULT ToDouble(
            _Out_ DOUBLE* paramValue) const = 0;
        virtual HRESULT ToDateTime(
            _Out_ SYSTEMTIME* paramValue) const = 0;
        virtual HRESULT ToDuration(
            _Out_ LONGLONG* paramValue) const = 0;
        virtual ~Parameter(){}
    };

    // Result XML Authoring API interfaces
    //
    struct ResultSnippet : public IUnknown
    {
        // XML Map to AssessmentResult/<ErrorsAndWarnings />
        virtual HRESULT AddWarning (
            _In_z_ LPCWSTR message) = 0;
        virtual HRESULT AddWarning (
            _In_z_ LPCWSTR message,
            _Outptr_opt_ ErrorWarning** warning) = 0;
        virtual HRESULT AddWarning (
            _In_ INT hresult,
            _In_z_ LPCWSTR message) = 0;
        virtual HRESULT AddWarning (
            _In_ INT hresult,
            _In_z_ LPCWSTR message,
            _Outptr_opt_ ErrorWarning** warning) = 0;
        virtual HRESULT AddError (
            _In_ INT hresult,
            _In_z_ LPCWSTR message) = 0;
        virtual HRESULT AddError (
            _In_ INT hresult,
            _In_z_ LPCWSTR message,
            _Outptr_opt_ ErrorWarning** error) = 0;
        virtual HRESULT GetErrorsAndWarnings (
            _Outptr_ ErrorWarningCollection** errorsAndWarnings) = 0;
        
        // XML Map to AssessmentResult/<LogFiles/>
        virtual HRESULT AddLogFile (
            _In_z_ LPCWSTR filePath) = 0;
        virtual HRESULT GetLogFiles (
            _Outptr_ LogFileCollection** logfiles) = 0;
            
        // XML Map to AssessmentResult/<Iterations />
        virtual HRESULT AddIteration (
            _Outptr_ Iteration** iteration) = 0;
        virtual HRESULT GetIterations (
            _Outptr_ IterationCollection** iterations) = 0;
        virtual HRESULT Save (
            _In_z_ LPCWSTR filePath) = 0;
        virtual HRESULT GetXmlText (
            _Outptr_ BSTR* xmlText) = 0;

        virtual ~ResultSnippet(){}
    }; 
    
    struct ErrorWarningCollection
    {
        virtual HRESULT AddItem (
            _In_ IssueType issueType,
            _In_z_ LPCWSTR message) = 0;
        virtual HRESULT AddItem (
            _In_ IssueType issueType,
            _In_z_ LPCWSTR message,
            _Outptr_opt_ ErrorWarning** errorWarning) = 0;
        virtual HRESULT AddItem (
            _In_ IssueType issueType,
            _In_ INT hresult,
            _In_z_ LPCWSTR message) = 0;
        virtual HRESULT AddItem (
            _In_ IssueType issueType,
            _In_ INT hresult,
            _In_z_ LPCWSTR message,
            _Outptr_opt_ ErrorWarning ** errorWarning) = 0;
        virtual HRESULT GetCount (
            _Out_ INT* count) const = 0;
        virtual HRESULT GetItem (
            _In_ INT index,
            _Outptr_ ErrorWarning** errorWarning) = 0;
        virtual HRESULT DeleteItem (
            _In_ INT index) = 0;
        virtual ~ErrorWarningCollection(){}
    };
    
    struct ErrorWarning 
    {
        // XML Map to Error/<Hresult />
        virtual HRESULT GetHresult (
            _Out_ INT * hresult) const = 0;
        virtual HRESULT SetHresult (
            _In_ INT hresult) = 0;
        
        // XML Map to Error/<Message />
        virtual HRESULT GetMessage (
            _Outptr_ LPCWSTR* message) const = 0;
        virtual HRESULT SetMessage (
            _In_z_ LPCWSTR message) = 0;

        virtual HRESULT GetKind (
            _Out_ IssueType* issueType) const = 0;
        virtual HRESULT SetKind (
            _In_ IssueType issueType) = 0;

        virtual ~ErrorWarning(){}
    };
    
    struct LogFileCollection
    {
        virtual HRESULT AddItem (
            _In_z_ LPCWSTR filePath) = 0;
        virtual HRESULT GetCount (
            _Out_ INT * count) const = 0;
        virtual HRESULT GetItem (
            _In_ INT index,
            _Outptr_ LPCWSTR * filePath) = 0;
        virtual HRESULT DeleteItem (
            _In_ INT index) = 0;
        virtual HRESULT Clear() = 0;
        virtual ~LogFileCollection(){}
    };
    
    struct IterationCollection
    {
        virtual HRESULT AddItem (
            _Outptr_ Iteration** iteration) = 0;
        virtual HRESULT GetCount (
            _Out_ INT* count) const = 0;
        virtual HRESULT GetItem (
            _In_ INT index,
            _Outptr_ Iteration** iteration) = 0;
        virtual HRESULT DeleteItem (
            _In_ INT index) = 0;
        virtual HRESULT Clear() = 0;
        virtual ~IterationCollection(){}
    };
    
    struct Iteration 
    {
        // XML Map to Iteration/Description/<ProgrammaticName />
        virtual HRESULT GetDescriptionProgrammaticName (
            _Outptr_ LPCWSTR* descriptionProgrammaticName) const = 0;
        virtual HRESULT SetDescriptionProgrammaticName (
            _In_  LPCWSTR descriptionProgrammaticName) = 0;

        // XML Map to Iteration/Description/<DisplayName />
        virtual HRESULT GetDescriptionDisplayName (
            _Outptr_ LPCWSTR* descriptionDisplayName) const = 0;
        virtual HRESULT SetDescriptionDisplayName (
            _In_  LPCWSTR descriptionDisplayName) = 0;

        // XML Map to Iteration/<Ordinal />
        virtual HRESULT GetOrdinal (
            _Out_ UINT* ordinal) const = 0;
        virtual HRESULT SetOrdinal (
            _In_ UINT ordinal) = 0;
        
        // XML Mao to Iteration/<Trace />
        virtual HRESULT GetTrace (
            _Outptr_ Trace** trace) = 0;
        virtual HRESULT SetTrace (
            _In_z_ LPCWSTR traceFile,
            _In_opt_z_ LPCWSTR traceLink,
            _In_opt_z_ LPCWSTR traceName,
            _In_opt_z_ LPCWSTR traceTooltip,
            _Outptr_opt_ Trace** trace) = 0;
        virtual HRESULT SetTrace (
            _In_z_ LPCWSTR traceFile,
            _In_opt_z_ LPCWSTR traceLink,
            _Outptr_opt_ Trace** trace) = 0;
        virtual HRESULT ClearTrace () = 0;
        
        // XML Map to Iteration/Trace/<File />
        virtual HRESULT GetTraceFile (
            _Outptr_ LPCWSTR* traceFile) const = 0;
        // Deprecated.
        virtual HRESULT SetTraceFile (
            _In_z_  LPCWSTR traceFile) = 0;
        
        // XML Map to Iteration/Trace/<Link />
        virtual HRESULT GetTraceLink (
            _Outptr_ LPCWSTR* traceLink) const = 0;
        // Deprecated.
        virtual HRESULT SetTraceLink (
            _In_z_  LPCWSTR traceLink) = 0;
        
        // XML Map to Iteration/Trace/Description/<Name />
        // Deprecated.
        virtual HRESULT GetTraceName (
            _Outptr_ LPCWSTR* traceName) const = 0;
        virtual HRESULT SetTraceName (
            _In_z_  LPCWSTR traceName) = 0;

        // XML Map to Iteration/Trace/Description/<ToolTip />
        // Deprecated.
        virtual HRESULT GetTraceToolTip (
            _Outptr_ LPCWSTR* traceToolTip) const = 0;
        virtual HRESULT SetTraceToolTip (
            _In_z_  LPCWSTR traceToolTip) = 0;

        // XML Map to Iteration/<Activities/>
        virtual HRESULT AddActivity (
            _Outptr_ Activity** activity) = 0;
        virtual HRESULT GetActivities (
            _Outptr_ ActivityCollection** activities) = 0;

        // XML Map to Iteration/<MetricValues/>
        virtual HRESULT AddMetricValue (
            _In_z_ LPCWSTR programmaticName,
            _In_z_ LPCWSTR value,
            _Outptr_opt_ MetricValue** metricValue) = 0;
        virtual HRESULT AddMetricValue (
            _In_z_ LPCWSTR programmaticName,
            _In_ INT value,
            _Outptr_opt_ MetricValue** metricValue) = 0;
        virtual HRESULT AddMetricValue (
            _In_z_ LPCWSTR programmaticName,
            _In_ UINT value,
            _Outptr_opt_ MetricValue** metricValue) = 0;
        virtual HRESULT AddMetricValue (
            _In_z_ LPCWSTR programmaticName,
            _In_ LONGLONG value,
            _Outptr_opt_ MetricValue** metricValue) = 0;
        virtual HRESULT AddMetricValue (
            _In_z_ LPCWSTR programmaticName,
            _In_ ULONGLONG value,
            _Outptr_opt_ MetricValue** metricValue) = 0;
        virtual HRESULT AddMetricValue (
            _In_z_ LPCWSTR programmaticName,
            _In_ DOUBLE value,
            _Outptr_opt_ MetricValue** metricValue) = 0;
        virtual HRESULT GetMetricValues (
            _Outptr_ MetricValueCollection** metricValues) = 0;
        
        // XML Map to Iteration/<MetricThresholds/>
        virtual HRESULT AddMetricThreshold (
            _In_z_ LPCWSTR descriptionProgrammaticName,
            _In_z_ LPCWSTR metricDefinitionProgrammaticName,
            _Outptr_opt_ MetricThreshold** metricThreshold) = 0;
        virtual HRESULT GetMetricThresholds (
            _Outptr_ MetricThresholdCollection** metricThresholds) = 0;
        
        // XML Map to Iteration/<Issues/>
        virtual HRESULT AddIssue (
            _Outptr_ Issue** issue) = 0;
        virtual HRESULT GetIssues (
            _Outptr_ IssueCollection** issues) = 0;
        
        // XML Map to Iteration/<TestCases/>
        virtual HRESULT AddTestCase (
            _Outptr_ TestCase** testCase) = 0;
        virtual HRESULT GetTestCases (
            _Outptr_ TestCaseCollection** testCases) = 0;

        virtual ~Iteration(){}
    };
    
    struct TestCaseCollection
    {
        virtual HRESULT AddItem (
            _Outptr_ TestCase** testCase) = 0;
        virtual HRESULT GetCount (
            _Out_ INT* count) const = 0;
        virtual HRESULT GetItem (
            _In_ INT index,
            _Outptr_ TestCase** testCase) = 0;
        virtual HRESULT DeleteItem (
            _In_ INT index) = 0;
        virtual HRESULT Clear() = 0;
        virtual ~TestCaseCollection(){}
    };
    
    struct TestCase
    {
        // XML Map to TestCase/<Key />
        virtual HRESULT GetKey (
            _Outptr_ LPCWSTR* key) const = 0;
        virtual HRESULT SetKey (
            _In_z_ LPCWSTR key) = 0;

        // XML Map to TestCase/<ActivityReference />
        virtual HRESULT GetActivityReference (
            _Outptr_ LPCWSTR* activityReference) const = 0;
        virtual HRESULT SetActivityReference (
            _In_z_ LPCWSTR activityReference ) = 0;

        // XML Map to TestCase/<Subject />
        virtual HRESULT SetSubject (
            _In_z_ LPCWSTR className,
            _Outptr_opt_ Subject** subject) = 0;
        virtual HRESULT SetSubject (
            _In_z_ LPCWSTR className,
            _In_opt_z_ LPCWSTR instanceName,
            _Outptr_opt_ Subject** subject) = 0;
        virtual HRESULT DeleteSubject () = 0;
        virtual HRESULT GetSubject (
            _Outptr_ Subject** subject) = 0;

        //* These are to be deprecated once dependent code can be removed.
        
        // XML Map to TestCase/CompositeKey/<ActivityClass />
        virtual HRESULT GetCompositeKeyActivityClass (
            _Outptr_ LPCWSTR* compositeKeyActivityClass) const = 0;
        virtual HRESULT SetCompositeKeyActivityClass (
            _In_z_ LPCWSTR compositeKeyActivityClass ) = 0;
            
        // XML Map to TestCase/CompositeKey/<ActivityInstance />
        virtual HRESULT GetCompositeKeyActivityInstance (
            _Outptr_ LPCWSTR* compositeKeyActivityInstance) const = 0;
        virtual HRESULT SetCompositeKeyActivityInstance (
            _In_z_ LPCWSTR compositeKeyActivityInstance ) = 0;

        // XML Map to TestCase/CompositeKey/<SubjectClass/>
        virtual HRESULT GetCompositeKeySubjectClass (
            _Outptr_ LPCWSTR* compositeKeySubjectClass) const = 0;
        virtual HRESULT SetCompositeKeySubjectClass (
            _In_z_ LPCWSTR compositeKeySubjectClass) = 0;

        // XML Map to TestCase/CompositeKey/<SubjectClassDisplayName />
        virtual HRESULT GetCompositeKeySubjectClassDisplayName (
            _Outptr_ LPCWSTR* compositeKeySubjectClassDisplayName) const = 0;
        virtual HRESULT SetCompositeKeySubjectClassDisplayName (
            _In_z_ LPCWSTR compositeKeySubjectClassDisplayName) = 0;
            
        // XML Map to TestCase/CompositeKey/<SubjectInstance/>
        virtual HRESULT GetCompositeKeySubjectInstance (
            _Outptr_ LPCWSTR* compositeKeySubjectInstance) const = 0;
        virtual HRESULT SetCompositeKeySubjectInstance (
            _In_z_ LPCWSTR compositeKeySubjectInstance) = 0;

        // XML Map to TestCase/CompositeKey/<SubjectInstanceDisplayName />
        virtual HRESULT GetCompositeKeySubjectInstanceDisplayName (
            _Outptr_ LPCWSTR* compositeKeySubjectInstanceDisplayName) const = 0;
        virtual HRESULT SetCompositeKeySubjectInstanceDisplayName (
            _In_z_ LPCWSTR compositeKeySubjectInstanceDisplayName) = 0;

        //*/
        
        // XML Map to TestCase/<Name />
        virtual HRESULT GetName (
            _Outptr_ LPCWSTR* name) const = 0;
        virtual HRESULT SetName (
            _In_z_ LPCWSTR name) = 0;
        
        // XML Map to TestCase/<ToolTip />
        virtual HRESULT GetToolTip (
            _Outptr_ LPCWSTR* toolTip) const = 0;
        virtual HRESULT SetToolTip (
            _In_z_ LPCWSTR toolTip) = 0;
        
        // XML Map to TestCase/<Parents/>
        virtual HRESULT AddParent (
            _In_z_ LPCWSTR parent) = 0;
        virtual HRESULT GetParents (
            _Outptr_ ParentCollection** parents) = 0;
        
        // XML Map to TestCase/<MetricValues/>
        virtual HRESULT AddMetricValue (
            _In_z_ LPCWSTR programmaticName,
            _In_z_ LPCWSTR value,
            _Outptr_opt_ MetricValue** metricValue) = 0;
        virtual HRESULT AddMetricValue (
            _In_z_ LPCWSTR programmaticName,
            _In_ INT value,
            _Outptr_opt_ MetricValue** metricValue) = 0;
        virtual HRESULT AddMetricValue (
            _In_z_ LPCWSTR programmaticName,
            _In_ UINT value,
            _Outptr_opt_ MetricValue** metricValue) = 0;
        virtual HRESULT AddMetricValue (
            _In_z_ LPCWSTR programmaticName,
            _In_ LONGLONG value,
            _Outptr_opt_ MetricValue** metricValue) = 0;
        virtual HRESULT AddMetricValue (
            _In_z_ LPCWSTR programmaticName,
            _In_ ULONGLONG value,
            _Outptr_opt_ MetricValue** metricValue) = 0;
        virtual HRESULT AddMetricValue (
            _In_z_ LPCWSTR programmaticName,
            _In_ DOUBLE value,
            _Outptr_opt_ MetricValue** metricValue) = 0;
        virtual HRESULT GetMetricValues (
            _Outptr_ MetricValueCollection** metricValues) = 0;
        
        // XML Map to TestCase/<Issues/>
        virtual HRESULT AddIssue (
            _Outptr_ Issue** issue) = 0;
        virtual HRESULT GetIssues (
            _Outptr_ IssueCollection** issues) = 0;

        // XML Map to TestCase/<MetricThresholds/>
        virtual HRESULT AddMetricThreshold (
            _In_z_ LPCWSTR descriptionProgrammaticName,
            _In_z_ LPCWSTR metricDefinitionProgrammaticName,
            _Outptr_opt_ MetricThreshold** metricThreshold) = 0;
        virtual HRESULT GetMetricThresholds (
            _Outptr_ MetricThresholdCollection** metricThresholds) = 0;

        virtual ~TestCase(){}
    };

    struct Subject
    {
        virtual HRESULT GetClass (
            _Outptr_ LPCWSTR* name) const = 0;
        virtual HRESULT SetClass (
            _In_z_ LPCWSTR name) = 0;
        virtual HRESULT GetClassDisplay (
            _Outptr_ LPCWSTR* name) const = 0;
        virtual HRESULT SetClassDisplay (
            _In_opt_z_ LPCWSTR name) = 0;
        virtual HRESULT GetInstance (
            _Outptr_ LPCWSTR* name) const = 0;
        virtual HRESULT SetInstance (
            _In_opt_z_ LPCWSTR name) = 0;
        virtual HRESULT GetInstanceDisplay (
            _Outptr_ LPCWSTR* name) const = 0;
        virtual HRESULT SetInstanceDisplay (
            _In_opt_z_ LPCWSTR name) = 0;
        virtual ~Subject(){}
    };
    
    struct IssueCollection
    {
        virtual HRESULT AddItem (
            _Outptr_ Issue** issue) = 0;
        virtual HRESULT GetCount (
            _Out_ INT* count) const = 0;
        virtual HRESULT GetItem (
            _In_ INT index,
            _Outptr_ Issue** issue) = 0;
        virtual HRESULT DeleteItem (
            _In_ INT index) = 0;
        virtual HRESULT Clear() = 0;
        virtual ~IssueCollection(){}
    };
    
    struct Issue 
    {
        // XML Map to attribute <Issue ID="">
        virtual HRESULT GetAttributeID (
            _Outptr_ LPCWSTR* attributeID) const = 0;
        virtual HRESULT SetAttributeID (
            _In_z_ LPCWSTR attributeID) = 0;
            
        // XML Map to attribute <Issue parentID="">
        virtual HRESULT GetAttributeParentID (
            _Outptr_ LPCWSTR* attributeParentID) const = 0;
        virtual HRESULT SetAttributeParentID (
            _In_z_ LPCWSTR attributeParentID) = 0;
        
        // XML Map to attribute <Issue Known="">
        virtual HRESULT GetAttributeKnown (
            _Outptr_ LPCWSTR* attributeKnown) const = 0;
        virtual HRESULT SetAttributeKnown (
            _In_z_ LPCWSTR attributeKnown) = 0;
        
        // XML Map to attribute <Issue TestCase="">
        virtual HRESULT GetAttributeTestCase (
            _Outptr_ LPCWSTR* attributeTestCase) const = 0;
        virtual HRESULT SetAttributeTestCase (
            _In_z_  LPCWSTR attributeTestCase) = 0;
        
        // XML Map to attribute <Issue Summary="">
        virtual HRESULT GetAttributeSummary (
            _Outptr_ LPCWSTR* attributeSummary) const = 0;
        virtual HRESULT SetAttributeSummary (
            _In_z_ LPCWSTR attributeSummary) = 0;
        
        // XML Map to Issue/<IssueTitle>
        virtual HRESULT GetIssueTitle (
            _Outptr_ LPCWSTR* issueTitle) const = 0;
        virtual HRESULT SetIssueTitle (
            _In_z_ LPCWSTR issueTitle) = 0;
        
        // XML Map to Issue/<IssueDescription>
        virtual HRESULT GetIssueDescription (
            _Outptr_ LPCWSTR* issueDescription) const = 0;
        virtual HRESULT SetIssueDescription (
            _In_z_ LPCWSTR issueDescription) = 0;
        
        // XML Map to Issue/<IssueToolTip>
        virtual HRESULT GetIssueToolTip (
            _Outptr_ LPCWSTR* issueToolTip) const = 0;
        virtual HRESULT SetIssueToolTip (
            _In_z_ LPCWSTR issueToolTip) = 0;

        // XML Map to Issue/Class/<ProgrammaticName>
        virtual HRESULT GetClassProgrammaticName (
            _Outptr_ LPCWSTR* classProgrammaticName) const = 0;
        virtual HRESULT SetClassProgrammaticName (
            _In_z_ LPCWSTR classProgrammaticName) = 0;

        // XML Map to Issue/Class/<DisplayName>
        virtual HRESULT GetClassDisplayName (
            _Outptr_ LPCWSTR* classDisplayName) const = 0;
        virtual HRESULT SetClassDisplayName (
            _In_z_ LPCWSTR classDisplayName) = 0;
        
        // XML Map to Issue/Solution/<SolutionDescription>
        virtual HRESULT GetSolutionDescription (
            _Outptr_ LPCWSTR* solutionDescription) const = 0;
        virtual HRESULT SetSolutionDescription (
            _In_z_ LPCWSTR solutionDescription) = 0;
        
        // XML Map to Issue/<TypeId />
        virtual HRESULT GetTypeID (
            _Outptr_ LPCWSTR* typeID) const = 0;
        virtual HRESULT SetTypeID (
            _In_z_ LPCWSTR typeID) = 0;
        
        // XML Map to Issue/<EqualityId />
        virtual HRESULT GetEqualityID (
            _Outptr_ LPCWSTR* equalityID) const = 0;
        virtual HRESULT SetEqualityID (
            _In_z_ LPCWSTR equalityID) = 0;
        
        // XML Map to attribute Issue/<Impact Severity="">
        virtual HRESULT GetImpactAttributeSeverity (
            _Out_ UINT* impactAttributeSeverity) const = 0;
        virtual HRESULT SetImpactAttributeSeverity (
            _In_ UINT impaceAttributeSeverity) = 0;
        
        // XML Map to Issue/Solution/<Links/>
        virtual HRESULT AddSolutionLink (
            _In_opt_z_ LPCWSTR solutionLinkTitle,
            _In_opt_z_ LPCWSTR solutionLinkValue,
            _Outptr_opt_ Link** solutionLink) = 0;
        virtual HRESULT GetSolutionLinks (
            _Outptr_ LinkCollection** solutionLinks) = 0;
        
        // XML Map to Issue/<AnalysisLinks />
        virtual HRESULT AddAnalysisLink (
            _In_opt_z_ LPCWSTR analysisLinkTitle,
            _In_opt_z_ LPCWSTR analysisLinkValue,
            _Outptr_opt_ Link** analysisLink) = 0;
        virtual HRESULT GetAnalysisLinks (
            _Outptr_ LinkCollection** analysisLinks) = 0;

        // XML Map to Issue/<AffectedMetrics/>
        virtual HRESULT AddMetricReference (
            _In_z_ LPCWSTR metricReference) = 0;
        virtual HRESULT GetAffectedMetrics (
            _Outptr_ AffectedMetricCollection** affectedMetrics) = 0;

        // XML Map to Issue/<Categories/>
        virtual HRESULT AddCategory(
            _In_z_ LPCWSTR category) = 0;
        virtual HRESULT GetCategories (
            _Outptr_ CategoryCollection** categories) = 0;
        
        // XML Map to Issue/Impact/<RelatedActivities/>
        virtual HRESULT AddImpactRelatedActivityReference(
            _In_z_ LPCWSTR attributeActivityId,
            _Outptr_opt_ ActivityReference** activityReference) = 0;
        virtual HRESULT GetImpactRelatedActivities (
            _Outptr_ RelatedActivityCollection** impactRelatedActivities) = 0; 

        // XML Map to Issue/<MetricValues/>
        virtual HRESULT AddMetricValue (
            _In_z_ LPCWSTR programmaticName,
            _In_z_ LPCWSTR value,
            _Outptr_opt_ MetricValue** metricValue) = 0;
        virtual HRESULT AddMetricValue (
            _In_z_ LPCWSTR programmaticName,
            _In_ INT value,
            _Outptr_opt_ MetricValue** metricValue) = 0;
        virtual HRESULT AddMetricValue (
            _In_z_ LPCWSTR programmaticName,
            _In_ UINT value,
            _Outptr_opt_ MetricValue** metricValue) = 0;
        virtual HRESULT AddMetricValue (
            _In_z_ LPCWSTR programmaticName,
            _In_ LONGLONG value,
            _Outptr_opt_ MetricValue** metricValue) = 0;
        virtual HRESULT AddMetricValue (
            _In_z_ LPCWSTR programmaticName,
            _In_ ULONGLONG value,
            _Outptr_opt_ MetricValue** metricValue) = 0;
        virtual HRESULT AddMetricValue (
            _In_z_ LPCWSTR programmaticName,
            _In_ DOUBLE value,
            _Outptr_opt_ MetricValue** metricValue) = 0;
        virtual HRESULT GetMetricValues (
            _Outptr_ MetricValueCollection** metricValues) = 0;

        virtual ~Issue(){}
    };
    
    struct AffectedMetricCollection
    {
        virtual HRESULT AddItem (
            _In_z_ LPCWSTR metricReference) = 0;
        virtual HRESULT GetCount (
            _Out_ INT* count) const = 0;
        virtual HRESULT GetItem (
            _In_ INT index,
            _Outptr_ LPCWSTR* metricReference) = 0;
        virtual HRESULT DeleteItem (
            _In_ INT index) = 0;
        virtual HRESULT Clear() = 0;
        virtual ~AffectedMetricCollection(){}
    };
    
    struct CategoryCollection
    {
        virtual HRESULT AddItem (
            _In_z_ LPCWSTR category) = 0;
        virtual HRESULT GetCount (
            _Out_ INT* count) const = 0;
        virtual HRESULT GetItem (
            _In_ INT index,
            _Outptr_ LPCWSTR* category) = 0;
        virtual HRESULT DeleteItem (
            _In_ INT index) = 0;
        virtual HRESULT Clear() = 0;
        virtual ~CategoryCollection(){}
    };

    enum MetricThresholdValueValueType
    {
        MetricThresholdValueValueType_NotSet = 0,
        MetricThresholdValueValueTypeString,
        MetricThresholdValueValueTypeInt,
        MetricThresholdValueValueTypeInt16,
        MetricThresholdValueValueTypeInt32,
        MetricThresholdValueValueTypeInt64,
        MetricThresholdValueValueTypeUInt16,
        MetricThresholdValueValueTypeUInt32,
        MetricThresholdValueValueTypeUInt64,
        MetricThresholdValueValueTypeByte,
        MetricThresholdValueValueTypeSByte,
        MetricThresholdValueValueTypeSingle,
        MetricThresholdValueValueTypeDouble,
        MetricThresholdValueValueTypeFloat,
        MetricThresholdValueValueTypeBool,
        MetricThresholdValueValueTypeBoolean,
        MetricThresholdValueValueTypeChar,
        MetricThresholdValueValueTypeDateTime,
        MetricThresholdValueValueTypeDuration,
        MetricThresholdValueValueTypeTimeSpan,
        MetricThresholdValueValueTypeFilePath,
        MetricThresholdValueValueTypeDirectoryPath,
        MetricThresholdValueValueType_Max
    };

    enum MetricThresholdValueComparison
    {
        MetricThresholdValueComparison_NotSet = 0,
        MetricThresholdValueComparisonAbsolute,
        MetricThresholdValueComparisonOffset,
        MetricThresholdValueComparisonPercent,
        MetricThresholdValueComparisonTrueIsPass,
        MetricThresholdValueComparisonFalseIsPass,
        MetricThresholdValueComparisonContainsStringIsPass,
        MetricThresholdValueComparisonContainsStringIsFail,
        MetricThresholdValueComparisonIsStringIsPass,
        MetricThresholdValueComparisonIsStringIsFail,
        MetricThresholdValueComparisonRegularExpressionMatchIsPass,
        MetricThresholdValueComparisonRegularExpressionMatchIsFail,
        MetricThresholdValueComparison_Max
    };

    enum MetricThresholdValueInclusion
    {
        MetricThresholdValueInclusion_NotSet = 0,
        MetricThresholdValueInclusionInclusive,
        MetricThresholdValueInclusionExclusive,
        MetricThresholdValueInclusion_Max
    };
    
    struct MetricThresholdCollection
    {
        virtual HRESULT AddItem (
            _In_z_ LPCWSTR descriptionProgrammaticName,
            _In_z_ LPCWSTR metricDefinitionProgrammaticName,
            _Outptr_opt_ MetricThreshold** metricThreshold) = 0;
        virtual HRESULT GetCount (
            _Out_ INT* count) const = 0;
        virtual HRESULT GetItem (
            _In_ INT index,
            _Outptr_ MetricThreshold** metricThreshold) = 0;
        virtual HRESULT DeleteItem (
            _In_ INT index) = 0;
        virtual HRESULT Clear() = 0;
        virtual ~MetricThresholdCollection(){}
    };
    
    struct MetricThreshold 
    {
        // XML Map to MetricThreshold/Description/<ProgrammaticName />
        virtual HRESULT GetDescriptionProgrammaticName (
            _Outptr_ LPCWSTR* descriptionProgrammaticName) const = 0;
        virtual HRESULT SetDescriptionProgrammaticName (
            _In_z_ LPCWSTR descriptionProgrammaticName) = 0;

        // XML Map to MetricThreshold/<MetricDefinitionProgrammaticName />
        virtual HRESULT GetMetricDefinitionProgrammaticName (
            _Outptr_ LPCWSTR* metricDefinitionProgrammaticName) const = 0;
        virtual HRESULT SetMetricDefinitionProgrammaticName (
            _In_z_ LPCWSTR metricDefinitionProgrammaticName) = 0;

        // XML Map to MetricThreshold/<Target />
        virtual HRESULT GetTarget (
            _Outptr_ LPCWSTR* target) const = 0;
        virtual HRESULT SetTarget (
            _In_z_ LPCWSTR target) = 0;

        // XML Map to MetricThreshold/<TestCaseKey />
        virtual HRESULT GetTestCaseKey (
            _Outptr_ LPCWSTR* testCaseKey) const = 0;
        virtual HRESULT SetTestCaseKey (
            _In_z_ LPCWSTR testCaseKey) = 0;

        // XML Map to MetricThreshold/<Ordinal />
        virtual HRESULT GetOrdinal (
            _Out_ UINT* ordinal) const = 0;
        virtual HRESULT SetOrdinal (
            _In_ UINT ordinal) = 0;

        // XML Map to MetricThreshold/<MetricThresholdValues/>
        virtual HRESULT AddMetricThresholdValue (
            _In_z_ LPCWSTR descriptionProgrammaticName,
            _In_ MetricThresholdValueValueType valueType,
            _In_z_ LPCWSTR value,
            _Outptr_opt_ MetricThresholdValue** metricThresholdValue) = 0;
            
        virtual HRESULT GetMetricThresholdValues (
            _Outptr_ MetricThresholdValueCollection** metricThresholdValues) = 0;
    
        virtual ~MetricThreshold(){}
    };
    
    struct MetricThresholdValueCollection
    {
        virtual HRESULT AddItem (
            _In_z_ LPCWSTR descriptionProgrammaticName,
            _In_ MetricThresholdValueValueType valueType,
            _In_z_ LPCWSTR value,
            _Outptr_opt_ MetricThresholdValue** metricThresholdValue) = 0;
        virtual HRESULT GetCount (
            _Out_ INT* count) const = 0;
        virtual HRESULT GetItem (
            _In_ INT index,
            _Outptr_ MetricThresholdValue** metricThresholdValue) = 0;
        virtual HRESULT DeleteItem (
            _In_ INT index) = 0;
        virtual HRESULT Clear() = 0;
        virtual ~MetricThresholdValueCollection(){}
    };
    
    struct MetricThresholdValue 
    {
        // XML Map to MetricThresholdValue/Description/<ProgrammaticName />
        virtual HRESULT GetDescriptionProgrammaticName (
            _Outptr_ LPCWSTR* descriptionProgrammaticName) const = 0;
        virtual HRESULT SetDescriptionProgrammaticName (
            _In_z_ LPCWSTR descriptionProgrammaticName) = 0;

        // XML Map to MetricThresholdValue/<ValueType />
        virtual HRESULT GetValueType (
            _Out_ MetricThresholdValueValueType* valueType) const = 0;
        virtual HRESULT SetValueType (
            _In_ MetricThresholdValueValueType valueType) = 0;

        // XML Map to MetricThresholdValue/<Value />
        virtual HRESULT GetValue (
            _Outptr_ LPCWSTR* value) const = 0;
        virtual HRESULT SetValue (
            _In_z_ LPCWSTR value) = 0;

        // XML Map to MetricThresholdValue/<Comparison />
        virtual HRESULT GetComparison (
            _Out_ MetricThresholdValueComparison* comparison) const = 0;
        virtual HRESULT SetComparison (
            _In_ MetricThresholdValueComparison comparison) = 0;

        // XML Map to MetricThresholdValue/<Inclusion />
        virtual HRESULT GetInclusion (
            _Out_ MetricThresholdValueInclusion* inclusion) const = 0;
        virtual HRESULT SetInclusion (
            _In_ MetricThresholdValueInclusion inclusion) = 0;

        virtual ~MetricThresholdValue(){}
    };
    
    struct ActivityCollection
    {
        virtual HRESULT AddItem (
            _Outptr_ Activity** activity) = 0;
        virtual HRESULT GetCount (
            _Out_ INT* count) const = 0;
        virtual HRESULT GetItem (
            _In_ INT index,
            _Outptr_ Activity** activity) = 0;
        virtual HRESULT DeleteItem (
            _In_ INT index) = 0;
        virtual HRESULT Clear() = 0;
        virtual ~ActivityCollection(){}
    };
    
    struct Activity
    {
        // XML Map to attribute <Activity ID="">
        virtual HRESULT GetAttributeID (
            _Outptr_ LPCWSTR* attributeID) const = 0;
        virtual HRESULT SetAttributeID (
            _In_z_ LPCWSTR attributeID) = 0;
        
        // XML Map to attribute <Activity parentID="">
        virtual HRESULT GetAttributeParentID (
            _Outptr_ LPCWSTR* attributeParentID) const = 0;
        virtual HRESULT SetAttributeParentID (
            _In_z_ LPCWSTR attributeParentID) = 0;
        
        // XML Map to Activity/<ActivityInstance>
        virtual HRESULT GetActivityInstance (
            _Outptr_ LPCWSTR* activityInstance) const = 0;
        virtual HRESULT SetActivityInstance (
            _In_z_ LPCWSTR activityInstance) = 0;
            
        // XML Map to Activity/<ActivityInstanceDisplayName>
        virtual HRESULT GetActivityInstanceDisplayName (
            _Outptr_ LPCWSTR* activityInstanceDisplayName) const = 0;
        virtual HRESULT SetActivityInstanceDisplayName (
            _In_z_ LPCWSTR activityInstanceDisplayName) = 0;
            
        // XML Map to Activity/<ActivityClassDisplayName>
        virtual HRESULT GetActivityClassDisplayName (
            _Outptr_ LPCWSTR* activityClassDisplayName) const = 0;
        virtual HRESULT SetActivityClassDisplayName (
            _In_z_ LPCWSTR activityClassDisplayName) = 0;
        
        // XML Mao to Activity/<Trace />
        virtual HRESULT GetTrace (
            _Outptr_ Trace** trace) = 0;
        virtual HRESULT SetTrace (
            _In_z_ LPCWSTR traceFile,
            _In_opt_z_ LPCWSTR traceLink,
            _In_opt_z_ LPCWSTR traceName,
            _In_opt_z_ LPCWSTR traceTooltip,
            _Outptr_opt_ Trace** trace) = 0;
        virtual HRESULT SetTrace (
            _In_z_ LPCWSTR traceFile,
            _In_opt_z_ LPCWSTR traceLink,
            _Outptr_opt_ Trace** trace) = 0;
        virtual HRESULT ClearTrace () = 0;
        
        // XML Map to Activity/Trace/<File />
        virtual HRESULT GetTraceFile (
            _Outptr_ LPCWSTR* traceFile) const = 0;
        // Deprecated.
        virtual HRESULT SetTraceFile (
            _In_z_  LPCWSTR traceFile) = 0;

        // XML Map to Activity/Trace/<Link />
        virtual HRESULT GetTraceLink (
            _Outptr_ LPCWSTR* traceLink) const = 0;
        // Deprecated.
        virtual HRESULT SetTraceLink (
            _In_z_  LPCWSTR traceLink) = 0;

        // XML Map to Activity/Trace/Description/<Name />
        virtual HRESULT GetTraceName (
            _Outptr_ LPCWSTR* traceName) const = 0;
        // Deprecated.
        virtual HRESULT SetTraceName (
            _In_z_  LPCWSTR traceName) = 0;

        // XML Map to Activity/Trace/Description/<ToolTip />
        virtual HRESULT GetTraceToolTip (
            _Outptr_ LPCWSTR* traceToolTip) const = 0;
        // Deprecated.
        virtual HRESULT SetTraceToolTip (
            _In_z_  LPCWSTR traceToolTip) = 0;

        // XML Map to Activity/<Importance />
        virtual HRESULT GetImportance (
            _Out_ UINT* importance) const = 0;
        virtual HRESULT SetImportance (
            _In_ UINT importance) = 0;
        

        // XML Map to Activity/<ActivityTitle>
        virtual HRESULT GetActivityTitle (
            _Outptr_ LPCWSTR* activityTitle) const = 0;
        virtual HRESULT SetActivityTitle (
            _In_z_ LPCWSTR activityTitle) = 0;
        
        // XML Map to Activity/<ActivityDescription>
        virtual HRESULT GetActivityDescription (
            _Outptr_ LPCWSTR* activityDescription) const = 0;
        virtual HRESULT SetActivityDescription (
            _In_z_ LPCWSTR activityDescription) = 0;
        
        // XML Map to Activity/<ActivityClass />
        virtual HRESULT GetActivityClass (
            _Outptr_ LPCWSTR* activityClass) const = 0;
        virtual HRESULT SetActivityClass (
            _In_z_ LPCWSTR activityClass) = 0;
        
        // XML Map to Activity/<ActivityStartTime />
        virtual HRESULT GetActivityStartTime (
            _Out_ DOUBLE* activityStartTime) const = 0;
        virtual HRESULT SetActivityStartTime (
            _In_ DOUBLE activityStartTime) = 0;
        
        // XML Map to Activity/<ActivityEndTime />
        virtual HRESULT GetActivityEndTime (
            _Out_ DOUBLE* activityEndTime) const = 0;
        virtual HRESULT SetActivityEndTime (
            _In_ DOUBLE activityEndTime) = 0;
        
        // XML Map to Activity/<ActivityStartThread />
        virtual HRESULT GetActivityStartThread (
            _Out_ INT* activityStartThread) const = 0;
        virtual HRESULT SetActivityStartThread (
            _In_ INT activityStartThread) = 0;
        
        // XML Map to Activity/<ActivityEndThread />
        virtual HRESULT GetActivityEndThread (
            _Out_ INT* activityEndThread) const = 0;
        virtual HRESULT SetActivityEndThread (
            _In_ INT activityEndThread) = 0;
        
        // XML Map to Activity/<References/>
        virtual HRESULT AddReference (
            _In_opt_z_ LPCWSTR attributeIssueID,
            _Outptr_opt_ IssueReference** issueReference) = 0;
        virtual HRESULT GetReferences (
            _Outptr_ ReferenceCollection** references) = 0;

        virtual ~Activity(){}
    };
    
    struct Trace
    {
        virtual HRESULT GetFile (
            _Outptr_ LPCWSTR* file) const = 0;
        virtual HRESULT SetFile (
            _In_z_ LPCWSTR file) = 0;
        virtual HRESULT GetLink (
            _Outptr_ LPCWSTR* link) const = 0;
        virtual HRESULT SetLink (
            _In_z_ LPCWSTR link) = 0;
        virtual HRESULT GetName (
            _Outptr_ LPCWSTR* name) const = 0;
        virtual HRESULT SetName (
            _In_z_ LPCWSTR name) = 0;
        virtual HRESULT GetTooltip (
            _Outptr_ LPCWSTR* tooltip) const = 0;
        virtual HRESULT SetTooltip (
            _In_z_ LPCWSTR tooltip) = 0;
        virtual HRESULT Clear () = 0;
        virtual ~Trace(){}
    };

    struct ParentCollection 
    {
        virtual HRESULT AddItem (
            _In_z_ LPCWSTR parent) = 0;
        virtual HRESULT GetCount (
            _Out_ INT* count) const = 0;
        virtual HRESULT GetItem (
            _In_ INT index,
            _Outptr_ LPCWSTR* parent) = 0;
        virtual HRESULT DeleteItem (
            _In_ INT index) = 0;
        virtual HRESULT Clear() = 0;
        virtual ~ParentCollection(){}
    };

    struct MetricValueCollection 
    {
        virtual HRESULT AddItem (
            _In_z_ LPCWSTR programmaticName,
            _In_z_ LPCWSTR value,
            _Outptr_opt_ MetricValue** metricValue) = 0;
        virtual HRESULT AddItem (
            _In_z_ LPCWSTR programmaticName,
            _In_ INT value,
            _Outptr_opt_ MetricValue** metricValue) = 0;
        virtual HRESULT AddItem (
            _In_z_ LPCWSTR programmaticName,
            _In_ UINT value,
            _Outptr_opt_ MetricValue** metricValue) = 0;
        virtual HRESULT AddItem (
            _In_z_ LPCWSTR programmaticName,
            _In_ LONGLONG value,
            _Outptr_opt_ MetricValue** metricValue) = 0;
        virtual HRESULT AddItem (
            _In_z_ LPCWSTR programmaticName,
            _In_ ULONGLONG value,
            _Outptr_opt_ MetricValue** metricValue) = 0;
        virtual HRESULT AddItem (
            _In_z_ LPCWSTR programmaticName,
            _In_ DOUBLE value,
            _Outptr_opt_ MetricValue** metricValue) = 0;
        virtual HRESULT GetCount (
            _Out_ INT* count) const = 0;
        virtual HRESULT GetItem (
            _In_ INT index,
            _Outptr_ MetricValue** metricValue) = 0;
        virtual HRESULT DeleteItem (
            _In_ INT index) = 0;
        virtual HRESULT Clear() = 0;
        virtual ~MetricValueCollection(){}
    };
    
    struct MetricValue 
    {
        // XML Map to MetricValue/<ProgrammaticName />
        virtual HRESULT GetProgrammaticName (
            _Outptr_ LPCWSTR* programmaticName) const = 0;
        virtual HRESULT SetProgrammaticName (
            _In_z_ LPCWSTR programmaticName) = 0;
        
        // XML Map to MetricValue/<Value />
        virtual HRESULT GetValue (
            _Outptr_ LPCWSTR* value) const = 0;
        virtual HRESULT GetValue (
            _Out_ INT* value) const = 0;
        virtual HRESULT GetValue (
            _Out_ UINT* value) const = 0;
        virtual HRESULT GetValue (
            _Out_ LONGLONG* value) const = 0;
        virtual HRESULT GetValue (
            _Out_ ULONGLONG* value) const = 0;
        virtual HRESULT GetValue (
            _Out_ DOUBLE* value) const = 0;
        virtual HRESULT GetValue (
            _Out_ bool* value) const = 0;
        virtual HRESULT SetValue (
            _In_z_ LPCWSTR value) = 0;
        virtual HRESULT SetValue (
            _In_ INT value) = 0;
        virtual HRESULT SetValue (
            _In_ UINT value) = 0;
        virtual HRESULT SetValue (
            _In_ LONGLONG value) = 0;
        virtual HRESULT SetValue (
            _In_ ULONGLONG value) = 0;
        virtual HRESULT SetValue (
            _In_ DOUBLE value) = 0;
        virtual HRESULT SetValue (
            _In_ bool value) = 0;

        virtual ~MetricValue(){}
    };
    
    struct LinkCollection 
    {
        virtual HRESULT AddItem (
            _In_z_ LPCWSTR linkTitle,
            _In_z_ LPCWSTR linkValue,
            _Outptr_opt_ Link** link) = 0;
        virtual HRESULT GetCount (
            _Out_ INT* count) const = 0;
        virtual HRESULT GetItem (
            _In_ INT index,
            _Outptr_ Link** link) = 0;
        virtual HRESULT DeleteItem (
            _In_ INT index) = 0;
        virtual HRESULT Clear() = 0;
        virtual ~LinkCollection(){}
    };
    
    struct Link 
    {
        // XML Map to Link/<LinkTitle />
        virtual HRESULT GetLinkTitle (
            _Outptr_ LPCWSTR* linkTitle) const = 0;
        virtual HRESULT SetLinkTitle (
            _In_z_ LPCWSTR linkTitle) = 0;
        
        // XML Map to Link/<LinkToolTip />
        virtual HRESULT GetLinkToolTip (
            _Outptr_ LPCWSTR* linkToolTip) const = 0;
        virtual HRESULT SetLinkToolTip (
            _In_z_  LPCWSTR linkToolTip) = 0;
        
        // XML Map to Link/<LinkURI />
        virtual HRESULT GetLinkValue (
            _Outptr_ LPCWSTR* linkValue) const = 0;
        virtual HRESULT SetLinkValue (
            _In_z_  LPCWSTR linkValue) = 0;
    
        virtual ~Link(){}
    };
    
    struct RelatedActivityCollection 
    {
        virtual HRESULT AddItem (
            _In_opt_z_ LPCWSTR attributeActivityID,
            _Outptr_opt_ ActivityReference** activityReference) = 0;
        virtual HRESULT GetCount (
            _Out_ INT* count) const = 0;
        virtual HRESULT GetItem (
            _In_ INT index,
            _Outptr_ ActivityReference** activityReference) = 0;
        virtual HRESULT DeleteItem (
            _In_ INT index) = 0;
        virtual HRESULT Clear() = 0;
        virtual ~RelatedActivityCollection(){}
    };
    
    struct ActivityReference 
    {
        // XML Map to attribute <ActivityReference ActivityID=""/>
        virtual HRESULT GetAttributeActivityID (
            _Outptr_ LPCWSTR* attributeActivityID) const = 0;
        virtual HRESULT SetAttributeActivityID (
            _In_z_ LPCWSTR attributeActivityID) = 0;

        virtual ~ActivityReference(){}
    };
    
    struct ReferenceCollection 
    {
        virtual HRESULT AddItem (
            _In_opt_z_ LPCWSTR attributeIssueID,
            _Outptr_opt_ IssueReference** issueReference) = 0;
        virtual HRESULT GetCount (
            _Out_ INT* count) const = 0;
        virtual HRESULT GetItem (
            _In_ INT index,
            _Outptr_ IssueReference** issueReference) = 0;
        virtual HRESULT DeleteItem (
            _In_ INT index) = 0;
        virtual HRESULT Clear() = 0;
        virtual ~ReferenceCollection(){}
    };
    
    struct IssueReference
    {
        // XML Map to attribute <IssueReference IssueID=""/>
        virtual HRESULT GetAttributeIssueID (
            _Outptr_ LPCWSTR* attributeIssueID) const = 0;
        virtual HRESULT SetAttributeIssueID (
            _In_z_ LPCWSTR attributeIssueID) = 0;
        virtual ~IssueReference(){}
    };


    // end Result XML Authoring API interfaces
    
} } }  // end namespace Microsoft::Assessments::Runtime


////////////////////////////////////////////////////////////////////////////////////////
// Factory function
////////////////////////////////////////////////////////////////////////////////////////

extern "C" 
{
    HRESULT WINAPI AxeInitAssessment(
        _Inout_opt_ LPVOID pReserved,
        _Deref_out_ Microsoft::Assessments::Runtime::Support** ppSupport);
    typedef HRESULT ( WINAPI * PFNAXE_INITASSESSMENT)(
        _Inout_opt_ LPVOID pReserved,
        _Deref_out_ Microsoft::Assessments::Runtime::Support** ppSupport);
    #define AXE_INITASSESSMENT "AxeInitAssessment"
}

#endif  // NTDDI_VERSION >= NTDDI_WIN7

#endif  // AXERUNTIME_H
