diff --git a/Alpm.Tests/Alpm.Tests.csproj b/Alpm.Tests/Alpm.Tests.csproj new file mode 100644 index 0000000..0e99eaf --- /dev/null +++ b/Alpm.Tests/Alpm.Tests.csproj @@ -0,0 +1,20 @@ + + + + netcoreapp3.1 + + false + + + + + + + + + + + + + + diff --git a/Alpm.Tests/AlpmIntegrationTest.cs b/Alpm.Tests/AlpmIntegrationTest.cs index b57c278..3a30233 100644 --- a/Alpm.Tests/AlpmIntegrationTest.cs +++ b/Alpm.Tests/AlpmIntegrationTest.cs @@ -13,7 +13,7 @@ namespace Alpm.Tests public void TestLocalDB() { using var localDB = _handle.LocalDB; - Assert.Equal(15, localDB.PackageCache.Count()); + Assert.True(localDB.CachePackageCache.Count() > 15); } [Fact] diff --git a/Alpm/Backup.cs b/Alpm/Backup.cs index bc16d37..3a8cbf9 100644 --- a/Alpm/Backup.cs +++ b/Alpm/Backup.cs @@ -1,8 +1,25 @@ +using System; +using System.Runtime.InteropServices; + namespace Foodsoft.Alpm { public struct Backup { - private string _name; - private string _hash; + public string Name { get; } + public string Hash { get; } + + [StructLayout(LayoutKind.Sequential)] + private readonly unsafe struct NativeBackup + { + internal readonly sbyte* name; + internal readonly sbyte* hash; + } + + internal unsafe Backup(IntPtr ptr) + { + var native = (NativeBackup*) ptr; + Name = new string(native->name); + Hash = new string(native->hash); + } } } \ No newline at end of file diff --git a/Alpm/PackageList.cs b/Alpm/CachePackageList.cs similarity index 76% rename from Alpm/PackageList.cs rename to Alpm/CachePackageList.cs index 77b1412..8ea8e7c 100644 --- a/Alpm/PackageList.cs +++ b/Alpm/CachePackageList.cs @@ -2,27 +2,26 @@ using System; using System.Collections; using System.Collections.Generic; using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; namespace Foodsoft.Alpm { - public class PackageList : ICollection + public class CachePackageList : IPackageList, ICollection { private readonly SafeDatabaseHandle _parentHandle; private readonly IntPtr _listPtr; private readonly Database _db; - internal PackageList(IntPtr listPtr, SafeDatabaseHandle parentHandle, Database db) + internal CachePackageList(IntPtr listPtr, SafeDatabaseHandle parentHandle, Database db) { _parentHandle = parentHandle; _listPtr = listPtr; _db = db; } - + public IEnumerator GetEnumerator() { var release = false; - + RuntimeHelpers.PrepareConstrainedRegions(); try { @@ -45,6 +44,7 @@ namespace Foodsoft.Alpm { return GetEnumerator(); } + public bool Contains(CachePackage item) { var name = item.Name; @@ -63,16 +63,27 @@ namespace Foodsoft.Alpm public void CopyTo(CachePackage[] array, int arrayIndex) { - _parentHandle.UseHandle(_listPtr,(list) => + _parentHandle.UseHandle(_listPtr, (list) => { for (; list != IntPtr.Zero; list = Wrapper.ListNext(list)) { array[arrayIndex++] = new CachePackage( new SafeCachePackageHandle(Wrapper.ListData(list), _parentHandle), _db); } + return 0; }); } + public CachePackage? FindSatisfier(string depString) + { + return _parentHandle.UseHandle(_listPtr, (list) => + { + var pkgPtr = alpm.alpm_find_satisfier(list, depString); + return pkgPtr != IntPtr.Zero + ? new CachePackage(new SafeCachePackageHandle(pkgPtr, _parentHandle), _db) + : null; + }); + } public void Add(CachePackage item) { @@ -83,12 +94,13 @@ namespace Foodsoft.Alpm { throw new NotSupportedException(); } + public void Clear() { throw new NotSupportedException(); } - public int Count => _parentHandle.UseHandle(_listPtr,(list) => (int) alpm.alpm_list_count(list)); + public int Count => _parentHandle.UseHandle(_listPtr, (list) => (int) alpm.alpm_list_count(list)); public bool IsReadOnly => true; } diff --git a/Alpm/Database.cs b/Alpm/Database.cs index 567379f..4b69d4d 100644 --- a/Alpm/Database.cs +++ b/Alpm/Database.cs @@ -19,20 +19,11 @@ namespace Foodsoft.Alpm public bool RemoveServer(string url) => API.WrapErrorBool(_handle.SafeAlpmHandle, () => alpm.alpm_db_remove_server(_handle, url)); - private readonly struct ServersImpl : ICollectionImpl - { - private readonly SafeDatabaseHandle _handle; - internal ServersImpl(SafeDatabaseHandle handle) => _handle = handle; - public SafeHandle Handle => _handle; - public IntPtr GetItems() => alpm.alpm_db_get_servers(_handle); - public string PtrToItem(IntPtr p) => Marshal.PtrToStringUTF8(p)!; - } - // FIXME: This is "bug correct", but probably dumb to do it this way, instead just call add_server // like all the stuff in handle. public IEnumerable Servers { - get => EnumerableWrapper.Create(new ServersImpl(_handle)); + get => EnumerableWrapper.Create(_handle, alpm.alpm_db_get_servers); set { var listPtr = IntPtr.Zero; @@ -94,14 +85,14 @@ namespace Foodsoft.Alpm return new CachePackage(new SafeCachePackageHandle(pkgPtr, _handle), this); } - public PackageList PackageCache + public CachePackageList CachePackageCache { get { var listPtr = alpm.alpm_db_get_pkgcache(_handle); if (listPtr == IntPtr.Zero) throw new AlpmException(_handle.SafeAlpmHandle); - return new PackageList(listPtr, _handle, this); + return new CachePackageList(listPtr, _handle, this); } } diff --git a/Alpm/Depend.cs b/Alpm/Depend.cs index c80f05a..0595b83 100644 --- a/Alpm/Depend.cs +++ b/Alpm/Depend.cs @@ -1,12 +1,9 @@ +using System; using System.Diagnostics.CodeAnalysis; using System.Runtime.InteropServices; namespace Foodsoft.Alpm { - - - [StructLayout(LayoutKind.Sequential)] - [SuppressMessage("ReSharper", "ConvertToConstant.Local")] public class Depend { public enum ModType @@ -19,16 +16,31 @@ namespace Foodsoft.Alpm LessThan } - [field: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8OutMarshaler))] - public string Name { get; } = null!; + public string Name { get; } + public string Version { get; } + public string Description { get; } + public ulong NameHash { get; } + public ModType Mod { get; } - [field: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8OutMarshaler))] - public string Version { get; } = null!; + [StructLayout(LayoutKind.Sequential)] + private readonly unsafe struct NativeDepend + { + internal readonly sbyte* name; + internal readonly sbyte* version; + internal readonly sbyte* description; + internal readonly ulong name_hash; + internal readonly Depend.ModType mod; + } - [field: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8OutMarshaler))] - public string Description { get; } = null!; - - public ulong NameHash { get; } = 0; - public ModType Mod { get; } = ModType.Any; + internal unsafe Depend(IntPtr ptr) + { + var native = (NativeDepend*) ptr; + Name = new string(native->name); + Version = new string(native->version); + Description = new string(native->description); + NameHash = native->name_hash; + Mod = native->mod; + } + } } \ No newline at end of file diff --git a/Alpm/EnumerableWrapperEx.cs b/Alpm/EnumerableWrapper.cs similarity index 74% rename from Alpm/EnumerableWrapperEx.cs rename to Alpm/EnumerableWrapper.cs index 6b688d4..265b154 100644 --- a/Alpm/EnumerableWrapperEx.cs +++ b/Alpm/EnumerableWrapper.cs @@ -7,23 +7,34 @@ using System.Runtime.InteropServices; namespace Foodsoft.Alpm { - internal static class EnumerableWrapperEx + internal static class EnumerableWrapper { - internal static EnumerableWrapperEx Create(THandle handle, - Func getItems, - Func getElement) where THandle : SafeHandle + internal static EnumerableWrapper Create(THandle handle, + Func getItems) where THandle : SafeHandle { - return new EnumerableWrapperEx(handle, getItems, getElement); + return new EnumerableWrapper(handle, getItems, Marshal.PtrToStringUTF8!); + } + + internal static EnumerableWrapper CreateForDepend(THandle handle, + Func getItems) where THandle : SafeHandle + { + return new EnumerableWrapper(handle, getItems, (ptr) => new Depend(ptr)); + } + + internal static EnumerableWrapper CreateForBackup(THandle handle, + Func getItems) where THandle : SafeHandle + { + return new EnumerableWrapper(handle, getItems, (ptr) => new Backup(ptr)); } } - internal readonly struct EnumerableWrapperEx : ICollection where THandle : SafeHandle + internal readonly struct EnumerableWrapper : ICollection where THandle : SafeHandle { private readonly THandle _handle; private readonly Func _getItems; private readonly Func _getElement; - internal EnumerableWrapperEx(THandle handle, Func getItems, Func getElement) + internal EnumerableWrapper(THandle handle, Func getItems, Func getElement) { _handle = handle; _getItems = getItems; diff --git a/Alpm/EnumerableWrapper`3.cs b/Alpm/EnumerableWrapper`3.cs deleted file mode 100644 index 46b9a61..0000000 --- a/Alpm/EnumerableWrapper`3.cs +++ /dev/null @@ -1,120 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Dynamic; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -namespace Foodsoft.Alpm -{ - internal static class EnumerableWrapper - { - internal static EnumerableWrapper Create(TImpl impl) - where TImpl : struct, ICollectionImpl - { - return new EnumerableWrapper(impl); - } - } - - internal struct EnumerableWrapper : ICollection where TImpl : struct, - ICollectionImpl - { - private TImpl _impl; - - public static EnumerableWrapper Create(TImpl impl) - { - return new EnumerableWrapper(impl); - } - - public EnumerableWrapper(TImpl impl) - { - _impl = impl; - } - - public IEnumerator GetEnumerator() - { - var handle = _impl.Handle; - var release = false; - - RuntimeHelpers.PrepareConstrainedRegions(); - try - { - handle.DangerousAddRef(ref release); - if (!release) throw new ObjectDisposedException(_impl.GetType().FullName); - for (var list = _impl.GetItems(); list != IntPtr.Zero; list = Wrapper.ListNext(list)) - { - yield return _impl.PtrToItem(Wrapper.ListData(list)); - } - } - finally - { - if (release) - handle.DangerousRelease(); - } - } - - IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); - - public int Count - { - get - { - var impl = _impl; - return impl.Handle.UseHandle((_) => (int) alpm.alpm_list_count(impl.GetItems())); - } - } - - public bool Contains(TElement item) - { - var impl = _impl; - switch (item) - { - case string s: - return impl.Handle.UseHandle((_) => alpm.alpm_list_find_str(impl.GetItems(), s) != (IntPtr.Zero)); - default: - var comparer = EqualityComparer.Default; - return _impl.Handle.UseHandle((_) => - { - for (var list = impl.GetItems(); list != IntPtr.Zero; list = Wrapper.ListNext(list)) - { - if (comparer.Equals(item, impl.PtrToItem(Wrapper.ListData(list)))) - return true; - } - - return false; - }); - } - } - - public void CopyTo(TElement[] array, int arrayIndex) - { - var impl = _impl; - impl.Handle.UseHandle((_) => - { - for (var list = impl.GetItems(); list != IntPtr.Zero; list = Wrapper.ListNext(list)) - { - array[arrayIndex++] = impl.PtrToItem(Wrapper.ListData(list)); - } - - return arrayIndex; - }); - } - - public void Add(TElement item) - { - throw new NotSupportedException(); - } - - public void Clear() - { - throw new NotSupportedException(); - } - - public bool Remove(TElement item) - { - throw new NotSupportedException(); - } - - public bool IsReadOnly => true; - } -} \ No newline at end of file diff --git a/Alpm/File.cs b/Alpm/File.cs index 77d3bb8..ea3b02a 100644 --- a/Alpm/File.cs +++ b/Alpm/File.cs @@ -1,15 +1,32 @@ +using System; using System.Diagnostics.CodeAnalysis; using System.Runtime.InteropServices; +using Foodsoft.Alpm.Marshalling; namespace Foodsoft.Alpm { - [SuppressMessage("ReSharper", "UnassignedGetOnlyAutoProperty")] public readonly struct File { - [field: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8OutMarshaler))] public string Name { get; } public long Size { get; } public uint Mode { get; } + + [StructLayout(LayoutKind.Sequential)] + internal readonly unsafe struct NativeFile + { + internal readonly sbyte* Name; + internal readonly long size; + internal readonly uint mode; + } + + internal unsafe File(IntPtr ptr) + { + var native = (NativeFile*) ptr; + Name = new string(native->Name); + Size = native->size; + Mode = native->mode; + } } + } \ No newline at end of file diff --git a/Alpm/FileList.cs b/Alpm/FileList.cs index 07b8260..73676e7 100644 --- a/Alpm/FileList.cs +++ b/Alpm/FileList.cs @@ -1,14 +1,50 @@ +using System; using System.Collections; using System.Collections.Generic; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; namespace Foodsoft.Alpm { - public class FileList : IReadOnlyList + public struct FileList : IReadOnlyList { - + private readonly SafePackageHandle _handle; + private readonly IntPtr _ptr; + + internal FileList(SafePackageHandle handle, IntPtr ptr) + { + _handle = handle; + _ptr = ptr; + } + + public File? Contains(string path) + { + return _handle.UseHandle(_ptr, (ptr) => + { + var foundPtr = alpm.alpm_filelist_contains(ptr, path); + return foundPtr != IntPtr.Zero ? new File(foundPtr) : (File?) null; + }); + } public IEnumerator GetEnumerator() { - throw new System.NotImplementedException(); + var release = false; + + RuntimeHelpers.PrepareConstrainedRegions(); + try + { + _handle.DangerousAddRef(ref release); + if (!release) throw new ObjectDisposedException(_handle.GetType().FullName); + var arrayPtr = FileArray(_ptr, out var count); + for (var i = 0; i < count; ++i) + { + yield return new File(FilePtr(arrayPtr, i)); + } + } + finally + { + if (release) + _handle.DangerousRelease(); + } } IEnumerator IEnumerable.GetEnumerator() @@ -16,8 +52,46 @@ namespace Foodsoft.Alpm return GetEnumerator(); } - public int Count { get; } + public int Count => _handle.UseHandle(_ptr, FileCount); - public File this[int index] => throw new System.NotImplementedException(); + public File this[int index] + { + get + { + return _handle.UseHandle(_ptr, (ptr) => + { + var arrayPtr = FileArray(ptr, out var count); + if (index >= count || index < 0) + throw new ArgumentOutOfRangeException(nameof(index), index, $"Exceeds size {count}"); + return new File(FilePtr(arrayPtr, index)); + }); + } + } + + + [StructLayout(LayoutKind.Sequential)] + private readonly unsafe struct NativeFileList + { + internal readonly UIntPtr count; + internal readonly File.NativeFile* files; + } + + private static unsafe IntPtr FilePtr(IntPtr array, int i) + { + return (IntPtr) ((File.NativeFile*) array + i); + } + + private static unsafe IntPtr FileArray(IntPtr ptr, out int count) + { + var list = (NativeFileList*) ptr; + count = (int) list->count; + return (IntPtr) list->files; + } + + private static unsafe int FileCount(IntPtr ptr) + { + var list = (NativeFileList*) ptr; + return (int) list->count; + } } } \ No newline at end of file diff --git a/Alpm/Handle.cs b/Alpm/Handle.cs index 1840a6c..3f1687f 100644 --- a/Alpm/Handle.cs +++ b/Alpm/Handle.cs @@ -41,20 +41,10 @@ namespace Foodsoft.Alpm public void AddCacheDir(string dir) => API.WrapError(_handle, () => alpm.alpm_option_add_cachedir(_handle, dir)); public bool RemoveCacheDir(string dir) => API.WrapErrorBool(_handle, () => alpm.alpm_option_add_cachedir(_handle, dir)); - - private readonly struct CacheDirsImpl : ICollectionImpl - { - private readonly SafeAlpmHandle _handle; - internal CacheDirsImpl(SafeAlpmHandle handle) => _handle = handle; - public SafeHandle Handle => _handle; - public IntPtr GetItems() => alpm.alpm_option_get_cachedirs(_handle); - public string PtrToItem(IntPtr p) => Marshal.PtrToStringUTF8(p)!; - } - public ICollection CacheDirs { get => - EnumerableWrapperEx.Create(_handle, alpm.alpm_option_get_cachedirs, Marshal.PtrToStringUTF8!); + EnumerableWrapper.Create(_handle, alpm.alpm_option_get_cachedirs); set => Wrapper.SetStringCollection(value, _handle, (s) => alpm.alpm_option_add_cachedir(_handle, s)); } diff --git a/Alpm/IItemsReader`2.cs b/Alpm/IItemsReader`2.cs deleted file mode 100644 index cf4bbc7..0000000 --- a/Alpm/IItemsReader`2.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Runtime.InteropServices; - -namespace Foodsoft.Alpm -{ - internal interface ICollectionImpl - { - public SafeHandle Handle { get; } - public IntPtr GetItems(); - public TElement PtrToItem(IntPtr p); - } -} \ No newline at end of file diff --git a/Alpm/IPackageData.cs b/Alpm/IPackageData.cs index 0ef3b20..86370fd 100644 --- a/Alpm/IPackageData.cs +++ b/Alpm/IPackageData.cs @@ -53,8 +53,8 @@ namespace Foodsoft.Alpm public ICollection Conflicts { get; } public ICollection Provides { get; } public ICollection Replaces { get; } - public IReadOnlyList FileList { get; } - public IReadOnlyList Backup { get; } + public IReadOnlyList Files { get; } + public ICollection Backup { get; } public string Base64Signature { get; } public ValidationType Validation { get; } public bool HasScriptlet { get; } diff --git a/Alpm/IPackageList.cs b/Alpm/IPackageList.cs new file mode 100644 index 0000000..7cfc7bc --- /dev/null +++ b/Alpm/IPackageList.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace Foodsoft.Alpm +{ + public interface IPackageList : IEnumerable where T : Package + { + public T? FindSatisfier(string depString); + } +} \ No newline at end of file diff --git a/Alpm/UTF8InMarshaler.cs b/Alpm/Marshalling/UTF8In.cs similarity index 83% rename from Alpm/UTF8InMarshaler.cs rename to Alpm/Marshalling/UTF8In.cs index 44d426d..6b1e59d 100644 --- a/Alpm/UTF8InMarshaler.cs +++ b/Alpm/Marshalling/UTF8In.cs @@ -1,12 +1,11 @@ using System; using System.Runtime.InteropServices; -using System.Text; -namespace Foodsoft.Alpm +namespace Foodsoft.Alpm.Marshalling { - internal readonly struct UTF8InMarshaler : ICustomMarshaler + internal readonly struct UTF8In : ICustomMarshaler { - private static readonly UTF8InMarshaler _instance = default; + private static readonly UTF8In _instance = default; public void CleanUpManagedData(object managedObj) { } diff --git a/Alpm/UTF8OutMarshaler.cs b/Alpm/Marshalling/UTF8Return.cs similarity index 74% rename from Alpm/UTF8OutMarshaler.cs rename to Alpm/Marshalling/UTF8Return.cs index 1ecbf60..4ac5f50 100644 --- a/Alpm/UTF8OutMarshaler.cs +++ b/Alpm/Marshalling/UTF8Return.cs @@ -1,13 +1,11 @@ -namespace Foodsoft.Alpm +using System; +using System.Runtime.InteropServices; + +namespace Foodsoft.Alpm.Marshalling { - using System; - using System.Runtime.InteropServices; - using System.Text; - - - internal readonly struct UTF8OutMarshaler : ICustomMarshaler + internal readonly struct UTF8Return : ICustomMarshaler { - private static readonly UTF8OutMarshaler _instance = default; + private static readonly UTF8Return _instance = default; // ReSharper disable once UnusedMember.Local // ReSharper disable once UnusedParameter.Local diff --git a/Alpm/Package.cs b/Alpm/Package.cs index 45f153e..e98e065 100644 --- a/Alpm/Package.cs +++ b/Alpm/Package.cs @@ -30,24 +30,25 @@ namespace Foodsoft.Alpm public long Size => alpm.alpm_pkg_get_size(Handle); public long InstalledSize => alpm.alpm_pkg_get_isize(Handle); public InstallReason InstallReason => alpm.alpm_pkg_get_reason(Handle); - public ICollection Licenses => - EnumerableWrapperEx.Create(Handle, alpm.alpm_pkg_get_licenses, Marshal.PtrToStringUTF8!); - - public ICollection Groups { get; } - public ICollection Depends { get; } - public ICollection OptDepends { get; } - public ICollection CheckDepends { get; } - public ICollection MakeDepends { get; } - public ICollection Conflicts { get; } - public ICollection Provides { get; } - public ICollection Replaces { get; } - public IReadOnlyList FileList { get; } - public IReadOnlyList Backup { get; } - public string Base64Signature { get; } - public ValidationType Validation { get; } - public bool HasScriptlet { get; } - public long DownloadSize { get; } + EnumerableWrapper.Create(Handle, alpm.alpm_pkg_get_licenses); + public ICollection Groups => EnumerableWrapper.Create(Handle, alpm.alpm_pkg_get_groups); + public ICollection Depends => EnumerableWrapper.CreateForDepend(Handle, alpm.alpm_pkg_get_depends); + public ICollection OptDepends => + EnumerableWrapper.CreateForDepend(Handle, alpm.alpm_pkg_get_optdepends); + public ICollection CheckDepends => + EnumerableWrapper.CreateForDepend(Handle, alpm.alpm_pkg_get_checkdepends); + public ICollection MakeDepends => + EnumerableWrapper.CreateForDepend(Handle, alpm.alpm_pkg_get_makedepends); + public ICollection Conflicts => EnumerableWrapper.CreateForDepend(Handle, alpm.alpm_pkg_get_conflicts); + public ICollection Provides => EnumerableWrapper.CreateForDepend(Handle, alpm.alpm_pkg_get_provides); + public ICollection Replaces => EnumerableWrapper.CreateForDepend(Handle, alpm.alpm_pkg_get_replaces); + public IReadOnlyList Files => new FileList(Handle, alpm.alpm_pkg_get_files(Handle)); + public ICollection Backup => EnumerableWrapper.CreateForBackup(Handle, alpm.alpm_pkg_get_backup); + public string Base64Signature => alpm.alpm_pkg_get_base64_sig(Handle); + public ValidationType Validation => alpm.alpm_pkg_get_validation(Handle); + public bool HasScriptlet => alpm.alpm_pkg_has_scriptlet(Handle); + public long DownloadSize => alpm.alpm_pkg_download_size(Handle); public bool CheckMD5Sum() { diff --git a/Alpm/Wrapper.cs b/Alpm/Wrapper.cs index 1951014..6f78736 100644 --- a/Alpm/Wrapper.cs +++ b/Alpm/Wrapper.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.ComponentModel; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; diff --git a/Alpm/alpm.cs b/Alpm/alpm.cs index 0edd52b..7db1c5c 100644 --- a/Alpm/alpm.cs +++ b/Alpm/alpm.cs @@ -1,8 +1,6 @@ using System; -using System.Diagnostics.CodeAnalysis; using System.Runtime.InteropServices; -using System.Runtime.InteropServices.WindowsRuntime; -using Foodsoft.Alpm; +using Foodsoft.Alpm.Marshalling; namespace Foodsoft.Alpm { @@ -11,7 +9,7 @@ namespace Foodsoft.Alpm internal struct alpm_list_t { internal IntPtr data; - internal readonly IntPtr prev; + private readonly IntPtr prev; internal readonly IntPtr next; } @@ -22,34 +20,34 @@ namespace Foodsoft.Alpm public static extern int alpm_pkg_should_ignore(SafeAlpmHandle handle, SafePackageHandle pkg); [DllImport(nameof(alpm))] - [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8OutMarshaler))] + [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8Return))] public static extern string alpm_pkg_get_filename(SafePackageHandle pkg); [DllImport(nameof(alpm))] - [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8OutMarshaler))] + [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8Return))] public static extern string alpm_pkg_get_base(SafePackageHandle pkg); [DllImport(nameof(alpm))] - [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8OutMarshaler))] + [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8Return))] public static extern string alpm_pkg_get_name(SafePackageHandle pkg); - + [DllImport(nameof(alpm))] - [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8OutMarshaler))] + [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8Return))] public static extern string alpm_pkg_get_name(IntPtr pkg); - + [DllImport(nameof(alpm))] - [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8OutMarshaler))] + [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8Return))] public static extern string alpm_pkg_get_version(SafePackageHandle pkg); [DllImport(nameof(alpm))] public static extern PackageOrigin alpm_pkg_get_origin(SafePackageHandle pkg); [DllImport(nameof(alpm))] - [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8OutMarshaler))] + [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8Return))] public static extern string alpm_pkg_get_desc(SafePackageHandle pkg); [DllImport(nameof(alpm))] - [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8OutMarshaler))] + [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8Return))] public static extern string alpm_pkg_get_url(SafePackageHandle pkg); [DllImport(nameof(alpm))] @@ -59,19 +57,19 @@ namespace Foodsoft.Alpm public static extern long alpm_pkg_get_installdate(SafePackageHandle pkg); [DllImport(nameof(alpm))] - [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8OutMarshaler))] + [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8Return))] public static extern string alpm_pkg_get_packager(SafePackageHandle pkg); [DllImport(nameof(alpm))] - [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8OutMarshaler))] + [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8Return))] public static extern string alpm_pkg_get_md5sum(SafePackageHandle pkg); [DllImport(nameof(alpm))] - [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8OutMarshaler))] + [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8Return))] public static extern string alpm_pkg_get_sha256sum(SafePackageHandle pkg); [DllImport(nameof(alpm))] - [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8OutMarshaler))] + [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8Return))] public static extern string alpm_pkg_get_arch(SafePackageHandle pkg); [DllImport(nameof(alpm))] @@ -87,32 +85,52 @@ namespace Foodsoft.Alpm public static extern IntPtr alpm_pkg_get_licenses(SafePackageHandle pkg); [DllImport(nameof(alpm))] - [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8OutMarshaler))] - public static extern string alpm_pkg_get_groups(SafePackageHandle pkg); + public static extern IntPtr alpm_pkg_get_groups(SafePackageHandle pkg); [DllImport(nameof(alpm))] - [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8OutMarshaler))] - public static extern string alpm_pkg_get_depends(SafePackageHandle pkg); + public static extern IntPtr alpm_pkg_get_depends(SafePackageHandle pkg); [DllImport(nameof(alpm))] - [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8OutMarshaler))] - public static extern string alpm_pkg_get_optdepends(SafePackageHandle pkg); + public static extern IntPtr alpm_pkg_get_optdepends(SafePackageHandle pkg); [DllImport(nameof(alpm))] - [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8OutMarshaler))] - public static extern string alpm_pkg_get_checkdepends(SafePackageHandle pkg); + public static extern IntPtr alpm_pkg_get_checkdepends(SafePackageHandle pkg); [DllImport(nameof(alpm))] - [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8OutMarshaler))] - public static extern string alpm_pkg_get_makedepends(SafePackageHandle pkg); + public static extern IntPtr alpm_pkg_get_makedepends(SafePackageHandle pkg); [DllImport(nameof(alpm))] - [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8OutMarshaler))] - public static extern string alpm_pkg_get_conflicts(SafePackageHandle pkg); + public static extern IntPtr alpm_pkg_get_conflicts(SafePackageHandle pkg); [DllImport(nameof(alpm))] - [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8OutMarshaler))] - public static extern string alpm_pkg_get_provides(SafePackageHandle pkg); + public static extern IntPtr alpm_pkg_get_provides(SafePackageHandle pkg); + + [DllImport(nameof(alpm))] + public static extern IntPtr alpm_pkg_get_replaces(SafePackageHandle pkg); + + [DllImport(nameof(alpm))] + public static extern IntPtr alpm_pkg_get_files(SafePackageHandle pkg); + + [DllImport(nameof(alpm))] + public static extern IntPtr alpm_pkg_get_backup(SafePackageHandle pkg); + + [DllImport(nameof(alpm))] + public static extern IntPtr alpm_filelist_contains(IntPtr fileList, + [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8In))] + string path); + + [DllImport(nameof(alpm))] + [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8Return))] + public static extern string alpm_pkg_get_base64_sig(SafePackageHandle pkg); + + [DllImport(nameof(alpm))] + public static extern ValidationType alpm_pkg_get_validation(SafePackageHandle pkg); + + [DllImport(nameof(alpm))] + public static extern bool alpm_pkg_has_scriptlet(SafePackageHandle pkg); + + [DllImport(nameof(alpm))] + public static extern long alpm_pkg_download_size(SafePackageHandle pkg); [DllImport(nameof(alpm))] public static extern int alpm_pkg_set_reason(SafePackageHandle pkg, InstallReason reason); @@ -122,25 +140,22 @@ namespace Foodsoft.Alpm [DllImport(nameof(alpm))] public static extern IntPtr alpm_option_get_cachedirs(SafeAlpmHandle handle); - - [DllImport(nameof(alpm))] - public static extern int alpm_option_set_cachedirs(SafeAlpmHandle handle, IntPtr cachedirs); - + [DllImport(nameof(alpm))] public static extern int alpm_option_add_cachedir(SafeAlpmHandle handle, - [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8InMarshaler))] + [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8In))] string cachedir); [DllImport(nameof(alpm))] public static extern int alpm_option_remove_cachedir(SafeAlpmHandle handle, - [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8InMarshaler))] + [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8In))] string cachedir); [DllImport(nameof(alpm))] public static extern ErrNo alpm_errno(SafeAlpmHandle handle); [DllImport(nameof(alpm))] - [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8OutMarshaler))] + [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8Return))] public static extern string alpm_strerror(ErrNo err); [DllImport(nameof(alpm))] @@ -151,7 +166,7 @@ namespace Foodsoft.Alpm [DllImport(nameof(alpm))] public static extern IntPtr alpm_register_syncdb(SafeAlpmHandle handle, - [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8InMarshaler))] + [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8In))] string treename, SigLevel sigLevel); [DllImport(nameof(alpm))] @@ -162,7 +177,7 @@ namespace Foodsoft.Alpm [DllImport(nameof(alpm))] public static extern IntPtr alpm_list_append_strdup(ref IntPtr list, - [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8InMarshaler))] + [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8In))] string str); [DllImport(nameof(alpm))] @@ -182,14 +197,14 @@ namespace Foodsoft.Alpm [DllImport(nameof(alpm))] public static extern IntPtr alpm_list_find_str(IntPtr list, - [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8InMarshaler))] + [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8In))] string needle); [DllImport(nameof(alpm))] public static extern int alpm_unlock(Handle handle); [DllImport(nameof(alpm))] - [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8OutMarshaler))] + [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8Return))] public static extern string alpm_version(); [DllImport(nameof(alpm))] @@ -197,8 +212,8 @@ namespace Foodsoft.Alpm [DllImport(nameof(alpm))] public static extern SafeAlpmHandle alpm_initialize( - [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8InMarshaler))] - string root, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8InMarshaler))] + [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8In))] + string root, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8In))] string dbpath, out ErrNo err); [DllImport(nameof(alpm))] @@ -206,14 +221,14 @@ namespace Foodsoft.Alpm [DllImport(nameof(alpm))] public static extern int alpm_db_remove_server(SafeDatabaseHandle db, - [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8InMarshaler))] + [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8In))] string url); [DllImport(nameof(alpm))] public static extern int alpm_db_unregister(IntPtr db); [DllImport(nameof(alpm))] - [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8OutMarshaler))] + [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8Return))] public static extern string alpm_db_get_name(SafeDatabaseHandle db); [DllImport(nameof(alpm))] @@ -233,12 +248,12 @@ namespace Foodsoft.Alpm [DllImport(nameof(alpm))] public static extern int alpm_db_add_server(SafeDatabaseHandle db, - [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8InMarshaler))] + [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8In))] string url); [DllImport(nameof(alpm))] public static extern IntPtr alpm_pkg_get_pkg(SafeDatabaseHandle db, - [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8InMarshaler))] + [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8In))] string name); [DllImport(nameof(alpm))] @@ -246,5 +261,8 @@ namespace Foodsoft.Alpm [DllImport(nameof(alpm))] public static extern int alpm_pkg_vercmp(string v1, string v2); + + [DllImport(nameof(alpm))] + public static extern IntPtr alpm_find_satisfier(IntPtr pkgList, string depstring); } } \ No newline at end of file diff --git a/DotNetAlpm.sln.DotSettings b/DotNetAlpm.sln.DotSettings index eef92bb..2431c01 100644 --- a/DotNetAlpm.sln.DotSettings +++ b/DotNetAlpm.sln.DotSettings @@ -1,7 +1,10 @@  True + True True + True True + True True True True diff --git a/Samples/Program.cs b/Samples/Program.cs index 08304cb..49fe18b 100644 --- a/Samples/Program.cs +++ b/Samples/Program.cs @@ -12,15 +12,37 @@ namespace Samples [Example("installed")] internal class Installed : IExample { + private static string ModToStr(Depend.ModType modType) + { + return modType switch + { + Depend.ModType.Any => "", + Depend.ModType.Equal => "==", + Depend.ModType.GreaterThanOrEqual => ">=", + Depend.ModType.LessThanOrEqual => "<=", + Depend.ModType.GreaterThan => ">", + Depend.ModType.LessThan => "<", + _ => throw new ArgumentOutOfRangeException(nameof(modType), modType, null) + }; + } + public int Run(string[] args) { using var h = new Handle("/", "/var/lib/pacman"); using var db = h.LocalDB; - foreach (var pkg in db.PackageCache) + foreach (var pkg in db.CachePackageCache) using (pkg) { - Console.WriteLine("{0} {1}", pkg.Name, pkg.Version); + Console.WriteLine($"Size: {pkg.DownloadSize}"); + foreach (var d in pkg.OptDepends) + { + if (d.Description.Length == 0) continue; + Console.WriteLine("dep({0}): {1} {2} {3} {4}", pkg.Name, d.Name, ModToStr(d.Mod), d.Version, + d.Description); + foreach (var f in pkg.Backup) + Console.WriteLine($"{f.Name} {f.Hash}"); + } } return 0; @@ -34,10 +56,10 @@ namespace Samples { using var h = new Handle("/", "/var/lib/pacman"); using var db = h.RegisterSyncDB("core"); - db.Servers = new[]{"http://www.google.com"}; + db.Servers = new[] {"http://www.google.com"}; db.Update(true); - foreach (var pkg in db.PackageCache) + foreach (var pkg in db.CachePackageCache) using (pkg) { Console.WriteLine("{0} {1} {2}", pkg.Name, pkg.Version, pkg.Description);