Bug 450917 - Create and populate nsIAbCollection. r=Standard8, sr=bienvenu

This commit is contained in:
Joshua Cranmer 2008-09-22 21:30:13 -04:00
Родитель fa68466530
Коммит 812af31a77
24 изменённых файлов: 197 добавлений и 155 удалений

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

@ -117,8 +117,7 @@ var editContactInlineUI = {
var bundle = document.getElementById("bundle_editContact");
// Is this address book writeable?
this._writeable = this._cardDetails.book.operations &
Components.interfaces.nsIAbDirectory.opWrite;
this._writeable = !this._cardDetails.book.readOnly;
var type = this._writeable ? "edit" : "view";
// Update the labels accordingly.

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

@ -1141,8 +1141,7 @@ function setupEmailAddressPopup(emailAddressNode)
if (emailAddressNode.cardDetails.card) {
document.getElementById('addToAddressBookItem').setAttribute('hidden', true);
if (emailAddressNode.cardDetails.book.operations &
Components.interfaces.nsIAbDirectory.opWrite) {
if (!emailAddressNode.cardDetails.book.readOnly) {
document.getElementById('editContactItem').removeAttribute('hidden');
document.getElementById('viewContactItem').setAttribute('hidden', true);
}

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

@ -120,7 +120,7 @@ function OnLoadNewCard()
if (parentURI)
gEditCard.selectedAB = parentURI;
}
else if (directory.operations & directory.opWrite)
else if (!directory.readOnly)
gEditCard.selectedAB = window.arguments[0].selectedAB;
}
@ -266,7 +266,7 @@ function OnLoadEditCard()
var abURI = window.arguments[0].abURI;
var directory = GetDirectoryFromURI(abURI);
if (!(directory.operations & directory.opWrite))
if (directory.readOnly)
{
// Set all the editable vcard fields to read only
for (var i = kVcardFields.length; i-- > 0; )

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

@ -100,8 +100,7 @@ var DirPaneController =
// If the directory is a mailing list, and it is read-only, return
// false.
var abDir = GetDirectoryFromURI(selectedDir);
if (abDir.isMailList &&
~abDir.operations & abDir.opWrite)
if (abDir.isMailList && abDir.readOnly)
return false;
// If the selected directory is an ldap directory

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

@ -47,9 +47,10 @@ MODULE = addrbook
XPIDLSRCS = \
nsIAbListener.idl \
nsIAbDirectory.idl \
nsIAbItem.idl \
nsIAbCollection.idl \
nsIAbCard.idl \
nsIAbDirectory.idl \
nsIAbMDBDirectory.idl \
nsIAddrDBAnnouncer.idl \
nsIAddrDBListener.idl \

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

@ -0,0 +1,108 @@
/* -*- 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 mozilla.org code.
*
* The Initial Developer of the Original Code is
* Mozilla Messaging Corporation.
* Portions created by the Initial Developer are Copyright (C) 2008
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Mark Banner <bugzilla@standard8.plus.com>
* Joshua Cranmer <Pidgeot18@gmail.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"),
* 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"
#include "nsIAbItem.idl"
interface nsIAbCard;
/**
* A collection of address book items.
*/
[scriptable, uuid(e6f97fdb-2e3e-46ad-974d-50f1388953c0)]
interface nsIAbCollection : nsIAbItem {
/**
* Returns true if this collection is read-only.
*/
readonly attribute boolean readOnly;
/**
* Returns true if this collection is accessed over a network connection.
*/
readonly attribute boolean isRemote;
/**
* Returns true if this collection is accessed over a secure connection.
*
* If isRemote returns false, then this value MUST be false as well.
*/
readonly attribute boolean isSecure;
/**
* Returns an address book card for the specified email address if found.
*
* If there are multiple cards with the given email address, this method will
* return one of these cards in an implementation-defined manner.
*
* This method performs a synchronous operation. If the collection cannot do
* the search in such a manner, then it should throw NS_ERROR_NOT_IMPLEMENTED.
*
* @param emailAddress The email address to find in any of the email address
* fields. If emailAddress is empty, the database won't
* be searched and the function will return as if no card
* was found.
* @return An nsIAbCard if one was found, else returns NULL.
* @exception NS_ERROR_NOT_IMPLEMENTED If the collection cannot do this.
*/
nsIAbCard cardForEmailAddress(in AUTF8String emailAddress);
/**
* Returns an address book card for the specified property if found.
*
* If there are multiple cards with the given value for the property, this
* method will return one of these cards in an implementation-defined manner.
*
* This method performs a synchronous operation. If the collection cannot do
* the search in such a manner, then it should throw NS_ERROR_NOT_IMPLEMENTED.
*
* If the property is not natively a string, it can still be searched for
* using the string-encoded value of the property, e.g. "0". See
* nsIAbCard::getPropertyAsAUTF8String for more information. Empty values will
* return no match, to prevent spurious results.
*
* @param aProperty The property to look for.
* @param aValue The value to search for.
* @param aCaseSensitive True if matching should be done case-sensitively.
* @result An nsIAbCard if one was found, else returns NULL.
* @exception NS_ERROR_NOT_IMPLEMENTED If the collection cannot do this.
*/
nsIAbCard getCardFromProperty(in string aProperty, in AUTF8String aValue,
in boolean aCaseSensitive);
};

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

@ -38,7 +38,7 @@
*
* ***** END LICENSE BLOCK ***** */
#include "nsISupports.idl"
#include "nsIAbCollection.idl"
#include "nsIAbCard.idl"
interface nsISimpleEnumerator;
@ -60,8 +60,8 @@ interface nsIMutableArray;
#define kABFileName_CurrentSuffix ".mab" /* v3 address book extension */
%}
[scriptable, uuid(1b2637fb-194e-442b-992a-17fe7c068fd4)]
interface nsIAbDirectory : nsISupports {
[scriptable, uuid(5ee48561-aff9-447c-802d-93384d524f53)]
interface nsIAbDirectory : nsIAbCollection {
/**
* The chrome URI to use for bringing up a dialog to edit this directory.
@ -71,21 +71,6 @@ interface nsIAbDirectory : nsISupports {
*/
readonly attribute ACString propertiesChromeURI;
// Types of operation
// Perform linear reading of directory card
// content
const long opRead = 0x1;
// Perform modification and deletion on a
// directories content
const long opWrite = 0x2;
// Perform searching on a directory card
// content via the uri format:
// scheme://path?query
const long opSearch = 0x4;
// The supported operations
readonly attribute long operations;
/**
* The description of the directory. If this directory is not a mailing list,
* then setting this attribute will send round a "DirName" update via
@ -164,16 +149,6 @@ interface nsIAbDirectory : nsISupports {
void dropCard(in nsIAbCard card, in boolean needToCopyCard);
/**
* directory is local (example, mork based) or remote (example, LDAP)
*/
readonly attribute boolean isRemote;
/**
* directory is secure (as in LDAP over SSL)
*/
readonly attribute boolean isSecure;
/**
* Whether or not the directory should be searched when doing autocomplete,
* (currently by using GetChildCards); LDAP does not support this in online
@ -308,45 +283,4 @@ interface nsIAbDirectory : nsISupports {
void setStringValue(in string aName, in ACString aValue);
void setLocalizedStringValue(in string aName, in AUTF8String aValue);
//@}
/**
* Returns an address book card for the specified email address if found.
*
* If there are multiple cards with the given email address, this method will
* return one of these cards in an implementation-defined manner.
*
* If the address book type does not know how to find a card, it will throw
* NS_ERROR_NOT_IMPLEMENTED. Core address book types do throw this exception,
* so beware when calling this method.
*
* @param emailAddress The email address to find in either the primary or
* secondary email address fields. If email address is
* empty, the database won't be searched and the function
* will return as if no card was found.
* @return An nsIAbCard if one was found, else returns NULL.
*/
nsIAbCard cardForEmailAddress(in AUTF8String emailAddress);
/**
* Returns an address book card for the specified property if found.
*
* If there are multiple cards with the given value for the property, this
* method will return one of these cards in an implementation-defined manner.
*
* If the address book type does not know how to do this, it will throw
* NS_ERROR_NOT_IMPLEMENTED. Core address book types do throw this exception,
* so beware when calling this method.
*
* If the property is not natively a string, it can still be searched for
* using the string-encoded value of the property, e.g. "0". See
* nsIAbCard::getPropertyAsAUTF8String for more information. Empty values will
* return no match, to prevent spurious results.
*
* @param aProperty The property to look for.
* @param aValue The value to search for.
* @param aCaseSensitive True if matching should be done case-senstively.
* @result An nsIAbCard if one was found, else returns NULL.
*/
nsIAbCard getCardFromProperty(in string aProperty, in AUTF8String aValue,
in boolean aCaseSensitive);
};

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

@ -120,7 +120,7 @@ function OnLoadNewCard()
if (parentURI)
gEditCard.selectedAB = parentURI;
}
else if (directory.operations & directory.opWrite)
else if (!directory.readOnly)
gEditCard.selectedAB = window.arguments[0].selectedAB;
}
@ -266,7 +266,7 @@ function OnLoadEditCard()
var abURI = window.arguments[0].abURI;
var directory = GetDirectoryFromURI(abURI);
if (!(directory.operations & directory.opWrite))
if (directory.readOnly)
{
// Set all the editable vcard fields to read only
for (var i = kVcardFields.length; i-- > 0; )

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

@ -98,8 +98,7 @@ var DirPaneController =
// If the directory is a mailing list, and it is read-only, return
// false.
var abDir = GetDirectoryFromURI(selectedDir);
if (abDir.isMailList &&
~abDir.operations & abDir.opWrite)
if (abDir.isMailList && abDir.readOnly)
return false;
// If the selected directory is an ldap directory

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

@ -55,7 +55,7 @@ var abResultsPaneObserver = {
var srcDirectory = GetDirectoryFromURI(GetSelectedDirectory());
// The default allowable actions are copy, move and link, so we need
// to restrict them here.
if ((srcDirectory.operations & srcDirectory.opWrite))
if (!srcDirectory.readOnly)
// Only allow copy & move from read-write directories.
aDragAction.action = Components.interfaces.
nsIDragService.DRAGDROP_ACTION_COPY |
@ -137,7 +137,7 @@ var abDirTreeObserver = {
// e.g. LDAP is readonly currently
var targetDirectory = GetDirectoryFromURI(targetURI);
if (!(targetDirectory.operations & targetDirectory.opWrite))
if (targetDirectory.readOnly)
return false;
var dragSession = dragService.getCurrentSession();
@ -157,7 +157,7 @@ var abDirTreeObserver = {
var srcDirectory = GetDirectoryFromURI(srcURI);
// Only allow copy from read-only directories.
if (!(srcDirectory.operations & srcDirectory.opWrite) &&
if (srcDirectory.readOnly &&
dragSession.dragAction != Components.interfaces.
nsIDragService.DRAGDROP_ACTION_COPY)
return false;

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

@ -220,7 +220,7 @@ function OnLoadNewMailList()
selectedAB = parentURI;
}
}
else if (!(directory.operations & directory.opWrite)) {
else if (directory.readOnly) {
selectedAB = kPersonalAddressbookURI;
}
@ -309,7 +309,7 @@ function OnLoadEditList()
// Is this directory read-only? If so, we now need to set all the fields to
// read-only.
if (~gEditList.operations & gEditList.opWrite) {
if (gEditList.readOnly) {
const kMailListFields = [ 'ListName', 'ListNickName', 'ListDescription' ];
for (var i = 0; i < kMailListFields.length; ++i)

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

@ -381,7 +381,7 @@ var ResultsPaneController =
var enabled = false;
if (gAbView && gAbView.selection) {
if (gAbView.directory)
enabled = gAbView.directory.operations & gAbView.directory.opWrite;
enabled = !gAbView.directory.readOnly;
numSelected = gAbView.selection.count;
}
else

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

@ -183,11 +183,10 @@
<parameter name="ab"/>
<body><![CDATA[
// This condition is used for instance when creating cards
if (this.getAttribute("writable") == "true" &&
!(ab.operations & Components.interfaces.nsIAbDirectory.opWrite))
if (this.getAttribute("writable") == "true" && ab.readOnly)
return false;
// This condition is used for isntance when creating mailing lists
// This condition is used for instance when creating mailing lists
if (this.getAttribute("supportsmaillists") == "true" &&
!ab.supportsMailingLists)
return false;

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

@ -77,25 +77,19 @@ nsAbDirProperty::~nsAbDirProperty(void)
NS_IMPL_ISUPPORTS1(nsAbDirProperty,nsIAbDirectory)
NS_IMETHODIMP nsAbDirProperty::GenerateName(PRInt32 aGenerateFormat,
nsIStringBundle *aBundle,
nsAString &name)
{
return GetDirName(name);
}
NS_IMETHODIMP nsAbDirProperty::GetPropertiesChromeURI(nsACString &aResult)
{
aResult.AssignLiteral("chrome://messenger/content/addressbook/abAddressBookNameDialog.xul");
return NS_OK;
}
NS_IMETHODIMP nsAbDirProperty::GetOperations(PRInt32 *aOperations)
{
// Default is to support all operations.
// Inheriting implementations may override
// to reduce supported operations
NS_ENSURE_ARG_POINTER(aOperations);
*aOperations = nsIAbDirectory::opRead |
nsIAbDirectory::opWrite |
nsIAbDirectory::opSearch;
return NS_OK;
}
NS_IMETHODIMP nsAbDirProperty::GetDirName(nsAString &aDirName)
{
if (m_DirPrefId.IsEmpty())
@ -330,6 +324,15 @@ NS_IMETHODIMP nsAbDirProperty::GetSupportsMailingLists(PRBool *aSupportsMailings
return NS_OK;
}
NS_IMETHODIMP nsAbDirProperty::GetReadOnly(PRBool *aReadOnly)
{
NS_ENSURE_ARG_POINTER(aReadOnly);
// Default is that we are writable. Any implementation that is read-only must
// override this method.
*aReadOnly = PR_FALSE;
return NS_OK;
}
NS_IMETHODIMP nsAbDirProperty::GetIsRemote(PRBool *aIsRemote)
{
NS_ENSURE_ARG_POINTER(aIsRemote);

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

@ -65,8 +65,10 @@ public:
nsAbDirProperty(void);
virtual ~nsAbDirProperty(void);
NS_DECL_ISUPPORTS
NS_DECL_NSIABDIRECTORY
NS_DECL_ISUPPORTS
NS_DECL_NSIABITEM
NS_DECL_NSIABCOLLECTION
NS_DECL_NSIABDIRECTORY
protected:
/**

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

@ -138,34 +138,6 @@ NS_IMETHODIMP nsAbLDAPDirectory::GetURI(nsACString &aURI)
return NS_OK;
}
NS_IMETHODIMP nsAbLDAPDirectory::GetOperations(PRInt32 *aOperations)
{
*aOperations = nsIAbDirectory::opSearch;
#ifdef MOZ_EXPERIMENTAL_WRITEABLE_LDAP
PRBool readOnly;
nsresult rv = GetBoolValue("readonly", PR_FALSE, &readOnly);
NS_ENSURE_SUCCESS(rv, rv);
if (readOnly)
return NS_OK;
// when online, we'll allow writing as well
PRBool offline;
nsCOMPtr <nsIIOService> ioService =
do_GetService(NS_IOSERVICE_CONTRACTID, &rv);
NS_ENSURE_SUCCESS(rv,rv);
rv = ioService->GetOffline(&offline);
NS_ENSURE_SUCCESS(rv,rv);
if (!offline)
*aOperations |= nsIAbDirectory::opWrite;
#endif
return NS_OK;
}
NS_IMETHODIMP nsAbLDAPDirectory::GetChildNodes(nsISimpleEnumerator* *aResult)
{
return NS_NewEmptyEnumerator(aResult);
@ -457,6 +429,36 @@ NS_IMETHODIMP nsAbLDAPDirectory::GetSupportsMailingLists(PRBool *aSupportsMailin
return NS_OK;
}
NS_IMETHODIMP nsAbLDAPDirectory::GetReadOnly(PRBool *aReadOnly)
{
NS_ENSURE_ARG_POINTER(aReadOnly);
*aReadOnly = PR_TRUE;
#ifdef MOZ_EXPERIMENTAL_WRITEABLE_LDAP
PRBool readOnly;
nsresult rv = GetBoolValue("readonly", PR_FALSE, &readOnly);
NS_ENSURE_SUCCESS(rv, rv);
if (readOnly)
return NS_OK;
// when online, we'll allow writing as well
PRBool offline;
nsCOMPtr <nsIIOService> ioService =
do_GetService(NS_IOSERVICE_CONTRACTID, &rv);
NS_ENSURE_SUCCESS(rv,rv);
rv = ioService->GetOffline(&offline);
NS_ENSURE_SUCCESS(rv,rv);
if (!offline)
*aReadOnly = PR_FALSE;
#endif
return NS_OK;
}
NS_IMETHODIMP nsAbLDAPDirectory::GetIsRemote(PRBool *aIsRemote)
{
NS_ENSURE_ARG_POINTER(aIsRemote);

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

@ -69,11 +69,11 @@ public:
// nsIAbDirectory methods
NS_IMETHOD GetPropertiesChromeURI(nsACString &aResult);
NS_IMETHOD GetURI(nsACString &aURI);
NS_IMETHOD GetOperations(PRInt32 *aOperations);
NS_IMETHOD GetChildNodes(nsISimpleEnumerator* *result);
NS_IMETHOD GetChildCards(nsISimpleEnumerator* *result);
NS_IMETHOD HasCard(nsIAbCard *cards, PRBool *hasCard);
NS_IMETHOD GetSupportsMailingLists(PRBool *aSupportsMailingsLists);
NS_IMETHOD GetReadOnly(PRBool *aReadOnly);
NS_IMETHOD GetIsRemote(PRBool *aIsRemote);
NS_IMETHOD GetIsSecure(PRBool *aIsRemote);
NS_IMETHOD UseForAutocomplete(const nsACString &aIdentityKey, PRBool *aResult);

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

@ -93,7 +93,7 @@ public:
NS_IMETHOD Init(const char *aUri);
// nsAbDirProperty methods
NS_IMETHOD GetOperations(PRInt32 *aOperations);
NS_IMETHOD GetReadOnly(PRBool *aReadOnly);
NS_IMETHOD GetChildCards(nsISimpleEnumerator **aCards);
NS_IMETHOD GetChildNodes(nsISimpleEnumerator **aNodes);
NS_IMETHOD HasCard(nsIAbCard *aCard, PRBool *aHasCard);

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

@ -522,11 +522,11 @@ nsAbOSXDirectory::GetURI(nsACString &aURI)
}
NS_IMETHODIMP
nsAbOSXDirectory::GetOperations(PRInt32 *aOperations)
nsAbOSXDirectory::GetReadOnly(PRBool *aReadOnly)
{
*aOperations = nsIAbDirectory::opRead |
nsIAbDirectory::opSearch;
NS_ENSURE_ARG_POINTER(aReadOnly);
*aReadOnly = PR_TRUE;
return NS_OK;
}

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

@ -494,11 +494,11 @@ nsresult
nsAbDirectoryDataSource::createDirectoryIsWriteableNode(nsIAbDirectory* directory,
nsIRDFNode **target)
{
PRBool isWriteable;
nsresult rv = directory->GetOperations(&isWriteable);
PRBool isReadOnly;
nsresult rv = directory->GetReadOnly(&isReadOnly);
NS_ENSURE_SUCCESS(rv, rv);
NS_IF_ADDREF(*target = ((isWriteable & nsIAbDirectory::opWrite) ? kTrueLiteral : kFalseLiteral));
NS_IF_ADDREF(*target = (isReadOnly ? kFalseLiteral : kTrueLiteral));
return NS_OK;
}

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

@ -19,9 +19,7 @@ var kPABData =
dirName: "Personal Address Book",
dirType: 2,
dirPrefID: "ldap_2.servers.pab",
operations: Components.interfaces.nsIAbDirectory.opRead |
Components.interfaces.nsIAbDirectory.opWrite |
Components.interfaces.nsIAbDirectory.opSearch,
readOnly: false,
position: 1
};
@ -33,9 +31,7 @@ var kCABData =
dirName: "Collected Addresses",
dirType: 2,
dirPrefID: "ldap_2.servers.history",
operations: Components.interfaces.nsIAbDirectory.opRead |
Components.interfaces.nsIAbDirectory.opWrite |
Components.interfaces.nsIAbDirectory.opSearch,
readOnly: false,
position: 2
};
@ -47,8 +43,7 @@ var kOSXData =
dirName: "Mac OS X Address Book",
dirType: 3,
dirPrefID: "ldap_2.servers.osx",
operations: Components.interfaces.nsIAbDirectory.opRead |
Components.interfaces.nsIAbDirectory.opSearch,
readOnly: true,
position: 1
};

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

@ -44,8 +44,9 @@ function check_ab(abConfig) {
// Test - Check attributes
do_check_eq(AB.generateName(0), abConfig.dirName);
do_check_eq(AB.propertiesChromeURI, kNormalPropertiesURI);
do_check_eq(AB.operations, abConfig.operations);
do_check_eq(AB.readOnly, abConfig.readOnly);
do_check_eq(AB.dirName, abConfig.dirName);
do_check_eq(AB.dirType, abConfig.dirType);
do_check_eq(AB.fileName, abConfig.fileName);

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

@ -26,6 +26,7 @@ function run_test() {
// Test - Check various fields
do_check_eq(abDir.dirName, "test");
do_check_eq(abDir.lDAPURL.spec, kLDAPTestSpec);
do_check_true(abDir.readOnly);
// Test - Write a UTF-8 Auth DN and check it
abDir.authDn = "test\u00D0";

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

@ -4652,13 +4652,13 @@ nsMsgCompose::CheckAndPopulateRecipients(PRBool aPopulateMailList,
if (NS_SUCCEEDED(rv))
recipient.mProcessed = PR_TRUE;
PRInt32 isWriteable;
rv = abDirectory->GetOperations(&isWriteable);
PRBool readOnly;
rv = abDirectory->GetReadOnly(&readOnly);
NS_ENSURE_SUCCESS(rv,rv);
// bump the popularity index for this card since we are about to send e-mail to it
PRUint32 popularityIndex = 0;
if ((isWriteable & nsIAbDirectory::opWrite) && NS_SUCCEEDED(existingCard->GetPropertyAsUint32(
if (!readOnly && NS_SUCCEEDED(existingCard->GetPropertyAsUint32(
kPopularityIndexProperty, &popularityIndex)))
{