summaryrefslogtreecommitdiffstats
path: root/mailnews/addrbook/src/nsAbLDAPReplicationService.cpp
blob: 0ee53d719cdb974f62abc295f03f00b66550d5c9 (plain)
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;
}