190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// found in the LICENSE file.
490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/media_galleries/fileapi/picasa_finder.h"
690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_WIN)
84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include <windows.h>
94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/base_paths.h"
1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/bind.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
1490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/path_service.h"
154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/strings/string16.h"
1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/common/media_galleries/picasa_types.h"
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/storage_monitor/storage_info.h"
1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/browser/browser_thread.h"
1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_WIN)
214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/win/registry.h"
224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace picasa {
2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_WIN)
274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const wchar_t kPicasaRegistryPath[] =
284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    L"Software\\Google\\Picasa\\Picasa2\\Preferences";
291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)const wchar_t kPicasaRegistryAppDataPathKey[] = L"AppLocalDataPath";
304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace {
3390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(OS_WIN)
351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)base::FilePath GetCustomPicasaAppDataPathFromWinRegistry() {
364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::win::RegKey key;
374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (key.Open(HKEY_CURRENT_USER, kPicasaRegistryPath, KEY_READ) !=
384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          ERROR_SUCCESS || !key.Valid()) {
394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return base::FilePath();
404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 value;
431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (key.ReadValue(kPicasaRegistryAppDataPathKey, &value) != ERROR_SUCCESS)
4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return base::FilePath();
454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (value.empty())
464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return base::FilePath();
474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return base::FilePath(value);
494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)base::FilePath GetPicasaDatabasePath() {
521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  base::FilePath path = GetCustomPicasaAppDataPathFromWinRegistry();
534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (path.empty() && !PathService::Get(base::DIR_LOCAL_APP_DATA, &path))
544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return base::FilePath();
551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return MakePicasaDatabasePath(path);
564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif  // OS_WIN
584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if defined(OS_MACOSX)
601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)base::FilePath GetPicasaDatabasePath() {
611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  base::FilePath path = GetCustomPicasaAppDataPathFromMacPreferences();
621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (path.empty() && !PathService::Get(base::DIR_APP_DATA, &path))
6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return base::FilePath();
641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return MakePicasaDatabasePath(path);
654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif  // OS_MACOSX
6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Returns path of Picasa's DB3 database directory. May only be called on
694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// threads that allow for disk IO, like the FILE thread or MediaTaskRunner.
704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)base::FilePath FindPicasaDatabaseOnFileThread() {
71e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK_CURRENTLY_ON(content::BrowserThread::FILE);
721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if defined(OS_WIN) || defined(OS_MACOSX)
741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)   base::FilePath path = GetPicasaDatabasePath();
751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)   // Verify actual existence
761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)   if (!base::DirectoryExists(path))
771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)     path.clear();
781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)   return path;
801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#else
811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)   return base::FilePath();
821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif
8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
8490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FinishOnOriginalThread(const DeviceIDCallback& callback,
8690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                            const base::FilePath& database_path) {
874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::string device_id;
884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!database_path.empty()) {
89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    device_id = storage_monitor::StorageInfo::MakeDeviceId(
90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        storage_monitor::StorageInfo::PICASA, database_path.AsUTF8Unsafe());
914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  callback.Run(device_id);
9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}  // namespace
9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FindPicasaDatabase(const DeviceIDCallback& callback) {
9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  content::BrowserThread::PostTaskAndReplyWithResult(
9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      content::BrowserThread::FILE,
10090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      FROM_HERE,
10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::Bind(&FindPicasaDatabaseOnFileThread),
10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::Bind(&FinishOnOriginalThread, callback));
10390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
10490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)base::FilePath MakePicasaDatabasePath(
1061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const base::FilePath& picasa_app_data_path) {
1071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if defined(OS_WIN)
1081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return picasa_app_data_path.AppendASCII("Google").AppendASCII("Picasa2")
1091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      .AppendASCII(kPicasaDatabaseDirName);
1101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#elif defined(OS_MACOSX)
1111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return picasa_app_data_path.AppendASCII("Google").AppendASCII("Picasa3")
1121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      .AppendASCII(kPicasaDatabaseDirName);
1131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#else
1141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return base::FilePath();
1151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif
1161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
11890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}  // namespace picasa
119