1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file.
4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#ifndef CHROMEOS_DBUS_FAKE_NFC_RECORD_CLIENT_H_
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define CHROMEOS_DBUS_FAKE_NFC_RECORD_CLIENT_H_
7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/observer_list.h"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/values.h"
11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chromeos/chromeos_export.h"
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chromeos/dbus/nfc_record_client.h"
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "dbus/object_path.h"
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace chromeos {
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// FakeNfcRecordClient simulates the behavior of the NFC record objects and is
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// used both in test cases in place of a mock and on the Linux desktop.
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class CHROMEOS_EXPORT FakeNfcRecordClient : public NfcRecordClient {
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public:
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Paths of the records exposed.
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static const char kDeviceSmartPosterRecordPath[];
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static const char kDeviceTextRecordPath[];
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static const char kDeviceUriRecordPath[];
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static const char kTagRecordPath[];
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Properties structure that provides fake behavior for D-Bus calls.
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  struct Properties : public NfcRecordClient::Properties {
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    explicit Properties(const PropertyChangedCallback& callback);
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    virtual ~Properties();
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // dbus::PropertySet overrides.
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    virtual void Get(dbus::PropertyBase* property,
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                     dbus::PropertySet::GetCallback callback) OVERRIDE;
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    virtual void GetAll() OVERRIDE;
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    virtual void Set(dbus::PropertyBase* property,
37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                     dbus::PropertySet::SetCallback callback) OVERRIDE;
38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  };
39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  FakeNfcRecordClient();
41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual ~FakeNfcRecordClient();
42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // NfcTagClient overrides.
44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void Init(dbus::Bus* bus) OVERRIDE;
45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void AddObserver(Observer* observer) OVERRIDE;
46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void RemoveObserver(Observer* observer) OVERRIDE;
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual std::vector<dbus::ObjectPath> GetRecordsForDevice(
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const dbus::ObjectPath& device_path) OVERRIDE;
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual std::vector<dbus::ObjectPath> GetRecordsForTag(
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const dbus::ObjectPath& tag_path) OVERRIDE;
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual Properties* GetProperties(
52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const dbus::ObjectPath& object_path) OVERRIDE;
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Adds or removes the fake record objects and notifies the observers.
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SetDeviceRecordsVisible(bool visible);
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SetTagRecordsVisible(bool visible);
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Modifies the contents of the tag record. |attributes| should be the
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // same as the argument to NfcTagClient::Write. Each field will be directly
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // assigned to the underlying record based on the type property, with
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // no validity checking. Invalid tag content can be passed here to test
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // the case where the remote application returns an incorrectly formatted
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // record.
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool WriteTagRecord(const base::DictionaryValue& attributes);
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private:
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Property changed callback passed when we create Properties* structures.
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnPropertyChanged(const dbus::ObjectPath& object_path,
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                         const std::string& property_name);
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Called by Properties* structures when GetAll is called.
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnPropertiesReceived(const dbus::ObjectPath& object_path);
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // If true, the records are currently visible.
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool device_records_visible_;
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool tag_records_visible_;
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // List of observers interested in event notifications from us.
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ObserverList<Observer> observers_;
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Fake properties that are returned for the fake records.
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<Properties> device_smart_poster_record_properties_;
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<Properties> device_text_record_properties_;
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<Properties> device_uri_record_properties_;
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<Properties> tag_record_properties_;
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FakeNfcRecordClient);
88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace chromeos
91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif  // CHROMEOS_DBUS_FAKE_NFC_RECORD_CLIENT_H_
93