Delay registering D-Bus object until Weave device is started

Otherwise daemons can start updating device state before webserver
notified us of HTTP port numbers and we start the libweave, which
would lead to a crash

Change-Id: I928477078da633def0bd00f165d39dd8b8dfc4c5
diff --git a/buffet/manager.cc b/buffet/manager.cc
index 37cebe5..3fe7a7d 100644
--- a/buffet/manager.cc
+++ b/buffet/manager.cc
@@ -147,8 +147,8 @@
   RestartWeave(sequencer);
 
   dbus_adaptor_.RegisterWithDBusObject(&dbus_object_);
-  dbus_object_.RegisterAsync(
-      sequencer->GetHandler("Manager.RegisterAsync() failed.", true));
+  dbus_registration_handler_ =
+      sequencer->GetHandler("Manager.RegisterAsync() failed.", true);
 }
 
 void Manager::RestartWeave(AsyncEventSequencer* sequencer) {
@@ -214,6 +214,12 @@
   device_->AddPairingChangedCallbacks(
       base::Bind(&Manager::OnPairingStart, weak_ptr_factory_.GetWeakPtr()),
       base::Bind(&Manager::OnPairingEnd, weak_ptr_factory_.GetWeakPtr()));
+
+  auto handler = dbus_registration_handler_;
+  if (handler.is_null())
+    handler = AsyncEventSequencer::GetDefaultCompletionAction();
+  dbus_object_.RegisterAsync(handler);
+  dbus_registration_handler_.Reset();
 }
 
 void Manager::Stop() {
diff --git a/buffet/manager.h b/buffet/manager.h
index 2dc06e8..33a782f 100644
--- a/buffet/manager.h
+++ b/buffet/manager.h
@@ -113,6 +113,7 @@
   std::unique_ptr<WebServClient> web_serv_client_;
   std::unique_ptr<weave::Device> device_;
   std::unique_ptr<DBusCommandDispacher> command_dispatcher_;
+  brillo::dbus_utils::AsyncEventSequencer::Handler dbus_registration_handler_;
 
   base::WeakPtrFactory<Manager> weak_ptr_factory_{this};
   DISALLOW_COPY_AND_ASSIGN(Manager);