using System; using System.Collections.Generic; namespace Foodsoft.Alpm { public sealed class Handle : IDisposable { private readonly SafeAlpmHandle _handle; public Handle(string root, string dbpath) { _handle = alpm.alpm_initialize(root, dbpath, out var err); if (_handle.IsInvalid) throw new AlpmException(err); } public Database LocalDB => ToDatabase(alpm.alpm_get_localdb(_handle)); public ICollection CacheDirs { get => EnumerableWrapper.Create(_handle, alpm.alpm_option_get_cachedirs); set => Detail.SetStringCollection(value, _handle, s => alpm.alpm_option_add_cachedir(_handle, s)); } public void Dispose() { _handle.Dispose(); } private Database ToDatabase(IntPtr ptr) { // It's ok that the database pointer is kept outside atomic section, because the resource is actually // managed by the alpm handle. if (ptr == IntPtr.Zero) throw new AlpmException(_handle); return new Database(new SafeDatabaseHandle(ptr, _handle)); } public Database RegisterSyncDB(string treename, SigLevel sigLevel = 0) { return ToDatabase(alpm.alpm_register_syncdb(_handle, treename, sigLevel)); } public void AddCacheDir(string dir) { Detail.WrapError(_handle, () => alpm.alpm_option_add_cachedir(_handle, dir)); } public bool RemoveCacheDir(string dir) { return Detail.WrapErrorBool(_handle, () => alpm.alpm_option_add_cachedir(_handle, dir)); } public bool ShouldIgnorePackage(Package pkg) { return alpm.alpm_pkg_should_ignore(_handle, pkg.Handle) == 0; } } }