1c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
2c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Copyright (C) 2012 The Android Open Source Project
3c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
4c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Licensed under the Apache License, Version 2.0 (the "License");
5c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// you may not use this file except in compliance with the License.
6c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// You may obtain a copy of the License at
7c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
8c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//      http://www.apache.org/licenses/LICENSE-2.0
9c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
10c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Unless required by applicable law or agreed to in writing, software
11c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// distributed under the License is distributed on an "AS IS" BASIS,
12c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// See the License for the specific language governing permissions and
14c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// limitations under the License.
15c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
1633af05c849e0888b15222da38b55515784b821c7Darin Petkov
172240e8c03451c6b6f21eb8944d8a1c0747ac10b3Ben Chan#ifndef SHILL_VPN_VPN_DRIVER_H_
182240e8c03451c6b6f21eb8944d8a1c0747ac10b3Ben Chan#define SHILL_VPN_VPN_DRIVER_H_
1933af05c849e0888b15222da38b55515784b821c7Darin Petkov
20ca6abd4635507fa5b8f4b8819a37819fb560c464Paul Stewart#include <string>
218a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko#include <vector>
22ca6abd4635507fa5b8f4b8819a37819fb560c464Paul Stewart
23602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov#include <base/cancelable_callback.h>
24cc67c52a2c00f90e877971d552208dd99825d84eBen Chan#include <base/macros.h>
25602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov#include <base/memory/weak_ptr.h>
260e9735db6db73a48c4b0cc3151a5272e3a8b9d2fDarin Petkov#include <gtest/gtest_prod.h>  // for FRIEND_TEST
2733af05c849e0888b15222da38b55515784b821c7Darin Petkov
28b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov#include "shill/accessor_interface.h"
29b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov#include "shill/key_value_store.h"
3079d74c9bdb654be48765c1e7aa416126ffd2ae5eDarin Petkov#include "shill/refptr_types.h"
3179d74c9bdb654be48765c1e7aa416126ffd2ae5eDarin Petkov
3233af05c849e0888b15222da38b55515784b821c7Darin Petkovnamespace shill {
3333af05c849e0888b15222da38b55515784b821c7Darin Petkov
3433af05c849e0888b15222da38b55515784b821c7Darin Petkovclass Error;
35602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkovclass EventDispatcher;
360e9735db6db73a48c4b0cc3151a5272e3a8b9d2fDarin Petkovclass Manager;
37ebd3856da9d213154f3c85a71e4ec8e8fce3b9eaPaul Stewartclass PropertyStore;
38f3c71d70885fdddff8d71db75878c1310af28f9dDarin Petkovclass StoreInterface;
3933af05c849e0888b15222da38b55515784b821c7Darin Petkov
4033af05c849e0888b15222da38b55515784b821c7Darin Petkovclass VPNDriver {
4133af05c849e0888b15222da38b55515784b821c7Darin Petkov public:
42b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov  virtual ~VPNDriver();
4333af05c849e0888b15222da38b55515784b821c7Darin Petkov
44e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart  virtual bool ClaimInterface(const std::string& link_name,
45ca6abd4635507fa5b8f4b8819a37819fb560c464Paul Stewart                              int interface_index) = 0;
46e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart  virtual void Connect(const VPNServiceRefPtr& service, Error* error) = 0;
476aa2187f18e5a9ba3d6d475669cd27dfee4d92bdDarin Petkov  virtual void Disconnect() = 0;
4839964fa3426450903d2640046e562708aeda0a30Paul Stewart  virtual std::string GetProviderType() const = 0;
49b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov
50a42afe3a1621b8262d5404ecfaf200d3d76bd454Darin Petkov  // Invoked by VPNService when the underlying connection disconnects.
51a42afe3a1621b8262d5404ecfaf200d3d76bd454Darin Petkov  virtual void OnConnectionDisconnected() = 0;
52a42afe3a1621b8262d5404ecfaf200d3d76bd454Darin Petkov
53e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart  virtual void InitPropertyStore(PropertyStore* store);
54b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov
55e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart  virtual bool Load(StoreInterface* storage, const std::string& storage_id);
56e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart  virtual bool Save(StoreInterface* storage,
57e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart                    const std::string& storage_id,
58cb71529cc0432935aff005726c81df109d1dc710Darin Petkov                    bool save_credentials);
59cb71529cc0432935aff005726c81df109d1dc710Darin Petkov  virtual void UnloadCredentials();
60b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov
619c6e9818cd1337ee06a218db83ee577ac977c7d9Darin Petkov  std::string GetHost() const;
629c6e9818cd1337ee06a218db83ee577ac977c7d9Darin Petkov
63e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart  KeyValueStore* args() { return &args_; }
64e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart  const KeyValueStore* const_args() const { return &args_; }
65b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov
66b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov protected:
67b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov  struct Property {
68b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov    enum Flags {
69cb71529cc0432935aff005726c81df109d1dc710Darin Petkov      kEphemeral = 1 << 0,   // Never load or save.
70cb71529cc0432935aff005726c81df109d1dc710Darin Petkov      kCredential = 1 << 1,  // Save if saving credentials (crypted).
71cb71529cc0432935aff005726c81df109d1dc710Darin Petkov      kWriteOnly = 1 << 2,   // Never read over RPC.
72df4e3c9d6673dfbff55a9bd0ba5125efca67f079Paul Stewart      kArray = 1 << 3,       // Property is an array of strings.
73b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov    };
74b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov
75e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart    const char* property;
76b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov    int flags;
77b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov  };
78b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov
790cd0d1e07270b05016b29cd7c9d6f4c5440fb078Darin Petkov  static const int kDefaultConnectTimeoutSeconds;
800cd0d1e07270b05016b29cd7c9d6f4c5440fb078Darin Petkov
81e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart  VPNDriver(EventDispatcher* dispatcher,
82e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart            Manager* manager,
83e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart            const Property* properties,
840e9735db6db73a48c4b0cc3151a5272e3a8b9d2fDarin Petkov            size_t property_count);
850e9735db6db73a48c4b0cc3151a5272e3a8b9d2fDarin Petkov
86e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart  EventDispatcher* dispatcher() const { return dispatcher_; }
87e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart  Manager* manager() const { return manager_; }
880e9735db6db73a48c4b0cc3151a5272e3a8b9d2fDarin Petkov
89e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart  virtual KeyValueStore GetProvider(Error* error);
90b536a74030880f4a4df0ad3d6c1380b0602446c6Darin Petkov
910cd0d1e07270b05016b29cd7c9d6f4c5440fb078Darin Petkov  // Initializes a callback that will invoke OnConnectTimeout after
920cd0d1e07270b05016b29cd7c9d6f4c5440fb078Darin Petkov  // |timeout_seconds|. The timeout will not be restarted if it's already
930cd0d1e07270b05016b29cd7c9d6f4c5440fb078Darin Petkov  // scheduled.
940cd0d1e07270b05016b29cd7c9d6f4c5440fb078Darin Petkov  void StartConnectTimeout(int timeout_seconds);
95602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov  // Cancels the connect timeout callback, if any, previously scheduled through
96602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov  // StartConnectTimeout.
97602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov  void StopConnectTimeout();
98602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov  // Returns true if a connect timeout is scheduled, false otherwise.
99602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov  bool IsConnectTimeoutStarted() const;
100602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov
101a42afe3a1621b8262d5404ecfaf200d3d76bd454Darin Petkov  // Called if a connect timeout scheduled through StartConnectTimeout
102a42afe3a1621b8262d5404ecfaf200d3d76bd454Darin Petkov  // fires. Cancels the timeout callback.
103a42afe3a1621b8262d5404ecfaf200d3d76bd454Darin Petkov  virtual void OnConnectTimeout();
104a42afe3a1621b8262d5404ecfaf200d3d76bd454Darin Petkov
1050cd0d1e07270b05016b29cd7c9d6f4c5440fb078Darin Petkov  int connect_timeout_seconds() const { return connect_timeout_seconds_; }
106602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov
1070cd0d1e07270b05016b29cd7c9d6f4c5440fb078Darin Petkov private:
1080cd0d1e07270b05016b29cd7c9d6f4c5440fb078Darin Petkov  friend class VPNDriverTest;
109602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov
110e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart  void ClearMappedStringProperty(const size_t& index, Error* error);
111e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart  void ClearMappedStringsProperty(const size_t& index, Error* error);
112e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart  std::string GetMappedStringProperty(const size_t& index, Error* error);
113df4e3c9d6673dfbff55a9bd0ba5125efca67f079Paul Stewart  std::vector<std::string> GetMappedStringsProperty(
114e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart      const size_t& index, Error* error);
115df4e3c9d6673dfbff55a9bd0ba5125efca67f079Paul Stewart  bool SetMappedStringProperty(
116e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart      const size_t& index, const std::string& value, Error* error);
117df4e3c9d6673dfbff55a9bd0ba5125efca67f079Paul Stewart  bool SetMappedStringsProperty(
118e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart      const size_t& index, const std::vector<std::string>& value, Error* error);
119b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov
120602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov  base::WeakPtrFactory<VPNDriver> weak_ptr_factory_;
121e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart  EventDispatcher* dispatcher_;
122e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart  Manager* manager_;
123e42d186ab3383b4a6bb267f490770af5932588b8Paul Stewart  const Property* const properties_;
124b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov  const size_t property_count_;
125b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov  KeyValueStore args_;
126b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov
127602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov  base::CancelableClosure connect_timeout_callback_;
128602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov  int connect_timeout_seconds_;
129602303fdc8e4a50c8f89bc7e1048a4b5438555bfDarin Petkov
130b451d6e5b5deb3a42ac09c3db349f325e4c8004eDarin Petkov  DISALLOW_COPY_AND_ASSIGN(VPNDriver);
13133af05c849e0888b15222da38b55515784b821c7Darin Petkov};
13233af05c849e0888b15222da38b55515784b821c7Darin Petkov
13333af05c849e0888b15222da38b55515784b821c7Darin Petkov}  // namespace shill
13433af05c849e0888b15222da38b55515784b821c7Darin Petkov
1352240e8c03451c6b6f21eb8944d8a1c0747ac10b3Ben Chan#endif  // SHILL_VPN_VPN_DRIVER_H_
136