You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

223 lines
6.8 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using CefSharp;
using NLog;
using POSV.Cef.Client.Properties;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace POSV.Cef.Client.ClientComm
{
internal class CustomSchemeHandler : IResourceHandler
{
private readonly IDictionary<string, byte[]> resources;
private string mimeType;
private MemoryStream stream;
Logger logger = null;
public CustomSchemeHandler()
{
logger = LogManager.GetLogger(this.GetType().FullName);
//这样加载非常浪费资源
resources = new Dictionary<string, byte[]>
{
};
}
public byte[] BitmapToBytes(Bitmap Bitmap)
{
MemoryStream ms = null;
try
{
ms = new MemoryStream();
Bitmap.Save(ms, Bitmap.RawFormat);
byte[] byteImage = new Byte[ms.Length];
byteImage = ms.ToArray();
return byteImage;
}
catch (ArgumentNullException ex)
{
return null;
}
finally
{
ms.Close();
}
}
// 当收到请求时的处理器
bool IResourceHandler.ProcessRequest(IRequest request, ICallback callback)
{
try
{
var uri = new Uri(request.Url);
var resourceName = uri.AbsolutePath;
var _Splits = resourceName.Split('/');
var _resources = "";//文件名
var _resourcename = "";
if (_Splits.Count() > 0)
{
_resources = _Splits[_Splits.Count() - 1];
}
_resourcename = _resources.Split('.')[0];
if (Properties.Resources.ResourceManager.GetObject(_resourcename) == null)
{
logger.Info("CEF错误找不到" + _resources + "资源文件");
return false;
}
using (callback)
{
if (_resources.Contains(".png") || _resources.Contains(".jpg"))
{
stream = new MemoryStream(this.BitmapToBytes((System.Drawing.Bitmap)Properties.Resources.ResourceManager.GetObject(_resourcename)));
}
else
{
stream = new MemoryStream(Encoding.UTF8.GetBytes((string)Properties.Resources.ResourceManager.GetObject(_resourcename)));
}
var fileExtension = Path.GetExtension(resourceName);
mimeType = ResourceHandler.GetMimeType(fileExtension);
if (!callback.IsDisposed)
{
callback.Continue();
}
}
return true;
#region 久代码
//// 普通的文件资源处理
//byte[] resource;
//if (resources.TryGetValue(resourceName, out resource))
//{
// using (callback)
// {
// stream = new MemoryStream(resource);
// var fileExtension = Path.GetExtension(resourceName);
// mimeType = ResourceHandler.GetMimeType(fileExtension);
// if (!callback.IsDisposed)
// {
// callback.Continue();
// }
// }
// return true;
//}
//else
//{
// logger.Info("CEF网页加载时找不到资源文件请确认文件引用是否正常。文件url" + resourceName);
//}
#endregion
}
catch (Exception ex)
{
logger.Info("CEF错误" + ex.Message);
}
return false;
}
// 当包装responseheader的处理代码
void IResourceHandler.GetResponseHeaders(IResponse response, out long responseLength, out string redirectUrl)
{
redirectUrl = null;
response.MimeType = mimeType;
if (stream != null)
{
responseLength = stream.Length;
response.StatusCode = (int)System.Net.HttpStatusCode.OK;
response.StatusText = "OK";
}
else
{
responseLength = 0;
response.StatusCode = (int)System.Net.HttpStatusCode.NotFound;
response.StatusText = "NotFound";
}
}
// 当包装responsebody的处理代码
bool IResourceHandler.ReadResponse(Stream dataOut, out int bytesRead, ICallback callback)
{
callback.Dispose();
if (stream == null)
{
bytesRead = 0;
return false;
}
var buffer = new byte[dataOut.Length];
bytesRead = stream.Read(buffer, 0, buffer.Length);
dataOut.Write(buffer, 0, buffer.Length);
return bytesRead > 0;
}
bool IResourceHandler.CanGetCookie(Cookie cookie)
{
return true;
}
bool IResourceHandler.CanSetCookie(Cookie cookie)
{
return true;
}
void IResourceHandler.Cancel()
{
}
#region IDisposable Support
private bool disposedValue = false; // 要检测冗余调用
protected virtual void Dispose(bool disposing)
{
if (!disposedValue)
{
if (disposing)
{
// TODO: 释放托管状态(托管对象)。
}
// TODO: 释放未托管的资源(未托管的对象)并在以下内容中替代终结器。
// TODO: 将大型字段设置为 null。
disposedValue = true;
}
}
// 添加此代码以正确实现可处置模式。
public void Dispose()
{
// 请勿更改此代码。将清理代码放入以上 Dispose(bool disposing) 中。
Dispose(true);
// TODO: 如果在以上内容中替代了终结器,则取消注释以下行。
// GC.SuppressFinalize(this);
}
#endregion
}
public class CustomSchemeHandlerFactory : ISchemeHandlerFactory
{
public const string SchemeName = "custom";
public IResourceHandler Create(IBrowser browser, IFrame frame, string schemeName, IRequest request)
{
return new CustomSchemeHandler();
}
}
}