author Siddartha Pothapragada <>
Tue, 09 Jun 2015 11:18:51 -0700
changeset 247826 a40b2c6672cd30671090ac3afc45ad46ec3c4c27
parent 203129 adfa67ea01c6808d7761e80313283a55923fe390
permissions -rw-r--r--
Bug 1118102 - Fix error handling by rejecting the promise request with specific SE errors instead of 'Generic Error'. r=allstars.chh r=khuey a=kwierso

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* 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 */

// Interfaces Needed
#include "nsIDirectoryService.h"
#include "nsIFile.h"

#include "nsCOMPtr.h"
#include "nsDirectoryServiceUtils.h"
#include "nsComponentManagerUtils.h"
#include "nsServiceManagerUtils.h"

#include "nsString.h"
#include "nsEmbedString.h"

// Forward Declarations
class nsProfileLock;

// --------------------------------------------------------------------------------------
// nsProfileDirServiceProvider - The nsIDirectoryServiceProvider implementation used for
// profile-relative file locations.
// --------------------------------------------------------------------------------------

class nsProfileDirServiceProvider: public nsIDirectoryServiceProvider

  friend nsresult NS_NewProfileDirServiceProvider(bool, nsProfileDirServiceProvider**);


    * SetProfileDir
    * @param aProfileDir   The directory containing the profile files.
    *                      It does not need to exist before calling this
    *                      method. If it does not, it will be created and
    *                      defaults will be copied to it. 
    * @param aLocalProfileDir
    *                      Directory for local profile data, e.g. Cache.
    *                      If null, aProfileDir will be used for this purpose.

   virtual nsresult        SetProfileDir(nsIFile* aProfileDir,
                                         nsIFile* aLocalProfileDir = nullptr);

   * Register
   * Convenience method to register the provider with directory service.
   * The service holds strong references to registered providers so consumers
   * don't need to hold a reference to this object after calling Register().

  virtual nsresult         Register();

   * Shutdown
   * This method must be called before shutting down XPCOM if this object
   * was created with aNotifyObservers == true. If this object was
   * created with aNotifyObservers == false, this method is a no-op.

  virtual nsresult         Shutdown();

                           explicit nsProfileDirServiceProvider(bool aNotifyObservers = true);
   virtual                 ~nsProfileDirServiceProvider();

  nsresult                 Initialize();
  nsresult                 InitProfileDir(nsIFile* profileDir);
  nsresult                 InitNonSharedProfileDir();
  nsresult                 EnsureProfileFileExists(nsIFile *aFile, nsIFile *destDir);
  nsresult                 UndefineFileLocations();


  nsCOMPtr<nsIFile>        mProfileDir;
  nsCOMPtr<nsIFile>        mLocalProfileDir;
  nsProfileLock*           mProfileDirLock;
  bool                     mNotifyObservers;

  bool                     mSharingEnabled;
  nsEmbedString            mNonSharedDirName;
  nsString                 mNonSharedDirName;
  nsCOMPtr<nsIFile>        mNonSharedProfileDir;

// --------------------------------------------------------------------------------------

 * Global method to create an instance of nsProfileDirServiceProvider
 * @param aNotifyObservers    If true, will send out profile startup
 *                            notifications when the profile directory is set.
 *                            See notifications.txt
nsresult NS_NewProfileDirServiceProvider(bool aNotifyObservers,
                                         nsProfileDirServiceProvider** aProvider);