using System; using System.Runtime.InteropServices; namespace Foodsoft.Alpm { /* * Hooks */ enum alpm_hook_when_t { HOOK_PRE_TRANSACTION = 1, HOOK_POST_TRANSACTION } /* * Logging facilities */ /** Logging Levels */ enum _alpm_loglevel_t { LOG_ERROR = 1, LOG_WARNING = (1 << 1), LOG_DEBUG = (1 << 2), LOG_FUNCTION = (1 << 3) } /** Location a package object was loaded from. */ enum alpm_pkgfrom_t { PKG_FROM_FILE = 1, PKG_FROM_LOCALDB, PKG_FROM_SYNCDB } /** Method used to validate a package. */ enum alpm_pkgvalidation_t { PKG_VALIDATION_UNKNOWN = 0, PKG_VALIDATION_NONE = (1 << 0), PKG_VALIDATION_MD5SUM = (1 << 1), PKG_VALIDATION_SHA256SUM = (1 << 2), PKG_VALIDATION_SIGNATURE = (1 << 3) } /** Types of version constraints in dependency specs. */ public enum alpm_depmod_t { /** No version constraint */ DEP_MOD_ANY = 1, /** Test version equality (package=x.y.z) */ DEP_MOD_EQ, /** Test for at least a version (package>=x.y.z) */ DEP_MOD_GE, /** Test for at most a version (package<=x.y.z) */ DEP_MOD_LE, /** Test for greater than some version (package>x.y.z) */ DEP_MOD_GT, /** Test for less than some version (package() * iCount; var byteBuffer = new byte[byteCount]; Marshal.Copy(files, byteBuffer, 0, byteBuffer.Length); var result = new alpm_file_t[iCount]; Buffer.BlockCopy(byteBuffer, 0, result, 0, byteBuffer.Length); return result; } } /** Local package or package file backup entry */ public struct _alpm_backup_t { string name; string hash; } public class alpm_pgpkey_t { public byte[] data; public string fingerprint; public string uid; public string name; public string email; public long created; public long expires; public uint revoked; public char pubkey_algo; } public class PgpKeyInMarshaler : ICustomMarshaler { [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] private class NativePgpKey { public IntPtr data; public string fingerprint; public string uid; public string name; public string email; public long created; public long expires; public uint length; public uint revoked; public char pubkey_algo; } public void CleanUpManagedData(object ManagedObj) { } public void CleanUpNativeData(IntPtr pNativeData) { } public int GetNativeDataSize() { throw new NotImplementedException(); } public IntPtr MarshalManagedToNative(object ManagedObj) { throw new NotImplementedException(); } public object MarshalNativeToManaged(IntPtr pNativeData) { var raw = Marshal.PtrToStructure(pNativeData); var managed = new alpm_pgpkey_t() { data = new byte[raw.length], fingerprint = raw.fingerprint, uid = raw.uid, name = raw.name, email = raw.email, created = raw.created, expires = raw.expires, revoked = raw.revoked, pubkey_algo = raw.pubkey_algo }; Marshal.Copy(raw.data, managed.data, 0, (int) raw.length); return managed; } } /** * Signature result. Contains the key, status, and validity of a given * signature. */ public readonly struct alpm_sigresult_t { [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(PgpKeyInMarshaler))] readonly alpm_pgpkey_t key; readonly alpm_sigstatus_t status; readonly alpm_sigvalidity_t validity; } /** * Signature list. Contains the number of signatures found and a pointer to an * array of results. The array is of size count. */ public class SigListInMarshaler : ICustomMarshaler { public void CleanUpManagedData(object ManagedObj) { } public void CleanUpNativeData(IntPtr pNativeData) { } public int GetNativeDataSize() { throw new NotImplementedException(); } public IntPtr MarshalManagedToNative(object ManagedObj) { throw new NotImplementedException(); } public object MarshalNativeToManaged(IntPtr pNativeData) { UIntPtr count; IntPtr data; unsafe { count = *(UIntPtr*) pNativeData; data = *(IntPtr*) (pNativeData + sizeof(UIntPtr)); } var iCount = (int) count; var result = new alpm_sigresult_t[iCount]; // NOTE: I expect this to fail cuz i didn't implement the above GetNativeDataSize for (var i = 0; i < iCount; ++i, data += Marshal.SizeOf()) { result[i] = Marshal.PtrToStructure(data); } return result; } } }