summaryrefslogtreecommitdiff
path: root/src/vm/eeconfigfactory.h
blob: 2554295268343b6896daa30e2469a1fea772c23f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
// EEConfigFactory.h
//

//
// Parses XML files and adding runtime entries to the EEConfig list
//


#ifndef EECONFIGFACTORY_H
#define EECONFIGFACTORY_H

#include <xmlparser.h>
#include <objbase.h>
#include "unknwn.h"
#include "../xmlparser/_reference.h"
#include "../xmlparser/_unknown.h"
#include "eehash.h"
#include "eeconfig.h"

#define CONFIG_KEY_SIZE 128

class EEConfigFactory : public _unknown<IXMLNodeFactory, &IID_IXMLNodeFactory>
{

public:
    EEConfigFactory(
        ConfigStringHashtable* pTable, 
        LPCWSTR, 
        ParseCtl parseCtl = parseAll);
    ~EEConfigFactory();
    HRESULT STDMETHODCALLTYPE NotifyEvent( 
            /* [in] */ IXMLNodeSource __RPC_FAR *pSource,
            /* [in] */ XML_NODEFACTORY_EVENT iEvt);

    HRESULT STDMETHODCALLTYPE BeginChildren( 
        /* [in] */ IXMLNodeSource __RPC_FAR *pSource,
        /* [in] */ XML_NODE_INFO* __RPC_FAR pNodeInfo);

    HRESULT STDMETHODCALLTYPE EndChildren( 
        /* [in] */ IXMLNodeSource __RPC_FAR *pSource,
        /* [in] */ BOOL fEmptyNode,
        /* [in] */ XML_NODE_INFO* __RPC_FAR pNodeInfo);
    
    HRESULT STDMETHODCALLTYPE Error( 
        /* [in] */ IXMLNodeSource __RPC_FAR *pSource,
        /* [in] */ HRESULT hrErrorCode,
        /* [in] */ USHORT cNumRecs,
        /* [in] */ XML_NODE_INFO* __RPC_FAR * __RPC_FAR apNodeInfo)
    {
        LIMITED_METHOD_CONTRACT;
      /* 
         UNUSED(pSource);
         UNUSED(hrErrorCode);
         UNUSED(cNumRecs);
         UNUSED(apNodeInfo);
      */
        return hrErrorCode;
    }
    
    HRESULT STDMETHODCALLTYPE CreateNode( 
        /* [in] */ IXMLNodeSource __RPC_FAR *pSource,
        /* [in] */ PVOID pNodeParent,
        /* [in] */ USHORT cNumRecs,
        /* [in] */ XML_NODE_INFO* __RPC_FAR * __RPC_FAR apNodeInfo);

private:

    HRESULT GrowKey(DWORD dwSize)
    {
        CONTRACTL
        {
      	    NOTHROW;	    
      	    GC_NOTRIGGER;
      	    INJECT_FAULT(return E_OUTOFMEMORY);
        }
        CONTRACTL_END;
        
        if(dwSize > m_dwSize) {
            DeleteKey();
            m_pCurrentRuntimeElement = new(nothrow) WCHAR[dwSize];
            if(m_pCurrentRuntimeElement == NULL) return E_OUTOFMEMORY;
            m_dwSize = dwSize;
        }
        return S_OK;
    }

    void ClearKey()
    {
        LIMITED_METHOD_CONTRACT;

        *m_pCurrentRuntimeElement = 0;
        m_dwCurrentRuntimeElement = 0;
    }

    void DeleteKey()
    {
        WRAPPER_NO_CONTRACT;
        if(m_pCurrentRuntimeElement != NULL && m_pCurrentRuntimeElement != m_pBuffer)
            delete [] m_pCurrentRuntimeElement;
        m_dwSize = 0;
        m_dwCurrentRuntimeElement = 0;
    }

    HRESULT CopyToKey(__in_z LPCWSTR pString, DWORD dwString)
    {
        WRAPPER_NO_CONTRACT;
        dwString++; // add in the null
        HRESULT hr = GrowKey(dwString);
        if(FAILED(hr)) return hr;
        wcsncpy_s(m_pCurrentRuntimeElement, m_dwSize, pString, dwString-1);

        m_dwCurrentRuntimeElement = dwString;
        return S_OK;
    }
    
    HRESULT STDMETHODCALLTYPE AddKeyValuePair( 
        __in_ecount(dwStringSize) WCHAR * pszString,
        /* [in] */ DWORD dwStringSize,
        __in_ecount(m_dwCurrentRuntimeElement) WCHAR * m_pCurrentRuntimeElement,
        /* [in] */ DWORD m_dwCurrentRuntimeElement);
        
    HRESULT CopyVersion(LPCWSTR version, DWORD dwVersion);

    ConfigStringHashtable* m_pTable;
    BOOL    m_fUnderRuntimeElement;
    BOOL    m_fOnEnabledAttribute;
    BOOL    m_fOnValueAttribute;
    BOOL    m_fVersionedRuntime;
    BOOL    m_fDeveloperSettings;

    LPCWSTR m_pVersion;
    LPWSTR  m_pCurrentRuntimeElement;
    DWORD   m_dwCurrentRuntimeElement;

    WCHAR   m_pBuffer[CONFIG_KEY_SIZE];
    DWORD   m_dwSize;

    DWORD   m_dwDepth;

    bool    m_bSafeMode; // If true, will ignore any settings that may compromise security
    ParseCtl m_parseCtl; // usually parseAll, sometimes stopAfterRuntimeSection

    ReleaseHolder<IXMLNodeFactory> m_pActiveFactory; // hold a factory responsible for parsing subnode
};

#endif