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#include "chrome/browser/media_galleries/fileapi/picasa/picasa_finder.h"
6
7#include "base/base_paths.h"
8#include "base/bind.h"
9#include "base/file_util.h"
10#include "base/path_service.h"
11#include "chrome/browser/storage_monitor/storage_info.h"
12#include "content/public/browser/browser_thread.h"
13
14namespace picasa {
15
16namespace {
17
18// Returns path of Picasa's DB3 database directory. May only be called on
19// threads that allow for disk IO, like the FILE thread or MediaTaskRunner.
20base::FilePath FindPicasaDatabaseOnFileThread() {
21  DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE));
22  base::FilePath path;
23
24#if defined(OS_WIN)
25  // TODO(tommycli): Check registry for alternative path.
26  if (!PathService::Get(base::DIR_LOCAL_APP_DATA, &path))
27    return base::FilePath();
28#elif defined(OS_MACOSX)
29  // TODO(tommycli): Check Mac Preferences for alternative path.
30  if (!PathService::Get(base::DIR_APP_DATA, &path))
31    return base::FilePath();
32#else
33  return base::FilePath();
34#endif
35
36  path = path.AppendASCII("Google").AppendASCII("Picasa2").AppendASCII("db3");
37
38  // Verify actual existence
39  if (!base::DirectoryExists(path))
40    path.clear();
41
42  return path;
43}
44
45void FinishOnOriginalThread(const PicasaFinder::DeviceIDCallback& callback,
46                            const base::FilePath& database_path) {
47  if (!database_path.empty())
48    callback.Run(chrome::StorageInfo::MakeDeviceId(
49        chrome::StorageInfo::PICASA,
50        database_path.AsUTF8Unsafe()));
51}
52
53}
54
55void PicasaFinder::FindPicasaDatabase(
56    const PicasaFinder::DeviceIDCallback& callback) {
57  content::BrowserThread::PostTaskAndReplyWithResult(
58      content::BrowserThread::FILE,
59      FROM_HERE,
60      base::Bind(&FindPicasaDatabaseOnFileThread),
61      base::Bind(&FinishOnOriginalThread, callback));
62}
63
64}  // namespace picasa
65