summaryrefslogtreecommitdiffstats
path: root/tools/wixl/util.vala
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2013-01-09 18:23:54 +0100
committerPaolo Bonzini <pbonzini@redhat.com>2013-01-09 18:23:54 +0100
commit0523a90f210bd443c64b92119de0ea30ae8bcaa0 (patch)
tree63fbe40850f951aa83c729f94e57df4f728f491a /tools/wixl/util.vala
parenta53f42abfbf6d3c0eb05c7cb7210dd537e55194a (diff)
downloadmsitools-0523a90f210bd443c64b92119de0ea30ae8bcaa0.tar.gz
msitools-0523a90f210bd443c64b92119de0ea30ae8bcaa0.tar.xz
msitools-0523a90f210bd443c64b92119de0ea30ae8bcaa0.zip
move wixl source to tools/wixl/
Fixes in-tree build.
Diffstat (limited to 'tools/wixl/util.vala')
-rw-r--r--tools/wixl/util.vala139
1 files changed, 139 insertions, 0 deletions
diff --git a/tools/wixl/util.vala b/tools/wixl/util.vala
new file mode 100644
index 0000000..11f1588
--- /dev/null
+++ b/tools/wixl/util.vala
@@ -0,0 +1,139 @@
+namespace Wixl {
+
+ public errordomain Error {
+ FAILED,
+ FIXME,
+ }
+
+ namespace UUID {
+ [CCode (cname = "uuid_generate", cheader_filename = "uuid/uuid.h")]
+ internal extern static void generate ([CCode (array_length = false)] uchar[] uuid);
+ [CCode (cname = "uuid_unparse", cheader_filename = "uuid/uuid.h")]
+ internal extern static void unparse ([CCode (array_length = false)] uchar[] uuid,
+ [CCode (array_length = false)] uchar[] output);
+ }
+
+ string uuid_generate () {
+ var udn = new uchar[50];
+ var id = new uchar[16];
+
+ UUID.generate (id);
+ UUID.unparse (id, udn);
+
+ return (string) udn;
+ }
+
+ int enum_from_string (Type t, string str) throws GLib.Error {
+ var k = (EnumClass)t.class_ref ();
+ var v = k.get_value_by_nick (str);
+
+ if (v == null)
+ throw new Wixl.Error.FAILED ("Can't convert string to enum");
+ return v.value;
+ }
+
+ string add_braces (string str) {
+ if (str[0] == '{')
+ return str;
+
+ return "{" + str + "}";
+ }
+
+ string get_uuid (owned string uuid) throws GLib.Error {
+ if (uuid == "*")
+ uuid = uuid_generate ();
+ uuid = add_braces (uuid);
+ uuid = uuid.up ();
+ // FIXME: validate
+ return uuid;
+ }
+
+ long now () {
+ var tv = TimeVal ();
+ tv.get_current_time ();
+ return tv.tv_sec;
+ }
+
+ uint64 time_to_filetime (long t) {
+ return (t + 134774ULL * 86400ULL) * 10000000ULL;
+ }
+
+ string get_attribute_content (Xml.Attr *attr) {
+ if (attr->children == null)
+ return "";
+
+ return attr->children->content;
+ }
+
+ public string indent (string space, string text) {
+ var indented = "";
+
+ foreach (var l in text.split ("\n")) {
+ if (indented.length != 0)
+ indented += "\n";
+
+ if (l.length != 0)
+ indented += space + l;
+ }
+
+ return indented;
+ }
+
+ public string generate_id (string prefix, uint n, ...) {
+ var l = va_list ();
+ var args = new string[n];
+
+ for (var i = 0; n > 0; n--) {
+ string? val = l.arg ();
+ if (val == null)
+ continue;
+ args[i] = val; // FIXME: misc vala bug when +=
+ i += 1;
+ }
+ var data = string.joinv ("|", args);
+ var hash = Checksum.compute_for_string (ChecksumType.MD5, data);
+ var str = prefix + hash[0:32].up ();
+
+ return str;
+ }
+
+ bool parse_yesno (string? str, bool default = false) {
+ if (str == null)
+ return default;
+
+ return (str[0] == 'Y' || str[0] == 'y');
+ }
+
+ string unquote (string str) {
+ if ((str[0] == '\'' && str[str.length-1] == '\'') ||
+ (str[0] == '"' && str[str.length-1] == '"'))
+ return str[1:-1];
+
+ return str;
+ }
+
+ string remove_prefix (string prefix, string str) {
+ if (str.has_prefix (prefix))
+ return str[prefix.length:str.length];
+
+ return str;
+ }
+
+ int find_closing_paren (string str) {
+ return_val_if_fail (str[0] == '(', -1);
+
+ var open_count = 1;
+ var close_count = 0;
+ for (var pos = 1; pos < str.length; pos++) {
+ if (str[pos] == '(')
+ open_count++;
+ else if (str[pos] == ')') {
+ close_count++;
+ if (open_count == close_count)
+ return pos;
+ }
+ }
+
+ return -1;
+ }
+} // Wixl