|
|
|
|
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();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|