summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/dlg-package-installer.c51
-rw-r--r--src/fr-command-rar.c168
-rw-r--r--src/fr-command-rar.h3
-rw-r--r--src/fr-command-zip.c8
4 files changed, 168 insertions, 62 deletions
diff --git a/src/dlg-package-installer.c b/src/dlg-package-installer.c
index 451a2ca..466aa5f 100644
--- a/src/dlg-package-installer.c
+++ b/src/dlg-package-installer.c
@@ -48,8 +48,9 @@ installer_data_free (InstallerData *idata)
static void
-package_installer_terminated (InstallerData *idata,
- const char *error)
+package_installer_terminated (InstallerData *idata,
+ FrProcErrorType error_type,
+ const char *error_message)
{
GdkWindow *window;
@@ -57,11 +58,11 @@ package_installer_terminated (InstallerData *idata,
if (window != NULL)
gdk_window_set_cursor (window, NULL);
- if (error != NULL) {
+ if (error_type != FR_PROC_ERROR_NONE) {
fr_archive_action_completed (idata->archive,
FR_ACTION_CREATING_NEW_ARCHIVE,
- FR_PROC_ERROR_GENERIC,
- error);
+ error_type,
+ error_message);
}
else {
update_registered_commands_capabilities ();
@@ -83,24 +84,36 @@ packagekit_install_package_names_ready_cb (GObject *source_object,
GAsyncResult *res,
gpointer user_data)
{
- InstallerData *idata = user_data;
- GDBusProxy *proxy;
- GVariant *values;
- GError *error = NULL;
- char *message = NULL;
+ InstallerData *idata = user_data;
+ GDBusProxy *proxy;
+ GVariant *values;
+ GError *error = NULL;
+ FrProcErrorType error_type = FR_PROC_ERROR_NONE;
+ char *error_message = NULL;
proxy = G_DBUS_PROXY (source_object);
values = g_dbus_proxy_call_finish (proxy, res, &error);
if (values == NULL) {
- message = g_strdup_printf ("%s\n%s",
- _("There was an internal error trying to search for applications:"),
- error->message);
+ if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)
+ || (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_DBUS_ERROR)
+ && (error->message != NULL)
+ && (strstr (error->message, "org.freedesktop.Packagekit.Modify.Cancelled") != NULL)))
+ {
+ error_type = FR_PROC_ERROR_STOPPED;
+ error_message = NULL;
+ }
+ else {
+ error_type = FR_PROC_ERROR_GENERIC;
+ error_message = g_strdup_printf ("%s\n%s",
+ _("There was an internal error trying to search for applications:"),
+ error->message);
+ }
g_clear_error (&error);
}
- package_installer_terminated (idata, message);
+ package_installer_terminated (idata, error_type, error_message);
- g_free (message);
+ g_free (error_message);
if (values != NULL)
g_variant_unref (values);
g_object_unref (proxy);
@@ -204,7 +217,7 @@ install_packages (InstallerData *idata)
message = g_strdup_printf ("%s\n%s",
_("There was an internal error trying to search for applications:"),
error->message);
- package_installer_terminated (idata, message);
+ package_installer_terminated (idata, FR_PROC_ERROR_GENERIC, message);
g_clear_error (&error);
}
@@ -251,7 +264,7 @@ dlg_package_installer (FrWindow *window,
if (command_type == 0)
command_type = get_preferred_command_for_mime_type (idata->archive->content_type, FR_COMMAND_CAN_READ);
if (command_type == 0) {
- package_installer_terminated (idata, _("Archive type not supported."));
+ package_installer_terminated (idata, FR_PROC_ERROR_GENERIC, _("Archive type not supported."));
return;
}
@@ -260,7 +273,7 @@ dlg_package_installer (FrWindow *window,
g_object_unref (command);
if (idata->packages == NULL) {
- package_installer_terminated (idata, _("Archive type not supported."));
+ package_installer_terminated (idata, FR_PROC_ERROR_GENERIC, _("Archive type not supported."));
return;
}
@@ -288,7 +301,7 @@ dlg_package_installer (FrWindow *window,
#else /* ! ENABLE_PACKAGEKIT */
- package_installer_terminated (idata, _("Archive type not supported."));
+ package_installer_terminated (idata, FR_PROC_ERROR_GENERIC, _("Archive type not supported."));
#endif /* ENABLE_PACKAGEKIT */
}
diff --git a/src/fr-command-rar.c b/src/fr-command-rar.c
index 6ef0859..631d58a 100644
--- a/src/fr-command-rar.c
+++ b/src/fr-command-rar.c
@@ -56,8 +56,8 @@ have_rar (void)
static time_t
-mktime_from_string (char *date_s,
- char *time_s)
+mktime_from_string (const char *date_s,
+ const char *time_s)
{
struct tm tm = {0, };
char **fields;
@@ -90,6 +90,84 @@ mktime_from_string (char *date_s,
return mktime (&tm);
}
+/* Sample rar-5 listing output:
+
+RAR 5.00 beta 8 Copyright (c) 1993-2013 Alexander Roshal 22 Aug 2013
+Trial version Type RAR -? for help
+
+Archive: test.rar
+Details: RAR 4
+
+ Attributes Size Packed Ratio Date Time Checksum Name
+----------- --------- -------- ----- -------- ----- -------- ----
+ -rw-r--r-- 453 304 67% 05-09-13 09:55 56DA5EF3 loremipsum.txt
+----------- --------- -------- ----- -------- ----- -------- ----
+ 453 304 67% 1
+
+ *
+ * Sample rar-4 listing output:
+ *
+
+RAR 4.20 Copyright (c) 1993-2012 Alexander Roshal 9 Jun 2012
+Trial version Type RAR -? for help
+
+Archive test.rar
+
+Pathname/Comment
+ Size Packed Ratio Date Time Attr CRC Meth Ver
+-------------------------------------------------------------------------------
+ loremipsum.txt
+ 453 304 67% 05-09-13 09:55 -rw-r--r-- 56DA5EF3 m3b 2.9
+-------------------------------------------------------------------------------
+ 1 453 304 67%
+
+ */
+
+static void
+parse_name_field (char *line,
+ FrCommandRar *rar_comm)
+{
+ char *name_field;
+ FileData *fdata;
+
+ rar_comm->fdata = fdata = file_data_new ();
+
+ /* read file name. */
+
+ fdata->encrypted = (line[0] == '*') ? TRUE : FALSE;
+
+ if (rar_comm->rar5)
+ /* rar-5 output adds trailing spaces to short file names :( */
+ name_field = g_strchomp (g_strdup (get_last_field (line, 8)));
+ else
+ name_field = g_strdup (line + 1);
+
+ if (*name_field == '/') {
+ fdata->full_path = g_strdup (name_field);
+ fdata->original_path = fdata->full_path;
+ }
+ else {
+ fdata->full_path = g_strconcat ("/", name_field, NULL);
+ fdata->original_path = fdata->full_path + 1;
+ }
+
+ fdata->link = NULL;
+ fdata->path = remove_level_from_path (fdata->full_path);
+
+ g_free (name_field);
+}
+
+static gboolean
+attr_field_is_dir (const char *attr_field,
+ FrCommandRar *rar_comm)
+{
+ if ((attr_field[0] == 'd') ||
+ (rar_comm->rar5 && attr_field[3] == 'D') ||
+ (!rar_comm->rar5 && attr_field[1] == 'D'))
+ return TRUE;
+
+ return FALSE;
+}
static void
process_line (char *line,
@@ -98,14 +176,24 @@ process_line (char *line,
FrCommand *comm = FR_COMMAND (data);
FrCommandRar *rar_comm = FR_COMMAND_RAR (comm);
char **fields;
- const char *name_field;
g_return_if_fail (line != NULL);
if (! rar_comm->list_started) {
- if (strncmp (line, "--------", 8) == 0) {
+ if (strncmp (line, "RAR ", 4) == 0) {
+ int version;
+ sscanf (line, "RAR %d.", &version);
+ rar_comm->rar5 = (version >= 5);
+ }
+ else if (strncmp (line, "UNRAR ", 6) == 0) {
+ int version;
+ sscanf (line, "UNRAR %d.", &version);
+ rar_comm->rar5 = (version >= 5);
+ }
+ else if (strncmp (line, "--------", 8) == 0) {
rar_comm->list_started = TRUE;
- rar_comm->odd_line = TRUE;
+ if (! rar_comm->rar5)
+ rar_comm->rar4_odd_line = TRUE;
}
else if (strncmp (line, "Volume ", 7) == 0)
comm->multi_volume = TRUE;
@@ -117,24 +205,43 @@ process_line (char *line,
return;
}
- if (! rar_comm->odd_line) {
- FileData *fdata;
+ if (rar_comm->rar4_odd_line || rar_comm->rar5)
+ parse_name_field (line, rar_comm);
+
+ if (! rar_comm->rar4_odd_line) {
+ FileData *fdata;
+ const char *size_field, *ratio_field, *date_field, *time_field, *attr_field;
fdata = rar_comm->fdata;
/* read file info. */
fields = split_line (line, 6);
+ if (rar_comm->rar5) {
+ size_field = fields[1];
+ ratio_field = fields[3];
+ date_field = fields[4];
+ time_field = fields[5];
+ attr_field = fields[0];
+ }
+ else {
+ size_field = fields[0];
+ ratio_field = fields[2];
+ date_field = fields[3];
+ time_field = fields[4];
+ attr_field = fields[5];
+ }
if (g_strv_length (fields) < 6) {
/* wrong line format, treat this line as a filename line */
g_strfreev (fields);
file_data_free (rar_comm->fdata);
rar_comm->fdata = NULL;
- rar_comm->odd_line = TRUE;
+ rar_comm->rar4_odd_line = TRUE;
+ parse_name_field (line, rar_comm);
}
else {
- if ((strcmp (fields[2], "<->") == 0)
- || (strcmp (fields[2], "<--") == 0))
+ if ((strcmp (ratio_field, "<->") == 0)
+ || (strcmp (ratio_field, "<--") == 0))
{
/* ignore files that span more volumes */
@@ -142,10 +249,10 @@ process_line (char *line,
rar_comm->fdata = NULL;
}
else {
- fdata->size = g_ascii_strtoull (fields[0], NULL, 10);
- fdata->modified = mktime_from_string (fields[3], fields[4]);
+ fdata->size = g_ascii_strtoull (size_field, NULL, 10);
+ fdata->modified = mktime_from_string (date_field, time_field);
- if ((fields[5][1] == 'D') || (fields[5][0] == 'd')) {
+ if (attr_field_is_dir (attr_field, rar_comm)) {
char *tmp;
tmp = fdata->full_path;
@@ -159,8 +266,11 @@ process_line (char *line,
fdata->name = dir_name_from_path (fdata->full_path);
fdata->dir = TRUE;
}
- else
+ else {
fdata->name = g_strdup (file_name_from_path (fdata->full_path));
+ if (attr_field[0] == 'l')
+ fdata->link = g_strdup (file_name_from_path (fdata->full_path));
+ }
fr_command_add_file (comm, fdata);
rar_comm->fdata = NULL;
@@ -170,34 +280,8 @@ process_line (char *line,
}
}
- if (rar_comm->odd_line) {
- FileData *fdata;
-
- rar_comm->fdata = fdata = file_data_new ();
-
- /* read file name. */
-
- fdata->encrypted = (line[0] == '*') ? TRUE : FALSE;
-
- name_field = line + 1;
-
- if (*name_field == '/') {
- fdata->full_path = g_strdup (name_field);
- fdata->original_path = fdata->full_path;
- }
- else {
- fdata->full_path = g_strconcat ("/", name_field, NULL);
- fdata->original_path = fdata->full_path + 1;
- }
-
- fdata->link = NULL;
- fdata->path = remove_level_from_path (fdata->full_path);
- }
- else {
-
- }
-
- rar_comm->odd_line = ! rar_comm->odd_line;
+ if (! rar_comm->rar5)
+ rar_comm->rar4_odd_line = ! rar_comm->rar4_odd_line;
}
diff --git a/src/fr-command-rar.h b/src/fr-command-rar.h
index e2a5e12..c86fec5 100644
--- a/src/fr-command-rar.h
+++ b/src/fr-command-rar.h
@@ -43,7 +43,8 @@ struct _FrCommandRar
FrCommand __parent;
gboolean list_started;
- gboolean odd_line;
+ gboolean rar4_odd_line;
+ gboolean rar5;
FileData *fdata;
};
diff --git a/src/fr-command-zip.c b/src/fr-command-zip.c
index 8c51bef..2aa332e 100644
--- a/src/fr-command-zip.c
+++ b/src/fr-command-zip.c
@@ -190,6 +190,7 @@ fr_command_zip_list (FrCommand *comm)
fr_process_begin_command (comm->process, "unzip");
fr_process_set_begin_func (comm->process, list__begin, comm);
fr_process_add_arg (comm->process, "-ZTs");
+ fr_process_add_arg (comm->process, "--");
fr_process_add_arg (comm->process, comm->filename);
fr_process_end_command (comm->process);
fr_process_start (comm->process);
@@ -253,6 +254,8 @@ fr_command_zip_add (FrCommand *comm,
}
fr_process_add_arg (comm->process, comm->filename);
+ fr_process_add_arg (comm->process, "--");
+
for (scan = file_list; scan; scan = scan->next)
fr_process_add_arg (comm->process, scan->data);
@@ -275,6 +278,8 @@ fr_command_zip_delete (FrCommand *comm,
fr_process_add_arg (comm->process, "-d");
fr_process_add_arg (comm->process, comm->filename);
+ fr_process_add_arg (comm->process, "--");
+
for (scan = file_list; scan; scan = scan->next) {
char *escaped;
@@ -319,6 +324,8 @@ fr_command_zip_extract (FrCommand *comm,
add_password_arg (comm, comm->password);
fr_process_add_arg (comm->process, comm->filename);
+ fr_process_add_arg (comm->process, "--");
+
for (scan = file_list; scan; scan = scan->next) {
char *escaped;
@@ -337,6 +344,7 @@ fr_command_zip_test (FrCommand *comm)
fr_process_begin_command (comm->process, "unzip");
fr_process_add_arg (comm->process, "-t");
add_password_arg (comm, comm->password);
+ fr_process_add_arg (comm->process, "--");
fr_process_add_arg (comm->process, comm->filename);
fr_process_end_command (comm->process);
}