Bug #107608 --> allow generic extensions to account manager,

nsIMsgIdentity and nsIMsgIncomingServer. checking in for Seth.
r=bhuvan
sr=mscott


git-svn-id: svn://10.0.0.236/trunk@106803 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
mscott%netscape.com 2001-10-31 03:45:24 +00:00
parent bf5d4ab91a
commit dcde2c8b00
10 changed files with 343 additions and 22 deletions

View File

@ -42,6 +42,7 @@
var accountArray;
var gGenericAttributeTypes;
var accounttree;
var currentServerId;
@ -101,6 +102,8 @@ function onLoad() {
}
accountArray = new Array;
gGenericAttributeTypes = new Array;
RDF = Components.classes["@mozilla.org/rdf/rdf-service;1"].getService(Components.interfaces.nsIRDFService);
accountManager = Components.classes["@mozilla.org/messenger/account-manager;1"].getService(Components.interfaces.nsIMsgAccountManager);
@ -453,16 +456,42 @@ function saveAccount(accountValues, account)
}
if (dest == undefined) continue;
if ((type in gGenericAttributeTypes) && (slot in gGenericAttributeTypes[type])) {
switch (gGenericAttributeTypes[type][slot]) {
case "int":
if (dest.getIntAttribute(slot) != typeArray[slot])
dest.setIntAttribute(slot, typeArray[slot]);
break;
case "wstring":
if (dest.getUnicharAttribute(slot) != typeArray[slot])
dest.setUnicharAttribute(slot, typeArray[slot]);
break;
case "string":
if (dest.getCharAttribute(slot) != typeArray[slot])
dest.setCharAttribute(slot, typeArray[slot]);
break;
case "bool":
if (dest.getBoolAttribute(slot) != typeArray[slot])
dest.setBoolAttribute(slot, typeArray[slot]);
break;
default:
dump("unexpected preftype: " + preftype + "\n");
break;
}
}
else {
if (dest[slot] != typeArray[slot]) {
try {
dest[slot] = typeArray[slot];
} catch (ex) {
}
catch (ex) {
// hrm... need to handle special types here
}
}
}
}
}
}
function updateButtons(tree,serverId) {
@ -662,7 +691,7 @@ function setAccountValue(accountValues, type, slot, value) {
accountValues[type][slot] = value;
}
function getAccountValue(account, accountValues, type, slot) {
function getAccountValue(account, accountValues, type, slot, preftype, isGeneric) {
if (!accountValues[type])
accountValues[type] = new Array;
@ -699,9 +728,35 @@ function getAccountValue(account, accountValues, type, slot) {
}
if (source) {
if (isGeneric) {
if (!gGenericAttributeTypes[type])
gGenericAttributeTypes[type] = new Array;
// we need the preftype later, for setting when we save.
gGenericAttributeTypes[type][slot] = preftype;
switch (preftype) {
case "int":
accountValues[type][slot] = source.getIntAttribute(slot);
break;
case "wstring":
accountValues[type][slot] = source.getUnicharAttribute(slot);
break;
case "string":
accountValues[type][slot] = source.getCharAttribute(slot);
break;
case "bool":
accountValues[type][slot] = source.getBoolAttribute(slot);
break;
default:
dump("unexpected preftype: " + preftype + "\n");
break;
}
}
else {
accountValues[type][slot] = source[slot];
}
}
}
var value = accountValues[type][slot];
//dump("Array->Form: accountValues[" + type + "][" + slot + "] = " + value + "\n");
return value;
@ -730,7 +785,7 @@ function restorePage(pageId, serverId) {
// buttons are lockable, but don't have any data so we skip that part.
// elements that do have data, we get the values at poke them in.
if (pageElements[i].localName != "button") {
var value = getAccountValue(account, accountValues, type, slot);
var value = getAccountValue(account, accountValues, type, slot, pageElements[i].getAttribute("preftype"), (pageElements[i].getAttribute("genericattr") == "true"));
setFormElementValue(pageElements[i], value);
}
updateElementWithKeys(account,pageElements[i],type);

View File

@ -111,7 +111,7 @@ function initDownloadSettings()
function onPreInit(account, accountValues)
{
gServerType = getAccountValue(account, accountValues, "server", "type");
gServerType = getAccountValue(account, accountValues, "server", "type", null, false);
hideShowControls(gServerType);
gIncomingServer= account.incomingServer;
gIncomingServer.type = gServerType;

View File

@ -34,7 +34,7 @@ function onInit()
function onPreInit(account, accountValues)
{
var type = parent.getAccountValue(account, accountValues, "server", "type");
var type = parent.getAccountValue(account, accountValues, "server", "type", null, false);
hideShowControls(type);
}

View File

@ -20,6 +20,7 @@
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Seth Spitzer <sspitzer@netscape.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
@ -185,3 +186,16 @@ interface nsIMsgAccountManager : nsISupports {
void saveAccountInfo();
};
%{C++
#define MAILNEWS_ACCOUNTMANAGER_EXTENSIONS "mailnews-accountmanager-extensions"
%}
[scriptable, uuid(9ce9fc76-1dd1-11b2-8da2-bf6b98b4c537)]
interface nsIMsgAccountManagerExtension : nsISupports
{
readonly attribute string name;
boolean showPanel(in nsIMsgIncomingServer server);
};

View File

@ -131,5 +131,22 @@ interface nsIMsgIdentity : nsISupports {
/* copy the attributes of the identity we pass in */
void copy(in nsIMsgIdentity identity);
/**
* these generic getter / setters, useful for extending mailnews
* note, these attributes persist across sessions
*/
wstring getUnicharAttribute(in string name);
void setUnicharAttribute(in string name, in wstring value);
string getCharAttribute(in string name);
void setCharAttribute(in string name, in string value);
boolean getBoolAttribute(in string name);
void setBoolAttribute(in string name, in boolean value);
long getIntAttribute(in string name);
void setIntAttribute(in string name, in long value);
/* useful for debugging */
wstring toString();
};

View File

@ -297,6 +297,22 @@ interface nsIMsgIncomingServer : nsISupports {
/* used for setting up the search UI */
readonly attribute nsMsgSearchScopeValue searchScope;
/**
* these generic getter / setters, useful for extending mailnews
* note, these attributes persist across sessions
*/
wstring getUnicharAttribute(in string name);
void setUnicharAttribute(in string name, in wstring value);
string getCharAttribute(in string name);
void setCharAttribute(in string name, in string value);
boolean getBoolAttribute(in string name);
void setBoolAttribute(in string name, in boolean value);
long getIntAttribute(in string name);
void setIntAttribute(in string name, in long value);
};
%{C++

View File

@ -21,6 +21,7 @@
*
* Contributor(s):
* Alec Flett <alecf@netscape.com>
* Seth Spitzer <sspitzer@netscape.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
@ -56,23 +57,24 @@
#include "nsMsgBaseCID.h"
#include "nsMsgIncomingServer.h"
#include "nsICategoryManager.h"
#include "nsISupportsPrimitives.h"
// turn this on to see useful output
#undef DEBUG_amds
static NS_DEFINE_CID(kMsgMailSessionCID, NS_MSGMAILSESSION_CID);
static NS_DEFINE_CID(kRDFServiceCID, NS_RDFSERVICE_CID);
static NS_DEFINE_CID(kStringBundleServiceCID, NS_STRINGBUNDLESERVICE_CID);
#define NC_RDF_PAGETITLE_MAIN NC_NAMESPACE_URI "PageTitleMain"
#define NC_RDF_PAGETITLE_SERVER NC_NAMESPACE_URI "PageTitleServer"
#define NC_RDF_PAGETITLE_COPIES NC_NAMESPACE_URI "PageTitleCopies"
#define NC_RDF_PAGETITLE_ADVANCED NC_NAMESPACE_URI "PageTitleAdvanced"
#define NC_RDF_PAGETITLE_OFFLINEANDDISKSPACE NC_NAMESPACE_URI "PageTitleOfflineAndDiskSpace"
#define NC_RDF_PAGETITLE_DISKSPACE NC_NAMESPACE_URI "PageTitleDiskSpace"
#define NC_RDF_PAGETITLE_ADDRESSING NC_NAMESPACE_URI "PageTitleAddressing"
#define NC_RDF_PAGETITLE_SMTP NC_NAMESPACE_URI "PageTitleSMTP"
#define NC_RDF_PAGETITLE_PREFIX NC_NAMESPACE_URI "PageTitle"
#define NC_RDF_PAGETITLE_MAIN NC_RDF_PAGETITLE_PREFIX "Main"
#define NC_RDF_PAGETITLE_SERVER NC_RDF_PAGETITLE_PREFIX "Server"
#define NC_RDF_PAGETITLE_COPIES NC_RDF_PAGETITLE_PREFIX "Copies"
#define NC_RDF_PAGETITLE_ADVANCED NC_RDF_PAGETITLE_PREFIX "Advanced"
#define NC_RDF_PAGETITLE_OFFLINEANDDISKSPACE NC_RDF_PAGETITLE_PREFIX "OfflineAndDiskSpace"
#define NC_RDF_PAGETITLE_DISKSPACE NC_RDF_PAGETITLE_PREFIX "DiskSpace"
#define NC_RDF_PAGETITLE_ADDRESSING NC_RDF_PAGETITLE_PREFIX "Addressing"
#define NC_RDF_PAGETITLE_SMTP NC_RDF_PAGETITLE_PREFIX "SMTP"
#define NC_RDF_PAGETAG NC_NAMESPACE_URI "PageTag"
#define NC_RDF_ACCOUNTROOT "msgaccounts:/"
typedef struct _serverCreationParams {
@ -319,15 +321,49 @@ nsMsgAccountManagerDataSource::GetTarget(nsIRDFResource *source,
getter_Copies(pageTitle));
else {
// if it's a server, use the pretty name
nsCOMPtr<nsIMsgFolder> folder = do_QueryInterface(source, &rv);
if (NS_SUCCEEDED(rv)) {
if (NS_SUCCEEDED(rv) && folder) {
PRBool isServer;
rv = folder->GetIsServer(&isServer);
if(NS_SUCCEEDED(rv) && isServer)
rv = folder->GetPrettyName(getter_Copies(pageTitle));
}
else {
// allow for the accountmanager to be dynamically extended.
nsCOMPtr<nsIStringBundleService> strBundleService =
do_GetService(NS_STRINGBUNDLE_CONTRACTID, &rv);
NS_ENSURE_SUCCESS(rv,rv);
const char *sourceValue;
rv = source->GetValueConst(&sourceValue);
NS_ENSURE_SUCCESS(rv,rv);
// make sure the pointer math we're about to do is safe.
NS_ENSURE_TRUE(sourceValue && (nsCRT::strlen(sourceValue) > nsCRT::strlen(NC_RDF_PAGETITLE_PREFIX)), NS_ERROR_UNEXPECTED);
nsCAutoString bundleURL;
bundleURL = "chrome://messenger/locale/";
bundleURL += "am-";
// turn NC#PageTitlefoobar into foobar, so we can get the am-foobar.properties bundle
bundleURL += (sourceValue + nsCRT::strlen(NC_RDF_PAGETITLE_PREFIX));
bundleURL += ".properties";
nsCOMPtr <nsIStringBundle> bundle;
rv = strBundleService->CreateBundle(bundleURL.get(),
getter_AddRefs(bundle));
NS_ENSURE_SUCCESS(rv,rv);
nsAutoString panelTitleName;
panelTitleName = NS_LITERAL_STRING("prefPanel-");
panelTitleName.AppendWithConversion(sourceValue + nsCRT::strlen(NC_RDF_PAGETITLE_PREFIX));
bundle->GetStringFromName(panelTitleName.get(),
getter_Copies(pageTitle));
}
str.Assign((const PRUnichar*)pageTitle);
}
str = pageTitle.get();
}
else if (property == kNC_PageTag) {
// do NOT localize these strings. these are the urls of the XUL files
@ -344,8 +380,8 @@ nsMsgAccountManagerDataSource::GetTarget(nsIRDFResource *source,
else if (source == kNC_PageTitleSMTP)
str = NS_LITERAL_STRING("am-smtp.xul");
else {
str = NS_LITERAL_STRING("am-main.xul");
nsCOMPtr<nsIMsgFolder> folder = do_QueryInterface(source, &rv);
if (NS_SUCCEEDED(rv) && folder) {
/* if this is a server, with no identities, then we show a special panel */
nsCOMPtr<nsIMsgIncomingServer> server;
rv = getServerForFolderNode(source, getter_AddRefs(server));
@ -355,6 +391,27 @@ nsMsgAccountManagerDataSource::GetTarget(nsIRDFResource *source,
if (NS_SUCCEEDED(rv) && !hasIdentities) {
str = NS_LITERAL_STRING("am-serverwithnoidentities.xul");
}
else {
str = NS_LITERAL_STRING("am-main.xul");
}
}
else {
str = NS_LITERAL_STRING("am-main.xul");
}
}
else {
// allow for the accountmanager to be dynamically extended
const char *sourceValue;
rv = source->GetValueConst(&sourceValue);
NS_ENSURE_SUCCESS(rv,rv);
// make sure the pointer math we're about to do is safe.
NS_ENSURE_TRUE(sourceValue && (nsCRT::strlen(sourceValue) > nsCRT::strlen(NC_RDF_PAGETITLE_PREFIX)), NS_ERROR_UNEXPECTED);
// turn NC#PageTitlefoobar into foobar, so we can get the am-foobar.xul file
str = NS_LITERAL_STRING("am-");
str.AppendWithConversion((sourceValue + nsCRT::strlen(NC_RDF_PAGETITLE_PREFIX)));
str += NS_LITERAL_STRING(".xul");
}
}
}
@ -537,6 +594,77 @@ nsMsgAccountManagerDataSource::createRootResources(nsIRDFResource *property,
return rv;
}
nsresult
nsMsgAccountManagerDataSource::appendGenericSettingsResources(nsIMsgIncomingServer *server, nsISupportsArray *aNodeArray)
{
nsresult rv;
nsCOMPtr<nsICategoryManager> catman = do_GetService(NS_CATEGORYMANAGER_CONTRACTID, &rv);
NS_ENSURE_SUCCESS(rv,rv);
nsCOMPtr<nsISimpleEnumerator> e;
rv = catman->EnumerateCategory(MAILNEWS_ACCOUNTMANAGER_EXTENSIONS, getter_AddRefs(e));
if(NS_SUCCEEDED(rv) && e) {
while (PR_TRUE) {
nsCOMPtr<nsISupportsString> catEntry;
rv = e->GetNext(getter_AddRefs(catEntry));
if (NS_FAILED(rv) || !catEntry)
break;
nsXPIDLCString entryString;
rv = catEntry->GetData(getter_Copies(entryString));
if (NS_FAILED(rv))
break;
nsXPIDLCString contractidString;
rv = catman->GetCategoryEntry(MAILNEWS_ACCOUNTMANAGER_EXTENSIONS, entryString.get(), getter_Copies(contractidString));
if (NS_FAILED(rv))
break;
nsCOMPtr <nsIMsgAccountManagerExtension> extension = do_GetService(contractidString.get(), &rv);
if (NS_FAILED(rv) || !extension)
break;
PRBool showPanel;
rv = extension->ShowPanel(server, &showPanel);
if (NS_FAILED(rv))
break;
if (showPanel) {
nsXPIDLCString name;
rv = extension->GetName(getter_Copies(name));
if (NS_FAILED(rv))
break;
rv = appendGenericSetting(name.get(), aNodeArray);
if (NS_FAILED(rv))
break;
}
}
}
return NS_OK;
}
nsresult
nsMsgAccountManagerDataSource::appendGenericSetting(const char *name, nsISupportsArray *aNodeArray)
{
NS_ENSURE_ARG_POINTER(name);
NS_ENSURE_ARG_POINTER(aNodeArray);
nsCOMPtr <nsIRDFResource> resource;
nsCAutoString resourceStr;
resourceStr = NC_RDF_PAGETITLE_PREFIX;
resourceStr += name;
nsresult rv = getRDFService()->GetResource(resourceStr.get(), getter_AddRefs(resource));
NS_ENSURE_SUCCESS(rv,rv);
// AppendElement will addref.
aNodeArray->AppendElement(resource);
return NS_OK;
}
// end of all #Settings arcs
nsresult
nsMsgAccountManagerDataSource::createSettingsResources(nsIRDFResource *aSource,
@ -584,6 +712,10 @@ nsMsgAccountManagerDataSource::createSettingsResources(nsIRDFResource *aSource,
else if (supportsDiskSpace) {
aNodeArray->AppendElement(kNC_PageTitleDiskSpace);
}
// extensions come after the default panels
rv = appendGenericSettingsResources(server, aNodeArray);
NS_ASSERTION(NS_SUCCEEDED(rv), "failed to add generic panels");
}
}
}
@ -979,7 +1111,7 @@ nsMsgAccountManagerDataSource::getStringBundle()
nsresult rv;
nsCOMPtr<nsIStringBundleService> strBundleService =
do_GetService(kStringBundleServiceCID, &rv);
do_GetService(NS_STRINGBUNDLE_CONTRACTID, &rv);
if (NS_FAILED(rv)) return rv;
rv = strBundleService->CreateBundle("chrome://messenger/locale/prefs.properties",

View File

@ -20,6 +20,7 @@
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Seth Spitzer <sspitzer@netscape.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
@ -118,6 +119,8 @@ protected:
nsISupportsArray* aNodeArray);
nsresult createSettingsResources(nsIRDFResource *aSource,
nsISupportsArray *aNodeArray);
nsresult appendGenericSettingsResources(nsIMsgIncomingServer *server, nsISupportsArray *aNodeArray);
nsresult appendGenericSetting(const char *name, nsISupportsArray *aNodeArray);
static nsIRDFResource* kNC_Name;
static nsIRDFResource* kNC_FolderTreeName;

View File

@ -19,8 +19,12 @@
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Original Author:
* Alec Flett <alecf@netscape.com>
*
* Contributor(s):
* Pierre Phaneuf <pp@ludusdesign.com>
* Seth Spitzer <sspitzer@netscape.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
@ -520,6 +524,46 @@ nsMsgIdentity::setFolderPref(const char *prefname, const char *value)
return rv;
}
NS_IMETHODIMP nsMsgIdentity::SetUnicharAttribute(const char *aName, const PRUnichar *val)
{
return setUnicharPref(aName, val);
}
NS_IMETHODIMP nsMsgIdentity::GetUnicharAttribute(const char *aName, PRUnichar **val)
{
return getUnicharPref(aName, val);
}
NS_IMETHODIMP nsMsgIdentity::SetCharAttribute(const char *aName, const char *val)
{
return setCharPref(aName, val);
}
NS_IMETHODIMP nsMsgIdentity::GetCharAttribute(const char *aName, char **val)
{
return getCharPref(aName, val);
}
NS_IMETHODIMP nsMsgIdentity::SetBoolAttribute(const char *aName, PRBool val)
{
return setBoolPref(aName, val);
}
NS_IMETHODIMP nsMsgIdentity::GetBoolAttribute(const char *aName, PRBool *val)
{
return getBoolPref(aName, val);
}
NS_IMETHODIMP nsMsgIdentity::SetIntAttribute(const char *aName, PRInt32 val)
{
return setIntPref(aName, val);
}
NS_IMETHODIMP nsMsgIdentity::GetIntAttribute(const char *aName, PRInt32 *val)
{
return getIntPref(aName, val);
}
#define COPY_IDENTITY_FILE_VALUE(SRC_ID,MACRO_GETTER,MACRO_SETTER) \
{ \
nsresult macro_rv; \

View File

@ -1510,3 +1510,43 @@ NS_IMPL_SERVERPREF_BOOL(nsMsgIncomingServer,
"limit_offline_message_size")
NS_IMPL_SERVERPREF_INT(nsMsgIncomingServer, MaxMessageSize, "max_size")
NS_IMETHODIMP nsMsgIncomingServer::SetUnicharAttribute(const char *aName, const PRUnichar *val)
{
return SetUnicharValue(aName, val);
}
NS_IMETHODIMP nsMsgIncomingServer::GetUnicharAttribute(const char *aName, PRUnichar **val)
{
return GetUnicharValue(aName, val);
}
NS_IMETHODIMP nsMsgIncomingServer::SetCharAttribute(const char *aName, const char *val)
{
return SetCharValue(aName, val);
}
NS_IMETHODIMP nsMsgIncomingServer::GetCharAttribute(const char *aName, char **val)
{
return GetCharValue(aName, val);
}
NS_IMETHODIMP nsMsgIncomingServer::SetBoolAttribute(const char *aName, PRBool val)
{
return SetBoolValue(aName, val);
}
NS_IMETHODIMP nsMsgIncomingServer::GetBoolAttribute(const char *aName, PRBool *val)
{
return GetBoolValue(aName, val);
}
NS_IMETHODIMP nsMsgIncomingServer::SetIntAttribute(const char *aName, PRInt32 val)
{
return SetIntValue(aName, val);
}
NS_IMETHODIMP nsMsgIncomingServer::GetIntAttribute(const char *aName, PRInt32 *val)
{
return GetIntValue(aName, val);
}