On Sat, 2008-02-02 at 14:57 +0200, Kostas Papadimas wrote: 
> Στις 02-02-2008, ημέρα Σαβ, και ώρα 12:40 +0200, ο/η Tsabolov Sergey
> έγραψε:
> > http://www.techteam.gr/index.php?showtopic=118719
> > 
> 
> Δεν καταλαβαίνω. 
> 1)Αν όντως υπάρχει πρόβλημα ΠΟΥ ΕΙΝΑΙ ΤΟ ΕΠΙΣΗΜΟ ΒUG REPORT?
> 2)OK το να προτείνει κάποιος script είναι θεμιτό, αλλά ποιός αφελής
> χρήστης εκτελεί αυτά scripts?
> 
> Αν και οι προθέσεις αυτού του χρήστη είναι αγνές, το γεγονός ότι δεν
> έχει υποβάλλει bug report (η δεν έχει link σε αυτό αν υπάρχει ήδη) είναι
> επιεικώς ανήθικο ..
> 

Τι κάνει πραγματικά ο Ναυτίλος όταν επιλέγουμε αποπροσάρτηση ή εξαγωγή;

Ο πηγαίος κώδικας του Ναυτίλου βρίκεται στο 
http://svn.gnome.org/viewvc/nautilus/trunk/

Πως εντοπίζουμε που πρέπει να κοιτάξουμε μέσα σε τόσο πηγαίο κώδικα;
Ξεκινούμε από το μήνυμα που εμφανίζεται κατά την αποπροσάρτηση. Σε
αγγλικό GNOME είναι "_Unmount Volume" ενώ σε ελληνικό είναι
"Αποπρο_σάρτηση τόμου" (ο επόμενος χαρακτήτας μετά το _ είναι ο
χαρακτήτας συντόμευσης).
Εντοπίζουμε την ελληνική μετάφραση μέσα στον πηγαίο κώδικα· είναι στον
υποκατάλογο po/, αρχείο el.po.
Δηλαδή,
http://svn.gnome.org/viewvc/nautilus/trunk/po/el.po?view=annotate
Είναι στη σειρά 3618. Βλέπουμε και ότι το συγκεκριμένο μήνυμα το
μετέφρασε ο Νίκος Χαρωνιτάκης.
Στα σχόλια του μηνύματος αναφέρει
#: ../src/file-manager/fm-directory-view.c:6266 3615
#: ../src/file-manager/fm-directory-view.c:6282 3616
#: ../src/file-manager/fm-tree-view.c:753

Δηλαδή μπορούμε να προχωρήσουμε στα αρχεία αυτά (+γραμμή) να δούμε τι
ακριβώς γίνεται. Η απάντηση βρίσκεται στο fm-tree-view.c,
http://svn.gnome.org/viewvc/nautilus/trunk/src/file-manager/fm-tree-view.c?view=annotate

Στη γραμμή 753 λέει

gtk_label_set_text (GTK_LABEL (GTK_BIN (GTK_MENU_ITEM
(view->details->popup_unmount))->child), unmount_is_eject?
_("E_ject"):_("_Unmount Volume"));

Ίσως είναι ακαταλαβίστικο, η ουσία βρίσκεται στο 
unmount_is_eject? _("E_ject"):_("_Unmount Volume")

που είναι κάπως ισοδύναμο με

if (unmount_is_eject) 
        return _("E_ject")
else
        return _("_Unmount Volume")

Δηλαδή το αν θα κάνει αποπροσάρτητη ή εξαγωγή το καθορίζει η μεταβλητή
unmount_is_eject. Η μεταβλητή αυτή παίρνει τιμή στις παραπάνω γραμμές:

[747]   show_unmount = g_mount_can_unmount (mount) || g_mount_can_eject
                                                        (mount); 
        /* TODO: show both unmount and eject if there are more than one
                volume for the drive */ 
        unmount_is_eject = g_mount_can_eject (mount);

Δηλαδή αν θα εμφανίζεται η επιλογή "Αποπροσάρτηση τόμου" γίνεται με
έλεγχο αν οι συσκευές έχουν νόημα για αποπροσάρτηση. Τώρα, αν η
αποπροσάρτηση θα έχει την έννοια της εξαγωγής (δηλαδή ο χρήστης βλέπει
πάντα Αποπροσάρτηση, αλλά στις κατάλληλες φορές η αποπροσάρτηση θα είναι
η λειτουργία της Εξαγωγής), το καθορίζει η συνάρτηση
g_mount_can_eject().

Οι συναρτήσεις με όνομα g_xxxxxxx() προέρχονται από τη βιβλιοθήκη GLib,
http://svn.gnome.org/viewvc/glib/trunk/
και η συγκεκριμένη συνάρτηση προέρχεται από το αρχείο
http://svn.gnome.org/viewvc/glib/trunk/gio/gmount.c?view=annotate
Θα αφήσουμε για τώρα τον τρόπο καθορισμού για το αν κάποια συσκευή
μπορεί να αποπροσαρτηστεί ή όχι. Όπως ειναι τώρα, δεν υπάρχει ένδειξη
στον τελικό χρήστη αν θα γίνει εξαγωγή ή σκέτη αποπροσάρτηση.

Κοιτώντας στο αρχικό αρχείο για την εντολή που κάνει πραγματικά την
αποπροσάρτηση/εξαγωγή, βλέπουμε ότι είναι η 
nautilus_file_operations_unmount_mount().
Που θα βρούμε την εντολή αυτή σε όλο τον κώδικα του Ναυτίλου;
Δοκιμάζουμε με Google και βρίσκουμε
http://mail.gnome.org/archives/svn-commits-list/2008-January/msg04806.html

Εδώ γίνονται μια σειρά από βήματα αναζήτησης που οδηγούν τελικά στο
αρχείο
http://svn.gnome.org/viewvc/glib/trunk/gio/gunixvolume.c?view=annotate
και στη γραμμή 417,

[417]           char *argv[] = {"eject", NULL, NULL};
                argv[1] = unix_volume->device_path;

Δηλαδή το σύστημα καλεί την εντολή "eject" με παράμετρο τη συσκευή που
θέλουμε να αποπροσαρτήσουμε.

Αν θέλουμε να δοκιμάσουμε με την εντολή sdparm, αρκεί να
αντικαταστήσουμε με 

[417]           char *argv[] = {"sdparm", "--command=stop", NULL, NULL};
                argv[2] = unix_volume->device_path;

Η εντολή sdparm λειτουργεί για όλες της συσκευές;
Θα ήταν καλύτερη να έχουμε "unmount", "eject" αλλά και "poweroff";

Είναι καλό να γίνει αναφορά σφάλματος στο Bugzilla του GNOME, στο έργο
glib, συστατικό gio : http://bugzilla.gnome.org/browse.cgi?product=glib
Θέλει να το αναλάβει κάποιος;

Σίμος



-- 
Ubuntu-gr mailing list
Ubuntu-gr@lists.ubuntu.com
https://lists.ubuntu.com/mailman/listinfo/ubuntu-gr

Απαντηση