You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
downkyi/Brotli.Core/Implement/Brolib.cs

317 lines
9.3 KiB

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace Brotli
{
public class Brolib
{
static bool UseX86 = IntPtr.Size == 4;
#region Encoder
public static IntPtr BrotliEncoderCreateInstance()
{
if (UseX86)
{
return Brolib32.BrotliEncoderCreateInstance(IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);
}
else
{
return Brolib64.BrotliEncoderCreateInstance(IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);
}
}
public static IntPtr GetModuleHandle(String moduleName)
{
IntPtr r = IntPtr.Zero;
foreach (ProcessModule mod in Process.GetCurrentProcess().Modules)
{
if (String.Compare(mod.ModuleName,moduleName,true)==0)
{
r = mod.BaseAddress;
break;
}
}
return r;
}
public static void FreeLibrary()
{
IntPtr libHandle = IntPtr.Zero;
libHandle = GetModuleHandle(LibPathBootStrapper.LibPath);
if (libHandle!=IntPtr.Zero)
{
NativeLibraryLoader.FreeLibrary(libHandle);
}
}
public static bool BrotliEncoderSetParameter(IntPtr state, BrotliEncoderParameter parameter, UInt32 value)
{
if (UseX86)
{
return Brolib32.BrotliEncoderSetParameter(state, parameter, value);
}
else
{
return Brolib64.BrotliEncoderSetParameter(state, parameter, value);
}
}
//@to rewrite using the following APIs
//BrotliGetDictionary
//BrotliGetTransforms
//BrotliSetDictionaryData
//BrotliTransformDictionaryWord
//public static void BrotliEncoderSetCustomDictionary(IntPtr state, UInt32 size, IntPtr dict)
//{
// if (UseX86)
// {
// Brolib32.BrotliEncoderSetCustomDictionary(state, size, dict);
// }
// else
// {
// Brolib64.BrotliEncoderSetCustomDictionary(state, size, dict);
// }
//}
public static bool BrotliEncoderCompressStream(
IntPtr state, BrotliEncoderOperation op, ref UInt32 availableIn,
ref IntPtr nextIn, ref UInt32 availableOut, ref IntPtr nextOut, out UInt32 totalOut)
{
if (UseX86)
{
return Brolib32.BrotliEncoderCompressStream(state, op, ref availableIn, ref nextIn, ref availableOut, ref nextOut, out totalOut);
}
else
{
UInt64 availableInL = availableIn;
UInt64 availableOutL = availableOut;
UInt64 totalOutL = 0;
var r = Brolib64.BrotliEncoderCompressStream(state, op, ref availableInL, ref nextIn, ref availableOutL, ref nextOut, out totalOutL);
availableIn = (UInt32)availableInL;
availableOut = (UInt32)availableOutL;
totalOut = (UInt32)totalOutL;
return r;
}
}
public static bool BrotliEncoderIsFinished(IntPtr state)
{
if (UseX86)
{
return Brolib32.BrotliEncoderIsFinished(state);
}
else
{
return Brolib64.BrotliEncoderIsFinished(state);
}
}
public static void BrotliEncoderDestroyInstance(IntPtr state)
{
if (UseX86)
{
Brolib32.BrotliEncoderDestroyInstance(state);
}
else
{
Brolib64.BrotliEncoderDestroyInstance(state);
}
}
public static UInt32 BrotliEncoderVersion()
{
if (UseX86)
{
return Brolib32.BrotliEncoderVersion();
}
else
{
return Brolib64.BrotliEncoderVersion();
}
}
public static IntPtr BrotliDecoderTakeOutput(IntPtr state, ref UInt32 size)
{
if (UseX86)
{
return Brolib32.BrotliDecoderTakeOutput(state, ref size);
}
else
{
UInt64 longSize = size;
var r = Brolib64.BrotliDecoderTakeOutput(state, ref longSize);
size = (UInt32)longSize;
return r;
}
}
#endregion
#region Decoder
public static IntPtr BrotliDecoderCreateInstance()
{
if (UseX86)
{
return Brolib32.BrotliDecoderCreateInstance(IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);
}
else
{
return Brolib64.BrotliDecoderCreateInstance(IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);
}
}
public static bool BrotliDecoderSetParameter(IntPtr state, BrotliDecoderParameter param, UInt32 value)
{
if (UseX86)
{
return Brolib32.BrotliDecoderSetParameter(state,param,value);
}
else
{
return Brolib64.BrotliDecoderSetParameter(state, param, value);
}
}
//@to rewrite using the following APIs
//BrotliGetDictionary
//BrotliGetTransforms
//BrotliSetDictionaryData
//BrotliTransformDictionaryWord
//public static void BrotliDecoderSetCustomDictionary(IntPtr state, UInt32 size, IntPtr dict)
//{
// if (UseX86)
// {
// Brolib32.BrotliDecoderSetCustomDictionary(state, size, dict);
// }
// else
// {
// Brolib64.BrotliDecoderSetCustomDictionary(state, size, dict);
// }
//}
public static BrotliDecoderResult BrotliDecoderDecompressStream(
IntPtr state, ref UInt32 availableIn,
ref IntPtr nextIn, ref UInt32 availableOut, ref IntPtr nextOut, out UInt32 totalOut)
{
if (UseX86)
{
return Brolib32.BrotliDecoderDecompressStream(state, ref availableIn, ref nextIn, ref availableOut, ref nextOut, out totalOut);
}
else
{
UInt64 availableInL = availableIn;
UInt64 availableOutL = availableOut;
UInt64 totalOutL = 0;
var r = Brolib64.BrotliDecoderDecompressStream(state, ref availableInL, ref nextIn, ref availableOutL, ref nextOut, out totalOutL);
availableIn = (UInt32)availableInL;
availableOut = (UInt32)availableOutL;
totalOut = (UInt32)totalOutL;
return r;
}
}
public static void BrotliDecoderDestroyInstance(IntPtr state)
{
if (UseX86)
{
Brolib32.BrotliDecoderDestroyInstance(state);
}
else
{
Brolib64.BrotliDecoderDestroyInstance(state);
}
}
public static UInt32 BrotliDecoderVersion()
{
if (UseX86)
{
return Brolib32.BrotliDecoderVersion();
}
else
{
return Brolib64.BrotliDecoderVersion();
}
}
public static bool BrotliDecoderIsUsed(IntPtr state)
{
if (UseX86)
{
return Brolib32.BrotliDecoderIsUsed(state);
}
else
{
return Brolib64.BrotliDecoderIsUsed(state);
}
}
public static bool BrotliDecoderIsFinished(IntPtr state)
{
if (UseX86)
{
return Brolib32.BrotliDecoderIsFinished(state);
}
else
{
return Brolib64.BrotliDecoderIsFinished(state);
}
}
public static Int32 BrotliDecoderGetErrorCode(IntPtr state)
{
if (UseX86)
{
return Brolib32.BrotliDecoderGetErrorCode(state);
}
else
{
return Brolib64.BrotliDecoderGetErrorCode(state);
}
}
public static String BrotliDecoderErrorString(Int32 code)
{
IntPtr r = IntPtr.Zero;
if (UseX86)
{
r = Brolib32.BrotliDecoderErrorString(code);
}
else
{
r = Brolib64.BrotliDecoderErrorString(code);
}
if (r != IntPtr.Zero)
{
return Marshal.PtrToStringAnsi(r);
}
return String.Empty;
}
public static IntPtr BrotliEncoderTakeOutput(IntPtr state, ref UInt32 size)
{
if (UseX86)
{
return Brolib32.BrotliEncoderTakeOutput(state, ref size);
}
else
{
UInt64 longSize = size;
var r = Brolib64.BrotliEncoderTakeOutput(state, ref longSize);
size = (UInt32)longSize;
return r;
}
}
#endregion
}
}