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