summaryrefslogtreecommitdiffstats
path: root/chrome/common/mach_message_source_mac.cc
diff options
context:
space:
mode:
authorjeremy@chromium.org <jeremy@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2008-11-24 21:37:13 +0000
committerjeremy@chromium.org <jeremy@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2008-11-24 21:37:13 +0000
commit37eedd8a6922e9810fd35df3a609126edf1c7a05 (patch)
tree26ee21747afcf74a4e03d9f2865769e7f4b7dff1 /chrome/common/mach_message_source_mac.cc
parent22bb1a47a2fa1510c525c7dfe8c8d14058a337ba (diff)
downloadchromium_src-37eedd8a6922e9810fd35df3a609126edf1c7a05.zip
chromium_src-37eedd8a6922e9810fd35df3a609126edf1c7a05.tar.gz
chromium_src-37eedd8a6922e9810fd35df3a609126edf1c7a05.tar.bz2
Add class to encapsulate a CF Mach Message Source and handle it's liftime.
This class handles adding a listener on Mach port to the current CFRunloop and calling a delegate when a message is received on that port. Review URL: http://codereview.chromium.org/11331 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@5936 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/common/mach_message_source_mac.cc')
-rw-r--r--chrome/common/mach_message_source_mac.cc66
1 files changed, 66 insertions, 0 deletions
diff --git a/chrome/common/mach_message_source_mac.cc b/chrome/common/mach_message_source_mac.cc
new file mode 100644
index 0000000..1249d8a
--- /dev/null
+++ b/chrome/common/mach_message_source_mac.cc
@@ -0,0 +1,66 @@
+// Copyright (c) 2008 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/common/mach_message_source_mac.h"
+
+#include "base/logging.h"
+
+MachMessageSource::MachMessageSource(mach_port_t port,
+ MachPortListener* msg_listener,
+ bool* success) {
+ DCHECK(msg_listener);
+ DCHECK(success);
+ DCHECK(port != MACH_PORT_NULL);
+
+ CFMachPortContext port_context = {0};
+ port_context.info = msg_listener;
+
+ scoped_cftyperef<CFMachPortRef> cf_mach_port_ref(
+ CFMachPortCreateWithPort(kCFAllocatorDefault,
+ port,
+ MachMessageSource::OnReceiveMachMessage,
+ &port_context,
+ NULL));
+
+ if (cf_mach_port_ref.get() == NULL) {
+ LOG(WARNING) << "CFMachPortCreate failed";
+ *success = false;
+ return;
+ }
+
+ // Create a RL source.
+ machport_runloop_ref_.reset(
+ CFMachPortCreateRunLoopSource(kCFAllocatorDefault,
+ cf_mach_port_ref.get(),
+ 0));
+
+ if (machport_runloop_ref_.get() == NULL) {
+ LOG(WARNING) << "CFMachPortCreateRunLoopSource failed";
+ *success = false;
+ return;
+ }
+
+ CFRunLoopAddSource(CFRunLoopGetCurrent(),
+ machport_runloop_ref_.get(),
+ kCFRunLoopCommonModes);
+ *success = true;
+}
+
+MachMessageSource::~MachMessageSource() {
+ CFRunLoopRemoveSource(CFRunLoopGetCurrent(),
+ machport_runloop_ref_.get(),
+ kCFRunLoopCommonModes);
+}
+
+// static
+void MachMessageSource::OnReceiveMachMessage(CFMachPortRef port, void* msg,
+ CFIndex size, void* closure) {
+ MachPortListener *msg_listener = static_cast<MachPortListener*>(closure);
+ size_t msg_size = (size < 0) ? 0 : static_cast<size_t>(size);
+ DCHECK(msg && msg_size > 0); // this should never happen!
+
+ if (msg_listener && msg && msg_size > 0) {
+ msg_listener->OnMachMessageReceived(msg, msg_size);
+ }
+}