blob: b880b1969cbd4fcf506cc8a6fcce1f4afab5a8c7 [file] [log] [blame]
Darin Petkov33af05c2012-02-28 10:10:30 +01001// Copyright (c) 2012 The Chromium OS 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
Darin Petkova42afe32013-02-05 16:53:52 +01005#ifndef SHILL_VPN_DRIVER_H_
6#define SHILL_VPN_DRIVER_H_
Darin Petkov33af05c2012-02-28 10:10:30 +01007
Paul Stewartca6abd42012-03-01 15:45:29 -08008#include <string>
9
Darin Petkov33af05c2012-02-28 10:10:30 +010010#include <base/basictypes.h>
Darin Petkov602303f2012-06-06 12:15:59 +020011#include <base/cancelable_callback.h>
12#include <base/memory/weak_ptr.h>
Darin Petkov0e9735d2012-04-24 12:33:45 +020013#include <gtest/gtest_prod.h> // for FRIEND_TEST
Darin Petkov33af05c2012-02-28 10:10:30 +010014
Darin Petkovb451d6e2012-04-23 11:56:41 +020015#include "shill/accessor_interface.h"
16#include "shill/key_value_store.h"
Darin Petkov79d74c92012-03-07 17:20:32 +010017#include "shill/refptr_types.h"
18
Darin Petkov33af05c2012-02-28 10:10:30 +010019namespace shill {
20
21class Error;
Darin Petkov602303f2012-06-06 12:15:59 +020022class EventDispatcher;
Darin Petkov0e9735d2012-04-24 12:33:45 +020023class Manager;
Paul Stewartebd38562012-03-23 13:06:40 -070024class PropertyStore;
Darin Petkovf3c71d72012-03-21 12:32:15 +010025class StoreInterface;
Darin Petkov33af05c2012-02-28 10:10:30 +010026
27class VPNDriver {
28 public:
Darin Petkovb451d6e2012-04-23 11:56:41 +020029 virtual ~VPNDriver();
Darin Petkov33af05c2012-02-28 10:10:30 +010030
Paul Stewartca6abd42012-03-01 15:45:29 -080031 virtual bool ClaimInterface(const std::string &link_name,
32 int interface_index) = 0;
Darin Petkov79d74c92012-03-07 17:20:32 +010033 virtual void Connect(const VPNServiceRefPtr &service, Error *error) = 0;
Darin Petkov6aa21872012-03-09 16:10:19 +010034 virtual void Disconnect() = 0;
Paul Stewart39964fa2012-04-04 09:50:25 -070035 virtual std::string GetProviderType() const = 0;
Darin Petkovb451d6e2012-04-23 11:56:41 +020036
Darin Petkova42afe32013-02-05 16:53:52 +010037 // Invoked by VPNService when the underlying connection disconnects.
38 virtual void OnConnectionDisconnected() = 0;
39
Darin Petkovb451d6e2012-04-23 11:56:41 +020040 virtual void InitPropertyStore(PropertyStore *store);
41
42 virtual bool Load(StoreInterface *storage, const std::string &storage_id);
Darin Petkovcb715292012-04-25 13:04:37 +020043 virtual bool Save(StoreInterface *storage,
44 const std::string &storage_id,
45 bool save_credentials);
46 virtual void UnloadCredentials();
Darin Petkovb451d6e2012-04-23 11:56:41 +020047
Darin Petkov9c6e9812013-03-26 13:49:07 +010048 std::string GetHost() const;
49
Darin Petkovb451d6e2012-04-23 11:56:41 +020050 KeyValueStore *args() { return &args_; }
51
52 protected:
53 struct Property {
54 enum Flags {
Darin Petkovcb715292012-04-25 13:04:37 +020055 kEphemeral = 1 << 0, // Never load or save.
56 kCredential = 1 << 1, // Save if saving credentials (crypted).
57 kWriteOnly = 1 << 2, // Never read over RPC.
Paul Stewartdf4e3c92013-06-13 17:50:30 -070058 kArray = 1 << 3, // Property is an array of strings.
Darin Petkovb451d6e2012-04-23 11:56:41 +020059 };
60
61 const char *property;
62 int flags;
63 };
64
Darin Petkov0cd0d1e2013-02-11 12:49:10 +010065 static const int kDefaultConnectTimeoutSeconds;
66
Darin Petkov602303f2012-06-06 12:15:59 +020067 VPNDriver(EventDispatcher *dispatcher,
68 Manager *manager,
Darin Petkov0e9735d2012-04-24 12:33:45 +020069 const Property *properties,
70 size_t property_count);
71
Darin Petkov602303f2012-06-06 12:15:59 +020072 EventDispatcher *dispatcher() const { return dispatcher_; }
Darin Petkov0e9735d2012-04-24 12:33:45 +020073 Manager *manager() const { return manager_; }
74
Darin Petkovb536a742012-04-26 11:31:28 +020075 virtual KeyValueStore GetProvider(Error *error);
76
Darin Petkov0cd0d1e2013-02-11 12:49:10 +010077 // Initializes a callback that will invoke OnConnectTimeout after
78 // |timeout_seconds|. The timeout will not be restarted if it's already
79 // scheduled.
80 void StartConnectTimeout(int timeout_seconds);
Darin Petkov602303f2012-06-06 12:15:59 +020081 // Cancels the connect timeout callback, if any, previously scheduled through
82 // StartConnectTimeout.
83 void StopConnectTimeout();
84 // Returns true if a connect timeout is scheduled, false otherwise.
85 bool IsConnectTimeoutStarted() const;
86
Darin Petkova42afe32013-02-05 16:53:52 +010087 // Called if a connect timeout scheduled through StartConnectTimeout
88 // fires. Cancels the timeout callback.
89 virtual void OnConnectTimeout();
90
Darin Petkov0cd0d1e2013-02-11 12:49:10 +010091 int connect_timeout_seconds() const { return connect_timeout_seconds_; }
Darin Petkov602303f2012-06-06 12:15:59 +020092
Darin Petkov0cd0d1e2013-02-11 12:49:10 +010093 private:
94 friend class VPNDriverTest;
Darin Petkov602303f2012-06-06 12:15:59 +020095
Paul Stewartdf4e3c92013-06-13 17:50:30 -070096 void ClearMappedStringProperty(const size_t &index, Error *error);
97 void ClearMappedStringsProperty(const size_t &index, Error *error);
98 std::string GetMappedStringProperty(const size_t &index, Error *error);
99 std::vector<std::string> GetMappedStringsProperty(
100 const size_t &index, Error *error);
101 bool SetMappedStringProperty(
Darin Petkovb451d6e2012-04-23 11:56:41 +0200102 const size_t &index, const std::string &value, Error *error);
Paul Stewartdf4e3c92013-06-13 17:50:30 -0700103 bool SetMappedStringsProperty(
104 const size_t &index, const std::vector<std::string> &value, Error *error);
Darin Petkovb451d6e2012-04-23 11:56:41 +0200105
Darin Petkov602303f2012-06-06 12:15:59 +0200106 base::WeakPtrFactory<VPNDriver> weak_ptr_factory_;
107 EventDispatcher *dispatcher_;
Darin Petkov0e9735d2012-04-24 12:33:45 +0200108 Manager *manager_;
Darin Petkovb451d6e2012-04-23 11:56:41 +0200109 const Property * const properties_;
110 const size_t property_count_;
111 KeyValueStore args_;
112
Darin Petkov602303f2012-06-06 12:15:59 +0200113 base::CancelableClosure connect_timeout_callback_;
114 int connect_timeout_seconds_;
115
Darin Petkovb451d6e2012-04-23 11:56:41 +0200116 DISALLOW_COPY_AND_ASSIGN(VPNDriver);
Darin Petkov33af05c2012-02-28 10:10:30 +0100117};
118
119} // namespace shill
120
Darin Petkova42afe32013-02-05 16:53:52 +0100121#endif // SHILL_VPN_DRIVER_H_