OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef DBUS_BUS_H_ | 5 #ifndef DBUS_BUS_H_ |
6 #define DBUS_BUS_H_ | 6 #define DBUS_BUS_H_ |
7 | 7 |
8 #include <dbus/dbus.h> | 8 #include <dbus/dbus.h> |
9 | 9 |
10 #include <map> | 10 #include <map> |
11 #include <set> | 11 #include <set> |
12 #include <string> | 12 #include <string> |
13 #include <utility> | 13 #include <utility> |
14 #include <vector> | |
14 | 15 |
15 #include "base/callback.h" | 16 #include "base/callback.h" |
16 #include "base/memory/ref_counted.h" | 17 #include "base/memory/ref_counted.h" |
17 #include "base/synchronization/waitable_event.h" | 18 #include "base/synchronization/waitable_event.h" |
18 #include "base/threading/platform_thread.h" | 19 #include "base/threading/platform_thread.h" |
19 #include "dbus/dbus_export.h" | 20 #include "dbus/dbus_export.h" |
20 #include "dbus/object_path.h" | 21 #include "dbus/object_path.h" |
21 | 22 |
22 namespace base { | 23 namespace base { |
23 class SequencedTaskRunner; | 24 class SequencedTaskRunner; |
24 class SingleThreadTaskRunner; | 25 class SingleThreadTaskRunner; |
25 class Thread; | |
26 } | 26 } |
27 | 27 |
28 namespace tracked_objects { | 28 namespace tracked_objects { |
29 class Location; | 29 class Location; |
30 } | 30 } |
31 | 31 |
32 namespace dbus { | 32 namespace dbus { |
33 | 33 |
34 class ExportedObject; | 34 class ExportedObject; |
35 class ObjectManager; | 35 class ObjectManager; |
(...skipping 520 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
556 // | 556 // |
557 // BLOCKING CALL. | 557 // BLOCKING CALL. |
558 virtual std::string GetServiceOwnerAndBlock(const std::string& service_name, | 558 virtual std::string GetServiceOwnerAndBlock(const std::string& service_name, |
559 GetServiceOwnerOption options); | 559 GetServiceOwnerOption options); |
560 | 560 |
561 // A non-blocking version of GetServiceOwnerAndBlock(). | 561 // A non-blocking version of GetServiceOwnerAndBlock(). |
562 // Must be called in the origin thread. | 562 // Must be called in the origin thread. |
563 virtual void GetServiceOwner(const std::string& service_name, | 563 virtual void GetServiceOwner(const std::string& service_name, |
564 const GetServiceOwnerCallback& callback); | 564 const GetServiceOwnerCallback& callback); |
565 | 565 |
566 // Whenever the owner for |service_name| changes, run |callback| with the | |
567 // name of the new owner. If the owner goes away, then |callback| receives | |
568 // an empty string. | |
569 // | |
570 // Any unique (service_name, callback) can be used. Duplicate are ignored, | |
571 // and so are empty |service_name|s and null |callback|s. | |
satorux1
2013/06/04 01:09:06
Silently ignoring empty service name and callback
Lei Zhang
2013/06/04 06:15:57
Done.
| |
572 // | |
573 // Must be called in the origin thread. | |
574 virtual void ListenForServiceOwnerChange( | |
575 const std::string& service_name, | |
576 const GetServiceOwnerCallback& callback); | |
577 | |
578 // Stop listening for |service_name| owner changes for |callback|. | |
579 // Any unique (service_name, callback) can be used. Non-registered callbacks | |
580 // for a given service name are ignored, and so are empty |service_name|s and | |
581 // null |callback|s. | |
582 // | |
583 // Must be called in the origin thread. | |
584 virtual void UnlistenForServiceOwnerChange( | |
585 const std::string& service_name, | |
586 const GetServiceOwnerCallback& callback); | |
587 | |
566 // Returns true if the bus is connected to D-Bus. | 588 // Returns true if the bus is connected to D-Bus. |
567 bool is_connected() { return connection_ != NULL; } | 589 bool is_connected() { return connection_ != NULL; } |
568 | 590 |
569 protected: | 591 protected: |
570 // This is protected, so we can define sub classes. | 592 // This is protected, so we can define sub classes. |
571 virtual ~Bus(); | 593 virtual ~Bus(); |
572 | 594 |
573 private: | 595 private: |
574 friend class base::RefCountedThreadSafe<Bus>; | 596 friend class base::RefCountedThreadSafe<Bus>; |
575 | 597 |
576 // Helper function used for RemoveObjectProxy(). | 598 // Helper function used for RemoveObjectProxy(). |
577 void RemoveObjectProxyInternal(scoped_refptr<dbus::ObjectProxy> object_proxy, | 599 void RemoveObjectProxyInternal(scoped_refptr<dbus::ObjectProxy> object_proxy, |
578 const base::Closure& callback); | 600 const base::Closure& callback); |
579 | 601 |
580 // Helper function used for UnregisterExportedObject(). | 602 // Helper function used for UnregisterExportedObject(). |
581 void UnregisterExportedObjectInternal( | 603 void UnregisterExportedObjectInternal( |
582 scoped_refptr<dbus::ExportedObject> exported_object); | 604 scoped_refptr<dbus::ExportedObject> exported_object); |
583 | 605 |
584 // Helper function used for ShutdownOnDBusThreadAndBlock(). | 606 // Helper function used for ShutdownOnDBusThreadAndBlock(). |
585 void ShutdownOnDBusThreadAndBlockInternal(); | 607 void ShutdownOnDBusThreadAndBlockInternal(); |
586 | 608 |
587 // Helper function used for RequestOwnership(). | 609 // Helper function used for RequestOwnership(). |
588 void RequestOwnershipInternal(const std::string& service_name, | 610 void RequestOwnershipInternal(const std::string& service_name, |
589 OnOwnershipCallback on_ownership_callback); | 611 OnOwnershipCallback on_ownership_callback); |
590 | 612 |
591 // Helper function used for GetServiceOwner(). | 613 // Helper function used for GetServiceOwner(). |
592 void GetServiceOwnerInternal(const std::string& service_name, | 614 void GetServiceOwnerInternal(const std::string& service_name, |
593 const GetServiceOwnerCallback& callback); | 615 const GetServiceOwnerCallback& callback); |
594 | 616 |
617 // Helper function used for ListenForServiceOwnerChange(). | |
618 void ListenForServiceOwnerChangeInternal( | |
619 const std::string& service_name, | |
620 const GetServiceOwnerCallback& callback); | |
621 | |
622 // Helper function used for UnListenForServiceOwnerChange(). | |
623 void UnlistenForServiceOwnerChangeInternal( | |
624 const std::string& service_name, | |
625 const GetServiceOwnerCallback& callback); | |
626 | |
595 // Processes the all incoming data to the connection, if any. | 627 // Processes the all incoming data to the connection, if any. |
596 // | 628 // |
597 // BLOCKING CALL. | 629 // BLOCKING CALL. |
598 void ProcessAllIncomingDataIfAny(); | 630 void ProcessAllIncomingDataIfAny(); |
599 | 631 |
600 // Called when a watch object is added. Used to start monitoring the | 632 // Called when a watch object is added. Used to start monitoring the |
601 // file descriptor used for D-Bus communication. | 633 // file descriptor used for D-Bus communication. |
602 dbus_bool_t OnAddWatch(DBusWatch* raw_watch); | 634 dbus_bool_t OnAddWatch(DBusWatch* raw_watch); |
603 | 635 |
604 // Called when a watch object is removed. | 636 // Called when a watch object is removed. |
(...skipping 13 matching lines...) Expand all Loading... | |
618 void OnToggleTimeout(DBusTimeout* raw_timeout); | 650 void OnToggleTimeout(DBusTimeout* raw_timeout); |
619 | 651 |
620 // Called when the dispatch status (i.e. if any incoming data is | 652 // Called when the dispatch status (i.e. if any incoming data is |
621 // available) is changed. | 653 // available) is changed. |
622 void OnDispatchStatusChanged(DBusConnection* connection, | 654 void OnDispatchStatusChanged(DBusConnection* connection, |
623 DBusDispatchStatus status); | 655 DBusDispatchStatus status); |
624 | 656 |
625 // Called when the connection is diconnected. | 657 // Called when the connection is diconnected. |
626 void OnConnectionDisconnected(DBusConnection* connection); | 658 void OnConnectionDisconnected(DBusConnection* connection); |
627 | 659 |
660 // Called when a service owner change occurs. | |
661 DBusHandlerResult OnServiceOwnerChanged(DBusMessage* message); | |
662 | |
628 // Callback helper functions. Redirects to the corresponding member function. | 663 // Callback helper functions. Redirects to the corresponding member function. |
629 static dbus_bool_t OnAddWatchThunk(DBusWatch* raw_watch, void* data); | 664 static dbus_bool_t OnAddWatchThunk(DBusWatch* raw_watch, void* data); |
630 static void OnRemoveWatchThunk(DBusWatch* raw_watch, void* data); | 665 static void OnRemoveWatchThunk(DBusWatch* raw_watch, void* data); |
631 static void OnToggleWatchThunk(DBusWatch* raw_watch, void* data); | 666 static void OnToggleWatchThunk(DBusWatch* raw_watch, void* data); |
632 static dbus_bool_t OnAddTimeoutThunk(DBusTimeout* raw_timeout, void* data); | 667 static dbus_bool_t OnAddTimeoutThunk(DBusTimeout* raw_timeout, void* data); |
633 static void OnRemoveTimeoutThunk(DBusTimeout* raw_timeout, void* data); | 668 static void OnRemoveTimeoutThunk(DBusTimeout* raw_timeout, void* data); |
634 static void OnToggleTimeoutThunk(DBusTimeout* raw_timeout, void* data); | 669 static void OnToggleTimeoutThunk(DBusTimeout* raw_timeout, void* data); |
635 static void OnDispatchStatusChangedThunk(DBusConnection* connection, | 670 static void OnDispatchStatusChangedThunk(DBusConnection* connection, |
636 DBusDispatchStatus status, | 671 DBusDispatchStatus status, |
637 void* data); | 672 void* data); |
638 | 673 |
639 // Calls OnConnectionDisconnected if the Diconnected signal is received. | 674 // Calls OnConnectionDisconnected if the Disconnected signal is received. |
640 static DBusHandlerResult OnConnectionDisconnectedFilter( | 675 static DBusHandlerResult OnConnectionDisconnectedFilter( |
641 DBusConnection* connection, | 676 DBusConnection* connection, |
642 DBusMessage* message, | 677 DBusMessage* message, |
643 void* user_data); | 678 void* user_data); |
644 | 679 |
680 // Calls OnServiceOwnerChanged for a NameOwnerChanged signal. | |
681 static DBusHandlerResult OnServiceOwnerChangedFilter( | |
682 DBusConnection* connection, | |
683 DBusMessage* message, | |
684 void* user_data); | |
685 | |
645 const BusType bus_type_; | 686 const BusType bus_type_; |
646 const ConnectionType connection_type_; | 687 const ConnectionType connection_type_; |
647 scoped_refptr<base::SequencedTaskRunner> dbus_task_runner_; | 688 scoped_refptr<base::SequencedTaskRunner> dbus_task_runner_; |
648 base::WaitableEvent on_shutdown_; | 689 base::WaitableEvent on_shutdown_; |
649 DBusConnection* connection_; | 690 DBusConnection* connection_; |
650 | 691 |
651 scoped_refptr<base::SingleThreadTaskRunner> origin_task_runner_; | 692 scoped_refptr<base::SingleThreadTaskRunner> origin_task_runner_; |
652 base::PlatformThreadId origin_thread_id_; | 693 base::PlatformThreadId origin_thread_id_; |
653 | 694 |
654 std::set<std::string> owned_service_names_; | 695 std::set<std::string> owned_service_names_; |
(...skipping 22 matching lines...) Expand all Loading... | |
677 scoped_refptr<dbus::ExportedObject> > ExportedObjectTable; | 718 scoped_refptr<dbus::ExportedObject> > ExportedObjectTable; |
678 ExportedObjectTable exported_object_table_; | 719 ExportedObjectTable exported_object_table_; |
679 | 720 |
680 // ObjectManagerTable is used to hold the object managers created by the | 721 // ObjectManagerTable is used to hold the object managers created by the |
681 // bus object. Key is a concatenated string of service name + object path, | 722 // bus object. Key is a concatenated string of service name + object path, |
682 // like "org.chromium.TestService/org/chromium/TestObject". | 723 // like "org.chromium.TestService/org/chromium/TestObject". |
683 typedef std::map<std::string, | 724 typedef std::map<std::string, |
684 scoped_refptr<dbus::ObjectManager> > ObjectManagerTable; | 725 scoped_refptr<dbus::ObjectManager> > ObjectManagerTable; |
685 ObjectManagerTable object_manager_table_; | 726 ObjectManagerTable object_manager_table_; |
686 | 727 |
728 // A map of NameOwnerChanged signals to listen for and the callbacks to run | |
729 // on the origin thread when the owner changes. | |
730 // Only accessed on the DBus thread. | |
731 // Key: Service name | |
732 // Value: Vector of callbacks. Unique and expected to be small. Not using | |
733 // std::set here because base::Callbacks don't have a '<' operator. | |
734 typedef std::map<std::string, std::vector<GetServiceOwnerCallback> > | |
735 ServiceOwnerChangedListenerMap; | |
736 ServiceOwnerChangedListenerMap service_owner_changed_listener_map_; | |
737 | |
687 bool async_operations_set_up_; | 738 bool async_operations_set_up_; |
688 bool shutdown_completed_; | 739 bool shutdown_completed_; |
689 | 740 |
690 // Counters to make sure that OnAddWatch()/OnRemoveWatch() and | 741 // Counters to make sure that OnAddWatch()/OnRemoveWatch() and |
691 // OnAddTimeout()/OnRemoveTimeou() are balanced. | 742 // OnAddTimeout()/OnRemoveTimeou() are balanced. |
692 int num_pending_watches_; | 743 int num_pending_watches_; |
693 int num_pending_timeouts_; | 744 int num_pending_timeouts_; |
694 | 745 |
695 std::string address_; | 746 std::string address_; |
696 base::Closure on_disconnected_closure_; | 747 base::Closure on_disconnected_closure_; |
697 | 748 |
698 DISALLOW_COPY_AND_ASSIGN(Bus); | 749 DISALLOW_COPY_AND_ASSIGN(Bus); |
699 }; | 750 }; |
700 | 751 |
701 } // namespace dbus | 752 } // namespace dbus |
702 | 753 |
703 #endif // DBUS_BUS_H_ | 754 #endif // DBUS_BUS_H_ |
OLD | NEW |