105debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian/*
205debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian * Copyright (C) 2010 The Android Open Source Project
305debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian *
405debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian * Licensed under the Apache License, Version 2.0 (the "License");
505debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian * you may not use this file except in compliance with the License.
605debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian * You may obtain a copy of the License at
705debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian *
805debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian *      http://www.apache.org/licenses/LICENSE-2.0
905debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian *
1005debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian * Unless required by applicable law or agreed to in writing, software
1105debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian * distributed under the License is distributed on an "AS IS" BASIS,
1205debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1305debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian * See the License for the specific language governing permissions and
1405debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian * limitations under the License.
1505debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian */
1605debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian
1705debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian#define LOG_TAG "Surface"
1805debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian
1905debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian#include <gui/view/Surface.h>
2005debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian
2105debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian#include <binder/Parcel.h>
2205debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian
2305debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian#include <utils/Log.h>
2405debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian
2505debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian#include <gui/IGraphicBufferProducer.h>
2605debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian
2705debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopiannamespace android {
2805debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopiannamespace view {
2905debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian
3005debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopianstatus_t Surface::writeToParcel(Parcel* parcel) const {
3105debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian    return writeToParcel(parcel, false);
3205debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian}
3305debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian
3405debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopianstatus_t Surface::writeToParcel(Parcel* parcel, bool nameAlreadyWritten) const {
3505debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian    if (parcel == nullptr) return BAD_VALUE;
3605debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian
3705debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian    status_t res = OK;
3805debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian
3905debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian    if (!nameAlreadyWritten) {
4005debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian        res = parcel->writeString16(name);
4105debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian        if (res != OK) return res;
4205debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian
4305debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian        /* isSingleBuffered defaults to no */
4405debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian        res = parcel->writeInt32(0);
4505debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian        if (res != OK) return res;
4605debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian    }
4705debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian
4805debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian    res = parcel->writeStrongBinder(
4905debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian            IGraphicBufferProducer::asBinder(graphicBufferProducer));
5005debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian
5105debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian    return res;
5205debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian}
5305debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian
5405debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopianstatus_t Surface::readFromParcel(const Parcel* parcel) {
5505debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian    return readFromParcel(parcel, false);
5605debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian}
5705debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian
5805debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopianstatus_t Surface::readFromParcel(const Parcel* parcel, bool nameAlreadyRead) {
5905debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian    if (parcel == nullptr) return BAD_VALUE;
6005debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian
6105debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian    status_t res = OK;
6205debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian    if (!nameAlreadyRead) {
6305debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian        name = readMaybeEmptyString16(parcel);
6405debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian        // Discard this for now
6505debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian        int isSingleBuffered;
6605debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian        res = parcel->readInt32(&isSingleBuffered);
6705debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian        if (res != OK) {
6805debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian            ALOGE("Can't read isSingleBuffered");
6905debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian            return res;
7005debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian        }
7105debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian    }
7205debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian
7305debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian    sp<IBinder> binder;
7405debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian
7505debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian    res = parcel->readNullableStrongBinder(&binder);
7605debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian    if (res != OK) {
7705debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian        ALOGE("%s: Can't read strong binder", __FUNCTION__);
7805debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian        return res;
7905debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian    }
8005debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian
8105debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian    graphicBufferProducer = interface_cast<IGraphicBufferProducer>(binder);
8205debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian
8305debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian    return OK;
8405debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian}
8505debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian
8605debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias AgopianString16 Surface::readMaybeEmptyString16(const Parcel* parcel) {
8705debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian    size_t len;
8805debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian    const char16_t* str = parcel->readString16Inplace(&len);
8905debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian    if (str != nullptr) {
9005debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian        return String16(str, len);
9105debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian    } else {
9205debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian        return String16();
9305debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian    }
9405debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian}
9505debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian
9605debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian} // namespace view
9705debe1d787b7471c2bc9c8f7569a338ca5c7ad4Mathias Agopian} // namespace android
98