summaryrefslogtreecommitdiffstats
path: root/comm/mail/components/migration/src/nsOutlookProfileMigrator.cpp
blob: dd7535e25730576596db99b6ed45ac2563251be1 (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
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* 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 "nsMailProfileMigratorUtils.h"
#include "nsIServiceManager.h"
#include "nsOutlookProfileMigrator.h"
#include "nsIProfileMigrator.h"
#include "nsIImportSettings.h"
#include "nsIFile.h"
#include "nsITimer.h"
#include "nsComponentManagerUtils.h"

NS_IMPL_ISUPPORTS(nsOutlookProfileMigrator, nsIMailProfileMigrator,
                  nsITimerCallback)

nsOutlookProfileMigrator::nsOutlookProfileMigrator() {
  mProcessingMailFolders = false;
  // get the import service
  mImportModule = do_CreateInstance("@mozilla.org/import/import-outlook;1");
}

nsOutlookProfileMigrator::~nsOutlookProfileMigrator() {}

nsresult nsOutlookProfileMigrator::ContinueImport() { return Notify(nullptr); }

///////////////////////////////////////////////////////////////////////////////
// nsITimerCallback

NS_IMETHODIMP
nsOutlookProfileMigrator::Notify(nsITimer* timer) {
  int32_t progress;
  mGenericImporter->GetProgress(&progress);

  nsAutoString index;
  index.AppendInt(progress);
  NOTIFY_OBSERVERS(MIGRATION_PROGRESS, index.get());

  if (progress == 100)  // are we done yet?
  {
    if (mProcessingMailFolders)
      return FinishCopyingMailFolders();
    else
      return FinishCopyingAddressBookData();
  } else {
    // fire a timer to handle the next one.
    nsresult rv = NS_NewTimerWithCallback(
        getter_AddRefs(mFileIOTimer), static_cast<nsITimerCallback*>(this), 100,
        nsITimer::TYPE_ONE_SHOT, nullptr);
    if (NS_FAILED(rv)) {
      NS_WARNING("Could not start mFileIOTimer timer");
    }
  }
  return NS_OK;
}

NS_IMETHODIMP
nsOutlookProfileMigrator::GetName(nsACString& aName) {
  aName.AssignLiteral("nsOutlookProfileMigrator");
  return NS_OK;
}

///////////////////////////////////////////////////////////////////////////////
// nsIMailProfileMigrator

NS_IMETHODIMP
nsOutlookProfileMigrator::Migrate(uint16_t aItems, nsIProfileStartup* aStartup,
                                  const char16_t* aProfile) {
  nsresult rv = NS_OK;

  if (aStartup) {
    rv = aStartup->DoStartup();
    NS_ENSURE_SUCCESS(rv, rv);
  }

  NOTIFY_OBSERVERS(MIGRATION_STARTED, nullptr);

  rv = ImportSettings(mImportModule);

  // now import address books
  // this routine will asynchronously import address book data and it will then
  // kick off the final migration step, copying the mail folders over.
  rv = ImportAddressBook(mImportModule);

  // don't broadcast an on end migration here. We aren't done until our asynch
  // import process says we are done.
  return rv;
}

NS_IMETHODIMP
nsOutlookProfileMigrator::GetMigrateData(const char16_t* aProfile,
                                         bool aReplace, uint16_t* aResult) {
  // There's no harm in assuming everything is available.
  *aResult = nsIMailProfileMigrator::ACCOUNT_SETTINGS |
             nsIMailProfileMigrator::ADDRESSBOOK_DATA |
             nsIMailProfileMigrator::MAILDATA;
  return NS_OK;
}

NS_IMETHODIMP
nsOutlookProfileMigrator::GetSourceExists(bool* aResult) {
  *aResult = false;

  nsCOMPtr<nsISupports> supports;
  mImportModule->GetImportInterface(NS_IMPORT_SETTINGS_STR,
                                    getter_AddRefs(supports));
  nsCOMPtr<nsIImportSettings> importSettings = do_QueryInterface(supports);

  if (importSettings) {
    nsString description;
    nsCOMPtr<nsIFile> location;
    importSettings->AutoLocate(getter_Copies(description),
                               getter_AddRefs(location), aResult);
  }

  return NS_OK;
}

NS_IMETHODIMP
nsOutlookProfileMigrator::GetSourceHasMultipleProfiles(bool* aResult) {
  *aResult = false;
  return NS_OK;
}

NS_IMETHODIMP
nsOutlookProfileMigrator::GetSourceProfiles(nsTArray<nsString>& aResult) {
  return NS_OK;
}

NS_IMETHODIMP
nsOutlookProfileMigrator::GetSourceProfileLocations(
    nsTArray<RefPtr<nsIFile>>& aResult) {
  return NS_OK;
}