admin
2020-06-10 a610f2ab6e543d2cb78c1ef212ac6a74ddc067d9
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
// Copyright © 2015 The CefSharp Authors. All rights reserved.
//
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
 
#pragma once
 
#include "Stdafx.h"
#include "include\cef_scheme.h"
#include "include\wrapper\cef_stream_resource_handler.h"
 
#include "Internals\CefBrowserWrapper.h"
#include "Internals\CefFrameWrapper.h"
#include "Request.h"
#include "CefResourceHandlerAdapter.h"
 
using namespace System::IO;
using namespace System::Collections::Specialized;
 
namespace CefSharp
{
    namespace Internals
    {
        private class CefSchemeHandlerFactoryAdapter : public CefSchemeHandlerFactory
        {
            gcroot<ISchemeHandlerFactory^> _factory;
 
        public:
            CefSchemeHandlerFactoryAdapter(ISchemeHandlerFactory^ factory)
                : _factory(factory)
            {
            }
 
            ~CefSchemeHandlerFactoryAdapter()
            {
                _factory = nullptr;
            }
 
            virtual CefRefPtr<CefResourceHandler> Create(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, const CefString& schemeName, CefRefPtr<CefRequest> request) OVERRIDE
            {
                CefBrowserWrapper browserWrapper(browser);
                CefFrameWrapper frameWrapper(frame);
                Request requestWrapper(request);
 
                auto handler = _factory->Create(%browserWrapper, %frameWrapper, StringUtils::ToClr(schemeName), %requestWrapper);
 
                if (handler == nullptr)
                {
                    return NULL;
                }
 
                if (handler->GetType() == FileResourceHandler::typeid)
                {
                    auto resourceHandler = static_cast<FileResourceHandler^>(handler);
 
                    auto streamReader = CefStreamReader::CreateForFile(StringUtils::ToNative(resourceHandler->FilePath));
 
                    if (streamReader.get())
                    {
                        return new CefStreamResourceHandler(StringUtils::ToNative(resourceHandler->MimeType), streamReader);
                    }
                    else
                    {
                        auto msg = "Unable to load resource CefStreamReader::CreateForFile returned NULL for file:" + resourceHandler->FilePath;
                        LOG(ERROR) << StringUtils::ToNative(msg).ToString();
 
                        return NULL;
                    }
                }
                else if (handler->GetType() == ByteArrayResourceHandler::typeid)
                {
                    auto resourceHandler = static_cast<ByteArrayResourceHandler^>(handler);
 
                    //NOTE: Prefix with cli:: namespace as VS2015 gets confused with std::array
                    cli::array<Byte>^ buffer = resourceHandler->Data;
                    pin_ptr<Byte> src = &buffer[0];
 
                    auto streamReader = CefStreamReader::CreateForData(static_cast<void*>(src), buffer->Length);
 
                    return new CefStreamResourceHandler(StringUtils::ToNative(resourceHandler->MimeType), streamReader);
                }
 
                return new CefResourceHandlerAdapter(handler);
            }
 
            IMPLEMENT_REFCOUNTING(CefSchemeHandlerFactoryAdapter);
        };
    }
}