123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- // 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/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);
- FdWatchController(const FdWatchController&) = delete;
- FdWatchController& operator=(const FdWatchController&) = delete;
- // 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;
- };
- MessagePumpIOSForIO();
- MessagePumpIOSForIO(const MessagePumpIOSForIO&) = delete;
- MessagePumpIOSForIO& operator=(const MessagePumpIOSForIO&) = delete;
- ~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_;
- };
- } // namespace base
- #endif // BASE_MESSAGE_LOOP_MESSAGE_PUMP_IO_IOS_H_
|