blob: e9f521d9dcc9caad826d9c79f274e91114c55733 [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_; }
Paul Stewartba8f1412013-09-30 17:52:03 -070051 const KeyValueStore *const_args() const { return &args_; }
Darin Petkovb451d6e2012-04-23 11:56:41 +020052
53 protected:
54 struct Property {
55 enum Flags {
Darin Petkovcb715292012-04-25 13:04:37 +020056 kEphemeral = 1 << 0, // Never load or save.
57 kCredential = 1 << 1, // Save if saving credentials (crypted).
58 kWriteOnly = 1 << 2, // Never read over RPC.
Paul Stewartdf4e3c92013-06-13 17:50:30 -070059 kArray = 1 << 3, // Property is an array of strings.
Darin Petkovb451d6e2012-04-23 11:56:41 +020060 };
61
62 const char *property;
63 int flags;
64 };
65
Darin Petkov0cd0d1e2013-02-11 12:49:10 +010066 static const int kDefaultConnectTimeoutSeconds;
67
Darin Petkov602303f2012-06-06 12:15:59 +020068 VPNDriver(EventDispatcher *dispatcher,
69 Manager *manager,
Darin Petkov0e9735d2012-04-24 12:33:45 +020070 const Property *properties,
71 size_t property_count);
72
Darin Petkov602303f2012-06-06 12:15:59 +020073 EventDispatcher *dispatcher() const { return dispatcher_; }
Darin Petkov0e9735d2012-04-24 12:33:45 +020074 Manager *manager() const { return manager_; }
75
Darin Petkovb536a742012-04-26 11:31:28 +020076 virtual KeyValueStore GetProvider(Error *error);
77
Darin Petkov0cd0d1e2013-02-11 12:49:10 +010078 // Initializes a callback that will invoke OnConnectTimeout after
79 // |timeout_seconds|. The timeout will not be restarted if it's already
80 // scheduled.
81 void StartConnectTimeout(int timeout_seconds);
Darin Petkov602303f2012-06-06 12:15:59 +020082 // Cancels the connect timeout callback, if any, previously scheduled through
83 // StartConnectTimeout.
84 void StopConnectTimeout();
85 // Returns true if a connect timeout is scheduled, false otherwise.
86 bool IsConnectTimeoutStarted() const;
87
Darin Petkova42afe32013-02-05 16:53:52 +010088 // Called if a connect timeout scheduled through StartConnectTimeout
89 // fires. Cancels the timeout callback.
90 virtual void OnConnectTimeout();
91
Darin Petkov0cd0d1e2013-02-11 12:49:10 +010092 int connect_timeout_seconds() const { return connect_timeout_seconds_; }
Darin Petkov602303f2012-06-06 12:15:59 +020093
Darin Petkov0cd0d1e2013-02-11 12:49:10 +010094 private:
95 friend class VPNDriverTest;
Darin Petkov602303f2012-06-06 12:15:59 +020096
Paul Stewartdf4e3c92013-06-13 17:50:30 -070097 void ClearMappedStringProperty(const size_t &index, Error *error);
98 void ClearMappedStringsProperty(const size_t &index, Error *error);
99 std::string GetMappedStringProperty(const size_t &index, Error *error);
100 std::vector<std::string> GetMappedStringsProperty(
101 const size_t &index, Error *error);
102 bool SetMappedStringProperty(
Darin Petkovb451d6e2012-04-23 11:56:41 +0200103 const size_t &index, const std::string &value, Error *error);
Paul Stewartdf4e3c92013-06-13 17:50:30 -0700104 bool SetMappedStringsProperty(
105 const size_t &index, const std::vector<std::string> &value, Error *error);
Darin Petkovb451d6e2012-04-23 11:56:41 +0200106
Darin Petkov602303f2012-06-06 12:15:59 +0200107 base::WeakPtrFactory<VPNDriver> weak_ptr_factory_;
108 EventDispatcher *dispatcher_;
Darin Petkov0e9735d2012-04-24 12:33:45 +0200109 Manager *manager_;
Darin Petkovb451d6e2012-04-23 11:56:41 +0200110 const Property * const properties_;
111 const size_t property_count_;
112 KeyValueStore args_;
113
Darin Petkov602303f2012-06-06 12:15:59 +0200114 base::CancelableClosure connect_timeout_callback_;
115 int connect_timeout_seconds_;
116
Darin Petkovb451d6e2012-04-23 11:56:41 +0200117 DISALLOW_COPY_AND_ASSIGN(VPNDriver);
Darin Petkov33af05c2012-02-28 10:10:30 +0100118};
119
120} // namespace shill
121
Darin Petkova42afe32013-02-05 16:53:52 +0100122#endif // SHILL_VPN_DRIVER_H_