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