-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
CefSchemeHandlerFactoryAdapter.h
90 lines (70 loc) · 3.24 KB
/
CefSchemeHandlerFactoryAdapter.h
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
// 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;
using namespace CefSharp::Core;
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 nullptr;
}
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 nullptr for file:" + resourceHandler->FilePath;
LOG(ERROR) << StringUtils::ToNative(msg).ToString();
return nullptr;
}
}
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_REFCOUNTINGM(CefSchemeHandlerFactoryAdapter);
};
}
}