michael@0: /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #include "nsGnomeVFSService.h" michael@0: #include "nsStringAPI.h" michael@0: #include "nsIURI.h" michael@0: #include "nsTArray.h" michael@0: #include "nsIStringEnumerator.h" michael@0: #include "nsAutoPtr.h" michael@0: michael@0: extern "C" { michael@0: #include michael@0: #include michael@0: #include michael@0: } michael@0: michael@0: class nsGnomeVFSMimeApp MOZ_FINAL : public nsIGnomeVFSMimeApp michael@0: { michael@0: public: michael@0: NS_DECL_ISUPPORTS michael@0: NS_DECL_NSIGNOMEVFSMIMEAPP michael@0: michael@0: nsGnomeVFSMimeApp(GnomeVFSMimeApplication* aApp) : mApp(aApp) {} michael@0: ~nsGnomeVFSMimeApp() { gnome_vfs_mime_application_free(mApp); } michael@0: michael@0: private: michael@0: GnomeVFSMimeApplication *mApp; michael@0: }; michael@0: michael@0: NS_IMPL_ISUPPORTS(nsGnomeVFSMimeApp, nsIGnomeVFSMimeApp) michael@0: michael@0: NS_IMETHODIMP michael@0: nsGnomeVFSMimeApp::GetId(nsACString& aId) michael@0: { michael@0: aId.Assign(mApp->id); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsGnomeVFSMimeApp::GetName(nsACString& aName) michael@0: { michael@0: aName.Assign(mApp->name); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsGnomeVFSMimeApp::GetCommand(nsACString& aCommand) michael@0: { michael@0: aCommand.Assign(mApp->command); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsGnomeVFSMimeApp::GetCanOpenMultipleFiles(bool* aCanOpen) michael@0: { michael@0: *aCanOpen = mApp->can_open_multiple_files; michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsGnomeVFSMimeApp::GetExpectsURIs(int32_t* aExpects) michael@0: { michael@0: *aExpects = mApp->expects_uris; michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsGnomeVFSMimeApp::Launch(const nsACString &aUri) michael@0: { michael@0: char *uri = gnome_vfs_make_uri_from_input(PromiseFlatCString(aUri).get()); michael@0: michael@0: if (! uri) michael@0: return NS_ERROR_FAILURE; michael@0: michael@0: GList uris = { 0 }; michael@0: uris.data = uri; michael@0: michael@0: GnomeVFSResult result = gnome_vfs_mime_application_launch(mApp, &uris); michael@0: g_free(uri); michael@0: michael@0: if (result != GNOME_VFS_OK) michael@0: return NS_ERROR_FAILURE; michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: class UTF8StringEnumerator MOZ_FINAL : public nsIUTF8StringEnumerator michael@0: { michael@0: public: michael@0: UTF8StringEnumerator() : mIndex(0) { } michael@0: ~UTF8StringEnumerator() { } michael@0: michael@0: NS_DECL_ISUPPORTS michael@0: NS_DECL_NSIUTF8STRINGENUMERATOR michael@0: michael@0: nsTArray mStrings; michael@0: uint32_t mIndex; michael@0: }; michael@0: michael@0: NS_IMPL_ISUPPORTS(UTF8StringEnumerator, nsIUTF8StringEnumerator) michael@0: michael@0: NS_IMETHODIMP michael@0: UTF8StringEnumerator::HasMore(bool *aResult) michael@0: { michael@0: *aResult = mIndex < mStrings.Length(); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: UTF8StringEnumerator::GetNext(nsACString& aResult) michael@0: { michael@0: if (mIndex >= mStrings.Length()) michael@0: return NS_ERROR_UNEXPECTED; michael@0: michael@0: aResult.Assign(mStrings[mIndex]); michael@0: ++mIndex; michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsGnomeVFSMimeApp::GetSupportedURISchemes(nsIUTF8StringEnumerator** aSchemes) michael@0: { michael@0: *aSchemes = nullptr; michael@0: michael@0: nsRefPtr array = new UTF8StringEnumerator(); michael@0: NS_ENSURE_TRUE(array, NS_ERROR_OUT_OF_MEMORY); michael@0: michael@0: for (GList *list = mApp->supported_uri_schemes; list; list = list->next) { michael@0: if (!array->mStrings.AppendElement((char*) list->data)) { michael@0: return NS_ERROR_OUT_OF_MEMORY; michael@0: } michael@0: } michael@0: michael@0: NS_ADDREF(*aSchemes = array); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsGnomeVFSMimeApp::GetRequiresTerminal(bool* aRequires) michael@0: { michael@0: *aRequires = mApp->requires_terminal; michael@0: return NS_OK; michael@0: } michael@0: michael@0: nsresult michael@0: nsGnomeVFSService::Init() michael@0: { michael@0: return gnome_vfs_init() ? NS_OK : NS_ERROR_FAILURE; michael@0: } michael@0: michael@0: NS_IMPL_ISUPPORTS(nsGnomeVFSService, nsIGnomeVFSService) michael@0: michael@0: NS_IMETHODIMP michael@0: nsGnomeVFSService::GetMimeTypeFromExtension(const nsACString &aExtension, michael@0: nsACString& aMimeType) michael@0: { michael@0: nsAutoCString fileExtToUse("."); michael@0: fileExtToUse.Append(aExtension); michael@0: michael@0: const char *mimeType = gnome_vfs_mime_type_from_name(fileExtToUse.get()); michael@0: aMimeType.Assign(mimeType); michael@0: michael@0: // |mimeType| points to internal gnome-vfs data, so don't free it. michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsGnomeVFSService::GetAppForMimeType(const nsACString &aMimeType, michael@0: nsIGnomeVFSMimeApp** aApp) michael@0: { michael@0: *aApp = nullptr; michael@0: GnomeVFSMimeApplication *app = michael@0: gnome_vfs_mime_get_default_application(PromiseFlatCString(aMimeType).get()); michael@0: michael@0: if (app) { michael@0: nsGnomeVFSMimeApp *mozApp = new nsGnomeVFSMimeApp(app); michael@0: NS_ENSURE_TRUE(mozApp, NS_ERROR_OUT_OF_MEMORY); michael@0: michael@0: NS_ADDREF(*aApp = mozApp); michael@0: } michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsGnomeVFSService::GetDescriptionForMimeType(const nsACString &aMimeType, michael@0: nsACString& aDescription) michael@0: { michael@0: const char *desc = michael@0: gnome_vfs_mime_get_description(PromiseFlatCString(aMimeType).get()); michael@0: aDescription.Assign(desc); michael@0: michael@0: // |desc| points to internal gnome-vfs data, so don't free it. michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsGnomeVFSService::ShowURI(nsIURI *aURI) michael@0: { michael@0: nsAutoCString spec; michael@0: aURI->GetSpec(spec); michael@0: michael@0: if (gnome_vfs_url_show_with_env(spec.get(), nullptr) == GNOME_VFS_OK) michael@0: return NS_OK; michael@0: michael@0: return NS_ERROR_FAILURE; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsGnomeVFSService::ShowURIForInput(const nsACString &aUri) michael@0: { michael@0: char* spec = gnome_vfs_make_uri_from_input(PromiseFlatCString(aUri).get()); michael@0: nsresult rv = NS_ERROR_FAILURE; michael@0: michael@0: if (gnome_vfs_url_show_with_env(spec, nullptr) == GNOME_VFS_OK) michael@0: rv = NS_OK; michael@0: michael@0: g_free(spec); michael@0: return rv; michael@0: }