PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : GNOME-VFS: Objektlebenszyklus



anda_skoa
02-09-2005, 14:49
Vielleicht kann mir jemand von den Glib/GTK/GNOME Entwicklern weiterhelfen:

Hab folgendes Beispiel unter Verwendung der libgnomevfs:


int main (int argc, char **argv)
{
const char *output_uri_string = argv[1];
GnomeVFSResult result;

/* remember to initialize GnomeVFS! */
if (!gnome_vfs_init ()) {
printf ("Could not initialize GnomeVFS\n");
return 1;
}

GnomeVFSURI* output_uri = gnome_vfs_uri_new(output_uri_string);
const char* mime_type = gnome_vfs_get_mime_type_from_uri(output_uri);
gnome_vfs_uri_unref(output_uri);

printf("mimeType = '%s'\n", mime_type);

GnomeVFSMimeApplication* default_app =
gnome_vfs_mime_get_default_application(mime_type);

printf("app = '%s'\n", default_app->name);

gnome_vfs_mime_application_free (default_app);

return 0;
}


Ich bin mir da als C++ Programmierer nicht ganz sicher, ob ich alle simulierten Objekte richtig wieder frei gebe, also speziell das uri_unref

Ist das so ausreichend um kein Memory Leak zu bekommen, oder gibt es eine passende Pseudodesktruktorfunktion wie gnome_vfs_mime_application_free für das GnomeVFSMimeApplication Objekt?

Ciao,
_

anda_skoa
10-09-2005, 14:35
Ich werde mal davon ausgehen, daß so alles seine Richtigkeit hat.

Dieses simulierte OOP scheint selbst den GTK+ Leuten hier im Forum nicht ganz geheuert zu sein :)

Ciao,
_

[0x[90]|
11-09-2005, 14:53
Jopp, gnome_vfs_mime_application_free() gibt es, und es sollte auch verwendet werden. :)

anda_skoa
11-09-2005, 16:52
Alles ein Frage des Köders ;)

Das benutzt ich eh.
NIcht ganz sicher war ich mir bezüglich des


gnome_vfs_uri_unref(output_uri);

aber ich konnte kein gnome_vfs_uri_free finden.

Ciao,
_

[0x[90]|
11-09-2005, 18:29
Ot; Warst du nicht einmal KDE entwickler? Wie kommt man da zur Verwendung von GVFS?

anda_skoa
11-09-2005, 19:31
Ich bin nach wie vor KDE Entwickler.

Aber ich brauche für mein QDS Projekt auch ein GNOME Plugin weil das sonst ziemlich einseitig wäre.

Der GNOME-VFS basierte Launcher war gar nicht so schwierig und funktioniert auch fast immer.
Falls du eine Idee hast, warum URL wie http://www.gnome.org/ nicht gestartet werden können, bzw wie man die anders behandeln muß, wäre ich sehr interessiert.

Wenn ich dann mal rausgefunden habe wie man eine Liste der von GNOME-VFS unterstützten Protokolle bekommt, versuch ich vielleicht auch noch die Network Implementierung.

Hilfe jederzeit willkommen :)

Ciao,
_

[0x[90]|
11-09-2005, 22:16
Schau dir dazu einmal vllt. die Sourcen des Programms "gnome-open" an. Dieses liest aus den Default-Einstellungen von Gnome den vom Benutzer gewaehlten Browser (oder was auch immer) und oeffnet die URL dann damit. Schau dir auch beispielsweise einmal gEdit oder eine andere Gnome Anwendung die GnomeVFS-HTTP unterstuetzt an. gEdit kann Text-Dateien ueber HTTP oeffnen. :)

anda_skoa
12-09-2005, 12:24
Hast du für gnome-open vielleicht einen Link ins GNOME CVS?

Es geht auch nur um URLs, die in Verzeichnissen enden, solche die in Dateien enden funktionieren einwandfrei.

Ciao,
_

[0x[90]|
12-09-2005, 14:29
Sicher, hier (http://cvs.gnome.org/viewcvs/libgnome/libgnome/gnome-open.c?rev=1.2&view=markup), bitte. :)

Bye

anda_skoa
12-09-2005, 21:59
Danke.

Sieht nicht viel anders aus als das was ich habe, nur daß ich gnome_vfs_url_show statt gnome_url_show benutze:


#include <libgnomevfs/gnome-vfs.h>

#include <stdio.h>

int print_error (GnomeVFSResult result, const char *uri_string);

int
main (int argc, char **argv)
{
if (argc < 2)
{
printf("given an URI as commandline parameter 1\n");
return 1;
}

const char *uri_string = gnome_vfs_make_uri_from_input(argv[1]);
GnomeVFSResult result;

if (!gnome_vfs_init ()) {
printf ("Could not initialize GnomeVFS\n");
return 1;
}

printf("trying gnome_vfs_url_show(%s)...\n",
gnome_vfs_format_uri_for_display(uri_string));

result = gnome_vfs_url_show(uri_string);

if (result != GNOME_VFS_OK) return print_error(result, uri_string);
printf("SUCCESS!!\n");

return 0;
}

int
print_error (GnomeVFSResult result, const char *uri_string)
{
const char *error_string = gnome_vfs_result_to_string (result);
printf ("Error '%s' occured opening location '%s'\n", error_string, uri_string
);
return 1;
}


Vielleicht liegt es auch nur an meinem Setup, könntest du es mal ausprobieren?
Ich benutzen zum kompilieren


gcc -Wall $(pkg-config --cflags --libs gnome-vfs-2.0) -o url_show url_show.c


Ciao,
_

[0x[90]|
12-09-2005, 22:23
gcc -Wall ./test.c `pkg-config --cflags --libs gnome-vfs-2.0` -o test


Funktioniert bei mir einwandfrei.



[devilx@xeno][~/Desktop] ./test http://www.example.com
trying gnome_vfs_url_show(http://www.example.com)...
SUCCESS!!
[devilx@xeno][~/Desktop]


Und es oeffnet sich ein neues Browsertab :)

anda_skoa
13-09-2005, 11:24
Dann liegt es vielleicht bei mir nur am Setup.

Danke fürs Ausprobieren.

Ich verwende in meinem GNOME-VFS Launcher eine leicht andere Methode.
Ich werd versuchen das auch in ein kleines Beispiel zu extrahieren und vielleicht könntest du das dann auch nochmal testen.

Bzw, falls ich dich dazu bewegen könnte das Qt-devel Paket zu installieren, gleich QDS? ;)

Ciao,
_

[0x[90]|
13-09-2005, 15:05
Testen kann ich es dir gerne, aber Qt Pakete kommen mir nicht auf mein Debian. Da meckert doch mein VRMS ;)

anda_skoa
13-09-2005, 21:09
|']Testen kann ich es dir gerne, aber Qt Pakete kommen mir nicht auf mein Debian. Da meckert doch mein VRMS ;)

Was ist ein VRMS?
Setzt das irgendwie apt-get remove --purge außer Kraft?

Das Beispiel funktionier bei mir hervorragend bei lokalen Files, oder zB http://www.gnome.org/about/why.html, aber nicht bei http://www.gnome.org/



#include <libgnomevfs/gnome-vfs.h>
#include <libgnomevfs/gnome-vfs-mime.h>
#include <libgnomevfs/gnome-vfs-mime-handlers.h>

#include <stdio.h>

int print_error (GnomeVFSResult result, const char *uri_string);

int
main (int argc, char **argv)
{
if (argc < 2)
{
printf("given an URI as commandline parameter 1\n");
return 1;
}

const char *uri_string = gnome_vfs_make_uri_from_input(argv[1]);
GnomeVFSResult result;

if (!gnome_vfs_init ()) {
printf ("Could not initialize GnomeVFS\n");
return 1;
}

GnomeVFSURI* uri = gnome_vfs_uri_new(uri_string);
const char* mime_type = gnome_vfs_get_mime_type_from_uri(uri);
gnome_vfs_uri_unref(uri);

printf("mime_type for (%s) = '%s'\n",
gnome_vfs_format_uri_for_display(uri_string),
mime_type);

GnomeVFSMimeApplication* default_app =
gnome_vfs_mime_get_default_application_for_uri(uri _string, mime_type);

printf("default app = '%s'\n", (default_app ? default_app->name : "NULL"));

GList* uri_list = 0;
uri_list = g_list_append(uri_list, uri);

result = gnome_vfs_mime_application_launch(default_app, uri_list);

g_list_free(uri_list);
gnome_vfs_mime_application_free(default_app);

if (result != GNOME_VFS_OK) return print_error(result, uri_string);
printf("SUCCESS!!\n");

return 0;
}


Ciao,
_

[0x[90]|
13-09-2005, 22:12
Woher hast du



#include <libgnomevfs/gnome-vfs-mime.h>


? Diese datei existiert bei mir nicht. Ausserdem ist in keiner der anderen Dateien die funktion



gnome_vfs_get_mime_type_from_uri


vorhanden.

anda_skoa
13-09-2005, 23:00
Im pkg-config heißt es gnome-vfs-module-2.0

Gefunden hab ich das hier:
http://developer.gnome.org/doc/API/2.0/gnome-vfs-2.0/gnome-vfs-20-gnome-vfs-mime.html#gnome-vfs-get-mime-type-from-uri

Ist vielleicht keine öffentliche API, so genau kenn ich mich da nicht aus, aber da es auf developer.gnome.org Teil der GNOME VFS Doku war, dachte ich ist ok.

Ciao,
_

[0x[90]|
18-09-2005, 13:27
Evtl. hast du eine neuere Version des GnomeVFS (nutzt du Experimental?), da bei mir die Funktion (noch?) nicht existiert.

anda_skoa
18-09-2005, 14:35
Nein, Debian/Sid

Außerdem ist es wie gesagt in einem Paket, da 2.0 heißt und in der API Doku auch nicht anders markiert ist.

Laut apt-file im Paket libgnomevfs2-dev

Aber vielleicht ist das von GNOME aus nicht richtig markiert worden oder funktioniert nicht weil es von ihnen aus experimental ist?

Ciao,
_