1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_MEDIA_GALLERIES_IMPORTED_MEDIA_GALLERY_REGISTRY_H_
6#define CHROME_BROWSER_MEDIA_GALLERIES_IMPORTED_MEDIA_GALLERY_REGISTRY_H_
7
8#include <set>
9#include <string>
10
11#include "base/basictypes.h"
12#include "base/files/file_path.h"
13#include "base/lazy_instance.h"
14#include "base/memory/scoped_ptr.h"
15
16namespace iphoto {
17class IPhotoDataProvider;
18class IPhotoDataProviderTest;
19}
20
21namespace itunes {
22class ITunesDataProvider;
23class ITunesDataProviderTest;
24}
25
26namespace picasa {
27class PicasaDataProvider;
28class PicasaDataProviderTest;
29}
30
31// This class lives on the MediaTaskRunner thread. It has some static
32// methods which are called on the UI thread.
33//
34// MediaTaskRunner is not guaranteed to be one thread, but it is guaranteed
35// to be a series of sequential calls. See SequencedTaskRunner for details.
36class ImportedMediaGalleryRegistry {
37 public:
38  static ImportedMediaGalleryRegistry* GetInstance();
39
40  void Initialize();
41
42  // Should be called on the UI thread only.
43  bool RegisterPicasaFilesystemOnUIThread(const std::string& fs_name,
44                                          const base::FilePath& database_path);
45
46  bool RegisterITunesFilesystemOnUIThread(
47      const std::string& fs_name,
48      const base::FilePath& xml_library_path);
49
50  bool RegisterIPhotoFilesystemOnUIThread(
51      const std::string& fs_name,
52      const base::FilePath& xml_library_path);
53
54  bool RevokeImportedFilesystemOnUIThread(const std::string& fs_name);
55
56  // Path where all virtual file systems are "mounted."
57  base::FilePath ImportedRoot();
58
59  // Should be called on the MediaTaskRunner thread only.
60#if defined(OS_WIN) || defined(OS_MACOSX)
61  static picasa::PicasaDataProvider* PicasaDataProvider();
62  static itunes::ITunesDataProvider* ITunesDataProvider();
63#endif  // defined(OS_WIN) || defined(OS_MACOSX)
64
65#if defined(OS_MACOSX)
66  static iphoto::IPhotoDataProvider* IPhotoDataProvider();
67#endif  // defined(OS_MACOSX)
68
69 private:
70  friend struct base::DefaultLazyInstanceTraits<ImportedMediaGalleryRegistry>;
71  friend class iphoto::IPhotoDataProviderTest;
72  friend class itunes::ITunesDataProviderTest;
73  friend class picasa::PicasaDataProviderTest;
74
75  ImportedMediaGalleryRegistry();
76  virtual ~ImportedMediaGalleryRegistry();
77
78#if defined(OS_WIN) || defined(OS_MACOSX)
79  void RegisterPicasaFileSystem(const base::FilePath& database_path);
80  void RevokePicasaFileSystem();
81
82  void RegisterITunesFileSystem(const base::FilePath& xml_library_path);
83  void RevokeITunesFileSystem();
84#endif  // defined(OS_WIN) || defined(OS_MACOSX)
85
86#if defined(OS_MACOSX)
87  void RegisterIPhotoFileSystem(const base::FilePath& xml_library_path);
88  void RevokeIPhotoFileSystem();
89#endif  // defined(OS_MACOSX)
90
91  base::FilePath imported_root_;
92
93#if defined(OS_WIN) || defined(OS_MACOSX)
94  // The data providers are only set or accessed on the task runner thread.
95  scoped_ptr<picasa::PicasaDataProvider> picasa_data_provider_;
96  scoped_ptr<itunes::ITunesDataProvider> itunes_data_provider_;
97
98  // The remaining members are only accessed on the IO thread.
99  std::set<std::string> picasa_fs_names_;
100  std::set<std::string> itunes_fs_names_;
101
102#ifndef NDEBUG
103  base::FilePath picasa_database_path_;
104  base::FilePath itunes_xml_library_path_;
105#endif
106#endif  // defined(OS_WIN) || defined(OS_MACOSX)
107
108#if defined(OS_MACOSX)
109  scoped_ptr<iphoto::IPhotoDataProvider> iphoto_data_provider_;
110
111  std::set<std::string> iphoto_fs_names_;
112
113#ifndef NDEBUG
114  base::FilePath iphoto_xml_library_path_;
115#endif
116#endif  // defined(OS_MACOSX)
117
118  DISALLOW_COPY_AND_ASSIGN(ImportedMediaGalleryRegistry);
119};
120
121#endif  // CHROME_BROWSER_MEDIA_GALLERIES_IMPORTED_MEDIA_GALLERY_REGISTRY_H_
122