| // Copyright 2012 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. |
| |
| #ifndef BASE_MESSAGE_LOOP_MESSAGE_PUMP_IO_IOS_H_ |
| #define BASE_MESSAGE_LOOP_MESSAGE_PUMP_IO_IOS_H_ |
| |
| #include "base/base_export.h" |
| #include "base/mac/scoped_cffiledescriptorref.h" |
| #include "base/mac/scoped_cftyperef.h" |
| #include "base/macros.h" |
| #include "base/memory/ref_counted.h" |
| #include "base/memory/weak_ptr.h" |
| #include "base/message_loop/message_pump_mac.h" |
| #include "base/message_loop/watchable_io_message_pump_posix.h" |
| #include "base/threading/thread_checker.h" |
| |
| namespace base { |
| |
| // This file introduces a class to monitor sockets and issue callbacks when |
| // sockets are ready for I/O on iOS. |
| class BASE_EXPORT MessagePumpIOSForIO : public MessagePumpNSRunLoop, |
| public WatchableIOMessagePumpPosix { |
| public: |
| class FdWatchController : public FdWatchControllerInterface { |
| public: |
| explicit FdWatchController(const Location& from_here); |
| |
| // Implicitly calls StopWatchingFileDescriptor. |
| ~FdWatchController() override; |
| |
| // FdWatchControllerInterface: |
| bool StopWatchingFileDescriptor() override; |
| |
| private: |
| friend class MessagePumpIOSForIO; |
| friend class MessagePumpIOSForIOTest; |
| |
| // Called by MessagePumpIOSForIO, ownership of |fdref| and |fd_source| |
| // is transferred to this object. |
| void Init(CFFileDescriptorRef fdref, |
| CFOptionFlags callback_types, |
| CFRunLoopSourceRef fd_source, |
| bool is_persistent); |
| |
| void set_pump(base::WeakPtr<MessagePumpIOSForIO> pump) { pump_ = pump; } |
| const base::WeakPtr<MessagePumpIOSForIO>& pump() const { return pump_; } |
| |
| void set_watcher(FdWatcher* watcher) { watcher_ = watcher; } |
| |
| void OnFileCanReadWithoutBlocking(int fd, MessagePumpIOSForIO* pump); |
| void OnFileCanWriteWithoutBlocking(int fd, MessagePumpIOSForIO* pump); |
| |
| bool is_persistent_ = false; // false if this event is one-shot. |
| base::mac::ScopedCFFileDescriptorRef fdref_; |
| CFOptionFlags callback_types_ = 0; |
| base::ScopedCFTypeRef<CFRunLoopSourceRef> fd_source_; |
| base::WeakPtr<MessagePumpIOSForIO> pump_; |
| FdWatcher* watcher_ = nullptr; |
| |
| DISALLOW_COPY_AND_ASSIGN(FdWatchController); |
| }; |
| |
| MessagePumpIOSForIO(); |
| ~MessagePumpIOSForIO() override; |
| |
| bool WatchFileDescriptor(int fd, |
| bool persistent, |
| int mode, |
| FdWatchController* controller, |
| FdWatcher* delegate); |
| |
| void RemoveRunLoopSource(CFRunLoopSourceRef source); |
| |
| private: |
| friend class MessagePumpIOSForIOTest; |
| |
| static void HandleFdIOEvent(CFFileDescriptorRef fdref, |
| CFOptionFlags callback_types, |
| void* context); |
| |
| ThreadChecker watch_file_descriptor_caller_checker_; |
| |
| base::WeakPtrFactory<MessagePumpIOSForIO> weak_factory_; |
| |
| DISALLOW_COPY_AND_ASSIGN(MessagePumpIOSForIO); |
| }; |
| |
| } // namespace base |
| |
| #endif // BASE_MESSAGE_LOOP_MESSAGE_PUMP_IO_IOS_H_ |