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