static void as_app_builder_parse_data_qt (AsAppBuilderContext *ctx, const gchar *locale, const guint8 *data, guint32 len) { AsAppBuilderEntry *entry; guint32 m = 0; guint nstrings = 0; /* read data */ while (m < len) { guint32 tag_len; AsAppBuilderQmTag tag = _read_uint8(data, &m); switch (tag) { case AS_APP_TRANSLATION_QM_TAG_END: break; case AS_APP_TRANSLATION_QM_TAG_OBSOLETE1: m += 4; break; case AS_APP_TRANSLATION_QM_TAG_TRANSLATION: case AS_APP_TRANSLATION_QM_TAG_SOURCE_TEXT: case AS_APP_TRANSLATION_QM_TAG_CONTEXT: case AS_APP_TRANSLATION_QM_TAG_COMMENT: tag_len = _read_uint32 (data, &m); if (tag_len < 0xffffffff) m += tag_len; if (tag == AS_APP_TRANSLATION_QM_TAG_TRANSLATION) nstrings++; break; default: m = G_MAXUINT32; break; } } /* add new entry */ entry = as_app_builder_entry_new (); entry->locale = g_strdup (locale); entry->nstrings = nstrings; if (entry->nstrings > ctx->max_nstrings) ctx->max_nstrings = entry->nstrings; ctx->data = g_list_prepend (ctx->data, entry); }
static gboolean as_app_builder_parse_file_gettext (AsAppBuilderContext *ctx, const gchar *locale, const gchar *filename, GError **error) { AsAppBuilderEntry *entry; AsAppBuilderGettextHeader h; g_autofree gchar *data = NULL; gboolean swapped; /* read data */ if (!g_file_get_contents (filename, &data, NULL, error)) return FALSE; /* we only strictly need the header */ memcpy (&h, data, sizeof (AsAppBuilderGettextHeader)); if (h.magic == 0x950412de) swapped = FALSE; else if (h.magic == 0xde120495) swapped = TRUE; else { g_set_error_literal (error, AS_APP_ERROR, AS_APP_ERROR_FAILED, "file is invalid"); return FALSE; } entry = as_app_builder_entry_new (); entry->locale = g_strdup (locale); if (swapped) entry->nstrings = GUINT32_SWAP_LE_BE (h.nstrings); else entry->nstrings = h.nstrings; if (entry->nstrings > ctx->max_nstrings) ctx->max_nstrings = entry->nstrings; ctx->data = g_list_prepend (ctx->data, entry); return TRUE; }
static gboolean as_app_builder_parse_file_pak (AsAppBuilderContext *ctx, const gchar *locale, const gchar *filename, GError **error) { AsAppBuilderEntry *entry; gsize len = 0; guint32 nr_resources; guint32 version_number; guint8 encoding; g_autofree gchar *data = NULL; if (!g_file_get_contents (filename, &data, &len, error)) return FALSE; if (len < 9) { g_set_error (error, AS_APP_ERROR, AS_APP_ERROR_FAILED, "file invalid, %" G_GSIZE_FORMAT "b in size", len); return FALSE; } /* get 4 byte version number */ memcpy (&version_number, data + 0, 4); if (version_number != 4) { g_set_error (error, AS_APP_ERROR, AS_APP_ERROR_FAILED, "version number invalid, " "got %" G_GUINT32_FORMAT " expected 4", version_number); return FALSE; } /* get 4 byte number of resources */ memcpy (&nr_resources, data + 4, 4); if (nr_resources == 0) { g_set_error_literal (error, AS_APP_ERROR, AS_APP_ERROR_FAILED, "no resources found"); return FALSE; } /* get single byte of encoding */ encoding = (guint8) data[8]; if (encoding != 0 && encoding != 1) { g_set_error (error, AS_APP_ERROR, AS_APP_ERROR_FAILED, "PAK encoding invalid, got %u expected 0 or 1", encoding); return FALSE; } /* create entry without reading resources */ entry = as_app_builder_entry_new (); entry->locale = g_strdup (locale); entry->nstrings = nr_resources; if (entry->nstrings > ctx->max_nstrings) ctx->max_nstrings = entry->nstrings; ctx->data = g_list_prepend (ctx->data, entry); return TRUE; }