static void process_messages(po_message_iterator_t it) { po_message_t m = po_next_message(it); while(m) { process_message(m); m = po_next_message(it); } }
static gboolean po_file_is_empty (po_file_t file) { const gchar *const *domains = po_file_domains (file); for (; *domains != NULL; domains++) { po_message_iterator_t iter = po_message_iterator (file, *domains); if (po_next_message (iter) != NULL) { po_message_iterator_free (iter); return FALSE; } po_message_iterator_free (iter); } return TRUE; }
/** * gtr_po_parse: * @po: a #GtrPo * @location: the file to open * @error: a variable to store the errors * * Parses all things related to the #GtrPo and initilizes all neccessary * variables. **/ gboolean gtr_po_parse (GtrPo * po, GFile * location, GError ** error) { GtrMsg *msg; po_message_t message; po_message_iterator_t iter; const gchar *const *domains; gint i = 0; gint pos = 1; GtrPoPrivate *priv = gtr_po_get_instance_private (po); g_return_val_if_fail (GTR_IS_PO (po), FALSE); g_return_val_if_fail (location != NULL, FALSE); if (message_error != NULL) { g_free (message_error); message_error = NULL; } /* * Get filename path. */ priv->location = g_file_dup (location); if (!_gtr_po_load_ensure_utf8 (po, error)) { g_object_unref (po); return FALSE; } /* * No need to return; this can be corrected by the user */ if (message_error != NULL) { g_set_error (error, GTR_PO_ERROR, GTR_PO_ERROR_RECOVERY, "%s", message_error); } /* * Determine the message domains to track */ if (!(domains = po_file_domains (priv->gettext_po_file))) { if (*error != NULL) g_clear_error (error); g_set_error (error, GTR_PO_ERROR, GTR_PO_ERROR_GETTEXT, _("Gettext returned a null message domain list.")); g_object_unref (po); return FALSE; } while (domains[i]) { priv->domains = g_list_append (priv->domains, g_strdup (domains[i])); i++; } /* * Determine whether first message is the header or not, and * if so, process it seperately. Otherwise, treat as a normal * message. */ priv->messages = NULL; iter = priv->iter; /* Post-process these into a linked list of GtrMsgs. */ while ((message = po_next_message (iter))) { /*FIXME: We have to change this: * we have to add a gtr_msg_is_obsolete fund msg.c * and detect if we want obsoletes messages in show message */ if (!po_message_is_obsolete (message)) { /* Unpack into a GtrMsg */ msg = _gtr_msg_new (iter, message); /* Set position in PO file */ gtr_msg_set_po_position (msg, pos++); /* Build up messages */ priv->messages = g_list_prepend (priv->messages, msg); } } if (priv->messages == NULL) { if (*error != NULL) g_clear_error (error); g_set_error (error, GTR_PO_ERROR, GTR_PO_ERROR_OTHER, _("No messages obtained from parser.")); g_object_unref (po); return FALSE; } priv->messages = g_list_reverse (priv->messages); /* * Set the current message to the first message. */ priv->current = g_list_first (priv->messages); gtr_po_update_translated_count (po); /* Initialize Tab state */ priv->state = GTR_PO_STATE_SAVED; return TRUE; }
static gboolean _gtr_po_load (GtrPo * po, GFile * location, GError ** error) { struct po_xerror_handler handler; po_message_iterator_t iter; po_message_t message; const gchar *msgid; gchar *filename; GtrPoPrivate *priv = gtr_po_get_instance_private (po); /* * Initialize the handler error. */ handler.xerror = &on_gettext_po_xerror; handler.xerror2 = &on_gettext_po_xerror2; if (message_error != NULL) { g_free (message_error); message_error = NULL; } filename = g_file_get_path (location); if (priv->gettext_po_file) po_file_free (priv->gettext_po_file); if (priv->header) { g_object_unref (priv->header); priv->header = NULL; } if (priv->iter) { po_message_iterator_free (priv->iter); priv->iter = NULL; } priv->gettext_po_file = po_file_read (filename, &handler); g_free (filename); if (po_file_is_empty (priv->gettext_po_file)) { g_set_error (error, GTR_PO_ERROR, GTR_PO_ERROR_FILE_EMPTY, _("The file is empty")); return FALSE; } if (!priv->gettext_po_file) { g_set_error (error, GTR_PO_ERROR, GTR_PO_ERROR_FILENAME, _("Failed opening file “%s”: %s"), filename, g_strerror (errno)); g_free (filename); return FALSE; } iter = po_message_iterator (priv->gettext_po_file, NULL); message = po_next_message (iter); msgid = po_message_msgid (message); if (*msgid == '\0') priv->header = gtr_header_new (iter, message); else { po_message_iterator_free (iter); iter = po_message_iterator (priv->gettext_po_file, NULL); message = po_message_create (); po_message_set_msgid (message, ""); po_message_set_msgstr (message, ""); po_message_insert (iter, message); priv->header = gtr_header_new (iter, message); } priv->iter = iter; return TRUE; }