shill: Delay cellular device creation if DeviceInfo is not available yet.

DeviceInfo notifies ModemInfo/ModemManager/Modem whenever a new cellular device
link is added so that cellular devices can be constructed and registered. This
fixes the current behavior where the device is not created at all if its device
info is not available yet.

BUG=chromium-os:24855
TEST=tested on device

Change-Id: I929bd70a6692a9ec6c66f51e01e44fca4433eb87
Reviewed-on: https://gerrit.chromium.org/gerrit/13866
Tested-by: Darin Petkov <petkov@chromium.org>
Reviewed-by: Paul Stewart <pstew@chromium.org>
Reviewed-by: Eric Shienbrood <ers@chromium.org>
Commit-Ready: Darin Petkov <petkov@chromium.org>
diff --git a/modem.h b/modem.h
index 725b41b..654b649 100644
--- a/modem.h
+++ b/modem.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
+// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
@@ -44,12 +44,14 @@
   // Cellular device.
   void Init();
 
+  void OnDeviceInfoAvailable(const std::string &link_name);
+
  private:
   friend class ModemManagerTest;
   friend class ModemTest;
   FRIEND_TEST(ModemManagerTest, Connect);
   FRIEND_TEST(ModemManagerTest, AddRemoveModem);
-  FRIEND_TEST(ModemTest, CreateCellularDevice);
+  FRIEND_TEST(ModemTest, CreateDeviceFromProperties);
   FRIEND_TEST(ModemTest, Init);
 
   static const char kPropertyLinkName[];
@@ -62,7 +64,8 @@
   // Creates and registers a Cellular device in |device_| based on
   // ModemManager.Modem's |properties|. The device may not be created if the
   // properties are invalid.
-  void CreateCellularDevice(const DBusPropertiesMap &properties);
+  void CreateDeviceFromProperties(const DBusPropertiesMap &properties);
+  void CreateDevice();
 
   // Signal callbacks inherited from DBusPropertiesProxyDelegate.
   virtual void OnDBusPropertiesChanged(
@@ -90,6 +93,8 @@
   EventDispatcher *dispatcher_;
   Manager *manager_;
   mobile_provider_db *provider_db_;
+  std::string link_name_;
+  bool pending_device_info_;
 
   DISALLOW_COPY_AND_ASSIGN(Modem);
 };