Files
ntwain/src/NTwain/Triplets/Control/StatusUtf8.cs

75 lines
2.8 KiB
C#

using System;
using System.Runtime.InteropServices;
using System.Text;
using NTwain.Data;
using NTwain.Internals;
namespace NTwain.Triplets.Control
{
sealed class StatusUtf8 : BaseTriplet
{
internal StatusUtf8(TwainSession session) : base(session) { }
public ReturnCode Get(ref TW_STATUS status, DataSource source, out string message)
{
message = null;
var rc = ReturnCode.Failure;
TW_STATUSUTF8 real = new TW_STATUSUTF8 { Status = status };
if (Is32Bit)
{
if (IsWin)
rc = NativeMethods.DsmWin32(Session.Config.App32, source?.Identity32,
DataGroups.Control, DataArgumentType.StatusUtf8, Message.Get, ref real);
else if (IsLinux)
rc = NativeMethods.DsmLinux32(Session.Config.App32, source?.Identity32,
DataGroups.Control, DataArgumentType.StatusUtf8, Message.Get, ref real);
else if (IsMac)
rc = NativeMethods.DsmMac32(Session.Config.App32, source?.Identity32,
DataGroups.Control, DataArgumentType.StatusUtf8, Message.Get, ref real);
}
else
{
if (IsWin)
rc = NativeMethods.DsmWin64(Session.Config.App32, source?.Identity32,
DataGroups.Control, DataArgumentType.StatusUtf8, Message.Get, ref real);
else if (IsLinux)
rc = NativeMethods.DsmLinux64(Session.Config.App32, source?.Identity32,
DataGroups.Control, DataArgumentType.StatusUtf8, Message.Get, ref real);
else if (IsMac)
rc = NativeMethods.DsmMac64(Session.Config.App32, source?.Identity32,
DataGroups.Control, DataArgumentType.StatusUtf8, Message.Get, ref real);
}
if (rc == ReturnCode.Success)
{
message = ReadUtf8String(ref real);
}
return rc;
}
private string ReadUtf8String(ref TW_STATUSUTF8 status)
{
if (status.UTF8string != IntPtr.Zero)
{
try
{
IntPtr lockedPtr = Session.Config.MemoryManager.Lock(status.UTF8string);
var buffer = new byte[status.Size - 1];
Marshal.Copy(lockedPtr, buffer, 0, buffer.Length);
return Encoding.UTF8.GetString(buffer);
}
finally
{
Session.Config.MemoryManager.Unlock(status.UTF8string);
Session.Config.MemoryManager.Free(status.UTF8string);
}
}
return null;
}
}
}