1dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Use of this source code is governed by a BSD-style license that can be 3dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// found in the LICENSE file. 4dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 5dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/common/auto_start_linux.h" 6dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 7dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/environment.h" 8dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/file_path.h" 9dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/file_util.h" 10dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/logging.h" 11dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/nix/xdg_util.h" 12dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/string_tokenizer.h" 13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 14dc0f95d653279beabeb9817299e2902918ba123eKristian Monsennamespace { 15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst FilePath::CharType kAutostart[] = "autostart"; 17dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst FilePath::CharType kConfig[] = ".config"; 18dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char kXdgConfigHome[] = "XDG_CONFIG_HOME"; 19dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 20dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenFilePath GetAutostartDirectory(base::Environment* environment) { 21dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen FilePath result = 22dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen base::nix::GetXDGDirectory(environment, kXdgConfigHome, kConfig); 23dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen result = result.Append(kAutostart); 24dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return result; 25dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 26dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 27dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} // namespace 28dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 29dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenbool AutoStart::AddApplication(const std::string& autostart_filename, 30dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const std::string& application_name, 31dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const std::string& command_line, 32dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen bool is_terminal_app) { 33dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen scoped_ptr<base::Environment> environment(base::Environment::Create()); 34dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen FilePath autostart_directory = GetAutostartDirectory(environment.get()); 35dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (!file_util::DirectoryExists(autostart_directory) && 36dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen !file_util::CreateDirectory(autostart_directory)) { 37dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return false; 38dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 39dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 40dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen FilePath autostart_file = autostart_directory.Append(autostart_filename); 41dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen std::string terminal = is_terminal_app ? "true" : "false"; 42dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen std::string autostart_file_contents = 43dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen "[Desktop Entry]\n" 44dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen "Type=Application\n" 45dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen "Terminal=" + terminal + "\n" 46dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen "Exec=" + command_line + "\n" 47dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen "Name=" + application_name + "\n"; 48dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen std::string::size_type content_length = autostart_file_contents.length(); 49dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (file_util::WriteFile(autostart_file, autostart_file_contents.c_str(), 50dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen content_length) != 51dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen static_cast<int>(content_length)) { 52dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen file_util::Delete(autostart_file, false); 53dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return false; 54dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 55dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return true; 56dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 57dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 58dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenbool AutoStart::Remove(const std::string& autostart_filename) { 59dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen scoped_ptr<base::Environment> environment(base::Environment::Create()); 60dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen FilePath autostart_directory = GetAutostartDirectory(environment.get()); 61dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen FilePath autostart_file = autostart_directory.Append(autostart_filename); 62dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return file_util::Delete(autostart_file, false); 63dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 64dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 65dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenbool AutoStart::GetAutostartFileContents( 66dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const std::string& autostart_filename, std::string* contents) { 67dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen scoped_ptr<base::Environment> environment(base::Environment::Create()); 68dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen FilePath autostart_directory = GetAutostartDirectory(environment.get()); 69dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen FilePath autostart_file = autostart_directory.Append(autostart_filename); 70dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return file_util::ReadFileToString(autostart_file, contents); 71dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 72dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 73dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenbool AutoStart::GetAutostartFileValue(const std::string& autostart_filename, 74dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const std::string& value_name, 75dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen std::string* value) { 76dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen std::string contents; 77dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (!GetAutostartFileContents(autostart_filename, &contents)) 78dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return false; 79dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen StringTokenizer tokenizer(contents, "\n"); 80dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen std::string token = value_name + "="; 81dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen while (tokenizer.GetNext()) { 82dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (tokenizer.token().substr(0, token.length()) == token) { 83dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen *value = tokenizer.token().substr(token.length()); 84dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return true; 85dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 86dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 87dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return false; 88dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 89