BitTube.cpp revision 589ce85ee4174829cfedce91b6b2509d2a4002eb
1589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian/* 2589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * Copyright (C) 2010 The Android Open Source Project 3589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * 4589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * Licensed under the Apache License, Version 2.0 (the "License"); 5589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * you may not use this file except in compliance with the License. 6589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * You may obtain a copy of the License at 7589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * 8589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * http://www.apache.org/licenses/LICENSE-2.0 9589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * 10589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * Unless required by applicable law or agreed to in writing, software 11589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * distributed under the License is distributed on an "AS IS" BASIS, 12589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * See the License for the specific language governing permissions and 14589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * limitations under the License. 15589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian */ 16589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 17589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <stdint.h> 18589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <sys/types.h> 19589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 20589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <unistd.h> 21589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <fcntl.h> 22589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 23589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <utils/Errors.h> 24589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 25589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <binder/Parcel.h> 26589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 27589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <gui/SensorChannel.h> 28589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 29589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopiannamespace android { 30589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian// ---------------------------------------------------------------------------- 31589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 32589ce85ee4174829cfedce91b6b2509d2a4002ebMathias AgopianSensorChannel::SensorChannel() 33589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian : mSendFd(-1), mReceiveFd(-1) 34589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{ 35589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian int fds[2]; 36589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian if (pipe(fds) == 0) { 37589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian mReceiveFd = fds[0]; 38589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian mSendFd = fds[1]; 39589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian fcntl(mReceiveFd, F_SETFL, O_NONBLOCK); 40589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian fcntl(mSendFd, F_SETFL, O_NONBLOCK); 41589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian } 42589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 43589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 44589ce85ee4174829cfedce91b6b2509d2a4002ebMathias AgopianSensorChannel::SensorChannel(const Parcel& data) 45589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian : mSendFd(-1), mReceiveFd(-1) 46589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{ 47589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian mReceiveFd = dup(data.readFileDescriptor()); 48589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian fcntl(mReceiveFd, F_SETFL, O_NONBLOCK); 49589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 50589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 51589ce85ee4174829cfedce91b6b2509d2a4002ebMathias AgopianSensorChannel::~SensorChannel() 52589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{ 53589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian if (mSendFd >= 0) 54589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian close(mSendFd); 55589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 56589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian if (mReceiveFd >= 0) 57589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian close(mReceiveFd); 58589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 59589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 60589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianint SensorChannel::getFd() const 61589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{ 62589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return mReceiveFd; 63589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 64589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 65589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianssize_t SensorChannel::write(void const* vaddr, size_t size) 66589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{ 67589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian ssize_t len = ::write(mSendFd, vaddr, size); 68589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian if (len < 0) 69589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return -errno; 70589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return len; 71589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 72589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 73589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianssize_t SensorChannel::read(void* vaddr, size_t size) 74589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{ 75589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian ssize_t len = ::read(mReceiveFd, vaddr, size); 76589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian if (len < 0) 77589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return -errno; 78589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return len; 79589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 80589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 81589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianstatus_t SensorChannel::writeToParcel(Parcel* reply) const 82589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{ 83589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian if (mReceiveFd < 0) 84589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return -EINVAL; 85589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 86589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian status_t result = reply->writeDupFileDescriptor(mReceiveFd); 87589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian close(mReceiveFd); 88589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian mReceiveFd = -1; 89589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian return result; 90589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 91589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 92589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian// ---------------------------------------------------------------------------- 93589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}; // namespace android 94