diff options
author | Zeeshan Ali (Khattak) <zeeshanak@gnome.org> | 2013-01-16 17:03:03 +0200 |
---|---|---|
committer | Zeeshan Ali (Khattak) <zeeshanak@gnome.org> | 2013-01-24 15:59:05 +0200 |
commit | fb018a674e7a30a891a65a6c92234d10d1723bc2 (patch) | |
tree | 9e650b66fc14c503df57a52efe1a0573fa2746ca | |
parent | b9d713530c00a9c3edd0361f1954e8acea555764 (diff) |
Add utility function to compare CPU architectures
https://bugzilla.gnome.org/show_bug.cgi?id=692246
-rw-r--r-- | src/installer-media.vala | 11 | ||||
-rw-r--r-- | src/util-app.vala | 69 |
2 files changed, 75 insertions, 5 deletions
diff --git a/src/installer-media.vala b/src/installer-media.vala index 7351505..278d4da 100644 --- a/src/installer-media.vala +++ b/src/installer-media.vala @@ -94,11 +94,12 @@ private class Boxes.InstallerMedia : GLib.Object { } public bool is_architecture_compatible (string architecture) { - return os_media == null || // Unknown media - os_media.architecture == architecture || - (os_media.architecture == "i386" && architecture == "i686") || - (os_media.architecture == "i386" && architecture == "x86_64") || - (os_media.architecture == "i686" && architecture == "x86_64"); + if (os_media == null) // Unknown media + return true; + + var compatibility = compare_cpu_architectures (architecture, os_media.architecture); + + return compatibility != CPUArchCompatibity.INCOMPATIBLE; } protected void add_cd_config (Domain domain, diff --git a/src/util-app.vala b/src/util-app.vala index 674a137..d98f259 100644 --- a/src/util-app.vala +++ b/src/util-app.vala @@ -394,6 +394,75 @@ namespace Boxes { } catch (IOError.EXISTS error) {} } + // Warning: architecture compability is not computative. e.g "i386" is compatible with "i686" but "i686" is + // incompatible with "i386". + public enum CPUArchCompatibity { + INCOMPATIBLE = -1, // First architecture is incompatible to second one + IDENTICAL = 0, // First architecture is identical to second one + COMPATIBLE = 1, // First architecture is compatible with second one + COMPATIBLE_DIFF_WORDSIZE = 2, // First architecture is more modern than but compatible + // with second one but has different word-size + } + + public CPUArchCompatibity compare_cpu_architectures (string arch1, string arch2) { + switch (arch2) { + case "i386": + switch (arch1) { + case "i386": + return CPUArchCompatibity.IDENTICAL; + case "i486": + case "i586": + case "i686": + return CPUArchCompatibity.COMPATIBLE; + case "x86_64": + return CPUArchCompatibity.COMPATIBLE_DIFF_WORDSIZE; + default: + return CPUArchCompatibity.INCOMPATIBLE; + } + case "i486": + switch (arch1) { + case "i486": + return CPUArchCompatibity.IDENTICAL; + case "i586": + case "i686": + return CPUArchCompatibity.COMPATIBLE; + case "x86_64": + return CPUArchCompatibity.COMPATIBLE_DIFF_WORDSIZE; + default: + return CPUArchCompatibity.INCOMPATIBLE; + } + case "i586": + switch (arch1) { + case "i586": + return CPUArchCompatibity.IDENTICAL; + case "i686": + return CPUArchCompatibity.COMPATIBLE; + case "x86_64": + return CPUArchCompatibity.COMPATIBLE_DIFF_WORDSIZE; + default: + return CPUArchCompatibity.INCOMPATIBLE; + } + case "i686": + switch (arch1) { + case "i686": + return CPUArchCompatibity.IDENTICAL; + case "x86_64": + return CPUArchCompatibity.COMPATIBLE_DIFF_WORDSIZE; + default: + return CPUArchCompatibity.INCOMPATIBLE; + } + case "x86_64": + switch (arch1) { + case "x86_64": + return CPUArchCompatibity.IDENTICAL; + default: + return CPUArchCompatibity.INCOMPATIBLE; + } + default: + return CPUArchCompatibity.INCOMPATIBLE; + } + } + namespace UUID { [CCode (cname = "uuid_generate", cheader_filename = "uuid/uuid.h")] internal extern static void generate ([CCode (array_length = false)] uchar[] uuid); |