view dwt/browser/PromptService2.d @ 0:380af2bdd8e5

Upload of whole dwt tree
author Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
date Sat, 09 Aug 2008 17:00:02 +0200
parents
children 1a8b3cb347e0
line wrap: on
line source

/*******************************************************************************
 * 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;
}

}