[OS/2] Bug 305061: use RWS to improve platform integration on OS/2 (base RWS support and helper app handling), p=Rich Walsh and me, testing=abwillis1,daveryeo,wuno, r=mkaply

This commit is contained in:
mozilla%weilbacher.org 2008-01-09 22:24:07 +00:00
Родитель 9fc33eef9e
Коммит e3f7b3d3ae
12 изменённых файлов: 2046 добавлений и 84 удалений

Просмотреть файл

@ -21,6 +21,7 @@
#
# Contributor(s):
# Ben Goodger <ben@bengoodger.com>
# Rich Walsh <dragtext@e-vertise.com>
#
# Alternatively, the contents of this file may be used under the terms of
# either the GNU General Public License Version 2 or later (the "GPL"), or
@ -46,3 +47,20 @@ selectDownloadDir=Select Download Folder
unknownAccept.label=Save File
unknownCancel.label=Cancel
fileType=%S file
# LOCALIZATION NOTE (wpsDefaultOS2): OS/2 only, WPS refers to the Workplace Shell and should probably not be translated
wpsDefaultOS2=WPS Default
# LOCALIZATION NOTE (classViewerOS2): OS/2 only
classViewerOS2=Viewer for Class %S
# LOCALIZATION NOTE (mmImageViewerOS2): OS/2 only, default operation of image files with OS/2 multimedia support installed
mmImageViewerOS2=Image Viewer
# LOCALIZATION NOTE (mmAudioPlayerOS2): OS/2 only, default operation of audio files with OS/2 multimedia support installed
mmAudioPlayerOS2=Audio Player
# LOCALIZATION NOTE (mmVideoPlayerOS2): OS/2 only, default operation of video files with OS/2 multimedia support installed
mmVideoPlayerOS2=Video Player
# LOCALIZATION NOTE (mmMidiPlayerOS2): OS/2 only, default operation of MIDI files with OS/2 multimedia support installed
mmMidiPlayerOS2=MIDI Player
# LOCALIZATION NOTE (odZipFolderOS2): OS/2 only, refers to ZipFolder of Object Desktop
odZipFolderOS2=ZipFolder
# LOCALIZATION NOTE (odTextViewOS2): OS/2 only, refers to TextView of Object Desktop
odTextViewOS2=TextView

Просмотреть файл

@ -125,6 +125,7 @@ endif
ifeq ($(MOZ_WIDGET_TOOLKIT),os2)
OSHELPER += nsMIMEInfoOS2.cpp
REQUIRES += widget
endif
EXPORTS = \

Просмотреть файл

@ -1,6 +1,6 @@
/* -*- Mode: C++; tab-width: 3; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* ***** BEGIN LICENSE BLOCK *****
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set sw=2 sts=2 et cin: */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
@ -24,6 +24,8 @@
* Scott MacGregor <mscott@netscape.com>
* Boris Zbarsky <bzbarsky@mit.edu> (Added mailcap and mime.types support)
* Christian Biesinger <cbiesinger@web.de>
* Rich Walsh <dragtext@e-vertise.com>
* Peter Weilbacher <mozilla@Weilbacher.org>
*
* Alternatively, the contents of this file may be used under the terms of
* either of the GNU General Public License Version 2 or later (the "GPL"),
@ -39,14 +41,26 @@
*
* ***** END LICENSE BLOCK ***** */
#ifdef MOZ_OS2_HIGH_MEMORY
// os2safe.h has to be included before os2.h, needed for high mem
#include <os2safe.h>
#endif
#include "nsMIMEInfoOS2.h"
#include "nsOSHelperAppService.h"
#include "nsExternalHelperAppService.h"
#include "nsCExternalHandlerService.h"
#include "nsReadableUtils.h"
#include "nsIProcess.h"
#include "nsNetUtil.h"
#include "nsDirectoryServiceDefs.h"
#include "nsIVariant.h"
#include "nsArrayEnumerator.h"
#include "nsIRwsService.h"
#include <stdlib.h>
//------------------------------------------------------------------------
#define SALT_SIZE 8
#define TABLE_SIZE 36
static const PRUnichar table[] =
@ -55,23 +69,72 @@ static const PRUnichar table[] =
'u','v','w','x','y','z','0','1','2','3',
'4','5','6','7','8','9'};
// reduces overhead by preventing calls to nsRwsService when it isn't present
static PRBool sUseRws = PR_TRUE;
//------------------------------------------------------------------------
NS_IMPL_ISUPPORTS_INHERITED1(nsMIMEInfoOS2, nsMIMEInfoBase, nsIPropertyBag)
nsMIMEInfoOS2::~nsMIMEInfoOS2()
{
}
NS_IMETHODIMP nsMIMEInfoOS2::LaunchWithURI(nsIURI* aURI,
nsIInterfaceRequestor* aWindowContext)
//------------------------------------------------------------------------
// if the helper application is a DOS app, create an 8.3 filename
static nsresult Make8Dot3Name(nsIFile *aFile, nsACString& aPath)
{
nsCAutoString leafName;
aFile->GetNativeLeafName(leafName);
const char *lastDot = strrchr(leafName.get(), '.');
char suffix[8] = "";
if (lastDot) {
strncpy(suffix, lastDot, 4);
suffix[4] = '\0';
}
nsCOMPtr<nsIFile> tempPath;
nsresult rv = NS_GetSpecialDirectory(NS_OS_TEMP_DIR, getter_AddRefs(tempPath));
NS_ENSURE_SUCCESS(rv, rv);
nsAutoString saltedTempLeafName;
do {
saltedTempLeafName.Truncate();
// this salting code was ripped directly from the profile manager.
// turn PR_Now() into milliseconds since epoch 1058 & salt rand with that
double fpTime;
LL_L2D(fpTime, PR_Now());
srand((uint)(fpTime * 1e-6 + 0.5));
for (PRInt32 i=0; i < SALT_SIZE; i++)
saltedTempLeafName.Append(table[(rand()%TABLE_SIZE)]);
AppendASCIItoUTF16(suffix, saltedTempLeafName);
rv = aFile->CopyTo(tempPath, saltedTempLeafName);
} while (NS_FAILED(rv));
nsCOMPtr<nsPIExternalAppLauncher>
helperAppService(do_GetService(NS_EXTERNALHELPERAPPSERVICE_CONTRACTID));
if (!helperAppService)
return NS_ERROR_FAILURE;
tempPath->Append(saltedTempLeafName);
helperAppService->DeleteTemporaryFileOnExit(tempPath);
tempPath->GetNativePath(aPath);
return rv;
}
//------------------------------------------------------------------------
// opens a file using the selected program or WPS object
NS_IMETHODIMP nsMIMEInfoOS2::LaunchWithFile(nsIFile *aFile)
{
nsresult rv = NS_OK;
nsCOMPtr<nsILocalFile> docToLoad;
rv = GetLocalFileFromURI(aURI, getter_AddRefs(docToLoad));
NS_ENSURE_SUCCESS(rv, rv);
nsCAutoString path;
docToLoad->GetNativePath(path);
nsCOMPtr<nsIFile> application;
if (mPreferredAction == useHelperApp) {
nsCOMPtr<nsILocalHandlerApp> localHandlerApp =
@ -86,73 +149,152 @@ NS_IMETHODIMP nsMIMEInfoOS2::LaunchWithURI(nsIURI* aURI,
return NS_ERROR_INVALID_ARG;
}
// The nsIMIMEInfo should have either the default or preferred
// application handler attribute set to match the preferredAction!
nsCAutoString filePath;
aFile->GetNativePath(filePath);
// if there's no program, use the WPS to open the file
if (!application) {
HOBJECT hobject = WinQueryObject(path.get());
if (WinSetObjectData( hobject, "OPEN=DEFAULT" ))
return NS_OK;
else
return NS_ERROR_FAILURE;
rv = NS_ERROR_FAILURE;
// if RWS is enabled, see if nsOSHelperAppService provided a handle for
// the app associated with this file; if so, use it to open the file;
if (sUseRws) {
PRUint32 appHandle;
GetDefaultAppHandle(&appHandle);
if (appHandle) {
nsCOMPtr<nsIRwsService> rwsSvc(do_GetService("@mozilla.org/rwsos2;1"));
if (!rwsSvc) {
sUseRws = PR_FALSE;
} else {
// this call is identical to dropping the file on a program's icon;
// it ensures filenames with multiple dots are handled correctly
rv = rwsSvc->OpenWithAppHandle(filePath.get(), appHandle);
}
}
}
// if RWS isn't present or fails, open it using a PM call
if (NS_FAILED(rv)) {
if (WinSetObjectData(WinQueryObject(filePath.get()), "OPEN=DEFAULT"))
rv = NS_OK;
}
return rv;
}
// open the data file using the specified program file
nsCAutoString appPath;
if (application) {
application->GetNativePath(appPath);
}
ULONG ulAppType;
nsCAutoString apppath;
application->GetNativePath(apppath);
DosQueryAppType(apppath.get(), &ulAppType);
DosQueryAppType(appPath.get(), &ulAppType);
if (ulAppType & (FAPPTYP_DOS |
FAPPTYP_WINDOWSPROT31 |
FAPPTYP_WINDOWSPROT |
FAPPTYP_WINDOWSREAL)) {
// if the helper application is a DOS app, create an 8.3 filename
// we do this even if the filename is valid because it's 8.3, who cares
nsCOMPtr<nsPIExternalAppLauncher> helperAppService (do_GetService(NS_EXTERNALHELPERAPPSERVICE_CONTRACTID));
if (helperAppService)
{
nsCAutoString leafName;
docToLoad->GetNativeLeafName(leafName);
const char* lastDot = strrchr(leafName.get(), '.');
char suffix[CCHMAXPATH + 1] = "";
if (lastDot)
{
strcpy(suffix, lastDot);
}
suffix[4] = '\0';
nsAutoString saltedTempLeafName;
do {
saltedTempLeafName.Truncate();
// this salting code was ripped directly from the profile manager.
// turn PR_Now() into milliseconds since epoch 1058 // and salt rand with that.
double fpTime;
LL_L2D(fpTime, PR_Now());
srand((uint)(fpTime * 1e-6 + 0.5));
PRInt32 i;
for (i=0;i<SALT_SIZE;i++) {
saltedTempLeafName.Append(table[(rand()%TABLE_SIZE)]);
}
AppendASCIItoUTF16(suffix, saltedTempLeafName);
rv = docToLoad->MoveTo(nsnull, saltedTempLeafName);
} while (NS_FAILED(rv));
helperAppService->DeleteTemporaryFileOnExit(docToLoad);
docToLoad->GetNativePath(path);
}
} else {
path.Insert('\"', 0);
path.Append('\"');
rv = Make8Dot3Name(aFile, filePath);
NS_ENSURE_SUCCESS(rv, rv);
}
const char * strPath = path.get();
// if we were given an application to use then use it....otherwise
// make the registry call to launch the app
nsCOMPtr<nsIProcess> process = do_CreateInstance(NS_PROCESS_CONTRACTID);
if (NS_FAILED(rv = process->Init(application)))
return rv;
PRUint32 pid;
return process->Run(PR_FALSE, &strPath, 1, &pid);
filePath.Insert('\"', 0);
filePath.Append('\"');
// if RWS is enabled, have the WPS open the file using the selected app;
// this lets the user specify commandline args in the exe's WPS notebook
rv = NS_ERROR_FAILURE;
if (sUseRws) {
nsCOMPtr<nsIRwsService> rwsSvc(do_GetService("@mozilla.org/rwsos2;1"));
if (!rwsSvc) {
sUseRws = PR_FALSE;
} else {
rv = rwsSvc->OpenWithAppPath(filePath.get(), appPath.get());
}
}
// if RWS isn't present or fails, use Moz facilities to run the program
if (NS_FAILED(rv)) {
nsCOMPtr<nsIProcess> process = do_CreateInstance(NS_PROCESS_CONTRACTID);
if (NS_FAILED(rv = process->Init(application)))
return rv;
const char *strPath = filePath.get();
PRUint32 pid;
return process->Run(PR_FALSE, &strPath, 1, &pid);
}
return rv;
}
nsresult nsMIMEInfoOS2::LoadUriInternal(nsIURI* aURL)
//------------------------------------------------------------------------
// if there's a description, there's a handler (which may be the WPS)
NS_IMETHODIMP nsMIMEInfoOS2::GetHasDefaultHandler(PRBool *_retval)
{
*_retval = !mDefaultAppDescription.IsEmpty();
return NS_OK;
}
//------------------------------------------------------------------------
// copied directly from nsMIMEInfoImpl
NS_IMETHODIMP
nsMIMEInfoOS2::GetDefaultDescription(nsAString& aDefaultDescription)
{
if (mDefaultAppDescription.IsEmpty() && mDefaultApplication)
mDefaultApplication->GetLeafName(aDefaultDescription);
else
aDefaultDescription = mDefaultAppDescription;
return NS_OK;
}
//------------------------------------------------------------------------
// Get() is new, Set() is an override; they permit nsOSHelperAppService
// to reorder the default & preferred app handlers
void nsMIMEInfoOS2::GetDefaultApplication(nsIFile **aDefaultAppHandler)
{
*aDefaultAppHandler = mDefaultApplication;
NS_IF_ADDREF(*aDefaultAppHandler);
return;
}
void nsMIMEInfoOS2::SetDefaultApplication(nsIFile *aDefaultApplication)
{
mDefaultApplication = aDefaultApplication;
return;
}
//------------------------------------------------------------------------
// gets/sets the handle of the WPS object associated with this mimetype
void nsMIMEInfoOS2::GetDefaultAppHandle(PRUint32 *aHandle)
{
if (aHandle) {
if (mDefaultAppHandle <= 0x10000 || mDefaultAppHandle >= 0x40000)
mDefaultAppHandle = 0;
*aHandle = mDefaultAppHandle;
}
return;
}
void nsMIMEInfoOS2::SetDefaultAppHandle(PRUint32 aHandle)
{
if (aHandle <= 0x10000 || aHandle >= 0x40000)
mDefaultAppHandle = 0;
else
mDefaultAppHandle = aHandle;
return;
}
//------------------------------------------------------------------------
nsresult nsMIMEInfoOS2::LoadUriInternal(nsIURI *aURL)
{
nsresult rv;
nsCOMPtr<nsIPrefService> thePrefsService(do_GetService(NS_PREFSERVICE_CONTRACTID, &rv));
@ -409,3 +551,74 @@ nsresult nsMIMEInfoOS2::LoadUriInternal(nsIURI* aURL)
return NS_OK;
}
//------------------------------------------------------------------------
// nsIPropertyBag
//------------------------------------------------------------------------
NS_IMETHODIMP
nsMIMEInfoOS2::GetEnumerator(nsISimpleEnumerator **_retval)
{
nsCOMArray<nsIVariant> properties;
nsCOMPtr<nsIVariant> variant;
GetProperty(NS_LITERAL_STRING("defaultApplicationIconURL"), getter_AddRefs(variant));
if (variant)
properties.AppendObject(variant);
GetProperty(NS_LITERAL_STRING("customApplicationIconURL"), getter_AddRefs(variant));
if (variant)
properties.AppendObject(variant);
return NS_NewArrayEnumerator(_retval, properties);
}
//------------------------------------------------------------------------
NS_IMETHODIMP
nsMIMEInfoOS2::GetProperty(const nsAString& aName, nsIVariant **_retval)
{
nsresult rv = NS_ERROR_FAILURE;
if (aName.EqualsLiteral(PROPERTY_DEFAULT_APP_ICON_URL)) {
rv = GetIconURLVariant(mDefaultApplication, _retval);
} else {
if (aName.EqualsLiteral(PROPERTY_CUSTOM_APP_ICON_URL) &&
mPreferredApplication) {
// find file from handler
nsCOMPtr<nsIFile> appFile;
nsCOMPtr<nsILocalHandlerApp> localHandlerApp =
do_QueryInterface(mPreferredApplication, &rv);
NS_ENSURE_SUCCESS(rv, rv);
rv = localHandlerApp->GetExecutable(getter_AddRefs(appFile));
NS_ENSURE_SUCCESS(rv, rv);
rv = GetIconURLVariant(appFile, _retval);
}
}
return rv;
}
//------------------------------------------------------------------------
NS_IMETHODIMP
nsMIMEInfoOS2::GetIconURLVariant(nsIFile *aApplication, nsIVariant **_retval)
{
nsresult rv = CallCreateInstance("@mozilla.org/variant;1", _retval);
NS_ENSURE_SUCCESS(rv, rv);
nsCAutoString fileURLSpec;
if (aApplication)
NS_GetURLSpecFromFile(aApplication, fileURLSpec);
else {
GetPrimaryExtension(fileURLSpec);
fileURLSpec.Insert(NS_LITERAL_CSTRING("moztmp."), 0);
}
nsCAutoString iconURLSpec(NS_LITERAL_CSTRING("moz-icon://"));
iconURLSpec += fileURLSpec;
nsCOMPtr<nsIWritableVariant> writable(do_QueryInterface(*_retval));
writable->SetAsAUTF8String(iconURLSpec);
return NS_OK;
}

Просмотреть файл

@ -1,3 +1,5 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set sw=2 sts=2 et cin: */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
@ -19,6 +21,8 @@
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Rich Walsh <dragtext@e-vertise.com>
* Peter Weilbacher <mozilla@Weilbacher.org>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
@ -38,6 +42,7 @@
#define nsMIMEInfoOS2_h_
#include "nsMIMEInfoImpl.h"
#include "nsIPropertyBag.h"
#include "nsIPrefService.h"
#include "nsIPrefBranch.h"
@ -50,25 +55,43 @@
#define INCL_WINSHELLDATA
#include <os2.h>
class nsMIMEInfoOS2 : public nsMIMEInfoImpl
class nsMIMEInfoOS2 : public nsMIMEInfoBase, public nsIPropertyBag
{
public:
nsMIMEInfoOS2(const char* aType = "") : nsMIMEInfoImpl(aType) {}
nsMIMEInfoOS2(const nsACString& aMIMEType) : nsMIMEInfoImpl(aMIMEType) {}
nsMIMEInfoOS2(const char *aType = "") :
nsMIMEInfoBase(aType), mDefaultAppHandle(0) {}
nsMIMEInfoOS2(const nsACString& aMIMEType) :
nsMIMEInfoBase(aMIMEType), mDefaultAppHandle(0) {}
nsMIMEInfoOS2(const nsACString& aType, HandlerClass aClass) :
nsMIMEInfoImpl(aType, aClass) {}
nsMIMEInfoBase(aType, aClass), mDefaultAppHandle(0) {}
virtual ~nsMIMEInfoOS2();
NS_IMETHOD LaunchWithURI(nsIURI* aURI,
nsIInterfaceRequestor* aWindowContext);
NS_DECL_ISUPPORTS_INHERITED
NS_DECL_NSIPROPERTYBAG
NS_IMETHOD LaunchWithFile(nsIFile *aFile);
NS_IMETHOD GetHasDefaultHandler(PRBool *_retval);
NS_IMETHOD GetDefaultDescription(nsAString& aDefaultDescription);
void GetDefaultApplication(nsIFile **aDefaultAppHandler);
void SetDefaultApplication(nsIFile *aDefaultApplication);
void GetDefaultAppHandle(PRUint32 *aHandle);
void SetDefaultAppHandle(PRUint32 aHandle);
protected:
virtual NS_HIDDEN_(nsresult) LoadUriInternal(nsIURI *aURI);
#ifdef DEBUG
virtual NS_HIDDEN_(nsresult) LaunchDefaultWithFile(nsIFile* aFile) {
// XXX should we do most of the work here and let LaunchWithFile() call this?
virtual NS_HIDDEN_(nsresult) LaunchDefaultWithFile(nsIFile *aFile) {
NS_NOTREACHED("Do not call this, use LaunchWithFile");
return NS_ERROR_UNEXPECTED;
}
#endif
NS_IMETHOD GetIconURLVariant(nsIFile *aApplication, nsIVariant **_retval);
nsCOMPtr<nsIFile> mDefaultApplication;
PRUint32 mDefaultAppHandle;
};
#endif

Просмотреть файл

@ -1,6 +1,6 @@
/* -*- Mode: C++; tab-width: 3; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* ***** BEGIN LICENSE BLOCK *****
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set sw=2 sts=2 et cin: */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
@ -24,6 +24,7 @@
* Scott MacGregor <mscott@netscape.com>
* Boris Zbarsky <bzbarsky@mit.edu> (Added mailcap and mime.types support)
* Peter Weilbacher <mozilla@Weilbacher.org>
* Rich Walsh <dragtext@e-vertise.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either of the GNU General Public License Version 2 or later (the "GPL"),
@ -57,8 +58,16 @@
#include "prenv.h" // for PR_GetEnv()
#include "nsMIMEInfoOS2.h"
#include "nsAutoPtr.h"
#include "nsIRwsService.h"
#include "nsIStringBundle.h"
#include "nsLocalHandlerApp.h"
#include <stdlib.h> // for system()
//------------------------------------------------------------------------
// reduces overhead by preventing calls to nsRws when it isn't present
static PRBool sUseRws = PR_TRUE;
static nsresult
FindSemicolon(nsAString::const_iterator& aSemicolon_iter,
const nsAString::const_iterator& aEnd_iter);
@ -73,6 +82,8 @@ ParseMIMEType(const nsAString::const_iterator& aStart_iter,
inline PRBool
IsNetscapeFormat(const nsACString& aBuffer);
//------------------------------------------------------------------------
nsOSHelperAppService::nsOSHelperAppService() : nsExternalHelperAppService()
{
}
@ -1345,6 +1356,212 @@ nsOSHelperAppService::GetFromType(const nsCString& aMIMEType) {
return mimeInfo;
}
//------------------------------------------------------------------------
// returns a localized string from unknownContentType.properties
static nsresult
GetNLSString(const PRUnichar *aKey, nsAString& result)
{
nsresult rv;
nsCOMPtr<nsIStringBundleService> bundleSvc =
do_GetService(NS_STRINGBUNDLE_CONTRACTID, &rv);
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIStringBundle> bundle;
rv = bundleSvc->CreateBundle(
"chrome://mozapps/locale/downloads/unknownContentType.properties",
getter_AddRefs(bundle));
NS_ENSURE_SUCCESS(rv, rv);
nsXPIDLString string;
rv = bundle->GetStringFromName(aKey, getter_Copies(string));
NS_ENSURE_SUCCESS(rv, rv);
result.Assign(string);
return rv;
}
//------------------------------------------------------------------------
// returns the handle of the WPS object associated with a file extension;
// if RWS isn't being used or there's no association, returns zero;
// also constructs a description of the handler based on available info
static PRUint32
WpsGetDefaultHandler(const char *aFileExt, nsAString& aDescription)
{
aDescription.Truncate();
if (sUseRws) {
nsCOMPtr<nsIRwsService> rwsSvc(do_GetService("@mozilla.org/rwsos2;1"));
if (!rwsSvc)
sUseRws = PR_FALSE;
else {
PRUint32 handle;
// the handle may be zero if the WPS class provides the default handler
if (NS_SUCCEEDED(rwsSvc->HandlerFromExtension(aFileExt, &handle, aDescription)))
return handle;
}
}
// no RWS or RWS failed to return at least a description
if (NS_FAILED(GetNLSString(NS_LITERAL_STRING("wpsDefaultOS2").get(),
aDescription)))
aDescription.Assign(NS_LITERAL_STRING("WPS default"));
return 0;
}
//------------------------------------------------------------------------
// this constructs the system-default entry when neither mailcap nor
// mime.types provided any info
static void
WpsMimeInfoFromExtension(const char *aFileExt, nsMIMEInfoOS2 *aMI)
{
// this identifies whether the mimetype is a bogus
// "application/octet-stream" generated when no match
// could be found for this extension
PRBool exists;
aMI->ExtensionExists(nsDependentCString(aFileExt), &exists);
// get the default app's description and WPS handle (if any)
nsAutoString ustr;
PRUint32 handle = WpsGetDefaultHandler(aFileExt, ustr);
aMI->SetDefaultDescription(ustr);
aMI->SetDefaultAppHandle(handle);
// if the mimeinfo is bogus, change the mimetype & extensions list
if (!exists) {
nsCAutoString extLower;
nsCAutoString cstr;
ToLowerCase(nsDependentCString(aFileExt), extLower);
cstr.Assign(NS_LITERAL_CSTRING("application/x-") + extLower);
aMI->SetMIMEType(cstr);
aMI->SetFileExtensions(extLower);
}
// if the mimetype is valid, perhaps we can supply a description;
// if it's bogus, replace the description
if (exists)
aMI->GetDescription(ustr);
else
ustr.Truncate();
if (ustr.IsEmpty()) {
nsCAutoString extUpper;
ToUpperCase(nsDependentCString(aFileExt), extUpper);
CopyUTF8toUTF16(extUpper, ustr);
nsAutoString fileType;
if (NS_FAILED(GetNLSString(NS_LITERAL_STRING("fileType").get(), fileType)))
ustr.Assign(NS_LITERAL_STRING("%S file"));
int pos = -1;
if ((pos = fileType.Find("%S")) > -1);
fileType.Replace(pos, 2, ustr);
aMI->SetDescription(fileType);
}
}
//------------------------------------------------------------------------
// this is an override of nsExternalHelperAppService's method;
// after the parent's method has looked for a handler, add
// an entry for the WPS's handler if there's room and one exists;
// it will never replace entries from mailcap or mimetypes.rdf
NS_IMETHODIMP
nsOSHelperAppService::GetFromTypeAndExtension(const nsACString& aMIMEType,
const nsACString& aFileExt,
nsIMIMEInfo **_retval)
{
// let the existing code do its thing
nsresult rv = nsExternalHelperAppService::GetFromTypeAndExtension(
aMIMEType, aFileExt, _retval);
if (!(*_retval))
return rv;
// this is needed for Get/SetDefaultApplication()
nsMIMEInfoOS2 *mi = static_cast<nsMIMEInfoOS2*>(*_retval);
// do lookups using the original extension if present;
// otherwise use the extension derived from the mimetype
nsCAutoString ext;
if (!aFileExt.IsEmpty())
ext.Assign(aFileExt);
else {
mi->GetPrimaryExtension(ext);
if (ext.IsEmpty())
return rv;
}
nsCOMPtr<nsIFile> defApp;
nsCOMPtr<nsIHandlerApp> prefApp;
mi->GetDefaultApplication(getter_AddRefs(defApp));
mi->GetPreferredApplicationHandler(getter_AddRefs(prefApp));
nsCOMPtr<nsILocalHandlerApp> locPrefApp = do_QueryInterface(prefApp, &rv);
// if neither mailcap nor mimetypes.rdf had an entry,
// create a default entry using the WPS handler
if (!defApp && !locPrefApp) {
WpsMimeInfoFromExtension(ext.get(), mi);
return rv;
}
PRBool gotPromoted = PR_FALSE;
// both mailcap & mimetypes.rdf have an entry; if they're
// different, exit; otherwise, clear the default entry
if (defApp && locPrefApp) {
PRBool sameFile;
nsCOMPtr<nsIFile> app;
rv = locPrefApp->GetExecutable(getter_AddRefs(app));
defApp->Equals(app, &sameFile);
if (!sameFile)
return rv;
defApp = 0;
mi->SetDefaultApplication(0);
mi->SetDefaultDescription(EmptyString());
gotPromoted = PR_TRUE;
}
nsAutoString description;
// mailcap has an entry but mimetypes.rdf doesn't;
// promote mailcap's entry to preferred
if (defApp && !locPrefApp) {
mi->GetDefaultDescription(description);
nsLocalHandlerApp *handlerApp(new nsLocalHandlerApp(description, defApp));
mi->SetPreferredApplicationHandler(handlerApp);
gotPromoted = PR_TRUE;
}
// if the former default app was promoted to preferred app,
// update preferred action if appropriate
if (gotPromoted) {
nsHandlerInfoAction action;
mi->GetPreferredAction(&action);
if (action == nsIMIMEInfo::useSystemDefault) {
mi->SetPreferredAction(nsIMIMEInfo::useHelperApp);
mi->SetPreferredAction(nsIMIMEInfo::useHelperApp);
}
}
// use the WPS default as the system default handler
PRUint32 handle = WpsGetDefaultHandler(ext.get(), description);
mi->SetDefaultDescription(description);
mi->SetDefaultApplication(0);
mi->SetDefaultAppHandle(handle);
return rv;
}
//------------------------------------------------------------------------
already_AddRefed<nsIMIMEInfo>
nsOSHelperAppService::GetMIMEInfoFromOS(const nsACString& aType,

Просмотреть файл

@ -1,6 +1,6 @@
/* -*- Mode: C++; tab-width: 3; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* ***** BEGIN LICENSE BLOCK *****
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set sw=2 sts=2 et cin: */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
@ -62,6 +62,9 @@ public:
virtual ~nsOSHelperAppService();
// method overrides for mime.types and mime.info look up steps
NS_IMETHOD GetFromTypeAndExtension(const nsACString& aMIMEType,
const nsACString& aFileExt,
nsIMIMEInfo **_retval);
already_AddRefed<nsIMIMEInfo> GetMIMEInfoFromOS(const nsACString& aMimeType,
const nsACString& aFileExt,
PRBool *aFound);

Просмотреть файл

@ -118,6 +118,10 @@ XPIDLSRCS += nsIPrintSettingsX.idl \
nsIPrintSessionX.idl
endif
ifeq ($(MOZ_WIDGET_TOOLKIT),os2)
XPIDLSRCS += nsIRwsService.idl
endif
EXPORTS := $(addprefix $(srcdir)/, $(EXPORTS))
include $(topsrcdir)/config/rules.mk

Просмотреть файл

@ -0,0 +1,136 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is OS/2 Remote Workplace Server interface.
*
* The Initial Developer of the Original Code is
* Richard L Walsh.
* Portions created by the Initial Developer are Copyright (C) 2005
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either of the GNU General Public License Version 2 or later (the "GPL"),
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "nsISupports.idl"
[scriptable, uuid(74a1105c-7e5a-418e-9a57-a0fc8cc992fc)]
interface nsIRwsService : nsISupports
{
/**
* Retrieves the icon given to files with the specified extension
*
* @param aExt The extension without the leading dot;
* if the dot is present, it will be ignored.
* @param aNeedMini Retrieve a mini icon if true; a standard icon if false.
* @return An HPOINTER representing the icon.
*/
unsigned long iconFromExtension(in string aExt, in boolean aNeedMini);
/**
* Retrieves the icon for a specific file or abstract object.
*
* @param aPath The fully-qualified name of the file or object.
* @param aAbstract False for filesystem objects, true for abstract objects.
* @param aNeedMini Retrieve a mini icon if true; a standard icon if false.
* @return An HPOINTER representing the icon.
*/
unsigned long iconFromPath(in string aPath, in boolean aAbstract,
in boolean aNeedMini);
/**
* Retrieves a file or abstract object's icon using its WPS object handle.
*
* @param aHandle The file or object's WPS object handle.
* @param aNeedMini Retrieve a mini icon if true; a standard icon if false.
* @return An HPOINTER representing the icon.
*/
unsigned long iconFromHandle(in unsigned long aHandle, in boolean aNeedMini);
/**
* Returns the name of the default handler for files with the
* specified extension. If the handler is a program, it also
* retrieves the handler's WPS object handle; if the default
* handler is provided by a WPS class, aHandle will be zero.
*
* @param aExt The extension without the leading dot;
* if the dot is present, it will be ignored.
* @param aHandle Returns a WPS object handle for programs or
* zero for class-based handlers.
* @return Either the unqualified title of a program or
* the name of the WPS class' default viewer/player.
*/
AString handlerFromExtension(in string aExt, out unsigned long aHandle);
/**
* Returns the name of the default handler for a specific file.
* If the handler is a program, it also retrieves the handler's
* WPS object handle; if the default handler is provided by a
* WPS class, aHandle will be zero.
*
* @param aPath The fully-qualified name of a file.
* @param aHandle Returns a WPS object handle for programs or
* zero for class-based handlers.
* @return Either the unqualified title of a program or
* the name of the WPS class' default viewer/player.
*/
AString handlerFromPath(in string aPath, out unsigned long aHandle);
/**
* Returns the unqualified title of the specified object.
*
* @param aHandle A WPS object handle.
* @return The title of this object.
*/
AString titleFromHandle(in unsigned long aHandle);
/**
* Displays the WPS object menu for the specified file or abstract object.
*
* @param aPath The fully-qualified name of the file or object.
* @param aAbstract False for filesystem objects, true for abstract objects.
*/
void menuFromPath(in string aPath, in boolean aAbstract);
/**
* Opens a file using the specified program file. The effect
* is identical to dropping the file on the program's icon.
*
* @param aFilePath The fully-qualified name of a file.
* @param aAppPath The fully-qualified name of a program file.
*/
void openWithAppPath(in string aFilePath, in string aAppPath);
/**
* Opens a file using the specified WPS object handle. The effect
* is identical to dropping the file on the object's icon.
*
* @param aFilePath The fully-qualified name of a file.
* @param aAppHandle A WPS object handle.
*/
void openWithAppHandle(in string aFilePath, in unsigned long aAppHandle);
};

Просмотреть файл

@ -94,6 +94,7 @@ CPPSRCS = \
nsScreenManagerOS2.cpp \
nsDeviceContextSpecOS2.cpp \
nsPrintOptionsOS2.cpp \
nsRwsService.cpp \
$(NULL)
SHARED_LIBRARY_LIBS = \

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Просмотреть файл

@ -0,0 +1,82 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is OS/2 Remote Workplace Server interface.
*
* The Initial Developer of the Original Code is
* Richard L Walsh.
* Portions created by the Initial Developer are Copyright (C) 2005
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either of the GNU General Public License Version 2 or later (the "GPL"),
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
//------------------------------------------------------------------------
#ifndef nsRwsService_h__
#define nsRwsService_h__
#include "nsIRwsService.h"
#include "rws.h"
// e314efd1-f4ef-49e0-bd98-12d4e87a63a7
#define NS_RWSSERVICE_CID \
{ 0xe314efd1, 0xf4ef,0x49e0, { 0xbd, 0x98, 0x12, 0xd4, 0xe8, 0x7a, 0x63, 0xa7 } }
#define NS_RWSSERVICE_CONTRACTID "@mozilla.org/rwsos2;1"
//------------------------------------------------------------------------
NS_IMETHODIMP nsRwsServiceConstructor(nsISupports *aOuter, REFNSIID aIID,
void **aResult);
//------------------------------------------------------------------------
class ExtCache;
class nsRwsService : public nsIRwsService, public nsIObserver
{
public:
NS_DECL_NSIRWSSERVICE
NS_DECL_NSIOBSERVER
NS_DECL_ISUPPORTS
nsRwsService();
private:
~nsRwsService();
protected:
static nsresult RwsConvert(PRUint32 type, PRUint32 value, PRUint32 *result);
static nsresult RwsConvert(PRUint32 type, PRUint32 value, nsAString& result);
ExtCache *mExtCache;
};
//------------------------------------------------------------------------
#endif // nsRwsService_h__

Просмотреть файл

@ -80,6 +80,7 @@
#include "nsHTMLFormatConverter.h"
#include "nsScreenManagerOS2.h"
#include "nsRwsService.h"
// Printing
#include "nsDeviceContextSpecOS2.h"
@ -186,6 +187,10 @@ static const nsModuleComponentInfo components[] =
// "@mozilla.org/gfx/printer_enumerator/gtk;1",
"@mozilla.org/gfx/printerenumerator;1",
nsPrinterEnumeratorOS2Constructor },
{ "Rws Service Interface",
NS_RWSSERVICE_CID,
NS_RWSSERVICE_CONTRACTID,
nsRwsServiceConstructor },
};
PR_STATIC_CALLBACK(void)