diff dwt/browser/PromptService2.d @ 278:93409d9838c5

Commit more browser/xpcom updates, including still uncoverted source.
author John Reimer<terminal.node@gmail.com>
date Thu, 31 Jul 2008 19:17:51 -0700
parents
children eec6ddb07873
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/browser/PromptService2.d	Thu Jul 31 19:17:51 2008 -0700
@@ -0,0 +1,649 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+module dwt.browser.PromptService2;
+
+import dwt.dwthelper.utils;
+
+import dwt.DWT;
+import dwt.internal.C;
+import dwt.internal.Compatibility;
+import dwt.internal.mozilla.XPCOM;
+import dwt.internal.mozilla.XPCOMObject;
+import dwt.internal.mozilla.nsEmbedString;
+import dwt.internal.mozilla.nsIAuthInformation;
+import dwt.internal.mozilla.nsIChannel;
+import dwt.internal.mozilla.nsID;
+import dwt.internal.mozilla.nsIDOMWindow;
+import dwt.internal.mozilla.nsIEmbeddingSiteWindow;
+import dwt.internal.mozilla.nsIMemory;
+import dwt.internal.mozilla.nsIPromptService;
+import dwt.internal.mozilla.nsIPromptService2;
+import dwt.internal.mozilla.nsIServiceManager;
+import dwt.internal.mozilla.nsISupports;
+import dwt.internal.mozilla.nsIURI;
+import dwt.internal.mozilla.nsIWebBrowserChrome;
+import dwt.internal.mozilla.nsIWindowWatcher;
+import dwt.widgets.MessageBox;
+import dwt.widgets.Shell;
+
+class PromptService2 {
+    XPCOMObject supports;
+    XPCOMObject promptService;
+    XPCOMObject promptService2;
+    int refCount = 0;
+
+PromptService2 () {
+    createCOMInterfaces ();
+}
+
+int AddRef () {
+    refCount++;
+    return refCount;
+}
+
+void createCOMInterfaces () {
+    /* Create each of the interfaces that this object implements */
+    supports = new XPCOMObject (new int[] {2, 0, 0}) {
+        public int /*long*/ method0 (int /*long*/[] args) {return QueryInterface (args[0], args[1]);}
+        public int /*long*/ method1 (int /*long*/[] args) {return AddRef ();}
+        public int /*long*/ method2 (int /*long*/[] args) {return Release ();}
+    };
+    
+    promptService = new XPCOMObject (new int[] {2, 0, 0, 3, 5, 4, 6, 10, 7, 8, 7, 7}) {
+        public int /*long*/ method0 (int /*long*/[] args) {return QueryInterface (args[0], args[1]);}
+        public int /*long*/ method1 (int /*long*/[] args) {return AddRef ();}
+        public int /*long*/ method2 (int /*long*/[] args) {return Release ();}
+        public int /*long*/ method3 (int /*long*/[] args) {return Alert (args[0], args[1], args[2]);}
+        public int /*long*/ method4 (int /*long*/[] args) {return AlertCheck (args[0], args[1], args[2], args[3], args[4]);}
+        public int /*long*/ method5 (int /*long*/[] args) {return Confirm (args[0], args[1], args[2], args[3]);}
+        public int /*long*/ method6 (int /*long*/[] args) {return ConfirmCheck (args[0], args[1], args[2], args[3], args[4], args[5]);}
+        public int /*long*/ method7 (int /*long*/[] args) {return ConfirmEx (args[0], args[1], args[2], (int)/*64*/args[3], args[4], args[5], args[6], args[7], args[8], args[9]);}
+        public int /*long*/ method8 (int /*long*/[] args) {return Prompt (args[0], args[1], args[2], args[3], args[4], args[5], args[6]);}
+        public int /*long*/ method9 (int /*long*/[] args) {return PromptUsernameAndPassword (args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7]);}
+        public int /*long*/ method10 (int /*long*/[] args) {return PromptPassword (args[0], args[1], args[2], args[3], args[4], args[5], args[6]);}
+        public int /*long*/ method11 (int /*long*/[] args) {return Select (args[0], args[1], args[2], (int)/*64*/args[3], args[4], args[5], args[6]);}
+    };
+    
+    promptService2 = new XPCOMObject (new int[] {2, 0, 0, 3, 5, 4, 6, 10, 7, 8, 7, 7, 7, 9}) {
+        public int /*long*/ method0 (int /*long*/[] args) {return QueryInterface (args[0], args[1]);}
+        public int /*long*/ method1 (int /*long*/[] args) {return AddRef ();}
+        public int /*long*/ method2 (int /*long*/[] args) {return Release ();}
+        public int /*long*/ method3 (int /*long*/[] args) {return Alert (args[0], args[1], args[2]);}
+        public int /*long*/ method4 (int /*long*/[] args) {return AlertCheck (args[0], args[1], args[2], args[3], args[4]);}
+        public int /*long*/ method5 (int /*long*/[] args) {return Confirm (args[0], args[1], args[2], args[3]);}
+        public int /*long*/ method6 (int /*long*/[] args) {return ConfirmCheck (args[0], args[1], args[2], args[3], args[4], args[5]);}
+        public int /*long*/ method7 (int /*long*/[] args) {return ConfirmEx (args[0], args[1], args[2], (int)/*64*/args[3], args[4], args[5], args[6], args[7], args[8], args[9]);}
+        public int /*long*/ method8 (int /*long*/[] args) {return Prompt (args[0], args[1], args[2], args[3], args[4], args[5], args[6]);}
+        public int /*long*/ method9 (int /*long*/[] args) {return PromptUsernameAndPassword (args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7]);}
+        public int /*long*/ method10 (int /*long*/[] args) {return PromptPassword (args[0], args[1], args[2], args[3], args[4], args[5], args[6]);}
+        public int /*long*/ method11 (int /*long*/[] args) {return Select (args[0], args[1], args[2], (int)/*64*/args[3], args[4], args[5], args[6]);}
+        public int /*long*/ method12 (int /*long*/[] args) {return PromptAuth (args[0], args[1], (int)/*64*/args[2], args[3], args[4], args[5], args[6]);}
+        public int /*long*/ method13 (int /*long*/[] args) {return AsyncPromptAuth (args[0], args[1], args[2], args[3], (int)/*64*/args[4], args[5], args[6], args[7], args[8]);}
+    };
+}
+
+void disposeCOMInterfaces () {
+    if (supports !is null) {
+        supports.dispose ();
+        supports = null;
+    }   
+    if (promptService !is null) {
+        promptService.dispose ();
+        promptService = null;   
+    }
+    if (promptService2 !is null) {
+        promptService2.dispose ();
+        promptService2 = null;  
+    }
+}
+
+int /*long*/ getAddress () {
+    return promptService2.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);
+    
+    if (guid.Equals (nsISupports.NS_ISUPPORTS_IID)) {
+        XPCOM.memmove (ppvObject, new int /*long*/[] {supports.getAddress ()}, C.PTR_SIZEOF);
+        AddRef ();
+        return XPCOM.NS_OK;
+    }
+    if (guid.Equals (nsIPromptService.NS_IPROMPTSERVICE_IID)) {
+        XPCOM.memmove (ppvObject, new int /*long*/[] {promptService.getAddress ()}, C.PTR_SIZEOF);
+        AddRef ();
+        return XPCOM.NS_OK;
+    }
+    if (guid.Equals (nsIPromptService2.NS_IPROMPTSERVICE2_IID)) {
+        XPCOM.memmove (ppvObject, new int /*long*/[] {promptService2.getAddress ()}, C.PTR_SIZEOF);
+        AddRef ();
+        return XPCOM.NS_OK;
+    }
+
+    XPCOM.memmove (ppvObject, new int /*long*/[] {0}, C.PTR_SIZEOF);
+    return XPCOM.NS_ERROR_NO_INTERFACE;
+}
+            
+int Release () {
+    refCount--;
+    if (refCount is 0) disposeCOMInterfaces ();
+    return refCount;
+}
+
+Browser getBrowser (int /*long*/ aDOMWindow) {
+    if (aDOMWindow is 0) return null;
+
+    int /*long*/[] result = new int /*long*/[1];
+    int rc = XPCOM.NS_GetServiceManager (result);
+    if (rc !is XPCOM.NS_OK) Mozilla.error (rc);
+    if (result[0] is 0) Mozilla.error (XPCOM.NS_NOINTERFACE);
+    
+    nsIServiceManager serviceManager = new nsIServiceManager (result[0]);
+    result[0] = 0;
+    byte[] aContractID = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_WINDOWWATCHER_CONTRACTID, true);
+    rc = serviceManager.GetServiceByContractID (aContractID, nsIWindowWatcher.NS_IWINDOWWATCHER_IID, result);
+    if (rc !is XPCOM.NS_OK) Mozilla.error(rc);
+    if (result[0] is 0) Mozilla.error (XPCOM.NS_NOINTERFACE);       
+    serviceManager.Release ();
+    
+    nsIWindowWatcher windowWatcher = new nsIWindowWatcher (result[0]);
+    result[0] = 0;
+    /* the chrome will only be answered for the top-level nsIDOMWindow */
+    nsIDOMWindow window = new nsIDOMWindow (aDOMWindow);
+    rc = window.GetTop (result);
+    if (rc !is XPCOM.NS_OK) Mozilla.error (rc);
+    if (result[0] is 0) Mozilla.error (XPCOM.NS_NOINTERFACE);
+    aDOMWindow = result[0];
+    result[0] = 0;
+    rc = windowWatcher.GetChromeForWindow (aDOMWindow, result);
+    if (rc !is XPCOM.NS_OK) Mozilla.error (rc);
+    if (result[0] is 0) Mozilla.error (XPCOM.NS_NOINTERFACE);       
+    windowWatcher.Release ();   
+    
+    nsIWebBrowserChrome webBrowserChrome = new nsIWebBrowserChrome (result[0]);
+    result[0] = 0;
+    rc = webBrowserChrome.QueryInterface (nsIEmbeddingSiteWindow.NS_IEMBEDDINGSITEWINDOW_IID, result);
+    if (rc !is XPCOM.NS_OK) Mozilla.error (rc);
+    if (result[0] is 0) Mozilla.error (XPCOM.NS_NOINTERFACE);       
+    webBrowserChrome.Release ();
+    
+    nsIEmbeddingSiteWindow embeddingSiteWindow = new nsIEmbeddingSiteWindow (result[0]);
+    result[0] = 0;
+    rc = embeddingSiteWindow.GetSiteWindow (result);
+    if (rc !is XPCOM.NS_OK) Mozilla.error (rc);
+    if (result[0] is 0) Mozilla.error (XPCOM.NS_NOINTERFACE);       
+    embeddingSiteWindow.Release ();
+    
+    return Mozilla.findBrowser (result[0]); 
+}
+
+String getLabel (int buttonFlag, int index, int /*long*/ buttonTitle) {
+    String label = null;
+    int flag = (buttonFlag & (0xff * index)) / index;
+    switch (flag) {
+        case nsIPromptService.BUTTON_TITLE_CANCEL : label = DWT.getMessage ("SWT_Cancel"); break; //$NON-NLS-1$
+        case nsIPromptService.BUTTON_TITLE_NO : label = DWT.getMessage ("SWT_No"); break; //$NON-NLS-1$
+        case nsIPromptService.BUTTON_TITLE_OK : label = DWT.getMessage ("SWT_OK"); break; //$NON-NLS-1$
+        case nsIPromptService.BUTTON_TITLE_SAVE : label = DWT.getMessage ("SWT_Save"); break; //$NON-NLS-1$
+        case nsIPromptService.BUTTON_TITLE_YES : label = DWT.getMessage ("SWT_Yes"); break; //$NON-NLS-1$
+        case nsIPromptService.BUTTON_TITLE_IS_STRING : {
+            int length = XPCOM.strlen_PRUnichar (buttonTitle);
+            char[] dest = new char[length];
+            XPCOM.memmove (dest, buttonTitle, length * 2);
+            label = new String (dest);
+        }
+    }
+    return label;
+}
+
+/* nsIPromptService */
+
+int Alert (int /*long*/ aParent, int /*long*/ aDialogTitle, int /*long*/ aText) {
+    Browser browser = getBrowser (aParent);
+    
+    int length = XPCOM.strlen_PRUnichar (aDialogTitle);
+    char[] dest = new char[length];
+    XPCOM.memmove (dest, aDialogTitle, length * 2);
+    String titleLabel = new String (dest);
+
+    length = XPCOM.strlen_PRUnichar (aText);
+    dest = new char[length];
+    XPCOM.memmove (dest, aText, length * 2);
+    String textLabel = new String (dest);
+
+    Shell shell = browser is null ? new Shell () : browser.getShell (); 
+    MessageBox messageBox = new MessageBox (shell, DWT.OK | DWT.ICON_WARNING);
+    messageBox.setText (titleLabel);
+    messageBox.setMessage (textLabel);
+    messageBox.open ();
+    return XPCOM.NS_OK;
+}
+
+int AlertCheck (int /*long*/ aParent, int /*long*/ aDialogTitle, int /*long*/ aText, int /*long*/ aCheckMsg, int /*long*/ aCheckState) {
+    Browser browser = getBrowser (aParent);
+    
+    int length = XPCOM.strlen_PRUnichar (aDialogTitle);
+    char[] dest = new char[length];
+    XPCOM.memmove (dest, aDialogTitle, length * 2);
+    String titleLabel = new String (dest);
+
+    length = XPCOM.strlen_PRUnichar (aText);
+    dest = new char[length];
+    XPCOM.memmove (dest, aText, length * 2);
+    String textLabel = new String (dest);
+
+    length = XPCOM.strlen_PRUnichar (aCheckMsg);
+    dest = new char[length];
+    XPCOM.memmove (dest, aCheckMsg, length * 2);
+    String checkLabel = new String (dest);
+
+    Shell shell = browser is null ? new Shell () : browser.getShell ();
+    PromptDialog dialog = new PromptDialog (shell);
+    int[] check = new int[1];
+    if (aCheckState !is 0) XPCOM.memmove (check, aCheckState, 4); /* PRBool */
+    dialog.alertCheck (titleLabel, textLabel, checkLabel, check);
+    if (aCheckState !is 0) XPCOM.memmove (aCheckState, check, 4); /* PRBool */
+    return XPCOM.NS_OK;
+}
+
+int AsyncPromptAuth(int /*long*/ aParent, int /*long*/ aChannel, int /*long*/ aCallback, int /*long*/ aContext, int level, int /*long*/ authInfo, int /*long*/ checkboxLabel, int /*long*/ checkValue, int /*long*/ _retval) {
+    return XPCOM.NS_ERROR_NOT_IMPLEMENTED;
+}
+
+int Confirm (int /*long*/ aParent, int /*long*/ aDialogTitle, int /*long*/ aText, int /*long*/ _retval) {
+    Browser browser = getBrowser (aParent);
+    
+    int length = XPCOM.strlen_PRUnichar (aDialogTitle);
+    char[] dest = new char[length];
+    XPCOM.memmove (dest, aDialogTitle, length * 2);
+    String titleLabel = new String (dest);
+
+    length = XPCOM.strlen_PRUnichar (aText);
+    dest = new char[length];
+    XPCOM.memmove (dest, aText, length * 2);
+    String textLabel = new String (dest);
+
+    Shell shell = browser is null ? new Shell () : browser.getShell ();
+    MessageBox messageBox = new MessageBox (shell, DWT.OK | DWT.CANCEL | DWT.ICON_QUESTION);
+    messageBox.setText (titleLabel);
+    messageBox.setMessage (textLabel);
+    int id = messageBox.open ();
+    int[] result = {id is DWT.OK ? 1 : 0};
+    XPCOM.memmove (_retval, result, 4);
+    return XPCOM.NS_OK;
+}
+
+int ConfirmCheck (int /*long*/ aParent, int /*long*/ aDialogTitle, int /*long*/ aText, int /*long*/ aCheckMsg, int /*long*/ aCheckState, int /*long*/ _retval) {
+    return XPCOM.NS_ERROR_NOT_IMPLEMENTED;
+}
+
+int ConfirmEx (int /*long*/ aParent, int /*long*/ aDialogTitle, int /*long*/ aText, int aButtonFlags, int /*long*/ aButton0Title, int /*long*/ aButton1Title, int /*long*/ aButton2Title, int /*long*/ aCheckMsg, int /*long*/ aCheckState, int /*long*/ _retval) {
+    Browser browser = getBrowser (aParent);
+    
+    int length = XPCOM.strlen_PRUnichar (aDialogTitle);
+    char[] dest = new char[length];
+    XPCOM.memmove (dest, aDialogTitle, length * 2);
+    String titleLabel = new String (dest);
+
+    length = XPCOM.strlen_PRUnichar (aText);
+    dest = new char[length];
+    XPCOM.memmove (dest, aText, length * 2);
+    String textLabel = new String (dest);
+    
+    String checkLabel = null;
+    if (aCheckMsg !is 0) {
+        length = XPCOM.strlen_PRUnichar (aCheckMsg);
+        dest = new char[length];
+        XPCOM.memmove (dest, aCheckMsg, length * 2);
+        checkLabel = new String (dest);
+    }
+    
+    String button0Label = getLabel (aButtonFlags, nsIPromptService.BUTTON_POS_0, aButton0Title);
+    String button1Label = getLabel (aButtonFlags, nsIPromptService.BUTTON_POS_1, aButton1Title);
+    String button2Label = getLabel (aButtonFlags, nsIPromptService.BUTTON_POS_2, aButton2Title);
+    
+    int defaultIndex = 0;
+    if ((aButtonFlags & nsIPromptService.BUTTON_POS_1_DEFAULT) !is 0) {
+        defaultIndex = 1;
+    } else if ((aButtonFlags & nsIPromptService.BUTTON_POS_2_DEFAULT) !is 0) {
+        defaultIndex = 2;
+    }
+    
+    Shell shell = browser is null ? new Shell () : browser.getShell ();
+    PromptDialog dialog = new PromptDialog (shell);
+    int[] check = new int[1], result = new int[1];
+    if (aCheckState !is 0) XPCOM.memmove (check, aCheckState, 4);
+    dialog.confirmEx (titleLabel, textLabel, checkLabel, button0Label, button1Label, button2Label, defaultIndex, check, result);
+    if (aCheckState !is 0) XPCOM.memmove (aCheckState, check, 4);
+    XPCOM.memmove (_retval, result, 4);
+    return XPCOM.NS_OK;
+}
+
+int Prompt (int /*long*/ aParent, int /*long*/ aDialogTitle, int /*long*/ aText, int /*long*/ aValue, int /*long*/ aCheckMsg, int /*long*/ aCheckState, int /*long*/ _retval) {
+    Browser browser = getBrowser (aParent);
+    String titleLabel = null, textLabel, checkLabel = null;
+    String[] valueLabel = new String[1];
+    char[] dest;
+    int length;
+    if (aDialogTitle !is 0) {
+        length = XPCOM.strlen_PRUnichar (aDialogTitle);
+        dest = new char[length];
+        XPCOM.memmove (dest, aDialogTitle, length * 2);
+        titleLabel = new String (dest);
+    }
+    
+    length = XPCOM.strlen_PRUnichar (aText);
+    dest = new char[length];
+    XPCOM.memmove (dest, aText, length * 2);
+    textLabel = new String (dest);
+    
+    int /*long*/[] valueAddr = new int /*long*/[1];
+    XPCOM.memmove (valueAddr, aValue, C.PTR_SIZEOF);
+    if (valueAddr[0] !is 0) {
+        length = XPCOM.strlen_PRUnichar (valueAddr[0]);
+        dest = new char[length];
+        XPCOM.memmove (dest, valueAddr[0], length * 2);
+        valueLabel[0] = new String (dest);      
+    }
+    
+    if (aCheckMsg !is 0) {
+        length = XPCOM.strlen_PRUnichar (aCheckMsg);
+        if (length > 0) {
+            dest = new char[length];
+            XPCOM.memmove (dest, aCheckMsg, length * 2);
+            checkLabel = new String (dest);
+        }
+    }
+
+    Shell shell = browser is null ? new Shell () : browser.getShell ();
+    PromptDialog dialog = new PromptDialog (shell);
+    int[] check = new int[1], result = new int[1];
+    if (aCheckState !is 0) XPCOM.memmove (check, aCheckState, 4);
+    dialog.prompt (titleLabel, textLabel, checkLabel, valueLabel, check, result);
+
+    XPCOM.memmove (_retval, result, 4);
+    if (result[0] is 1) {
+        /* 
+        * User selected OK. User name and password are returned as PRUnichar values. Any default
+        * value that we override must be freed using the nsIMemory service.
+        */
+        int cnt, size;
+        int /*long*/ ptr;
+        char[] buffer;
+        int /*long*/[] result2 = new int /*long*/[1];
+        if (valueLabel[0] !is null) {
+            cnt = valueLabel[0].length ();
+            buffer = new char[cnt + 1];
+            valueLabel[0].getChars (0, cnt, buffer, 0);
+            size = buffer.length * 2;
+            ptr = C.malloc (size);
+            XPCOM.memmove (ptr, buffer, size);
+            XPCOM.memmove (aValue, new int /*long*/[] {ptr}, C.PTR_SIZEOF);
+
+            if (valueAddr[0] !is 0) {
+                int rc = XPCOM.NS_GetServiceManager (result2);
+                if (rc !is XPCOM.NS_OK) DWT.error (rc);
+                if (result2[0] is 0) DWT.error (XPCOM.NS_NOINTERFACE);
+            
+                nsIServiceManager serviceManager = new nsIServiceManager (result2[0]);
+                result2[0] = 0;
+                byte[] aContractID = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_MEMORY_CONTRACTID, true);
+                rc = serviceManager.GetServiceByContractID (aContractID, nsIMemory.NS_IMEMORY_IID, result2);
+                if (rc !is XPCOM.NS_OK) DWT.error (rc);
+                if (result2[0] is 0) DWT.error (XPCOM.NS_NOINTERFACE);      
+                serviceManager.Release ();
+                
+                nsIMemory memory = new nsIMemory (result2[0]);
+                result2[0] = 0;
+                memory.Free (valueAddr[0]);
+                memory.Release ();
+            }
+        }
+    }
+    if (aCheckState !is 0) XPCOM.memmove (aCheckState, check, 4);
+    return XPCOM.NS_OK;
+}
+
+int PromptAuth(int /*long*/ aParent, int /*long*/ aChannel, int level, int /*long*/ authInfo, int /*long*/ checkboxLabel, int /*long*/ checkboxValue, int /*long*/ _retval) {
+    Browser browser = getBrowser (aParent);
+    String checkLabel = null;
+    int[] checkValue = new int[1];
+    String[] userLabel = new String[1], passLabel = new String[1];
+
+    String title = DWT.getMessage ("SWT_Authentication_Required"); //$NON-NLS-1$
+
+    if (checkboxLabel !is 0 && checkboxValue !is 0) {
+        int length = XPCOM.strlen_PRUnichar (checkboxLabel);
+        char[] dest = new char[length];
+        XPCOM.memmove (dest, checkboxLabel, length * 2);
+        checkLabel = new String (dest);
+        XPCOM.memmove (checkValue, checkboxValue, 4); /* PRBool */
+    }
+
+    /* get initial username and password values */
+
+    nsIAuthInformation auth = new nsIAuthInformation (authInfo);
+
+    int /*long*/ ptr = XPCOM.nsEmbedString_new ();
+    int rc = auth.GetUsername (ptr);
+    if (rc !is XPCOM.NS_OK) DWT.error (rc);
+    int length = XPCOM.nsEmbedString_Length (ptr);
+    int /*long*/ buffer = XPCOM.nsEmbedString_get (ptr);
+    char[] chars = new char[length];
+    XPCOM.memmove (chars, buffer, length * 2);
+    userLabel[0] = new String (chars);
+    XPCOM.nsEmbedString_delete (ptr);
+
+    ptr = XPCOM.nsEmbedString_new ();
+    rc = auth.GetPassword (ptr);
+    if (rc !is XPCOM.NS_OK) DWT.error (rc);
+    length = XPCOM.nsEmbedString_Length (ptr);
+    buffer = XPCOM.nsEmbedString_get (ptr);
+    chars = new char[length];
+    XPCOM.memmove (chars, buffer, length * 2);
+    passLabel[0] = new String (chars);
+    XPCOM.nsEmbedString_delete (ptr);
+
+    /* compute the message text */
+
+    ptr = XPCOM.nsEmbedString_new ();
+    rc = auth.GetRealm (ptr);
+    if (rc !is XPCOM.NS_OK) DWT.error (rc);
+    length = XPCOM.nsEmbedString_Length (ptr);
+    buffer = XPCOM.nsEmbedString_get (ptr);
+    chars = new char[length];
+    XPCOM.memmove (chars, buffer, length * 2);
+    String realm = new String (chars);
+    XPCOM.nsEmbedString_delete (ptr);
+
+    nsIChannel channel = new nsIChannel (aChannel);
+    int /*long*/[] uri = new int /*long*/[1];
+    rc = channel.GetURI (uri);
+    if (rc !is XPCOM.NS_OK) DWT.error (rc);
+    if (uri[0] is 0) Mozilla.error (XPCOM.NS_NOINTERFACE);
+
+    nsIURI nsURI = new nsIURI (uri[0]);
+    int /*long*/ aSpec = XPCOM.nsEmbedCString_new ();
+    rc = nsURI.GetHost (aSpec);
+    if (rc !is XPCOM.NS_OK) DWT.error (rc);
+    length = XPCOM.nsEmbedCString_Length (aSpec);
+    buffer = XPCOM.nsEmbedCString_get (aSpec);
+    byte[] bytes = new byte[length];
+    XPCOM.memmove (bytes, buffer, length);
+    XPCOM.nsEmbedCString_delete (aSpec);
+    String host = new String (bytes);
+    nsURI.Release ();
+
+    String message;
+    if (realm.length () > 0 && host.length () > 0) {
+        message = Compatibility.getMessage ("SWT_Enter_Username_and_Password", new String[] {realm, host}); //$NON-NLS-1$
+    } else {
+        message = ""; //$NON-NLS-1$
+    }
+
+    /* open the prompter */
+    Shell shell = browser is null ? new Shell () : browser.getShell ();
+    PromptDialog dialog = new PromptDialog (shell);
+    int[] result = new int[1];
+    dialog.promptUsernameAndPassword (title, message, checkLabel, userLabel, passLabel, checkValue, result);
+
+    XPCOM.memmove (_retval, result, 4); /* PRBool */
+    if (result[0] is 1) {   /* User selected OK */
+        nsEmbedString string = new nsEmbedString (userLabel[0]);
+        rc = auth.SetUsername(string.getAddress ());
+        if (rc !is XPCOM.NS_OK) DWT.error (rc);
+        string.dispose ();
+        
+        string = new nsEmbedString (passLabel[0]);
+        rc = auth.SetPassword(string.getAddress ());
+        if (rc !is XPCOM.NS_OK) DWT.error (rc);
+        string.dispose ();
+    }
+
+    if (checkboxValue !is 0) XPCOM.memmove (checkboxValue, checkValue, 4); /* PRBool */
+    return XPCOM.NS_OK;
+}
+
+int PromptUsernameAndPassword (int /*long*/ aParent, int /*long*/ aDialogTitle, int /*long*/ aText, int /*long*/ aUsername, int /*long*/ aPassword, int /*long*/ aCheckMsg, int /*long*/ aCheckState, int /*long*/ _retval) {
+    Browser browser = getBrowser (aParent);
+    String titleLabel, textLabel, checkLabel = null;
+    String[] userLabel = new String[1], passLabel = new String[1];
+    char[] dest;
+    int length;
+    if (aDialogTitle !is 0) {
+        length = XPCOM.strlen_PRUnichar (aDialogTitle);
+        dest = new char[length];
+        XPCOM.memmove (dest, aDialogTitle, length * 2);
+        titleLabel = new String (dest);
+    } else {
+        titleLabel = DWT.getMessage ("SWT_Authentication_Required");    //$NON-NLS-1$
+    }
+    
+    length = XPCOM.strlen_PRUnichar (aText);
+    dest = new char[length];
+    XPCOM.memmove (dest, aText, length * 2);
+    textLabel = new String (dest);
+    
+    int /*long*/[] userAddr = new int /*long*/[1];
+    XPCOM.memmove (userAddr, aUsername, C.PTR_SIZEOF);
+    if (userAddr[0] !is 0) {
+        length = XPCOM.strlen_PRUnichar (userAddr[0]);
+        dest = new char[length];
+        XPCOM.memmove (dest, userAddr[0], length * 2);
+        userLabel[0] = new String (dest);       
+    }
+    
+    int /*long*/[] passAddr = new int /*long*/[1];
+    XPCOM.memmove (passAddr, aPassword, C.PTR_SIZEOF);
+    if (passAddr[0] !is 0) {
+        length = XPCOM.strlen_PRUnichar (passAddr[0]);
+        dest = new char[length];
+        XPCOM.memmove (dest, passAddr[0], length * 2);
+        passLabel[0] = new String (dest);       
+    }
+    
+    if (aCheckMsg !is 0) {
+        length = XPCOM.strlen_PRUnichar (aCheckMsg);
+        if (length > 0) {
+            dest = new char[length];
+            XPCOM.memmove (dest, aCheckMsg, length * 2);
+            checkLabel = new String (dest);
+        }
+    }
+
+    Shell shell = browser is null ? new Shell () : browser.getShell ();
+    PromptDialog dialog = new PromptDialog (shell);
+    int[] check = new int[1], result = new int[1];
+    if (aCheckState !is 0) XPCOM.memmove (check, aCheckState, 4);   /* PRBool */
+    dialog.promptUsernameAndPassword (titleLabel, textLabel, checkLabel, userLabel, passLabel, check, result);
+
+    XPCOM.memmove (_retval, result, 4); /* PRBool */
+    if (result[0] is 1) {
+        /* 
+        * User selected OK. User name and password are returned as PRUnichar values. Any default
+        * value that we override must be freed using the nsIMemory service.
+        */
+        int cnt, size;
+        int /*long*/ ptr;
+        char[] buffer;
+        int /*long*/[] result2 = new int /*long*/[1];
+        if (userLabel[0] !is null) {
+            cnt = userLabel[0].length ();
+            buffer = new char[cnt + 1];
+            userLabel[0].getChars (0, cnt, buffer, 0);
+            size = buffer.length * 2;
+            ptr = C.malloc (size);
+            XPCOM.memmove (ptr, buffer, size);
+            XPCOM.memmove (aUsername, new int /*long*/[] {ptr}, C.PTR_SIZEOF);
+
+            if (userAddr[0] !is 0) {
+                int rc = XPCOM.NS_GetServiceManager (result2);
+                if (rc !is XPCOM.NS_OK) DWT.error (rc);
+                if (result2[0] is 0) DWT.error (XPCOM.NS_NOINTERFACE);
+            
+                nsIServiceManager serviceManager = new nsIServiceManager (result2[0]);
+                result2[0] = 0;
+                byte[] aContractID = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_MEMORY_CONTRACTID, true);
+                rc = serviceManager.GetServiceByContractID (aContractID, nsIMemory.NS_IMEMORY_IID, result2);
+                if (rc !is XPCOM.NS_OK) DWT.error (rc);
+                if (result[0] is 0) DWT.error (XPCOM.NS_NOINTERFACE);       
+                serviceManager.Release ();
+                
+                nsIMemory memory = new nsIMemory (result2[0]);
+                result2[0] = 0;
+                memory.Free (userAddr[0]);
+                memory.Release ();
+            }
+        }
+        if (passLabel[0] !is null) {
+            cnt = passLabel[0].length ();
+            buffer = new char[cnt + 1];
+            passLabel[0].getChars (0, cnt, buffer, 0);
+            size = buffer.length * 2;
+            ptr = C.malloc (size);
+            XPCOM.memmove (ptr, buffer, size);
+            XPCOM.memmove (aPassword, new int /*long*/[] {ptr}, C.PTR_SIZEOF);
+            
+            if (passAddr[0] !is 0) {
+                int rc = XPCOM.NS_GetServiceManager (result2);
+                if (rc !is XPCOM.NS_OK) DWT.error (rc);
+                if (result2[0] is 0) DWT.error (XPCOM.NS_NOINTERFACE);
+
+                nsIServiceManager serviceManager = new nsIServiceManager (result2[0]);
+                result2[0] = 0;
+                byte[] aContractID = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_MEMORY_CONTRACTID, true);
+                rc = serviceManager.GetServiceByContractID (aContractID, nsIMemory.NS_IMEMORY_IID, result2);
+                if (rc !is XPCOM.NS_OK) DWT.error (rc);
+                if (result2[0] is 0) DWT.error (XPCOM.NS_NOINTERFACE);      
+                serviceManager.Release ();
+
+                nsIMemory memory = new nsIMemory (result2[0]);
+                result2[0] = 0;
+                memory.Free (passAddr[0]);
+                memory.Release ();
+            }
+        }
+    }
+    if (aCheckState !is 0) XPCOM.memmove (aCheckState, check, 4); /* PRBool */
+    return XPCOM.NS_OK;
+}
+
+int PromptPassword (int /*long*/ aParent, int /*long*/ aDialogTitle, int /*long*/ aText, int /*long*/ aPassword, int /*long*/ aCheckMsg, int /*long*/ aCheckState, int /*long*/ _retval) {
+    return XPCOM.NS_ERROR_NOT_IMPLEMENTED;
+}
+
+int Select (int /*long*/ aParent, int /*long*/ aDialogTitle, int /*long*/ aText, int aCount, int /*long*/ aSelectList, int /*long*/ aOutSelection, int /*long*/ _retval) {
+    return XPCOM.NS_ERROR_NOT_IMPLEMENTED;
+}
+
+}