[shill] Add support for weird Cellular.SimLockStatus property

SimLockStatus is bizarre in that its type is a dictionary that maps
names to values of different types.  It's { string:string,
string:uint32 }, which doesn't fit nicely into dbus-c++, because you
can't represent it trivially with an STL container -- and therefore I
have to do something special to convert it.

BUG=chromium-os:17281
TEST=unit tests
STATUS=Verified

Change-Id: I9c4e43f75c666570caae66e04293bce6207a1b99
Reviewed-on: http://gerrit.chromium.org/gerrit/3619
Reviewed-by: Chris Masone <cmasone@chromium.org>
Tested-by: Chris Masone <cmasone@chromium.org>
diff --git a/property_store.h b/property_store.h
index fdea66a..c452d79 100644
--- a/property_store.h
+++ b/property_store.h
@@ -74,6 +74,8 @@
   PropertyConstIterator<int32> GetInt32PropertiesIter();
   PropertyConstIterator<std::string> GetStringPropertiesIter();
   PropertyConstIterator<Stringmap> GetStringmapPropertiesIter();
+  PropertyConstIterator<Stringmaps> GetStringmapsPropertiesIter();
+  PropertyConstIterator<StrIntPair> GetStrIntPairPropertiesIter();
   PropertyConstIterator<Strings> GetStringsPropertiesIter();
   PropertyConstIterator<uint8> GetUint8PropertiesIter();
   PropertyConstIterator<uint16> GetUint16PropertiesIter();
@@ -90,6 +92,8 @@
   void RegisterStringmap(const std::string &name, Stringmap *prop);
   void RegisterConstStringmap(const std::string &name, const Stringmap *prop);
   void RegisterStrings(const std::string &name, Strings *prop);
+  void RegisterConstStrings(const std::string &name, const Strings *prop);
+  void RegisterUint8(const std::string &name, uint8 *prop);
   void RegisterConstUint8(const std::string &name, const uint8 *prop);
   void RegisterUint16(const std::string &name, uint16 *prop);
   void RegisterConstUint16(const std::string &name, const uint16 *prop);
@@ -98,8 +102,12 @@
                            const BoolAccessor &accessor);
   void RegisterDerivedString(const std::string &name,
                              const StringAccessor &accessor);
+  void RegisterDerivedStringmaps(const std::string &name,
+                                 const StringmapsAccessor &accessor);
   void RegisterDerivedStrings(const std::string &name,
                               const StringsAccessor &accessor);
+  void RegisterDerivedStrIntPair(const std::string &name,
+                                 const StrIntPairAccessor &accessor);
 
  private:
   // These are std::maps instead of something cooler because the common
@@ -109,7 +117,9 @@
   std::map<std::string, Int32Accessor> int32_properties_;
   std::map<std::string, StringAccessor> string_properties_;
   std::map<std::string, StringmapAccessor> stringmap_properties_;
+  std::map<std::string, StringmapsAccessor> stringmaps_properties_;
   std::map<std::string, StringsAccessor> strings_properties_;
+  std::map<std::string, StrIntPairAccessor> strintpair_properties_;
   std::map<std::string, Uint8Accessor> uint8_properties_;
   std::map<std::string, Uint16Accessor> uint16_properties_;
   std::map<std::string, Uint32Accessor> uint32_properties_;