Mercurial > projects > dwt-linux
diff dwt/browser/HelperAppLauncherDialog.d @ 298:eec6ddb07873
More xpcom/mozilla port
author | John Reimer<terminal.node@gmail.com> |
---|---|
date | Sun, 10 Aug 2008 22:25:43 -0700 |
parents | 93409d9838c5 |
children | 942da4b6558a |
line wrap: on
line diff
--- a/dwt/browser/HelperAppLauncherDialog.d Fri Aug 08 15:25:08 2008 +0200 +++ b/dwt/browser/HelperAppLauncherDialog.d Sun Aug 10 22:25:43 2008 -0700 @@ -7,15 +7,19 @@ * * Contributors: * IBM Corporation - initial API and implementation + * Port to the D programming language: + * John Reimer <terminal.node@gmail.com> *******************************************************************************/ module dwt.browser.HelperAppLauncherDialog; import dwt.dwthelper.utils; +import Utf = tango.text.convert.Utf; + import dwt.DWT; -import dwt.internal.C; +//import dwt.internal.C; import dwt.internal.mozilla.XPCOM; -import dwt.internal.mozilla.XPCOMObject; +//import dwt.internal.mozilla.XPCOMObject; import dwt.internal.mozilla.nsEmbedString; import dwt.internal.mozilla.nsID; import dwt.internal.mozilla.nsIHelperAppLauncher; @@ -26,20 +30,20 @@ import dwt.widgets.FileDialog; import dwt.widgets.Shell; -class HelperAppLauncherDialog { - XPCOMObject supports; - XPCOMObject helperAppLauncherDialog; +class HelperAppLauncherDialog : nsHelperAppLauncherDialog { + //XPCOMObject supports; + //XPCOMObject helperAppLauncherDialog; int refCount = 0; -HelperAppLauncherDialog () { - createCOMInterfaces (); +this() { + //createCOMInterfaces (); } -int AddRef () { +nsrefcnt AddRef () { refCount++; return refCount; } - +/+ void createCOMInterfaces () { /* Create each of the interfaces that this object implements */ supports = new XPCOMObject (new int[] {2, 0, 0}) { @@ -71,28 +75,28 @@ int /*long*/ getAddress () { return helperAppLauncherDialog.getAddress (); } - -int QueryInterface (int /*long*/ riid, int /*long*/ ppvObject) { - if (riid is 0 || ppvObject is 0) return XPCOM.NS_ERROR_NO_INTERFACE; - nsID guid = new nsID (); - XPCOM.memmove (guid, riid, nsID.sizeof); ++/ +nsresult QueryInterface (nsID* riid, void** ppvObject) { + if (riid is null || ppvObject is null) return XPCOM.NS_ERROR_NO_INTERFACE; + //nsID guid = new nsID (); + //XPCOM.memmove (guid, riid, nsID.sizeof); - if (guid.Equals (nsISupports.NS_ISUPPORTS_IID)) { - XPCOM.memmove (ppvObject, new int /*long*/[] {supports.getAddress ()}, C.PTR_SIZEOF); + if (*riid == nsISupports.IID) { + *ppvObject = cast(void*)cast(nsISupports)this; AddRef (); return XPCOM.NS_OK; } - if (guid.Equals (nsIHelperAppLauncherDialog.NS_IHELPERAPPLAUNCHERDIALOG_IID)) { - XPCOM.memmove (ppvObject, new int /*long*/[] {helperAppLauncherDialog.getAddress ()}, C.PTR_SIZEOF); + if (*riid == nsIHelperAppLauncherDialog.IID) { + *ppvObject = cast(void*)cast(nsIHelperAppLauncherDialog)this; AddRef (); return XPCOM.NS_OK; } - XPCOM.memmove (ppvObject, new int /*long*/[] {0}, C.PTR_SIZEOF); + *ppvObject = null; return XPCOM.NS_ERROR_NO_INTERFACE; } -int Release () { +nsrefcnt Release () { refCount--; /* * Note. This instance lives as long as the download it is binded to. @@ -101,42 +105,46 @@ * cancels the File Dialog, cancels or closes the Download Dialog * and when the Download Dialog goes away after the download is completed. */ - if (refCount is 0) disposeCOMInterfaces (); + //if (refCount is 0) disposeCOMInterfaces (); return refCount; } /* nsIHelperAppLauncherDialog */ -int Show (int /*long*/ aLauncher, int /*long*/ aContext, int aReason) { +nsresult Show (nsIHelperAppLauncher aLauncher, nsISupports aContext, PRUint32 aReason) { /* * The interface for nsIHelperAppLauncher changed in GRE versions 1.8 and 1.9. Query for * each of these interfaces in turn until one is found. */ - nsISupports supports = new nsISupports (aLauncher); - int /*long*/[] result = new int /*long*/[1]; - int rc = supports.QueryInterface (nsIHelperAppLauncher_1_9.NS_IHELPERAPPLAUNCHER_IID, result); + // FIXME: Not sure if this will work because of different versions of + // nsIHelperAppLauncher. Remember to check. -JJR + nsIHelperAppLauncher_1_9 helperAppLauncher1; + int rc = aLauncher.QueryInterface (nsIHelperAppLauncher_1_9.IID, cast(void*)&helperAppLauncher1); if (rc is 0) { - nsIHelperAppLauncher_1_9 helperAppLauncher = new nsIHelperAppLauncher_1_9 (aLauncher); - rc = helperAppLauncher.SaveToDisk (0, 0); - helperAppLauncher.Release (); + // nsIHelperAppLauncher_1_9 helperAppLauncher = new nsIHelperAppLauncher_1_9 (aLauncher); + rc = helperAppLauncher1.SaveToDisk (0, 0); + helperAppLauncher1.Release (); return rc; } - result[0] = 0; - rc = supports.QueryInterface (nsIHelperAppLauncher_1_8.NS_IHELPERAPPLAUNCHER_IID, result); + //result[0] = 0; + nsIHelperAppLauncher_1_8 helperAppLauncher2; + rc = aLauncher.QueryInterface (nsIHelperAppLauncher_1_8.IID, cast(void*)&helperAppLauncher2); if (rc is 0) { - nsIHelperAppLauncher_1_8 helperAppLauncher = new nsIHelperAppLauncher_1_8 (aLauncher); - rc = helperAppLauncher.SaveToDisk (0, 0); - helperAppLauncher.Release (); + //nsIHelperAppLauncher_1_8 helperAppLauncher = new nsIHelperAppLauncher_1_8 (aLauncher); + rc = helperAppLauncher2.SaveToDisk (0, 0); + helperAppLauncher2.Release (); return rc; } - nsIHelperAppLauncher helperAppLauncher = new nsIHelperAppLauncher (aLauncher); /* < 1.8 */ - return helperAppLauncher.SaveToDisk (0, 0); + //nsIHelperAppLauncher helperAppLauncher = new nsIHelperAppLauncher (aLauncher); /* < 1.8 */ + return aLauncher.SaveToDisk (0, 0); } -int PromptForSaveToFile (int /*long*/ arg0, int /*long*/ arg1, int /*long*/ arg2, int /*long*/ arg3, int /*long*/ arg4) { - int /*long*/ aDefaultFile, aSuggestedFileExtension, _retval; +int PromptForSaveToFile (nsIHelperAppLauncher arg0, nsISupports arg1, PRUnichar* arg2, PRUnichar* arg3, nsILocalFile* arg4) { + PRUnichar* aDefaultFile; + PRUnichar* aSuggestedFileExtension; + nsILocalFile* _retval; bool hasLauncher = false; /* @@ -153,81 +161,91 @@ * argument must be queried for both the old and new nsIHelperAppLauncher interfaces. */ bool using_1_8 = false, using_1_9 = false; - nsISupports support = new nsISupports (arg0); - int /*long*/[] result = new int /*long*/[1]; - int rc = support.QueryInterface (nsIHelperAppLauncher_1_8.NS_IHELPERAPPLAUNCHER_IID, result); + // technically this should have an AddRef? -JJR + nsISupports support = cast(nsISupports)arg0; + //int /*long*/[] result = new int /*long*/[1]; + if (arg0 is null) + assert(0); + + nsIHelperAppLauncher_1_8 helperAppLauncher1; + int rc = support.QueryInterface (nsIHelperAppLauncher_1_8.IID, cast(void*)&helperAppLauncher1); if (rc is 0) { using_1_8 = true; hasLauncher = true; - new nsISupports (result[0]).Release (); + helperAppLauncher1.Release (); } else { - result[0] = 0; - rc = support.QueryInterface (nsIHelperAppLauncher_1_9.NS_IHELPERAPPLAUNCHER_IID, result); + nsIHelperAppLauncher_1_9 helperAppLauncher2; + rc = support.QueryInterface (nsIHelperAppLauncher_1_9.IID, cast(void*)&helperAppLauncher2); if (rc is 0) { using_1_9 = true; hasLauncher = true; - new nsISupports (result[0]).Release (); + helperAppLauncher2.Release; } else { - result[0] = 0; - rc = support.QueryInterface (nsIHelperAppLauncher.NS_IHELPERAPPLAUNCHER_IID, result); + nsIHelperAppLauncher helperAppLauncher; + rc = support.QueryInterface (nsIHelperAppLauncher.IID, cast(void*)&helperAppLauncher); if (rc is 0) { hasLauncher = true; - new nsISupports (result[0]).Release (); + helperAppLauncher.Release; } } } - result[0] = 0; + //result[0] = 0; if (hasLauncher) { /* >= 1.5 */ aDefaultFile = arg2; aSuggestedFileExtension = arg3; _retval = arg4; - } else { /* 1.4 */ + } else { /* 1.4 */ + // This call conversion probablywon't work for non-Java + // and shouldn't get called; fix it later. -JJR aDefaultFile = arg1; aSuggestedFileExtension = arg2; _retval = arg3; } - int length = XPCOM.strlen_PRUnichar (aDefaultFile); - char[] dest = new char[length]; - XPCOM.memmove (dest, aDefaultFile, length * 2); - String defaultFile = new String (dest); + int span = XPCOM.strlen_PRUnichar (aDefaultFile); + // XPCOM.memmove (dest, aDefaultFile, length * 2); + String defaultFile = Utf.toString (aDefaultFile[0 .. span])); - length = XPCOM.strlen_PRUnichar (aSuggestedFileExtension); - dest = new char[length]; - XPCOM.memmove (dest, aSuggestedFileExtension, length * 2); - String suggestedFileExtension = new String (dest); + span = XPCOM.strlen_PRUnichar (aSuggestedFileExtension); + //dest = new char[length]; + //XPCOM.memmove (dest, aSuggestedFileExtension, length * 2); + String suggestedFileExtension = Utf.toString (aSuggestedFileExtension[0 .. span]); Shell shell = new Shell (); FileDialog fileDialog = new FileDialog (shell, DWT.SAVE); fileDialog.setFileName (defaultFile); - fileDialog.setFilterExtensions (new String[] {suggestedFileExtension}); + String[] tmp ~= suggestedFileExtension; + fileDialog.setFilterExtensions (tmp); String name = fileDialog.open (); shell.close (); if (name is null) { if (hasLauncher) { + // not sure if these produce correct interface alignment. Check. -JJR if (using_1_8) { - nsIHelperAppLauncher_1_8 launcher = new nsIHelperAppLauncher_1_8 (arg0); + auto launcher = cast(nsIHelperAppLauncher_1_8)cast(void*)arg0; rc = launcher.Cancel (XPCOM.NS_BINDING_ABORTED); } else if (using_1_9) { - nsIHelperAppLauncher_1_9 launcher = new nsIHelperAppLauncher_1_9 (arg0); + auto launcher = cast(nsIHelperAppLauncher_1_9)cast(void*)arg0; rc = launcher.Cancel (XPCOM.NS_BINDING_ABORTED); } else { - nsIHelperAppLauncher launcher = new nsIHelperAppLauncher (arg0); - rc = launcher.Cancel (); + //nsIHelperAppLauncher launcher = new nsIHelperAppLauncher (arg0); + rc = arg0.Cancel (); } if (rc !is XPCOM.NS_OK) Mozilla.error (rc); return XPCOM.NS_OK; } return XPCOM.NS_ERROR_FAILURE; } - nsEmbedString path = new nsEmbedString (name); - rc = XPCOM.NS_NewLocalFile (path.getAddress (), 1, result); - path.dispose (); + scope auto path = new nsEmbedString (name); + nsILocalFile localFile; + rc = XPCOM.NS_NewLocalFile (cast(nsAString*)path, 1, cast(void*)&localFile); + //path.dispose (); if (rc !is XPCOM.NS_OK) Mozilla.error (rc); - if (result[0] is 0) Mozilla.error (XPCOM.NS_ERROR_NULL_POINTER); + if (localFile is null) Mozilla.error (XPCOM.NS_ERROR_NULL_POINTER); /* Our own nsIDownload has been registered during the Browser initialization. It will be invoked by Mozilla. */ - XPCOM.memmove (_retval, result, C.PTR_SIZEOF); + *_retval = cast(void*)&localFile; + //XPCOM.memmove (_retval, result, C.PTR_SIZEOF); return XPCOM.NS_OK; } }