nsresult
RegisterBluetoothEventHandler(const nsCString& aNodeName,
                              BluetoothEventObserver* aHandler)
{
  MOZ_ASSERT(NS_IsMainThread());
  BluetoothEventObserverList *ol;

  NS_ENSURE_TRUE(sBluetoothEventObserverTable, NS_ERROR_FAILURE);
  if (!sBluetoothEventObserverTable->Get(aNodeName, &ol)) {
    sBluetoothEventObserverTable->Put(aNodeName,
                                      new BluetoothEventObserverList());
  }
  sBluetoothEventObserverTable->Get(aNodeName, &ol);
  ol->AddObserver(aHandler);
  return NS_OK;
}
nsresult
UnregisterBluetoothEventHandler(const nsCString& aNodeName,
                                BluetoothEventObserver* aHandler)
{
  MOZ_ASSERT(NS_IsMainThread());
  BluetoothEventObserverList *ol;

  NS_ENSURE_TRUE(sBluetoothEventObserverTable, NS_ERROR_FAILURE);
  if (!sBluetoothEventObserverTable->Get(aNodeName, &ol)) {
    NS_WARNING("Node does not exist to remove BluetoothEventListener from!");
    return NS_ERROR_FAILURE;
  }
  sBluetoothEventObserverTable->Get(aNodeName, &ol);  
  ol->RemoveObserver(aHandler);
  if (ol->Length() == 0) {
    sBluetoothEventObserverTable->Remove(aNodeName);
  }
  return NS_OK;
}
 NS_IMETHOD Run()
 {
   if (dbus_message_get_path(mMsg.get()) == NULL) {
     return NS_OK;
   }    
   MOZ_ASSERT(NS_IsMainThread());
   
   // Notify observers that a message has been sent
   nsDependentCString path(dbus_message_get_path(mMsg.get()));
   nsDependentCString member(dbus_message_get_member(mMsg.get()));
   BluetoothEventObserverList *ol;
   if (!sBluetoothEventObserverTable->Get(path, &ol)) {
     LOG("No objects registered for %s, returning\n",
         dbus_message_get_path(mMsg.get()));
     return NS_OK;
   }
   BluetoothEvent e;
   e.mEventName = member;
   ol->Broadcast(e);
   return NS_OK;
 }