aboutsummaryrefslogtreecommitdiff
path: root/src/ext/Util/be/UtilBundleExtension.cpp
blob: 23f5d94f70a8a9a50a6c96572a540705f46aa838 (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
// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.

#include "precomp.h"
#include "BextBaseBundleExtension.h"

class CWixUtilBundleExtension : public CBextBaseBundleExtension
{
public: // IBundleExtension
    virtual STDMETHODIMP Search(
        __in LPCWSTR wzId,
        __in LPCWSTR wzVariable
        )
    {
        HRESULT hr = S_OK;

        hr = UtilSearchExecute(&m_searches, wzId, wzVariable, m_pEngine);

        return hr;
    }

public: //CBextBaseBundleExtension
    virtual STDMETHODIMP Initialize(
        __in const BUNDLE_EXTENSION_CREATE_ARGS* pCreateArgs
        )
    {
        HRESULT hr = S_OK;
        IXMLDOMDocument* pixdManifest = NULL;
        IXMLDOMNode* pixnBundleExtension = NULL;

        hr = __super::Initialize(pCreateArgs);
        BextExitOnFailure(hr, "CBextBaseBundleExtension initialization failed.");

        hr = XmlLoadDocumentFromFile(m_sczBundleExtensionDataPath, &pixdManifest);
        BextExitOnFailure(hr, "Failed to load bundle extension manifest from path: %ls", m_sczBundleExtensionDataPath);

        hr = BextGetBundleExtensionDataNode(pixdManifest, UTIL_BUNDLE_EXTENSION_ID, &pixnBundleExtension);
        BextExitOnFailure(hr, "Failed to get BundleExtension '%ls'", UTIL_BUNDLE_EXTENSION_ID);

        hr = UtilSearchParseFromXml(&m_searches, pixnBundleExtension);
        BextExitOnFailure(hr, "Failed to parse searches from bundle extension manifest.");

    LExit:
        ReleaseObject(pixnBundleExtension);
        ReleaseObject(pixdManifest);

        return hr;
    }

public:
    CWixUtilBundleExtension(
        __in IBundleExtensionEngine* pEngine
        ) : CBextBaseBundleExtension(pEngine)
    {
        m_searches = { };
    }

    ~CWixUtilBundleExtension()
    {
        UtilSearchUninitialize(&m_searches);
    }

private:
    UTIL_SEARCHES m_searches;
};

HRESULT UtilBundleExtensionCreate(
    __in IBundleExtensionEngine* pEngine,
    __in const BUNDLE_EXTENSION_CREATE_ARGS* pArgs,
    __out IBundleExtension** ppBundleExtension
    )
{
    HRESULT hr = S_OK;
    CWixUtilBundleExtension* pExtension = NULL;

    pExtension = new CWixUtilBundleExtension(pEngine);
    BextExitOnNull(pExtension, hr, E_OUTOFMEMORY, "Failed to create new CWixUtilBundleExtension.");

    hr = pExtension->Initialize(pArgs);
    BextExitOnFailure(hr, "CWixUtilBundleExtension initialization failed.");

    *ppBundleExtension = pExtension;
    pExtension = NULL;

LExit:
    ReleaseObject(pExtension);
    return hr;
}