Bug 323181 nsIAbLDAPReplicationQuery.idl should use nsIAb*Directory instead of DIR_Server as a member. r=bienvenu,sr=neil

This commit is contained in:
bugzilla%standard8.demon.co.uk 2006-03-23 17:09:02 +00:00
parent b38195389e
commit b3a33a385e
16 changed files with 486 additions and 172 deletions

View File

@ -56,6 +56,7 @@ PACKAGE_FILE = addrbook.pkg
REQUIRES = xpcom \
string \
necko \
pref \
mime \
rdf \
msgbase \

View File

@ -72,7 +72,7 @@ interface nsIAbDirectoryProperties : nsISupports {
attribute long position;
};
[scriptable, uuid(2edfc712-e6c5-11d8-9a39-000a95dc234c)]
[scriptable, uuid(d6d55de3-261d-4149-987d-3a88ceb5f2a9)]
interface nsIAbDirectory : nsISupports {
// Types of operation
@ -214,6 +214,51 @@ interface nsIAbDirectory : nsISupports {
wstring getValueForCard(in nsIAbCard card, in string name);
void setValueForCard(in nsIAbCard card, in string name, in wstring value);
// the id of the directory used in prefs
/**
* The id of the directory used in prefs e.g. "ldap_2.servers.pab"
* Setting this will cause directoryPrefs to be updated.
*/
attribute ACString dirPrefId;
/**
* @name getXXXValue
*
* Helper functions to get different types of pref, but return a default
* value if a pref value was not obtained.
*
* @param aName The name of the pref within the branch dirPrefId to
* get a value from.
*
* @param aDefaultValue The default value to return if getting the pref fails
* or the pref is not present.
*
* @return The value of the pref or the default value.
*
* @exception NS_ERROR_NOT_INITIALIZED if the pref branch couldn't
* be obtained (e.g. dirPrefId isn't set).
*/
//@{
long getIntValue(in string aName, in long aDefaultValue);
boolean getBoolValue(in string aName, in boolean aDefaultValue);
string getStringValue(in string aName, in string aDefaultValue);
//@}
/**
* @name setXXXValue
*
* Helper functions to set different types of pref values.
*
* @param aName The name of the pref within the branch dirPrefId to
* get a value from.
*
* @param aValue The value to set the pref to.
*
* @exception NS_ERROR_NOT_INITIALIZED if the pref branch couldn't
* be obtained (e.g. dirPrefId isn't set).
*/
//@{
void setIntValue(in string aName, in long aValue);
void setBoolValue(in string aName, in boolean aValue);
void setStringValue(in string aName, in string aValue);
//@}
};

View File

@ -49,7 +49,7 @@ interface nsIMutableArray;
* XXX This should really inherit from nsIAbDirectory, and some day it will.
* But for now, doing that complicates implementation.
*/
[scriptable, uuid(27ef9414-6959-4085-b5e3-bc491c0e6554)]
[scriptable, uuid(0780ec5e-0e45-4a42-af26-ab927faace4f)]
interface nsIAbLDAPDirectory : nsISupports
{
/**
@ -58,5 +58,30 @@ interface nsIAbLDAPDirectory : nsISupports
*/
attribute nsIMutableArray searchServerControls;
attribute nsIMutableArray searchClientControls;
/**
* The Replication File Name to use.
*/
attribute string replicationFileName;
/**
* The version of LDAP protocol in use.
*/
attribute unsigned long protocolVersion;
/**
* The AuthDN to use to access the server.
*/
attribute string authDn;
/**
* The Last Change Number used for replication.
*/
attribute long lastChangeNumber;
/**
* The LDAP server's scoping of the lastChangeNumber.
*/
attribute string dataVersion;
};

View File

@ -37,27 +37,23 @@
#include "nsISupports.idl"
%{ C++
#include "nsDirPrefs.h"
%}
[ptr] native DIR_Server(DIR_Server);
interface nsIWebProgressListener;
interface nsILDAPURL;
interface nsILDAPConnection;
interface nsILDAPOperation;
interface nsIAbLDAPDirectory;
/**
* this interface provides methods to perform LDAP Replication Queries
*/
[scriptable, uuid(00D568A1-3C3B-11d6-B7B9-00B0D06E5F27)]
[scriptable, uuid(91c213f7-a381-4b1d-adf3-af58a2bb95d2)]
interface nsIAbLDAPReplicationQuery : nsISupports {
readonly attribute nsILDAPURL replicationURL;
readonly attribute nsILDAPConnection connection;
readonly attribute nsILDAPOperation operation;
[noscript] readonly attribute DIR_Server replicationServerInfo;
readonly attribute nsIAbLDAPDirectory lDAPDirectory;
/**
* initialize for the query

View File

@ -109,7 +109,6 @@ CPPSRCS = \
$(NULL)
EXPORTS = \
nsDirPrefs.h \
nsAbCardProperty.h \
nsAbMDBCardProperty.h \
nsVCardObj.h \

View File

@ -38,21 +38,15 @@
* ***** END LICENSE BLOCK ***** */
#include "nsAbDirProperty.h"
#include "nsIRDFService.h"
#include "nsIRDFResource.h"
#include "nsIServiceManager.h"
#include "nsRDFCID.h"
#include "nsXPIDLString.h"
#include "nsReadableUtils.h"
#include "nsCOMPtr.h"
#include "nsAbBaseCID.h"
#include "nsIAbCard.h"
#include "nsDirPrefs.h"
#include "nsIPrefService.h"
#include "nsServiceManagerUtils.h"
#include "prmem.h"
#include "nsCRT.h"
#include "rdf.h"
#include "mdb.h"
nsAbDirProperty::nsAbDirProperty(void)
: m_LastModifiedDate(0)
{
@ -308,8 +302,14 @@ NS_IMETHODIMP nsAbDirProperty::GetDirPrefId(nsACString &aDirPrefId)
}
NS_IMETHODIMP nsAbDirProperty::SetDirPrefId(const nsACString &aDirPrefId)
{
if (!m_DirPrefId.Equals(aDirPrefId))
{
m_DirPrefId.Assign(aDirPrefId);
// Clear the directory pref branch so that it is re-initialized next
// time its required.
m_DirectoryPrefs = nsnull;
}
return NS_OK;
}
@ -375,6 +375,101 @@ NS_IMETHODIMP nsAbDirProperty::GetDirectoryProperties(nsIAbDirectoryProperties *
return rv;
}
nsresult nsAbDirProperty::InitDirectoryPrefs()
{
if (m_DirPrefId.IsEmpty())
return NS_ERROR_NOT_INITIALIZED;
nsresult rv;
nsCOMPtr<nsIPrefService> prefService(do_GetService(NS_PREFSERVICE_CONTRACTID, &rv));
NS_ENSURE_SUCCESS(rv, rv);
nsCString realPrefId(m_DirPrefId);
realPrefId.Append('.');
return prefService->GetBranch(realPrefId.get(), getter_AddRefs(m_DirectoryPrefs));
}
NS_IMETHODIMP nsAbDirProperty::GetIntValue(const char *aName,
PRInt32 aDefaultValue,
PRInt32 *aResult)
{
NS_ENSURE_ARG_POINTER(aResult);
if (!m_DirectoryPrefs && NS_FAILED(InitDirectoryPrefs()))
return NS_ERROR_NOT_INITIALIZED;
if (NS_FAILED(m_DirectoryPrefs->GetIntPref(aName, aResult)))
*aResult = aDefaultValue;
return NS_OK;
}
NS_IMETHODIMP nsAbDirProperty::GetBoolValue(const char *aName,
PRBool aDefaultValue,
PRBool *aResult)
{
NS_ENSURE_ARG_POINTER(aResult);
if (!m_DirectoryPrefs && NS_FAILED(InitDirectoryPrefs()))
return NS_ERROR_NOT_INITIALIZED;
if (NS_FAILED(m_DirectoryPrefs->GetBoolPref(aName, aResult)))
*aResult = aDefaultValue;
return NS_OK;
}
NS_IMETHODIMP nsAbDirProperty::GetStringValue(const char *aName,
const char *aDefaultValue,
char * *aResult)
{
NS_ENSURE_ARG_POINTER(aResult);
if (!m_DirectoryPrefs && NS_FAILED(InitDirectoryPrefs()))
return NS_ERROR_NOT_INITIALIZED;
nsXPIDLCString value;
if (NS_SUCCEEDED(m_DirectoryPrefs->GetCharPref(aName, getter_Copies(value))))
{
/* unfortunately, there may be some prefs out there which look like this */
*aResult = value.EqualsLiteral("(null)") ?
nsCRT::strdup(aDefaultValue) : ToNewCString(value);
}
else
*aResult = nsCRT::strdup(aDefaultValue);
return NS_OK;
}
NS_IMETHODIMP nsAbDirProperty::SetIntValue(const char *aName,
PRInt32 aValue)
{
if (!m_DirectoryPrefs && NS_FAILED(InitDirectoryPrefs()))
return NS_ERROR_NOT_INITIALIZED;
return m_DirectoryPrefs->SetIntPref(aName, aValue);
}
NS_IMETHODIMP nsAbDirProperty::SetBoolValue(const char *aName,
PRBool aValue)
{
if (!m_DirectoryPrefs && NS_FAILED(InitDirectoryPrefs()))
return NS_ERROR_NOT_INITIALIZED;
return m_DirectoryPrefs->SetBoolPref(aName, aValue);
}
NS_IMETHODIMP nsAbDirProperty::SetStringValue(const char *aName,
const char *aValue)
{
if (!m_DirectoryPrefs && NS_FAILED(InitDirectoryPrefs()))
return NS_ERROR_NOT_INITIALIZED;
return m_DirectoryPrefs->SetCharPref(aName, aValue);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
nsAbDirectoryProperties::nsAbDirectoryProperties(void)

View File

@ -53,6 +53,7 @@
#include "nsDirPrefs.h"
#include "nsIAddrDatabase.h"
#include "nsString.h"
#include "nsIPrefBranch.h"
/*
* Address Book Directory
@ -68,11 +69,14 @@ public:
NS_DECL_NSIABDIRECTORY
protected:
/**
* Initialise the directory prefs for this branch
*/
nsresult InitDirectoryPrefs();
nsresult GetAttributeName(PRUnichar **aName, nsString& value);
nsresult SetAttributeName(const PRUnichar *aName, nsString& arrtibute);
nsString m_DirName;
PRUint32 m_LastModifiedDate;
@ -81,10 +85,8 @@ protected:
nsString m_Description;
PRBool m_IsMailList;
nsCString m_DirPrefId; // ie,"ldap_2.servers.pab"
nsCOMPtr<nsIPrefBranch> m_DirectoryPrefs;
nsCOMPtr<nsISupportsArray> m_AddressList;
};
class nsAbDirectoryProperties: public nsIAbDirectoryProperties

View File

@ -1,4 +1,6 @@
/* ***** BEGIN LICENSE BLOCK *****
/* -*- 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
@ -199,7 +201,12 @@ nsresult nsAbLDAPProcessChangeLogData::OnLDAPSearchResult(nsILDAPMessage *aMessa
if (NS_FAILED(rv))
break;
rv = dbPath->AppendNative(nsDependentCString(mDirServerInfo->fileName));
nsXPIDLCString fileName;
rv = mDirectory->GetReplicationFileName(getter_Copies(fileName));
if (NS_FAILED(rv))
break;
rv = dbPath->AppendNative(fileName);
if (NS_FAILED(rv))
break;
@ -310,8 +317,6 @@ nsresult nsAbLDAPProcessChangeLogData::GetAuthData()
if(NS_SUCCEEDED(rv) && btnResult) {
CopyUTF16toUTF8(username, mAuthUserID);
CopyUTF16toUTF8(password, mAuthPswd);
mDirServerInfo->enableAuth=PR_TRUE;
mDirServerInfo->savePassword=PR_TRUE;
}
else
rv = NS_ERROR_FAILURE;
@ -330,8 +335,7 @@ nsresult nsAbLDAPProcessChangeLogData::OnSearchAuthDNDone()
rv = mQuery->ConnectToLDAPServer(url, mAuthDN);
if(NS_SUCCEEDED(rv)) {
mState = kAuthenticatedBinding;
PR_FREEIF(mDirServerInfo->authDn);
mDirServerInfo->authDn=ToNewCString(mAuthDN);
rv = mDirectory->SetAuthDn(mAuthDN.get());
}
return rv;
@ -367,13 +371,16 @@ nsresult nsAbLDAPProcessChangeLogData::ParseRootDSEEntry(nsILDAPMessage *aMessag
}
}
if((mRootDSEEntry.lastChangeNumber > 0)
&& (mDirServerInfo->replInfo->lastChangeNumber < mRootDSEEntry.lastChangeNumber)
&& (mDirServerInfo->replInfo->lastChangeNumber > mRootDSEEntry.firstChangeNumber)
)
PRInt32 lastChangeNumber;
mDirectory->GetLastChangeNumber(&lastChangeNumber);
if ((mRootDSEEntry.lastChangeNumber > 0) &&
(lastChangeNumber < mRootDSEEntry.lastChangeNumber) &&
(lastChangeNumber > mRootDSEEntry.firstChangeNumber))
mUseChangeLog = PR_TRUE;
if(mRootDSEEntry.lastChangeNumber && (mDirServerInfo->replInfo->lastChangeNumber == mRootDSEEntry.lastChangeNumber)) {
if (mRootDSEEntry.lastChangeNumber &&
(lastChangeNumber == mRootDSEEntry.lastChangeNumber)) {
Done(PR_TRUE); // we are up to date no need to replicate, db not open yet so call Done
return NS_OK;
}
@ -405,9 +412,10 @@ nsresult nsAbLDAPProcessChangeLogData::OnSearchRootDSEDone()
mListener->OnStateChange(nsnull, nsnull, nsIWebProgressListener::STATE_START, PR_TRUE);
}
mDirServerInfo->replInfo->lastChangeNumber = mRootDSEEntry.lastChangeNumber;
PR_FREEIF(mDirServerInfo->replInfo->dataVersion);
mDirServerInfo->replInfo->dataVersion = ToNewCString(mRootDSEEntry.dataVersion);
rv = mDirectory->SetLastChangeNumber(mRootDSEEntry.lastChangeNumber);
NS_ENSURE_SUCCESS(rv, rv);
rv = mDirectory->SetDataVersion(mRootDSEEntry.dataVersion.get());
return rv;
}

View File

@ -1,4 +1,4 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
/* -*- 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
@ -127,8 +127,15 @@ NS_IMETHODIMP nsAbLDAPChangeLogQuery::QueryAuthDN(const nsACString & aValueUsedT
do_GetService("@mozilla.org/addressbook/ldap-attribute-map-service;1", &rv);
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIAbDirectory> abDirectory(do_QueryInterface(mDirectory, &rv));
NS_ENSURE_SUCCESS(rv, rv);
nsXPIDLCString prefBaseName;
rv = abDirectory->GetDirPrefId(prefBaseName);
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIAbLDAPAttributeMap> attrMap;
rv = mapSvc->GetMapForPrefBranch(nsDependentCString(mDirServer->prefName), getter_AddRefs(attrMap));
rv = mapSvc->GetMapForPrefBranch(prefBaseName, getter_AddRefs(attrMap));
NS_ENSURE_SUCCESS(rv, rv);
nsCAutoString filter;
@ -173,13 +180,17 @@ NS_IMETHODIMP nsAbLDAPChangeLogQuery::QueryChangeLog(const nsACString & aChangeL
if (aChangeLogDN.IsEmpty())
return NS_ERROR_UNEXPECTED;
PRInt32 lastChangeNumber;
nsresult rv = mDirectory->GetLastChangeNumber(&lastChangeNumber);
NS_ENSURE_SUCCESS(rv, rv);
// make sure that the filter here just have one condition
// and should not be enclosed in enclosing brackets.
// also condition '>' doesnot work, it should be '>='/
nsCAutoString filter (NS_LITERAL_CSTRING("changenumber>="));
filter.AppendInt(mDirServer->replInfo->lastChangeNumber+1);
filter.AppendInt(lastChangeNumber + 1);
nsresult rv = CreateNewLDAPOperation();
rv = CreateNewLDAPOperation();
NS_ENSURE_SUCCESS(rv, rv);
return mOperation->SearchExt(aChangeLogDN, nsILDAPURL::SCOPE_ONELEVEL, filter,

View File

@ -1,4 +1,4 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* -*- 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
*
@ -493,16 +493,8 @@ NS_IMETHODIMP nsAbLDAPDirectory::GetIsSecure(PRBool *aIsSecure)
{
NS_ENSURE_ARG_POINTER(aIsSecure);
nsresult rv;
nsCOMPtr<nsIPrefBranch> prefBranch(do_GetService(NS_PREFSERVICE_CONTRACTID, &rv));
NS_ENSURE_SUCCESS(rv, rv);
// use mURINoQuery to get a prefName
nsCAutoString prefName;
prefName = nsDependentCString(mURINoQuery.get() + kLDAPDirectoryRootLen) + NS_LITERAL_CSTRING(".uri");
nsXPIDLCString URI;
rv = prefBranch->GetCharPref(prefName.get(), getter_Copies(URI));
nsresult rv = GetStringValue("uri", "", getter_Copies(URI));
NS_ENSURE_SUCCESS(rv,rv);
// to determine if this is a secure directory, check if the uri is ldaps:// or not
@ -548,3 +540,69 @@ nsAbLDAPDirectory::SetSearchServerControls(nsIMutableArray *aControls)
mSearchServerControls = aControls;
return NS_OK;
}
NS_IMETHODIMP nsAbLDAPDirectory::GetProtocolVersion(PRUint32 *aProtocolVersion)
{
nsXPIDLCString versionString;
nsresult rv = GetStringValue("protocolVersion", "3",
getter_Copies(versionString));
NS_ENSURE_SUCCESS(rv, rv);
*aProtocolVersion = versionString.EqualsLiteral("3") ?
(PRUint32)nsILDAPConnection::VERSION3 :
(PRUint32)nsILDAPConnection::VERSION2;
return NS_OK;
}
NS_IMETHODIMP nsAbLDAPDirectory::SetProtocolVersion(PRUint32 aProtocolVersion)
{
// XXX We should cancel any existing LDAP connections here and
// be ready to re-initialise them with the new auth details.
return SetStringValue("protocolVersion",
aProtocolVersion == nsILDAPConnection::VERSION3 ? "3" : "2");
}
NS_IMETHODIMP nsAbLDAPDirectory::GetReplicationFileName(char* *aReplicationFileName)
{
return GetStringValue("filename", "", aReplicationFileName);
}
NS_IMETHODIMP nsAbLDAPDirectory::SetReplicationFileName(const char* aReplicationFileName)
{
return SetStringValue("filename", aReplicationFileName);
}
NS_IMETHODIMP nsAbLDAPDirectory::GetAuthDn(char * *aAuthDn)
{
return GetStringValue("auth.Dn", "", aAuthDn);
}
NS_IMETHODIMP nsAbLDAPDirectory::SetAuthDn(const char* aAuthDn)
{
// XXX We should cancel any existing LDAP connections here and
// be ready to re-initialise them with the new auth details.
return SetStringValue("auth.Dn", aAuthDn);
}
NS_IMETHODIMP nsAbLDAPDirectory::GetLastChangeNumber(PRInt32 *aLastChangeNumber)
{
return GetIntValue("lastChangeNumber", -1, aLastChangeNumber);
}
NS_IMETHODIMP nsAbLDAPDirectory::SetLastChangeNumber(PRInt32 aLastChangeNumber)
{
return SetIntValue("lastChangeNumber", aLastChangeNumber);
}
NS_IMETHODIMP nsAbLDAPDirectory::GetDataVersion(char * *aDataVersion)
{
return GetStringValue("dataVersion", "", aDataVersion);
}
NS_IMETHODIMP nsAbLDAPDirectory::SetDataVersion(const char* aDataVersion)
{
return SetStringValue("dataVersion", aDataVersion);
}

View File

@ -61,8 +61,7 @@ nsAbLDAPProcessReplicationData::nsAbLDAPProcessReplicationData()
mProtocol(-1),
mCount(0),
mDBOpen(PR_FALSE),
mInitialized(PR_FALSE),
mDirServerInfo(nsnull)
mInitialized(PR_FALSE)
{
}
@ -79,24 +78,38 @@ NS_IMETHODIMP nsAbLDAPProcessReplicationData::Init(nsIAbLDAPReplicationQuery *qu
mQuery = query;
nsresult rv = mQuery->GetReplicationServerInfo(&mDirServerInfo);
nsresult rv = mQuery->GetLDAPDirectory(getter_AddRefs(mDirectory));
if(NS_FAILED(rv)) {
mQuery = nsnull;
return rv;
}
if(!mDirServerInfo) {
mQuery = nsnull;
return NS_ERROR_FAILURE;
}
nsCOMPtr<nsIAbLDAPAttributeMapService> mapSvc =
do_GetService("@mozilla.org/addressbook/ldap-attribute-map-service;1",
&rv);
NS_ENSURE_SUCCESS(rv, rv);
if (NS_FAILED(rv)) {
mQuery = nsnull;
return rv;
}
rv = mapSvc->GetMapForPrefBranch(
nsDependentCString(mDirServerInfo->prefName), getter_AddRefs(mAttrMap));
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIAbDirectory> abDirectory(do_QueryInterface(mDirectory, &rv));
if (NS_FAILED(rv)) {
mQuery = nsnull;
return rv;
}
nsXPIDLCString prefBaseName;
rv = abDirectory->GetDirPrefId(prefBaseName);
if (NS_FAILED(rv)) {
mQuery = nsnull;
return rv;
}
rv = mapSvc->GetMapForPrefBranch(prefBaseName, getter_AddRefs(mAttrMap));
if (NS_FAILED(rv)) {
mQuery = nsnull;
return rv;
}
mListener = progressListener;
@ -234,10 +247,12 @@ NS_IMETHODIMP nsAbLDAPProcessReplicationData::Abort()
// delete the unsaved replication file
if(mReplicationFile) {
rv = mReplicationFile->Remove(PR_FALSE);
if(NS_SUCCEEDED(rv)) {
if(NS_SUCCEEDED(rv) && mDirectory) {
nsXPIDLCString fileName;
rv = mDirectory->GetReplicationFileName(getter_Copies(fileName));
// now put back the backed up replicated file if aborted
if(mBackupReplicationFile && mDirServerInfo->replInfo)
rv = mBackupReplicationFile->MoveToNative(nsnull, nsDependentCString(mDirServerInfo->fileName));
if(NS_SUCCEEDED(rv) && mBackupReplicationFile)
rv = mBackupReplicationFile->MoveToNative(nsnull, fileName);
}
}
}
@ -251,9 +266,15 @@ NS_IMETHODIMP nsAbLDAPProcessReplicationData::Abort()
// this should get the authDN from prefs and password from PswdMgr
NS_IMETHODIMP nsAbLDAPProcessReplicationData::PopulateAuthData()
{
mAuthDN.Assign(mDirServerInfo->authDn);
if (!mDirectory)
return NS_ERROR_NOT_INITIALIZED;
nsXPIDLCString authDn;
nsresult rv = mDirectory->GetAuthDn(getter_Copies(authDn));
NS_ENSURE_SUCCESS(rv, rv);
mAuthDN.Assign(authDn);
nsresult rv = NS_OK;
nsCOMPtr <nsIPasswordManagerInternal> passwordMgrInt = do_GetService(NS_PASSWORDMANAGER_CONTRACTID, &rv);
if(NS_SUCCEEDED(rv) && passwordMgrInt) {
// Get the current server URI
@ -460,13 +481,18 @@ nsresult nsAbLDAPProcessReplicationData::OnLDAPSearchResult(nsILDAPMessage *aMes
NS_ASSERTION(NS_SUCCEEDED(rv), "Replication File Remove on Failure failed");
if(NS_SUCCEEDED(rv)) {
// now put back the backed up replicated file
if(mBackupReplicationFile && mDirServerInfo->replInfo)
if(mBackupReplicationFile && mDirectory)
{
rv = mBackupReplicationFile->MoveToNative(nsnull, nsDependentCString(mDirServerInfo->fileName));
nsXPIDLCString fileName;
rv = mDirectory->GetReplicationFileName(getter_Copies(fileName));
if (NS_SUCCEEDED(rv) && !fileName.IsEmpty())
{
rv = mBackupReplicationFile->MoveToNative(nsnull, fileName);
NS_ASSERTION(NS_SUCCEEDED(rv), "Replication Backup File Move back on Failure failed");
}
}
}
}
Done(PR_FALSE);
}
@ -486,7 +512,10 @@ nsresult nsAbLDAPProcessReplicationData::OpenABForReplicatedDir(PRBool aCreate)
return rv;
}
if(!mDirServerInfo->fileName) {
nsXPIDLCString fileName;
rv = mDirectory->GetReplicationFileName(getter_Copies(fileName));
if (NS_FAILED(rv) || fileName.IsEmpty())
{
Done(PR_FALSE);
return NS_ERROR_FAILURE;
}
@ -497,7 +526,7 @@ nsresult nsAbLDAPProcessReplicationData::OpenABForReplicatedDir(PRBool aCreate)
return rv;
}
rv = mReplicationFile->AppendNative(nsDependentCString(mDirServerInfo->fileName));
rv = mReplicationFile->AppendNative(fileName);
if(NS_FAILED(rv)) {
Done(PR_FALSE);
return rv;
@ -545,7 +574,8 @@ nsresult nsAbLDAPProcessReplicationData::OpenABForReplicatedDir(PRBool aCreate)
if(aCreate) {
// set backup file to existing replication file for move
mBackupReplicationFile->SetNativeLeafName(nsDependentCString(mDirServerInfo->fileName));
mBackupReplicationFile->SetNativeLeafName(fileName);
rv = mBackupReplicationFile->MoveTo(nsnull, backupFileLeafName);
// set the backup file leaf name now
if (NS_SUCCEEDED(rv))
@ -553,7 +583,8 @@ nsresult nsAbLDAPProcessReplicationData::OpenABForReplicatedDir(PRBool aCreate)
}
else {
// set backup file to existing replication file for copy
mBackupReplicationFile->SetNativeLeafName(nsDependentCString(mDirServerInfo->fileName));
mBackupReplicationFile->SetNativeLeafName(fileName);
// specify the parent here specifically,
// passing nsnull to copy to the same dir actually renames existing file
// instead of making another copy of the existing file.

View File

@ -48,6 +48,7 @@
#include "nsILocalFile.h"
#include "nsDirPrefs.h"
#include "nsIAbLDAPAttributeMap.h"
#include "nsIAbLDAPDirectory.h"
#include "nsString.h"
class nsAbLDAPProcessReplicationData : public nsIAbLDAPProcessReplicationData
@ -77,7 +78,7 @@ protected :
PRBool mDBOpen;
PRBool mInitialized;
DIR_Server * mDirServerInfo;
nsCOMPtr<nsIAbLDAPDirectory> mDirectory;
nsCString mAuthDN; // authDN of the user
nsCString mAuthPswd; // pswd of the authDN user
nsCOMPtr<nsIAbLDAPAttributeMap> mAttrMap; // maps ab properties to ldap attrs

View File

@ -1,4 +1,4 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* -*- 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
*
@ -50,49 +50,75 @@
#include "nsDirPrefs.h"
#include "nsCRT.h"
#include "prmem.h"
#include "nsIRDFService.h"
NS_IMPL_ISUPPORTS1(nsAbLDAPReplicationQuery, nsIAbLDAPReplicationQuery)
nsAbLDAPReplicationQuery::nsAbLDAPReplicationQuery()
: mInitialized(PR_FALSE),
mDirServer(nsnull)
: mInitialized(PR_FALSE)
{
}
nsAbLDAPReplicationQuery::~nsAbLDAPReplicationQuery()
{
DIR_DeleteServer(mDirServer);
}
nsresult nsAbLDAPReplicationQuery::InitLDAPData()
{
mDirServer = (DIR_Server *) PR_Calloc(1, sizeof(DIR_Server));
if (!mDirServer) return NS_ERROR_NULL_POINTER;
nsresult rv;
DIR_InitServerWithType(mDirServer, LDAPDirectory);
// since DeleteServer frees the prefName make a copy of prefName string
mDirServer->prefName = nsCRT::strdup(mDirPrefName.get());
DIR_GetPrefsForOneServer(mDirServer, PR_FALSE, PR_FALSE);
nsCOMPtr<nsIRDFService> rdfService = do_GetService("@mozilla.org/rdf/rdf-service;1", &rv);
NS_ENSURE_SUCCESS(rv, rv);
nsCAutoString resourceURI(kLDAPDirectoryRoot);
resourceURI.Append(mDirPrefName);
nsCOMPtr<nsIRDFResource> resource;
rv = rdfService->GetResource(resourceURI, getter_AddRefs(resource));
NS_ENSURE_SUCCESS(rv, rv);
mDirectory = do_QueryInterface(resource, &rv);
NS_ENSURE_SUCCESS(rv, rv);
nsXPIDLCString fileName;
rv = mDirectory->GetReplicationFileName(getter_Copies(fileName));
NS_ENSURE_SUCCESS(rv, rv);
// this is done here to take care of the problem related to bug # 99124.
// earlier versions of Mozilla could have the fileName associated with the directory
// to be abook.mab which is the profile's personal addressbook. If the pref points to
// it, calls nsDirPrefs to generate a new server filename.
if (!nsCRT::strcasecmp(mDirServer->fileName,kPersonalAddressbook)
|| !mDirServer->fileName || !(*mDirServer->fileName)) {
// initialize mDirServer->filename is null or else DIR_SetServerFileName doesnot work
PR_FREEIF(mDirServer->fileName);
mDirServer->fileName=nsnull;
DIR_SetServerFileName(mDirServer);
if (fileName.IsEmpty() || fileName.Equals(NS_LITERAL_CSTRING(kPersonalAddressbook)))
{
// Ensure fileName is empty for DIR_GenerateAbFileName to work
// correctly.
fileName.Truncate();
// XXX This should be replaced by a local function at some stage.
// For now we'll continue using the nsDirPrefs version.
DIR_Server* server = DIR_GetServerFromList(mDirPrefName.get());
if (server)
{
DIR_SetServerFileName(server);
// Now ensure the prefs are saved
DIR_SavePrefsForOneServer(server);
}
}
nsresult rv = NS_OK;
rv = mDirectory->SetReplicationFileName(fileName);
NS_ENSURE_SUCCESS(rv, rv);
mURL = do_CreateInstance(NS_LDAPURL_CONTRACTID, &rv);
if (NS_FAILED(rv))
return rv;
rv = mURL->SetSpec(nsDependentCString(mDirServer->uri));
nsCOMPtr<nsIAbDirectory> abDirectory(do_QueryInterface(mDirectory, &rv));
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIAbDirectoryProperties> dirProperties;
rv = abDirectory->GetDirectoryProperties(getter_AddRefs(dirProperties));
NS_ENSURE_SUCCESS(rv, rv);
nsXPIDLCString uri;
rv = dirProperties->GetURI(getter_Copies(uri));
NS_ENSURE_SUCCESS(rv, rv);
rv = mURL->SetSpec(uri);
if (NS_FAILED(rv))
return rv;
@ -171,11 +197,8 @@ NS_IMETHODIMP nsAbLDAPReplicationQuery::ConnectToLDAPServer(nsILDAPURL *aURL, co
}
PRUint32 protocolVersion;
if (DIR_TestFlag(mDirServer, DIR_LDAP_VERSION3)) {
protocolVersion = nsILDAPConnection::VERSION3;
} else {
protocolVersion = nsILDAPConnection::VERSION2;
}
rv = mDirectory->GetProtocolVersion(&protocolVersion);
NS_ENSURE_SUCCESS(rv, rv);
// initialize the LDAP connection
return mConnection->Init(host.get(), port,
@ -264,9 +287,6 @@ NS_IMETHODIMP nsAbLDAPReplicationQuery::Done(PRBool aSuccess)
if (NS_SUCCEEDED(rv))
replicationService->Done(aSuccess);
if (aSuccess)
DIR_SavePrefsForOneServer(mDirServer);
return rv;
}
@ -304,14 +324,11 @@ NS_IMETHODIMP nsAbLDAPReplicationQuery::GetReplicationURL(nsILDAPURL * *aReplica
return NS_OK;
}
NS_IMETHODIMP nsAbLDAPReplicationQuery::GetReplicationServerInfo(DIR_Server * *aReplicationServerInfo)
NS_IMETHODIMP nsAbLDAPReplicationQuery::GetLDAPDirectory(nsIAbLDAPDirectory * *aDirectory)
{
NS_ENSURE_ARG_POINTER(aReplicationServerInfo);
if (!mInitialized)
return NS_ERROR_NOT_INITIALIZED;
NS_ENSURE_ARG_POINTER(aDirectory);
*aReplicationServerInfo = mDirServer;
NS_IF_ADDREF(*aDirectory = mDirectory);
return NS_OK;
}

View File

@ -42,6 +42,7 @@
#include "nsIWebProgressListener.h"
#include "nsIAbLDAPReplicationQuery.h"
#include "nsIAbLDAPReplicationData.h"
#include "nsIAbLDAPDirectory.h"
#include "nsILDAPConnection.h"
#include "nsILDAPOperation.h"
#include "nsILDAPURL.h"
@ -55,7 +56,6 @@ public:
NS_DECL_NSIABLDAPREPLICATIONQUERY
nsAbLDAPReplicationQuery();
virtual ~nsAbLDAPReplicationQuery();
nsresult InitLDAPData();
nsresult CreateNewLDAPOperation();
@ -65,13 +65,12 @@ protected :
nsCOMPtr<nsILDAPConnection> mConnection;
nsCOMPtr<nsILDAPOperation> mOperation;
nsCOMPtr<nsILDAPURL> mURL;
nsCOMPtr<nsIAbLDAPDirectory> mDirectory;
nsCOMPtr<nsIAbLDAPProcessReplicationData> mDataProcessor;
PRBool mInitialized;
nsCString mDirPrefName;
DIR_Server * mDirServer;
};
#endif // nsAbLDAPReplicationQuery_h__

View File

@ -236,6 +236,31 @@ nsresult DIR_GetDirServers()
return rv;
}
DIR_Server* DIR_GetServerFromList(const char* prefName)
{
DIR_Server* result = nsnull;
if (!dir_ServerList)
DIR_GetDirServers();
if (dir_ServerList)
{
PRInt32 count = dir_ServerList->Count();
PRInt32 i;
for (i = 0; i < count; ++i)
{
DIR_Server *server = (DIR_Server *)dir_ServerList->ElementAt(i);
if (server && strcmp(server->prefName, prefName) == 0)
{
result = server;
break;
}
}
}
return result;
}
static nsresult dir_ConvertToMabFileName()
{
if (dir_ServerList)

View File

@ -155,6 +155,7 @@ typedef struct DIR_Server
nsVoidArray* DIR_GetDirectories();
nsresult DIR_GetDirServers();
DIR_Server* DIR_GetServerFromList(const char* prefName);
nsresult DIR_ShutDown(void); /* FEs should call this when the app is shutting down. It frees all DIR_Servers regardless of ref count values! */
nsresult DIR_AddNewAddressBook(const PRUnichar *dirName, const char *fileName, PRBool migrating, const char * uri, int maxHits, const char * authDn, DirectoryType dirType, DIR_Server** pServer);