shill: vpn: Parse openvpn IP configuration options.

The options are pushed to shill over DBus through the .Task.notify service
method.

BUG=chromium-os:27056
TEST=unit tests

Change-Id: I98d7d49c275f49daba5a6dbe0af0878bf82038a6
Reviewed-on: https://gerrit.chromium.org/gerrit/17219
Tested-by: Darin Petkov <petkov@chromium.org>
Reviewed-by: mukesh agrawal <quiche@chromium.org>
Commit-Ready: Darin Petkov <petkov@chromium.org>
diff --git a/openvpn_driver.h b/openvpn_driver.h
index 57d2272..00f7eab 100644
--- a/openvpn_driver.h
+++ b/openvpn_driver.h
@@ -5,12 +5,14 @@
 #ifndef SHILL_OPENVPN_DRIVER_
 #define SHILL_OPENVPN_DRIVER_
 
+#include <map>
 #include <string>
 #include <vector>
 
 #include <base/memory/scoped_ptr.h>
 #include <gtest/gtest_prod.h>  // for FRIEND_TEST
 
+#include "shill/ipconfig.h"
 #include "shill/key_value_store.h"
 #include "shill/vpn_driver.h"
 
@@ -29,6 +31,9 @@
                 const KeyValueStore &args);
   virtual ~OpenVPNDriver();
 
+  bool Notify(const std::string &reason,
+              const std::map<std::string, std::string> &dict);
+
   // Inherited from VPNDriver.
   virtual bool ClaimInterface(const std::string &link_name,
                               int interface_index);
@@ -41,6 +46,21 @@
   FRIEND_TEST(OpenVPNDriverTest, ClaimInterface);
   FRIEND_TEST(OpenVPNDriverTest, InitOptions);
   FRIEND_TEST(OpenVPNDriverTest, InitOptionsNoHost);
+  FRIEND_TEST(OpenVPNDriverTest, ParseForeignOption);
+  FRIEND_TEST(OpenVPNDriverTest, ParseForeignOptions);
+  FRIEND_TEST(OpenVPNDriverTest, ParseIPConfiguration);
+
+  // The map is a sorted container that allows us to iterate through the options
+  // in order.
+  typedef std::map<int, std::string> ForeignOptions;
+
+  static void ParseIPConfiguration(
+      const std::map<std::string, std::string> &configuration,
+      IPConfig::Properties *properties);
+  static void ParseForeignOptions(const ForeignOptions &options,
+                                  IPConfig::Properties *properties);
+  static void ParseForeignOption(const std::string &option,
+                                 IPConfig::Properties *properties);
 
   void InitOptions(std::vector<std::string> *options, Error *error);