root/trunk/third/nautilus/components/rpmview/nautilus-rpm-view.c @ 15547

Revision 15547, 29.6 KB (checked in by ghudson, 9 years ago)

This commit was generated by cvs2svn to compensate for changes in r15546,
which included commits to RCS files with non-trunk default branches.

Line 
1/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
2
3/*
4 *  Copyright (C) 2000 Eazel, Inc.
5 *
6 *  This library is free software; you can redistribute it and/or
7 *  modify it under the terms of the GNU General Public License as
8 *  published by the Free Software Foundation; either version 2 of the
9 *  License, or (at your option) any later version.
10 *
11 *  This library is distributed in the hope that it will be useful,
12 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 *  General Public License for more details.
15 *
16 *  You should have received a copy of the GNU General Public License
17 *  along with this library; if not, write to the Free Software
18 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 *
20 *  Author: Andy Hertzfeld <andy@eazel.com>
21 *
22 */
23 
24/* The RPM view component is used to provide an easy-to-use overview of a rpm package */
25
26#include <config.h>
27
28#include "nautilus-rpm-view.h"
29#include "nautilus-rpm-verify-window.h"
30
31#include <sys/types.h>
32#include <sys/stat.h>
33#include <fcntl.h>
34#include <dirent.h>
35#include <stdio.h>
36#include <errno.h>
37
38#include <libnautilus/libnautilus.h>
39#include <libnautilus-extensions/nautilus-background.h>
40#include <libnautilus-extensions/nautilus-file.h>
41#include <libnautilus-extensions/nautilus-file-utilities.h>
42#include <libnautilus-extensions/nautilus-glib-extensions.h>
43#include <libnautilus-extensions/nautilus-gtk-extensions.h>
44#include <libnautilus-extensions/nautilus-gtk-macros.h>
45#include <libnautilus-extensions/nautilus-metadata.h>
46#include <libnautilus-extensions/nautilus-string.h>
47#include <libnautilus-extensions/nautilus-theme.h>
48#include <gdk-pixbuf/gdk-pixbuf.h>
49#include <gtk/gtklabel.h>
50#include <gnome.h>
51#include <libgnomevfs/gnome-vfs.h>
52#include <libgnorba/gnorba.h>
53#include <limits.h>
54
55/* must be after any services includes */
56#include "nautilus-rpm-view-private.h"
57
58
59#define RPM_VIEW_DEFAULT_BACKGROUND_COLOR  "rgb:DDDD/DDDD/BBBB"
60
61enum {
62        TARGET_URI_LIST,
63        TARGET_COLOR,
64        TARGET_GNOME_URI_LIST
65};
66
67static GtkTargetEntry rpm_dnd_target_table[] = {
68        { "text/uri-list",  0, TARGET_URI_LIST },
69        { "application/x-color", 0, TARGET_COLOR },
70        { "x-special/gnome-icon-list",  0, TARGET_GNOME_URI_LIST }
71};
72
73static void nautilus_rpm_view_drag_data_received (GtkWidget            *widget,
74                                                  GdkDragContext       *context,
75                                                  int                   x,
76                                                  int                   y,
77                                                  GtkSelectionData     *selection_data,
78                                                  guint                 info,
79                                                  guint                 time);
80static void nautilus_rpm_view_initialize_class   (NautilusRPMViewClass *klass);
81static void nautilus_rpm_view_initialize         (NautilusRPMView      *view);
82static void nautilus_rpm_view_destroy            (GtkObject            *object);
83static void rpm_view_load_location_callback      (NautilusView         *view,
84                                                  const char           *location,
85                                                  NautilusRPMView      *rpm_view);
86static void nautilus_rpm_view_verify_package_callback (GtkWidget *widget,
87                                                  NautilusRPMView *rpm_view);
88
89static void file_selection_callback              (GtkCList             *clist,
90                                                  int                   row,
91                                                  int                   column,
92                                                  GdkEventButton       *event,
93                                                  NautilusRPMView      *rpm_view);
94static void go_to_button_callback                (GtkWidget            *widget,
95                                                  NautilusRPMView      *rpm_view);
96
97NAUTILUS_DEFINE_CLASS_BOILERPLATE (NautilusRPMView, nautilus_rpm_view, GTK_TYPE_EVENT_BOX)
98
99static void
100nautilus_rpm_view_initialize_class (NautilusRPMViewClass *klass)
101{
102        GtkObjectClass *object_class;
103        GtkWidgetClass *widget_class;
104       
105        object_class = GTK_OBJECT_CLASS (klass);
106        widget_class = GTK_WIDGET_CLASS (klass);
107
108        object_class->destroy = nautilus_rpm_view_destroy;
109        widget_class->drag_data_received  = nautilus_rpm_view_drag_data_received;
110}
111
112/* initialize the rpm view */
113
114static void
115nautilus_rpm_view_initialize (NautilusRPMView *rpm_view)
116{
117        NautilusBackground *background;
118        GtkWidget *temp_box, *temp_widget;
119        GtkWidget *icon_title_box, *title_box;
120        GtkTable *table;
121        char *default_icon_path;
122       
123        static gchar *list_headers[] = { N_("Package Contents") };
124       
125        rpm_view->details = g_new0 (NautilusRPMViewDetails, 1);
126
127        rpm_view->details->package_system = eazel_package_system_new (NULL);
128        eazel_package_system_set_debug (rpm_view->details->package_system, EAZEL_PACKAGE_SYSTEM_DEBUG_FAIL);
129        rpm_view->details->package = NULL;
130
131        rpm_view->details->nautilus_view = nautilus_view_new (GTK_WIDGET (rpm_view));
132
133        gtk_signal_connect (GTK_OBJECT (rpm_view->details->nautilus_view), 
134                            "load_location",
135                            GTK_SIGNAL_FUNC (rpm_view_load_location_callback), 
136                            rpm_view);
137
138        rpm_view->details->current_uri = NULL;
139        rpm_view->details->background_connection = 0;
140        rpm_view->details->selected_file = -1;
141       
142        /* set up the default background color */
143        background = nautilus_get_widget_background (GTK_WIDGET (rpm_view));
144        nautilus_background_set_color (background, RPM_VIEW_DEFAULT_BACKGROUND_COLOR);
145         
146        /* allocate a vbox to contain all of the views */
147       
148        rpm_view->details->package_container = GTK_VBOX (gtk_vbox_new (FALSE, 0));
149        gtk_container_add (GTK_CONTAINER (rpm_view), GTK_WIDGET (rpm_view->details->package_container));
150        gtk_widget_show (GTK_WIDGET (rpm_view->details->package_container));
151
152        /* allocate an hbox to hold the package icon and the title info */
153        icon_title_box = gtk_hbox_new (FALSE, 0);
154        gtk_widget_show (icon_title_box);
155        gtk_box_pack_start (GTK_BOX (rpm_view->details->package_container), icon_title_box, FALSE, FALSE, 0);   
156       
157        /* allocate a pixwidget to hold the icon */
158        default_icon_path = nautilus_theme_get_image_path ("gnome-pack-rpm.png");
159        rpm_view->details->package_image = gnome_pixmap_new_from_file (default_icon_path);
160        g_free (default_icon_path);
161        gtk_widget_show (rpm_view->details->package_image);
162        gtk_box_pack_start (GTK_BOX (icon_title_box), rpm_view->details->package_image, FALSE, FALSE, 8);       
163       
164        /* allocate another vbox to hold the titles */
165        title_box = gtk_vbox_new (FALSE, 0);
166        gtk_widget_show (title_box);
167        gtk_box_pack_start (GTK_BOX (icon_title_box), title_box, TRUE, TRUE, 8);       
168       
169        /* allocate the name field */
170        rpm_view->details->package_title = gtk_label_new (_("Package Title"));
171        nautilus_gtk_label_make_larger (GTK_LABEL (rpm_view->details->package_title), 4);
172        gtk_box_pack_start (GTK_BOX (title_box), rpm_view->details->package_title, FALSE, FALSE, 1);   
173        gtk_widget_show (rpm_view->details->package_title);
174               
175        /* allocate the release-version field */       
176        rpm_view->details->package_release = gtk_label_new ("1.0-1");
177        gtk_box_pack_start (GTK_BOX (title_box), rpm_view->details->package_release, FALSE, FALSE, 1); 
178
179        gtk_widget_show (rpm_view->details->package_release);
180       
181        /* allocate the summary field */       
182        rpm_view->details->package_summary = gtk_label_new ("");       
183        gtk_box_pack_start (GTK_BOX (title_box), rpm_view->details->package_summary, FALSE, FALSE, 2);         
184
185        gtk_widget_show (rpm_view->details->package_summary);
186               
187        /* allocate a table to hold the fields of information */
188        table = GTK_TABLE(gtk_table_new(4, 4, FALSE));
189        gtk_widget_set_usize (GTK_WIDGET (table), 420, -1);
190       
191        temp_widget = gtk_label_new(_("Size: "));
192        gtk_label_set_justify (GTK_LABEL (temp_widget), GTK_JUSTIFY_RIGHT);
193        gtk_misc_set_alignment(GTK_MISC(temp_widget), 1.0, 0.5);
194        gtk_table_attach(table, temp_widget, 0,1, 1,2, GTK_FILL, GTK_FILL, 0,0);
195        gtk_widget_show(temp_widget);
196       
197        rpm_view->details->package_size = gtk_label_new(_("<size>"));
198        gtk_label_set_justify (GTK_LABEL (rpm_view->details->package_size), GTK_JUSTIFY_LEFT);
199        gtk_misc_set_alignment(GTK_MISC(rpm_view->details->package_size), 0.0, 0.5);
200        gtk_table_attach(table, rpm_view->details->package_size, 1, 2, 1, 2, GTK_FILL|GTK_EXPAND, GTK_FILL, 0,0);
201        gtk_widget_show(rpm_view->details->package_size);
202
203        temp_widget = gtk_label_new(_("Install Date: "));
204        gtk_misc_set_alignment(GTK_MISC(temp_widget), 1.0, 0.5);
205        gtk_label_set_justify (GTK_LABEL (temp_widget), GTK_JUSTIFY_RIGHT);
206        gtk_table_attach(table, temp_widget, 2,3, 1,2, GTK_FILL, GTK_FILL, 0,0);
207        gtk_widget_show(temp_widget);
208       
209        rpm_view->details->package_idate = gtk_label_new(_("<unknown>"));
210        gtk_label_set_justify (GTK_LABEL (rpm_view->details->package_idate), GTK_JUSTIFY_LEFT);
211        gtk_misc_set_alignment(GTK_MISC(rpm_view->details->package_idate), 0.0, 0.5);
212        gtk_table_attach(table, rpm_view->details->package_idate, 3,4, 1,2, GTK_FILL|GTK_EXPAND, GTK_FILL, 0,0);
213        gtk_widget_show(rpm_view->details->package_idate);
214
215        temp_widget = gtk_label_new(_("License: "));
216        gtk_misc_set_alignment(GTK_MISC(temp_widget), 1.0, 0.5);
217        gtk_label_set_justify (GTK_LABEL (temp_widget), GTK_JUSTIFY_RIGHT);
218        gtk_table_attach(table, temp_widget, 0,1, 2,3, GTK_FILL, GTK_FILL, 0,0);
219        gtk_widget_show(temp_widget);
220       
221        rpm_view->details->package_license = gtk_label_new(_("<unknown>"));
222        gtk_label_set_justify (GTK_LABEL (rpm_view->details->package_license), GTK_JUSTIFY_LEFT);       
223        gtk_misc_set_alignment(GTK_MISC(rpm_view->details->package_license), 0.0, 0.5);
224        gtk_table_attach(table, rpm_view->details->package_license, 1,2, 2,3, GTK_FILL|GTK_EXPAND, GTK_FILL, 0,0);
225        gtk_widget_show(rpm_view->details->package_license);
226
227        temp_widget = gtk_label_new(_("Build Date: "));
228        gtk_misc_set_alignment(GTK_MISC (temp_widget), 1.0, 0.5);
229        gtk_label_set_justify (GTK_LABEL (temp_widget), GTK_JUSTIFY_RIGHT);
230        gtk_table_attach(table, temp_widget, 2,3, 2,3, GTK_FILL, GTK_FILL, 0,0);
231        gtk_widget_show(temp_widget);
232       
233        rpm_view->details->package_bdate = gtk_label_new(_("<unknown>"));
234        gtk_label_set_justify (GTK_LABEL (rpm_view->details->package_bdate), GTK_JUSTIFY_LEFT); 
235        gtk_misc_set_alignment(GTK_MISC(rpm_view->details->package_bdate), 0.0, 0.5);
236        gtk_table_attach(table, rpm_view->details->package_bdate, 3,4, 2,3, GTK_FILL|GTK_EXPAND, GTK_FILL, 0,0);
237        gtk_widget_show(rpm_view->details->package_bdate);
238
239        temp_widget = gtk_label_new(_("Distribution: "));
240        gtk_misc_set_alignment(GTK_MISC(temp_widget), 1.0, 0.5);
241        gtk_label_set_justify (GTK_LABEL (temp_widget), GTK_JUSTIFY_RIGHT);
242        gtk_table_attach(table, temp_widget, 0,1, 3,4, GTK_FILL, GTK_FILL, 0,0);
243        gtk_widget_show(temp_widget);
244       
245        rpm_view->details->package_distribution = gtk_label_new(_("<unknown>"));
246        gtk_label_set_justify (GTK_LABEL (rpm_view->details->package_distribution), GTK_JUSTIFY_LEFT); 
247        gtk_misc_set_alignment(GTK_MISC(rpm_view->details->package_distribution), 0.0, 0.5);
248        gtk_table_attach(table, rpm_view->details->package_distribution, 1,2, 3,4, GTK_FILL|GTK_EXPAND, GTK_FILL, 0,0);
249        gtk_widget_show(rpm_view->details->package_distribution);
250
251        temp_widget = gtk_label_new(_("Vendor: "));
252        gtk_misc_set_alignment(GTK_MISC(temp_widget), 1.0, 0.5);
253        gtk_label_set_justify (GTK_LABEL (temp_widget), GTK_JUSTIFY_RIGHT);
254        gtk_table_attach(table, temp_widget, 2,3, 3,4, GTK_FILL, GTK_FILL, 0,0);
255        gtk_widget_show(temp_widget);
256       
257        rpm_view->details->package_vendor = gtk_label_new(_("<unknown>"));
258        gtk_label_set_justify (GTK_LABEL (rpm_view->details->package_vendor), GTK_JUSTIFY_LEFT);       
259        gtk_misc_set_alignment(GTK_MISC(rpm_view->details->package_vendor), 0.0, 0.5);
260        gtk_table_attach(table, rpm_view->details->package_vendor, 3,4, 3,4, GTK_FILL|GTK_EXPAND, GTK_FILL, 0,0);
261        gtk_widget_show(rpm_view->details->package_vendor);
262
263        /* insert the data table */
264        temp_widget = gtk_hseparator_new();     
265        gtk_box_pack_start (GTK_BOX (rpm_view->details->package_container), temp_widget, FALSE, FALSE, 2);     
266        gtk_widget_show (temp_widget);
267        gtk_box_pack_start (GTK_BOX (rpm_view->details->package_container), GTK_WIDGET (table), FALSE, FALSE, 2);       
268        gtk_widget_show (GTK_WIDGET(table));
269       
270        /* make the install message and button area  */
271       
272        temp_box = gtk_hbox_new(FALSE, 0);
273        gtk_box_pack_start(GTK_BOX (rpm_view->details->package_container), temp_box, FALSE, FALSE, 8); 
274        gtk_widget_show(temp_box);
275       
276        rpm_view->details->package_installed_message = gtk_label_new("");
277       
278        gtk_box_pack_start (GTK_BOX (temp_box), rpm_view->details->package_installed_message,
279                                 FALSE, FALSE, 2);             
280        gtk_widget_show (rpm_view->details->package_installed_message);
281       
282        /* install button */
283        rpm_view->details->package_install_button = gtk_button_new();               
284        temp_widget = gtk_label_new (_("Install"));
285        gtk_widget_show (temp_widget);
286        gtk_container_add (GTK_CONTAINER (rpm_view->details->package_install_button), temp_widget);     
287        gtk_box_pack_start(GTK_BOX (temp_box), rpm_view->details->package_install_button,
288                                 FALSE, FALSE, 2);             
289        gtk_widget_show(rpm_view->details->package_install_button);
290
291#ifdef EAZEL_SERVICES
292        gtk_signal_connect (GTK_OBJECT (rpm_view->details->package_install_button), 
293                            "clicked", 
294                            GTK_SIGNAL_FUNC (nautilus_rpm_view_install_package_callback), 
295                            rpm_view);
296#endif /* EAZEL_SERVICES */       
297       
298        /* update button */
299        rpm_view->details->package_update_button = gtk_button_new();               
300        temp_widget = gtk_label_new (_("Update"));
301        gtk_widget_show (temp_widget);
302        gtk_container_add (GTK_CONTAINER (rpm_view->details->package_update_button), temp_widget);     
303        gtk_box_pack_start(GTK_BOX (temp_box), rpm_view->details->package_update_button,
304                                 FALSE, FALSE, 2);             
305        gtk_widget_show(rpm_view->details->package_update_button);
306       
307        /* uninstall button */
308        rpm_view->details->package_uninstall_button = gtk_button_new();             
309        temp_widget = gtk_label_new (_("Uninstall"));
310        gtk_widget_show (temp_widget);
311        gtk_container_add (GTK_CONTAINER (rpm_view->details->package_uninstall_button), temp_widget);   
312        gtk_box_pack_start(GTK_BOX (temp_box), rpm_view->details->package_uninstall_button,
313                                 FALSE, FALSE, 4);             
314        gtk_widget_show(rpm_view->details->package_uninstall_button);
315
316#ifdef EAZEL_SERVICES
317        gtk_signal_connect (GTK_OBJECT (rpm_view->details->package_uninstall_button), 
318                            "clicked", 
319                            GTK_SIGNAL_FUNC (nautilus_rpm_view_uninstall_package_callback), 
320                            rpm_view);
321#endif /* EAZEL_SERVICES */       
322
323        /* verify button */
324        rpm_view->details->package_verify_button = gtk_button_new();               
325        temp_widget = gtk_label_new (_("Verify"));
326        gtk_widget_show (temp_widget);
327        gtk_container_add (GTK_CONTAINER (rpm_view->details->package_verify_button), temp_widget);     
328        gtk_box_pack_start(GTK_BOX (temp_box), rpm_view->details->package_verify_button,
329                                 FALSE, FALSE, 4);             
330        gtk_widget_show(rpm_view->details->package_verify_button);
331
332        gtk_signal_connect (GTK_OBJECT (rpm_view->details->package_verify_button), 
333                            "clicked", 
334                            GTK_SIGNAL_FUNC (nautilus_rpm_view_verify_package_callback), 
335                            rpm_view);
336               
337        /* add the list of files contained in the package */
338
339        temp_widget = gtk_scrolled_window_new(NULL, NULL);
340        gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(temp_widget),
341                                 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
342        gtk_box_pack_start (GTK_BOX (rpm_view->details->package_container), temp_widget, TRUE, TRUE, 0);       
343        gtk_widget_show(temp_widget);
344 
345        rpm_view->details->package_file_list = gtk_clist_new_with_titles(1, list_headers);
346        gtk_clist_column_titles_passive(GTK_CLIST(rpm_view->details->package_file_list));
347        gtk_container_add (GTK_CONTAINER (temp_widget), rpm_view->details->package_file_list); 
348        gtk_widget_show(rpm_view->details->package_file_list);
349
350        gtk_signal_connect (GTK_OBJECT (rpm_view->details->package_file_list),
351                            "select_row", GTK_SIGNAL_FUNC (file_selection_callback), rpm_view);
352       
353        /* add an hbox for buttons that operate on the package list */
354        temp_box = gtk_hbox_new(FALSE, 0);
355        gtk_box_pack_start(GTK_BOX (rpm_view->details->package_container), temp_box, FALSE, FALSE, 4);
356        gtk_widget_show(temp_box);
357               
358        /* add the file go-to button */
359
360        rpm_view->details->go_to_button = gtk_button_new();                 
361        temp_widget = gtk_label_new (_("Go to selected file"));
362        gtk_widget_show (temp_widget);
363        gtk_container_add (GTK_CONTAINER (rpm_view->details->go_to_button), temp_widget);       
364        gtk_box_pack_start(GTK_BOX (temp_box), rpm_view->details->go_to_button,
365                                 FALSE, FALSE, 2);             
366
367        gtk_signal_connect (GTK_OBJECT(rpm_view->details->go_to_button), "clicked", GTK_SIGNAL_FUNC(go_to_button_callback), rpm_view); 
368        gtk_widget_set_sensitive(rpm_view->details->go_to_button, FALSE);
369        gtk_widget_show(rpm_view->details->go_to_button);
370       
371        /* add the description */
372        rpm_view->details->package_description = gtk_label_new (_("Description"));     
373        gtk_box_pack_start (GTK_BOX (rpm_view->details->package_container), rpm_view->details->package_description,
374                                FALSE, FALSE, 8);       
375        gtk_widget_show (rpm_view->details->package_description);
376       
377        /* prepare ourselves to receive dropped objects */
378       
379        gtk_drag_dest_set (GTK_WIDGET (rpm_view),
380                           GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_HIGHLIGHT | GTK_DEST_DEFAULT_DROP, 
381                           rpm_dnd_target_table, NAUTILUS_N_ELEMENTS (rpm_dnd_target_table), GDK_ACTION_COPY);
382
383        /* finally, show the view itself */     
384        gtk_widget_show (GTK_WIDGET (rpm_view));
385}
386
387static void
388nautilus_rpm_view_destroy (GtkObject *object)
389{
390        NautilusRPMView *rpm_view = NAUTILUS_RPM_VIEW (object);
391#ifdef EAZEL_SERVICES
392        PackageData *pack;
393#endif /* EAZEL_SERVICES */       
394
395#ifdef EAZEL_SERVICES
396        pack = (PackageData *) gtk_object_get_data (GTK_OBJECT (rpm_view), "packagedata");
397        if (pack) {
398                packagedata_destroy (pack, TRUE);
399        }
400
401        if (rpm_view->details->root_client) {
402                trilobite_root_client_unref (GTK_OBJECT (rpm_view->details->root_client));
403        }
404        if (rpm_view->details->installer) {
405                eazel_install_callback_unref (GTK_OBJECT (rpm_view->details->installer));
406        }
407        if (rpm_view->details->package_system) {
408                gtk_object_unref (GTK_OBJECT (rpm_view->details->package_system));
409        }
410
411        g_free (rpm_view->details->remembered_password);
412#endif /* EAZEL_SERVICES */
413
414        if (rpm_view->details->verify_window) {
415                gtk_object_destroy (GTK_OBJECT (rpm_view->details->verify_window));
416        }
417       
418        g_free (rpm_view->details->current_uri);
419        g_free (rpm_view->details->package_name);
420        g_free (rpm_view->details);
421
422        NAUTILUS_CALL_PARENT_CLASS (GTK_OBJECT_CLASS, destroy, (object));
423}
424
425/* Component embedding support */
426NautilusView *
427nautilus_rpm_view_get_nautilus_view (NautilusRPMView *rpm_view)
428{
429        return rpm_view->details->nautilus_view;
430}
431
432/* callback to handle file selection in the file list view */
433static void 
434file_selection_callback(GtkCList * clist, int row, int column, GdkEventButton * event, NautilusRPMView* rpm_view)
435{
436        gtk_widget_set_sensitive(rpm_view->details->go_to_button, rpm_view->details->package_installed);
437        rpm_view->details->selected_file = row;
438}
439
440/* callback to handle the go to file button */
441static void 
442go_to_button_callback (GtkWidget * widget, NautilusRPMView *rpm_view)
443{
444        char *path_name;
445       
446        gtk_clist_get_text (GTK_CLIST(rpm_view->details->package_file_list), 
447                            rpm_view->details->selected_file, 0, &path_name);
448        nautilus_view_open_location_in_this_window
449                (rpm_view->details->nautilus_view, path_name);
450}
451
452static void
453add_to_clist (char *name,
454              NautilusRPMView *view)
455{
456        gtk_clist_append (GTK_CLIST(view->details->package_file_list), &name);
457}
458
459/* here's where we do most of the real work of populating the view with info from the package */
460/* open the package and copy the information, and then set up the appropriate views with it */
461/* FIXME bugzilla.eazel.com 725: use gnome-vfs to open the package */
462
463static void 
464nautilus_rpm_view_update_from_uri (NautilusRPMView *rpm_view, const char *uri)
465{
466        char *temp_str;
467        gboolean is_installed;
468        char *path_name, *default_icon_path;
469       
470        path_name = gnome_vfs_get_local_path_from_uri (uri);
471               
472        /* load the standard icon as the default */
473        default_icon_path = nautilus_theme_get_image_path ("gnome-pack-rpm.png");
474        gnome_pixmap_load_file (GNOME_PIXMAP (rpm_view->details->package_image), default_icon_path);
475        g_free (default_icon_path);
476
477#ifdef EAZEL_SERVICES         
478        rpm_view->details->package = eazel_package_system_load_package (rpm_view->details->package_system,
479                                                                        rpm_view->details->package,
480                                                                        path_name,
481                                                                        PACKAGE_FILL_EVERYTHING);
482        g_free (path_name);
483
484        /* Set the file list */
485        gtk_clist_freeze (GTK_CLIST (rpm_view->details->package_file_list));
486        gtk_clist_clear (GTK_CLIST (rpm_view->details->package_file_list));             
487        temp_str = g_strdup_printf(_("Package Contents: %d files"), 
488                                   g_list_length (rpm_view->details->package->provides));
489        g_list_foreach (rpm_view->details->package->provides, (GFunc)add_to_clist, rpm_view);
490        gtk_clist_set_column_title (GTK_CLIST(rpm_view->details->package_file_list), 0, temp_str);
491        g_free(temp_str);               
492        gtk_clist_thaw(GTK_CLIST(rpm_view->details->package_file_list));
493               
494        temp_str = g_strdup_printf(_("Package \"%s\" "), rpm_view->details->package->name);
495        gtk_label_set_text (GTK_LABEL (rpm_view->details->package_title), temp_str);
496        g_free(temp_str);
497
498        temp_str = gnome_vfs_format_file_size_for_display (rpm_view->details->package->bytesize);
499        gtk_label_set_text (GTK_LABEL (rpm_view->details->package_size), temp_str);
500        g_free (temp_str);                                     
501
502        temp_str = trilobite_get_distribution_name (rpm_view->details->package->distribution, TRUE, FALSE);
503        gtk_label_set_text (GTK_LABEL (rpm_view->details->package_distribution), 
504                            temp_str);
505        g_free (temp_str);
506       
507        /* I no longer set
508           buildtime
509           installtime
510           vendor
511           gif
512           xpm
513        */
514       
515        gtk_label_set_text (GTK_LABEL (rpm_view->details->package_description), 
516                            rpm_view->details->package->description);
517        gtk_label_set_text (GTK_LABEL (rpm_view->details->package_summary), 
518                            rpm_view->details->package->summary );
519
520       
521        temp_str = packagedata_get_readable_name (rpm_view->details->package);
522        gtk_label_set_text (GTK_LABEL (rpm_view->details->package_release), temp_str);
523        g_free (temp_str);
524       
525        /* determine if the package is installed */
526        is_installed = eazel_package_system_is_installed (rpm_view->details->package_system,
527                                                          NULL,
528                                                          rpm_view->details->package->name,
529                                                          rpm_view->details->package->version,
530                                                          rpm_view->details->package->minor,
531                                                          EAZEL_SOFTCAT_SENSE_EQ);
532        rpm_view->details->package_installed = is_installed != 0;
533                       
534        /* set up the install message and buttons */
535        if (is_installed) {
536                gtk_label_set_text (GTK_LABEL(rpm_view->details->package_installed_message), "This package is currently installed");   
537        } else {
538                gtk_label_set_text (GTK_LABEL(rpm_view->details->package_installed_message), "This package is currently not installed");
539        }
540       
541        if (is_installed == 0) {
542                gtk_widget_show(rpm_view->details->package_install_button);
543        } else {
544                gtk_widget_hide(rpm_view->details->package_install_button);
545        }
546        if (is_installed == 255) {
547                gtk_widget_show(rpm_view->details->package_update_button);
548        } else {
549                gtk_widget_hide(rpm_view->details->package_update_button);
550        }
551        if (is_installed != 0) {
552                gtk_widget_show (rpm_view->details->package_uninstall_button);
553                gtk_widget_show (rpm_view->details->package_verify_button);
554        } else {
555                gtk_widget_hide (rpm_view->details->package_uninstall_button);
556                gtk_widget_hide (rpm_view->details->package_verify_button);
557        }       
558#endif /* EAZEL_SERVICES */             
559}
560
561char*
562nautilus_rpm_view_get_uri (NautilusRPMView *view)
563{
564        return view->details->current_uri;
565}
566
567gboolean
568nautilus_rpm_view_get_installed (NautilusRPMView *view)
569{
570        return view->details->package_installed;
571}
572
573NautilusView* 
574nautilus_rpm_view_get_view (NautilusRPMView *view)
575{
576        return view->details->nautilus_view;
577}
578
579void
580nautilus_rpm_view_load_uri (NautilusRPMView *rpm_view, const char *uri)
581{
582        g_free(rpm_view->details->current_uri);
583        rpm_view->details->current_uri = g_strdup (uri);       
584        nautilus_rpm_view_update_from_uri(rpm_view, uri);
585}
586
587static void
588rpm_view_load_location_callback (NautilusView *view, 
589                                 const char *location,
590                                 NautilusRPMView *rpm_view)
591{
592        nautilus_view_report_load_underway (rpm_view->details->nautilus_view);
593        nautilus_rpm_view_load_uri (rpm_view, location);
594        nautilus_view_report_load_complete (rpm_view->details->nautilus_view);
595}
596
597static gboolean
598verify_failed_signal (EazelPackageSystem *system,
599                      EazelPackageSystemOperation op, 
600                      const PackageData *package,
601                      NautilusRPMView *rpm_view)
602{
603        nautilus_rpm_verify_window_set_error_mode (NAUTILUS_RPM_VERIFY_WINDOW (rpm_view->details->verify_window), TRUE);
604        rpm_view->details->verify_success = FALSE;
605
606        return FALSE;
607}
608
609static gboolean 
610verify_progress_signal (EazelPackageSystem *system,
611                        EazelPackageSystemOperation op,
612                        const PackageData *pack,
613                        unsigned long *info,
614                        GtkWidget *verify_window)
615{
616        g_assert (verify_window);
617        g_assert (NAUTILUS_RPM_VERIFY_WINDOW (verify_window));
618        nautilus_rpm_verify_window_set_progress (NAUTILUS_RPM_VERIFY_WINDOW (verify_window),
619                                                 (g_list_nth (pack->provides, info[0]-1))->data,
620                                                 info[0], info[1]);
621        return TRUE;
622}
623
624/* routine to handle the verify command */
625static void 
626nautilus_rpm_view_verify_files (GtkWidget *widget,
627                                NautilusRPMView *rpm_view)
628{
629        GList *packages = g_list_prepend (NULL, rpm_view->details->package);
630        guint failsignal, progresssignal;
631       
632        /* put up a window to give file handling feedback */
633        if (rpm_view->details->verify_window == NULL) {
634                rpm_view->details->verify_window = nautilus_rpm_verify_window_new (rpm_view->details->package->name);   
635                /*
636                gtk_signal_connect (GTK_OBJECT (rpm_view->details->verify_window),
637                            "continue",
638                            GTK_SIGNAL_FUNC (rpm_view_continue_verify),
639                            rpm_view);
640                */
641       
642        }
643       
644        nautilus_gtk_window_present (GTK_WINDOW (rpm_view->details->verify_window));
645
646        failsignal = gtk_signal_connect (GTK_OBJECT (rpm_view->details->package_system),
647                                         "failed",
648                                         (GtkSignalFunc)verify_failed_signal,
649                                         rpm_view);
650        progresssignal = gtk_signal_connect (GTK_OBJECT (rpm_view->details->package_system),
651                                             "progress",
652                                             (GtkSignalFunc)verify_progress_signal,
653                                             rpm_view->details->verify_window);
654
655        rpm_view->details->verify_success = TRUE;
656        eazel_package_system_verify (rpm_view->details->package_system,
657                                     NULL, 
658                                     packages);
659
660        gtk_signal_disconnect (GTK_OBJECT (rpm_view->details->package_system), failsignal);
661        gtk_signal_disconnect (GTK_OBJECT (rpm_view->details->package_system), progresssignal);                               
662        g_list_free (packages);
663               
664        if (rpm_view->details->verify_success) {
665                nautilus_rpm_verify_window_set_error_mode (NAUTILUS_RPM_VERIFY_WINDOW (rpm_view->details->verify_window), FALSE);
666                nautilus_rpm_verify_window_set_message (NAUTILUS_RPM_VERIFY_WINDOW (rpm_view->details->verify_window), _("Verification completed, package ok."));
667        } else {
668        }
669}
670
671/* callback to handle the verify command */
672static void 
673nautilus_rpm_view_verify_package_callback (GtkWidget *widget,
674                                           NautilusRPMView *rpm_view)
675{
676        rpm_view->details->last_file_index = 0;
677        nautilus_rpm_view_verify_files (widget, rpm_view);
678}
679
680/* handle drag and drop */
681static void 
682nautilus_rpm_view_drag_data_received (GtkWidget *widget, GdkDragContext *context,
683                                      int x, int y,
684                                      GtkSelectionData *selection_data, guint info, guint time)
685{
686        g_return_if_fail (NAUTILUS_IS_RPM_VIEW (widget));
687
688        switch (info) {
689        case TARGET_GNOME_URI_LIST:
690        case TARGET_URI_LIST:   
691                g_message ("dropped data on rpm_view: %s", selection_data->data);                       
692                break;
693               
694               
695        case TARGET_COLOR:
696                /* Let the background change based on the dropped color. */
697                nautilus_background_receive_dropped_color (nautilus_get_widget_background (widget),
698                                                           widget, x, y, selection_data);
699                break;
700               
701        default:
702                g_warning ("unknown drop type");
703                break;
704        }
705}
Note: See TracBrowser for help on using the browser.