// 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 _factory; public: CefSchemeHandlerFactoryAdapter(ISchemeHandlerFactory^ factory) : _factory(factory) { } ~CefSchemeHandlerFactoryAdapter() { _factory = nullptr; } virtual CefRefPtr Create(CefRefPtr browser, CefRefPtr frame, const CefString& schemeName, CefRefPtr 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(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(handler); //NOTE: Prefix with cli:: namespace as VS2015 gets confused with std::array cli::array^ buffer = resourceHandler->Data; pin_ptr src = &buffer[0]; auto streamReader = CefStreamReader::CreateForData(static_cast(src), buffer->Length); return new CefStreamResourceHandler(StringUtils::ToNative(resourceHandler->MimeType), streamReader); } return new CefResourceHandlerAdapter(handler); } IMPLEMENT_REFCOUNTING(CefSchemeHandlerFactoryAdapter); }; } }