DXR is a code search and navigation tool aimed at making sense of large projects. It supports full-text and regex searches as well as structural queries.

Header

Mercurial (af5845922999)

VCS Links

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */


#include "nsCOMPtr.h"
#include "nsAbLDAPReplicationService.h"
#include "nsAbLDAPReplicationQuery.h"
#include "nsAbBaseCID.h"
#include "nsIWebProgressListener.h"
#include "nsComponentManagerUtils.h"
#include "nsServiceManagerUtils.h"

// XXX Change log replication doesn't work. Bug 311632 should fix it.
//#include "nsAbLDAPChangeLogQuery.h"
#include "nsIAbLDAPReplicationData.h"

/*** implementation of the service ******/

NS_IMPL_ISUPPORTS(nsAbLDAPReplicationService, nsIAbLDAPReplicationService)

nsAbLDAPReplicationService::nsAbLDAPReplicationService()
    : mReplicating(false)
{
}

nsAbLDAPReplicationService::~nsAbLDAPReplicationService()
{
}

/* void startReplication(in string aURI, in nsIWebProgressListener progressListener); */
NS_IMETHODIMP nsAbLDAPReplicationService::StartReplication(nsIAbLDAPDirectory *aDirectory,
							   nsIWebProgressListener *progressListener)
{
  NS_ENSURE_ARG_POINTER(aDirectory);

#ifdef DEBUG_rdayal
  printf("Start Replication called");
#endif

  // Makes sure to allow only one replication at a time.
  if(mReplicating)
    return NS_ERROR_FAILURE;

  mDirectory = aDirectory;

  nsresult rv = NS_ERROR_NOT_IMPLEMENTED;

  switch (DecideProtocol())
  {
  case nsIAbLDAPProcessReplicationData::kDefaultDownloadAll:
    mQuery = do_CreateInstance(NS_ABLDAP_REPLICATIONQUERY_CONTRACTID, &rv);
    break;
// XXX Change log replication doesn't work. Bug 311632 should fix it.
//case nsIAbLDAPProcessReplicationData::kChangeLogProtocol:
//  mQuery = do_CreateInstance (NS_ABLDAP_CHANGELOGQUERY_CONTRACTID, &rv);
//  break;
  default:
    break;
  }

  if (NS_SUCCEEDED(rv) && mQuery)
  {
    rv = mQuery->Init(mDirectory, progressListener);
    if (NS_SUCCEEDED(rv))
    {
      rv = mQuery->DoReplicationQuery();
      if (NS_SUCCEEDED(rv))
	{
	  mReplicating = true;
	  return rv;
	}
    }
  }

  if (progressListener && NS_FAILED(rv))
    progressListener->OnStateChange(nullptr, nullptr,
				    nsIWebProgressListener::STATE_STOP,
				    NS_OK);

  if (NS_FAILED(rv))
  {
    mDirectory = nullptr;
    mQuery = nullptr;
  }

  return rv;
}

/* void cancelReplication(in string aURI); */
NS_IMETHODIMP nsAbLDAPReplicationService::CancelReplication(nsIAbLDAPDirectory *aDirectory)
{
  NS_ENSURE_ARG_POINTER(aDirectory);

  nsresult rv = NS_ERROR_FAILURE;

  if (aDirectory == mDirectory)
  {
    if (mQuery && mReplicating)
      rv = mQuery->CancelQuery();
  }

  // If query has been cancelled successfully
  if (NS_SUCCEEDED(rv))
    Done(false);

  return rv;
}

NS_IMETHODIMP nsAbLDAPReplicationService::Done(bool aSuccess)
{
  mReplicating = false;
  if (mQuery)
  {
    mQuery = nullptr;  // Release query obj
    mDirectory = nullptr; // Release directory
  }

  return NS_OK;
}


// XXX: This method should query the RootDSE for the changeLog attribute,
// if it exists ChangeLog protocol is supported.
int32_t nsAbLDAPReplicationService::DecideProtocol()
{
  // Do the changeLog, it will decide if there is a need to replicate all
  // entries or only update existing DB and will do the appropriate thing.
  //
  // XXX: Bug 231965 changed this from kChangeLogProtocol to
  // kDefaultDownloadAll because of a problem with ldap replication not
  // working correctly. We need to change this back at some stage (bug 311632).
  return nsIAbLDAPProcessReplicationData::kDefaultDownloadAll;
}