uriloader/exthandler/unix/nsMIMEInfoUnix.cpp

Wed, 31 Dec 2014 07:53:36 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 07:53:36 +0100
branch
TOR_BUG_3246
changeset 5
4ab42b5ab56c
permissions
-rw-r--r--

Correct small whitespace inconsistency, lost while renaming variables.

     1 /* -*- Mode: C++; tab-width: 3; indent-tabs-mode: nil; c-basic-offset: 2 -*-
     2  *
     3  * This Source Code Form is subject to the terms of the Mozilla Public
     4  * License, v. 2.0. If a copy of the MPL was not distributed with this
     5  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     7 #ifdef MOZ_WIDGET_QT
     8 #include <QDesktopServices>
     9 #include <QUrl>
    10 #include <QString>
    11 #if (MOZ_ENABLE_CONTENTACTION)
    12 #include <contentaction/contentaction.h>
    13 #include "nsContentHandlerApp.h"
    14 #endif
    15 #endif
    17 #include "nsMIMEInfoUnix.h"
    18 #include "nsGNOMERegistry.h"
    19 #include "nsIGIOService.h"
    20 #include "nsNetCID.h"
    21 #include "nsIIOService.h"
    22 #include "nsIGnomeVFSService.h"
    23 #include "nsAutoPtr.h"
    24 #ifdef MOZ_ENABLE_DBUS
    25 #include "nsDBusHandlerApp.h"
    26 #endif
    28 nsresult
    29 nsMIMEInfoUnix::LoadUriInternal(nsIURI * aURI)
    30 {
    31   nsresult rv = nsGNOMERegistry::LoadURL(aURI);
    33 #ifdef MOZ_WIDGET_QT
    34   if (NS_FAILED(rv)) {
    35     nsAutoCString spec;
    36     aURI->GetAsciiSpec(spec);
    37     if (QDesktopServices::openUrl(QUrl(spec.get()))) {
    38       rv = NS_OK;
    39     }
    40   }
    41 #endif
    43   return rv;
    44 }
    46 NS_IMETHODIMP
    47 nsMIMEInfoUnix::GetHasDefaultHandler(bool *_retval)
    48 {
    49   // if mDefaultApplication is set, it means the application has been set from
    50   // either /etc/mailcap or ${HOME}/.mailcap, in which case we don't want to
    51   // give the GNOME answer.
    52   if (mDefaultApplication)
    53     return nsMIMEInfoImpl::GetHasDefaultHandler(_retval);
    55   *_retval = false;
    57   if (mClass ==  eProtocolInfo) {
    58     *_retval = nsGNOMERegistry::HandlerExists(mSchemeOrType.get());
    59   } else {
    60     nsRefPtr<nsMIMEInfoBase> mimeInfo = nsGNOMERegistry::GetFromType(mSchemeOrType);
    61     if (!mimeInfo) {
    62       nsAutoCString ext;
    63       nsresult rv = GetPrimaryExtension(ext);
    64       if (NS_SUCCEEDED(rv)) {
    65         mimeInfo = nsGNOMERegistry::GetFromExtension(ext);
    66       }
    67     }
    68     if (mimeInfo)
    69       *_retval = true;
    70   }
    72   if (*_retval)
    73     return NS_OK;
    75 #if defined(MOZ_ENABLE_CONTENTACTION)
    76   ContentAction::Action action = 
    77     ContentAction::Action::defaultActionForFile(QUrl(), QString(mSchemeOrType.get()));
    78   if (action.isValid()) {
    79     *_retval = true;
    80     return NS_OK;
    81   }
    82 #endif
    84   return NS_OK;
    85 }
    87 nsresult
    88 nsMIMEInfoUnix::LaunchDefaultWithFile(nsIFile *aFile)
    89 {
    90   // if mDefaultApplication is set, it means the application has been set from
    91   // either /etc/mailcap or ${HOME}/.mailcap, in which case we don't want to
    92   // give the GNOME answer.
    93   if (mDefaultApplication)
    94     return nsMIMEInfoImpl::LaunchDefaultWithFile(aFile);
    96   nsAutoCString nativePath;
    97   aFile->GetNativePath(nativePath);
    99 #if defined(MOZ_ENABLE_CONTENTACTION)
   100   QUrl uri = QUrl::fromLocalFile(QString::fromUtf8(nativePath.get()));
   101   ContentAction::Action action =
   102     ContentAction::Action::defaultActionForFile(uri, QString(mSchemeOrType.get()));
   103   if (action.isValid()) {
   104     action.trigger();
   105     return NS_OK;
   106   }
   107   return NS_ERROR_FAILURE;
   108 #endif
   110   nsCOMPtr<nsIGIOService> giovfs = do_GetService(NS_GIOSERVICE_CONTRACTID);
   111   nsAutoCString uriSpec;
   112   if (giovfs) {
   113     // nsGIOMimeApp->Launch wants a URI string instead of local file
   114     nsresult rv;
   115     nsCOMPtr<nsIIOService> ioservice = do_GetService(NS_IOSERVICE_CONTRACTID, &rv);
   116     NS_ENSURE_SUCCESS(rv, rv);
   117     nsCOMPtr<nsIURI> uri;
   118     rv = ioservice->NewFileURI(aFile, getter_AddRefs(uri));
   119     NS_ENSURE_SUCCESS(rv, rv);
   120     uri->GetSpec(uriSpec);
   121   }
   123   nsCOMPtr<nsIGnomeVFSService> gnomevfs = do_GetService(NS_GNOMEVFSSERVICE_CONTRACTID);
   124   if (giovfs) {
   125     nsCOMPtr<nsIGIOMimeApp> app;
   126     if (NS_SUCCEEDED(giovfs->GetAppForMimeType(mSchemeOrType, getter_AddRefs(app))) && app)
   127       return app->Launch(uriSpec);
   128   } else if (gnomevfs) {
   129     /* Fallback to GnomeVFS */
   130     nsCOMPtr<nsIGnomeVFSMimeApp> app;
   131     if (NS_SUCCEEDED(gnomevfs->GetAppForMimeType(mSchemeOrType, getter_AddRefs(app))) && app)
   132       return app->Launch(nativePath);
   133   }
   135   // If we haven't got an app we try to get a valid one by searching for the
   136   // extension mapped type
   137   nsRefPtr<nsMIMEInfoBase> mimeInfo = nsGNOMERegistry::GetFromExtension(nativePath);
   138   if (mimeInfo) {
   139     nsAutoCString type;
   140     mimeInfo->GetType(type);
   141     if (giovfs) {
   142       nsCOMPtr<nsIGIOMimeApp> app;
   143       if (NS_SUCCEEDED(giovfs->GetAppForMimeType(type, getter_AddRefs(app))) && app)
   144         return app->Launch(uriSpec);
   145     } else if (gnomevfs) {
   146       nsCOMPtr<nsIGnomeVFSMimeApp> app;
   147       if (NS_SUCCEEDED(gnomevfs->GetAppForMimeType(type, getter_AddRefs(app))) && app)
   148         return app->Launch(nativePath);
   149     }
   150   }
   152   if (!mDefaultApplication)
   153     return NS_ERROR_FILE_NOT_FOUND;
   155   return LaunchWithIProcess(mDefaultApplication, nativePath);
   156 }
   158 #if defined(MOZ_ENABLE_CONTENTACTION)
   159 NS_IMETHODIMP
   160 nsMIMEInfoUnix::GetPossibleApplicationHandlers(nsIMutableArray ** aPossibleAppHandlers)
   161 {
   162   if (!mPossibleApplications) {
   163     mPossibleApplications = do_CreateInstance(NS_ARRAY_CONTRACTID);
   165     if (!mPossibleApplications)
   166       return NS_ERROR_OUT_OF_MEMORY;
   168     QList<ContentAction::Action> actions =
   169       ContentAction::Action::actionsForFile(QUrl(), QString(mSchemeOrType.get()));
   171     for (int i = 0; i < actions.size(); ++i) {
   172       nsContentHandlerApp* app =
   173         new nsContentHandlerApp(nsString((char16_t*)actions[i].name().data()), 
   174                                 mSchemeOrType, actions[i]);
   175       mPossibleApplications->AppendElement(app, false);
   176     }
   177   }
   179   *aPossibleAppHandlers = mPossibleApplications;
   180   NS_ADDREF(*aPossibleAppHandlers);
   181   return NS_OK;
   182 }
   183 #endif

mercurial