using Invercargill; using Invercargill.Convert; namespace Usm { public enum ResourceType { RESOURCE, BINARY, SUPER_BINARY, LIBRARY, LIBRARY_EXECUTABLE, LIBRARY_RESOURCE, INFO_PAGE, MANUAL_PAGE, LOCALE, APPLICATION, INCLUDE, PKG_CONFIG, VALA_API; public string to_string() { switch (this) { case ResourceType.RESOURCE: return "res"; case ResourceType.BINARY: return "bin"; case ResourceType.SUPER_BINARY: return "sbin"; case ResourceType.LIBRARY: return "lib"; case ResourceType.LIBRARY_EXECUTABLE: return "libexec"; case ResourceType.LIBRARY_RESOURCE: return "libres"; case ResourceType.INFO_PAGE: return "info"; case ResourceType.MANUAL_PAGE: return "man"; case ResourceType.LOCALE: return "locale"; case ResourceType.APPLICATION: return "app"; case ResourceType.INCLUDE: return "inc"; case ResourceType.PKG_CONFIG: return "pc"; case ResourceType.VALA_API: return "vapi"; default: assert_not_reached(); } } public static ResourceType from_string(string str) throws ManifestError { switch (str) { case "res": return ResourceType.RESOURCE; case "bin": return ResourceType.BINARY; case "sbin": return ResourceType.SUPER_BINARY; case "lib": return ResourceType.LIBRARY; case "libexec": return ResourceType.LIBRARY_EXECUTABLE; case "libres": return ResourceType.LIBRARY_RESOURCE; case "info": return ResourceType.INFO_PAGE; case "man": return ResourceType.MANUAL_PAGE; case "locale": return ResourceType.LOCALE; case "app": return ResourceType.APPLICATION; case "inc": return ResourceType.INCLUDE; case "pc": return ResourceType.PKG_CONFIG; case "vapi": return ResourceType.VALA_API; default: throw new ManifestError.INVALID_RESOURCE_TYPE(@"Unknown resource type \"$str\"."); } } } public class ResourceRef : Hashable, Equatable { public string resource { get; set; } public ResourceType resource_type { get; set; } public ResourceRef(string str) throws ManifestError { var parts = str.split(":", 2); resource_type = ResourceType.from_string(parts[0]); resource = parts[1]; } public uint hash_code() { return to_string().hash(); } public bool equals(ResourceRef other) { return this == other || (this.resource == other.resource && this.resource_type == other.resource_type); } public string to_string() { return @"$resource_type:$resource"; } public bool is_satisfied() { switch (resource_type) { case ResourceType.RESOURCE: return check_res(); case ResourceType.BINARY: return check_bin(); case ResourceType.SUPER_BINARY: return check_sbin(); case ResourceType.LIBRARY: return check_lib(); case ResourceType.LIBRARY_EXECUTABLE: return check_libexec(); case ResourceType.LIBRARY_RESOURCE: return check_libres(); case ResourceType.INFO_PAGE: return check_info(); case ResourceType.MANUAL_PAGE: return check_man(); case ResourceType.LOCALE: return check_locale(); case ResourceType.APPLICATION: return check_app(); case ResourceType.INCLUDE: return check_inc(); case ResourceType.PKG_CONFIG: return check_pc(); case ResourceType.VALA_API: return check_vapi(); default: assert_not_reached(); } } private bool check_lib() { try { var proc = new Subprocess.newv(new string[] { "ldconfig", "-p" }, SubprocessFlags.STDOUT_PIPE); var pipe = new DataInputStream(proc.get_stdout_pipe()); string line = null; while((line = pipe.read_line()) != null) { if(line.has_prefix("\t")) { var name = line.substring(1).split(" ", 2)[0]; if(resource == name) { return true; } } } proc.wait_check(); } catch(Error e) { warning(@"Error checking for resource $this: $(e.message)"); } return false; } private bool check_bin() { var paths = Environment.get_variable("PATH").split(":"); foreach (var path in paths) { var file = File.new_build_filename(path, resource); if(file.query_exists()) { return true; } } return false; } private bool check_res() { var file = File.new_build_filename("/", resource); return file.query_exists(); } private bool check_libres() { var paths = new string[] { "/usr/lib", "/usr/lib64", "/lib", "/lib64" }; foreach (var path in paths) { var file = File.new_build_filename(path, resource); if(file.query_exists()) { return true; } } return false; } private bool check_app() { var file = File.new_build_filename("/usr/share/applications", resource); return file.query_exists(); } private bool check_inc() { var file = File.new_build_filename("/usr/include", resource); return file.query_exists(); } private bool check_sbin() { var paths = new string[] { "/usr/sbin", "/sbin" }; foreach (var path in paths) { var file = File.new_build_filename(path, resource); if(file.query_exists()) { return true; } } return false; } private bool check_libexec() { var file = File.new_build_filename("/usr/libexec", resource); return file.query_exists(); } private bool check_info() { var file = File.new_build_filename("/usr/share/info", resource); return file.query_exists(); } private bool check_man() { var file = File.new_build_filename("/usr/share/man", resource); return file.query_exists(); } private bool check_locale() { var file = File.new_build_filename("/usr/share/locale", resource); return file.query_exists(); } private bool check_vapi() { var paths = new string[] { "/usr/share/vala/vapi", "/usr/share/vala-0.56/vapi" }; foreach (var path in paths) { var file = File.new_build_filename(path, resource); if(file.query_exists()) { return true; } } return false; } private bool check_pc() { var paths = ate(new string[] { "/usr/lib/pkgconfig", "/usr/lib64/pkgconfig", "/usr/share/pkgconfig" }); var env = Environment.get_variable("PKG_CONFIG_PATH"); if(env != null) { paths = paths.concat(ate(env.split(":"))); } foreach (var path in paths) { var file = File.new_build_filename(path, resource); if(file.query_exists()) { return true; } } return false; } } }