void ParamTraits<MagicGrallocBufferHandle>::Write(Message* aMsg, const paramType& aParam) { #if ANDROID_VERSION >= 19 sp<GraphicBuffer> flattenable = aParam.mGraphicBuffer; #else Flattenable *flattenable = aParam.mGraphicBuffer.get(); #endif size_t nbytes = flattenable->getFlattenedSize(); size_t nfds = flattenable->getFdCount(); char data[nbytes]; int fds[nfds]; #if ANDROID_VERSION >= 19 // Make a copy of "data" and "fds" for flatten() to avoid casting problem void *pdata = (void *)data; int *pfds = fds; flattenable->flatten(pdata, nbytes, pfds, nfds); // In Kitkat, flatten() will change the value of nbytes and nfds, which dues // to multiple parcelable object consumption. The actual size and fd count // which returned by getFlattenedSize() and getFdCount() are not changed. // So we change nbytes and nfds back by call corresponding calls. nbytes = flattenable->getFlattenedSize(); nfds = flattenable->getFdCount(); #else flattenable->flatten(data, nbytes, fds, nfds); #endif aMsg->WriteInt(aParam.mRef.mOwner); aMsg->WriteInt64(aParam.mRef.mKey); aMsg->WriteSize(nbytes); aMsg->WriteSize(nfds); aMsg->WriteBytes(data, nbytes); for (size_t n = 0; n < nfds; ++n) { // These buffers can't die in transit because they're created // synchonously and the parent-side buffer can only be dropped if // there's a crash. aMsg->WriteFileDescriptor(FileDescriptor(fds[n], false)); } }
void ParamTraits<MagicGrallocBufferHandle>::Write(Message* aMsg, const paramType& aParam) { Flattenable *flattenable = aParam.mGraphicBuffer.get(); size_t nbytes = flattenable->getFlattenedSize(); size_t nfds = flattenable->getFdCount(); char data[nbytes]; int fds[nfds]; flattenable->flatten(data, nbytes, fds, nfds); aMsg->WriteSize(nbytes); aMsg->WriteSize(nfds); aMsg->WriteBytes(data, nbytes); for (size_t n = 0; n < nfds; ++n) { // These buffers can't die in transit because they're created // synchonously and the parent-side buffer can only be dropped if // there's a crash. aMsg->WriteFileDescriptor(FileDescriptor(fds[n], false)); } }