Welcome to mirror list, hosted at ThFree Co, Russian Federation.

info.h « bundle « cli « corehost « installer « src - github.com/dotnet/runtime.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 0f3db559fc2221e40082abd7b9616af3ace90398 (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
// 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.

#ifndef __INFO_H_
#define __INFO_H_

#include "error_codes.h"
#include "header.h"

// bundle::info supports:
// * API for identification of a single-file app bundle, and
// * Minimal probing and mapping functionality only for the app.runtimeconfig.json and app.deps.json files.
// bundle::info is used by HostFxr to read the above config files.

namespace bundle
{
    struct info_t
    {
        struct config_t
        {
            config_t()
            : m_location(nullptr) {}

            config_t(const config_t& config)
            {
                m_path = config.m_path;
                m_location = config.m_location;
            }

            config_t(const pal::string_t& path, const location_t *location=nullptr)
            {
                m_path = path;
                m_location = location;
            }

            bool matches(const pal::string_t& path) const
            {
                return m_location->is_valid() && path.compare(m_path) == 0;
            }

            static bool probe(const pal::string_t& path)
            {
                return is_single_file_bundle() && 
                       (the_app->m_deps_json.matches(path) || the_app->m_runtimeconfig_json.matches(path));
            }

            void set_location(const location_t* location)
            {
                m_location = location;
            }

            static char* map(const pal::string_t& path, const location_t* &location);
            static void unmap(const char* addr, const location_t* location);

        private:
            pal::string_t m_path;
            const location_t *m_location;
        };

        static StatusCode process_bundle(const pal::char_t* bundle_path, const pal::char_t *app_path, int64_t header_offset);
        static bool is_single_file_bundle() { return the_app != nullptr; }

        bool is_netcoreapp3_compat_mode() const { return m_header.is_netcoreapp3_compat_mode(); }
        const pal::string_t& base_path() const { return m_base_path; }
        int64_t header_offset() const { return m_header_offset; }

        // Global single-file info object
        static const info_t* the_app;

    protected:
          info_t(const pal::char_t* bundle_path,
                 const pal::char_t* app_path,
                 int64_t header_offset);

        const char* map_bundle();
        void unmap_bundle(const char* addr) const;

        pal::string_t m_bundle_path;
        pal::string_t m_base_path;
        size_t m_bundle_size;
        int64_t m_header_offset;
        header_t m_header;
        config_t m_deps_json;
        config_t m_runtimeconfig_json;

    private:
        StatusCode process_header();
    };
}
#endif // __INFO_H_