mount_library.h revision c407dc5cd9bdc5668497f21b26b09d988ab439de
1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2009 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_CHROMEOS_CROS_MOUNT_LIBRARY_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_CHROMEOS_CROS_MOUNT_LIBRARY_H_
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string>
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector>
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/observer_list.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/singleton.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/time.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "cros/chromeos_mount.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace chromeos {
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This class handles the interaction with the ChromeOS mount library APIs.
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Classes can add themselves as observers. Users can get an instance of this
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// library class like this: MountLibrary::Get().
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MountLibrary {
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Used to house an instance of each found mount device.
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  struct Disk {
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Disk() {}
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Disk(const std::string& devicepath,
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         const std::string& mountpath,
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         const std::string& systempath,
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         bool isparent,
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         bool hasmedia)
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        : device_path(devicepath),
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          mount_path(mountpath),
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          system_path(systempath),
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          is_parent(isparent),
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          has_media(hasmedia) {}
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // The path of the device, used by devicekit-disks.
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::string device_path;
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // The path to the mount point of this device. Will be empty if not mounted.
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::string mount_path;
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // The path of the device according to the udev system.
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::string system_path;
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // if the device is a parent device (i.e. sdb rather than sdb1)
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    bool is_parent;
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // if the device has media currently
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    bool has_media;
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef std::vector<Disk> DiskVector;
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  class Observer {
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   public:
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    virtual void MountChanged(MountLibrary* obj,
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              MountEventType evt,
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              const std::string& path) = 0;
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~MountLibrary() {}
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void AddObserver(Observer* observer) = 0;
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void RemoveObserver(Observer* observer) = 0;
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual const DiskVector& disks() const = 0;
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool MountPath(const char* device_path) = 0;
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This class handles the interaction with the ChromeOS mount library APIs.
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Classes can add themselves as observers. Users can get an instance of this
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// library class like this: MountLibrary::Get().
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MountLibraryImpl : public MountLibrary {
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MountLibraryImpl();
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~MountLibraryImpl();
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // MountLibrary overrides.
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void AddObserver(Observer* observer);
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void RemoveObserver(Observer* observer);
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual const DiskVector& disks() const { return disks_; }
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool MountPath(const char* device_path);
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ParseDisks(const MountStatus& status);
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This method is called when there's a change in mount status.
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This method is called the UI Thread.
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static void MountStatusChangedHandler(void* object,
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                        const MountStatus& status,
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                        MountEventType evt,
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                        const char* path);
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This methods starts the monitoring of mount changes.
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // It should be called on the UI Thread.
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Init();
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called by the handler to update the mount status.
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This will notify all the Observers.
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void UpdateMountStatus(const MountStatus& status,
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         MountEventType evt,
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         const std::string& path);
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ObserverList<Observer> observers_;
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // A reference to the  mount api, to allow callbacks when the mount
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // status changes.
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MountStatusConnection mount_status_connection_;
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The list of disks found.
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DiskVector disks_;
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(MountLibraryImpl);
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace chromeos
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_CHROMEOS_CROS_MOUNT_LIBRARY_H_
111