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