1// Copyright (c) 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/**
6 * Wallpaper file system quota.
7 */
8/** @const */ var WallpaperQuota = 1024 * 1024 * 100;
9
10/**
11 * Wallpaper directories enum.
12 */
13/** @const */ var WallpaperDirNameEnum = {
14                  ORIGINAL: 'original',
15                  THUMBNAIL: 'thumbnail'
16              };
17
18var wallpaperDirectories = null;
19
20/**
21 * Manages custom wallpaper related directories in wallpaper's sandboxed
22 * FileSystem.
23 * @constructor
24 */
25function WallpaperDirectories() {
26  this.wallpaperDirs_ = {};
27  this.wallpaperDirs_[WallpaperDirNameEnum.ORIGINAL] = null;
28  this.wallpaperDirs_[WallpaperDirNameEnum.THUMBNAIL] = null;
29}
30
31/**
32 * Gets WallpaperDirectories instance. In case is hasn't been initialized, a new
33 * instance is created.
34 * @return {WallpaperDirectories} A WallpaperDirectories instance.
35 */
36WallpaperDirectories.getInstance = function() {
37  if (wallpaperDirectories === null)
38    wallpaperDirectories = new WallpaperDirectories();
39  return wallpaperDirectories;
40};
41
42WallpaperDirectories.prototype = {
43  /**
44   * Returns all custom wallpaper related directory entries.
45   */
46  get wallpaperDirs() {
47    return this.wallpaperDirs_;
48  },
49
50  /**
51   * If dirName is not requested, gets the directory entry of dirName and cache
52   * the result. Calls success callback if success.
53   * @param {string} dirName The directory name of requested directory entry.
54   * @param {function(DirectoryEntry):void} success Call success with requested
55   *     DirectoryEntry.
56   * @param {function(e):void} failure Call failure when failed to get the
57   *     requested directory.
58   */
59  requestDir: function(dirName, success, failure) {
60    if (dirName != WallpaperDirNameEnum.ORIGINAL &&
61        dirName != WallpaperDirNameEnum.THUMBNAIL) {
62      console.error('Error: Unknow directory name.');
63      var e = new Error();
64      e.code = FileError.NOT_FOUND_ERR;
65      failure(e);
66      return;
67    }
68    var self = this;
69    window.webkitRequestFileSystem(window.PERSISTENT, WallpaperQuota,
70                                   function(fs) {
71      fs.root.getDirectory(dirName, {create: true}, function(dirEntry) {
72        self.wallpaperDirs_[dirName] = dirEntry;
73        success(dirEntry);
74      }, failure);
75    }, failure);
76  },
77
78  /**
79   * Gets DirectoryEntry associated with dirName from cache. If not in cache try
80   * to request it from FileSystem.
81   * @param {string} dirName The directory name of requested directory entry.
82   * @param {function(DirectoryEntry):void} success Call success with requested
83   *     DirectoryEntry.
84   * @param {function(e):void} failure Call failure when failed to get the
85   *     requested directory.
86   */
87  getDirectory: function(dirName, success, failure) {
88    if (this.wallpaperDirs[dirName])
89      success(this.wallpaperDirs[dirName]);
90    else
91      this.requestDir(dirName, success, failure);
92  }
93};
94