Home | History | Annotate | Download | only in net
      1 //
      2 // Copyright (C) 2014 The Android Open Source Project
      3 //
      4 // Licensed under the Apache License, Version 2.0 (the "License");
      5 // you may not use this file except in compliance with the License.
      6 // You may obtain a copy of the License at
      7 //
      8 //      http://www.apache.org/licenses/LICENSE-2.0
      9 //
     10 // Unless required by applicable law or agreed to in writing, software
     11 // distributed under the License is distributed on an "AS IS" BASIS,
     12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 // See the License for the specific language governing permissions and
     14 // limitations under the License.
     15 //
     16 
     17 #include "shill/net/io_ready_handler.h"
     18 
     19 #include <unistd.h>
     20 
     21 #include <base/logging.h>
     22 
     23 namespace shill {
     24 
     25 IOReadyHandler::IOReadyHandler(int fd,
     26                                ReadyMode mode,
     27                                const ReadyCallback& ready_callback)
     28     : fd_(fd),
     29       ready_mode_(mode),
     30       ready_callback_(ready_callback) {}
     31 
     32 IOReadyHandler::~IOReadyHandler() {
     33   Stop();
     34 }
     35 
     36 void IOReadyHandler::Start() {
     37   CHECK(ready_mode_ == kModeOutput || ready_mode_ == kModeInput);
     38   base::MessageLoopForIO::Mode mode;
     39   if (ready_mode_ == kModeOutput) {
     40     mode = base::MessageLoopForIO::WATCH_WRITE;
     41   } else {
     42     mode = base::MessageLoopForIO::WATCH_READ;
     43   }
     44 
     45   if (!base::MessageLoopForIO::current()->WatchFileDescriptor(
     46           fd_, true, mode, &fd_watcher_, this)) {
     47     LOG(ERROR) << "WatchFileDescriptor failed on read";
     48   }
     49 }
     50 
     51 void IOReadyHandler::Stop() {
     52   fd_watcher_.StopWatchingFileDescriptor();
     53 }
     54 
     55 void IOReadyHandler::OnFileCanReadWithoutBlocking(int fd) {
     56   CHECK_EQ(fd_, fd);
     57   CHECK_EQ(ready_mode_, kModeInput);
     58 
     59   ready_callback_.Run(fd_);
     60 }
     61 
     62 void IOReadyHandler::OnFileCanWriteWithoutBlocking(int fd) {
     63   CHECK_EQ(fd_, fd);
     64   CHECK_EQ(ready_mode_, kModeOutput);
     65 
     66   ready_callback_.Run(fd_);
     67 }
     68 
     69 }  // namespace shill
     70