12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- // 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_
|