16b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen/*
26b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen * Copyright (C) 2010 The Android Open Source Project
36b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen *
46b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen * Licensed under the Apache License, Version 2.0 (the "License");
56b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen * you may not use this file except in compliance with the License.
66b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen * You may obtain a copy of the License at
76b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen *
86b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen *      http://www.apache.org/licenses/LICENSE-2.0
96b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen *
106b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen * Unless required by applicable law or agreed to in writing, software
116b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen * distributed under the License is distributed on an "AS IS" BASIS,
126b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen * See the License for the specific language governing permissions and
146b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen * limitations under the License.
156b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen */
166b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen
176b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen#include "Utils.h"
186b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen#include "SkUtils.h"
193449789b9ca58fee7e5cd02ff89d544f4a6bc9b5Leon Scroggins III#include "SkData.h"
206b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen
216b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chenusing namespace android;
226b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen
23c2d39573ca95994d9a44db8aea4887a67f84e5acBen WagnerAssetStreamAdaptor::AssetStreamAdaptor(Asset* asset)
24b9c58ab617c257dbece105167b21e94faad67320Leon Scroggins III    : fAsset(asset)
25b9c58ab617c257dbece105167b21e94faad67320Leon Scroggins III{
26b9c58ab617c257dbece105167b21e94faad67320Leon Scroggins III}
27b9c58ab617c257dbece105167b21e94faad67320Leon Scroggins III
286b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chenbool AssetStreamAdaptor::rewind() {
29ddb76c4644756b31be948d70aaa8ee541dd94999Kenny Root    off64_t pos = fAsset->seek(0, SEEK_SET);
30ddb76c4644756b31be948d70aaa8ee541dd94999Kenny Root    if (pos == (off64_t)-1) {
316b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen        SkDebugf("----- fAsset->seek(rewind) failed\n");
326b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen        return false;
336b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen    }
346b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen    return true;
356b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen}
366b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen
37ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins IIIsize_t AssetStreamAdaptor::getLength() const {
38ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III    return fAsset->getLength();
39ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III}
40ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III
41ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins IIIbool AssetStreamAdaptor::isAtEnd() const {
42ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III    return fAsset->getRemainingLength() == 0;
43ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III}
44ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III
45be896edb209e5fd99fb8f00977c2da8f24ffa067Mike ReedSkStreamRewindable* AssetStreamAdaptor::onDuplicate() const {
46ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III    // Cannot create a duplicate, since each AssetStreamAdaptor
47ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III    // would be modifying the Asset.
48ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III    //return new AssetStreamAdaptor(fAsset);
49ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III    return NULL;
50ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III}
51ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III
520492eefece5ba2bb1d9ab5b3af7e350fd50343e9Leon Scroggins IIIbool AssetStreamAdaptor::hasPosition() const {
530492eefece5ba2bb1d9ab5b3af7e350fd50343e9Leon Scroggins III    return fAsset->seek(0, SEEK_CUR) != -1;
540492eefece5ba2bb1d9ab5b3af7e350fd50343e9Leon Scroggins III}
550492eefece5ba2bb1d9ab5b3af7e350fd50343e9Leon Scroggins III
560492eefece5ba2bb1d9ab5b3af7e350fd50343e9Leon Scroggins IIIsize_t AssetStreamAdaptor::getPosition() const {
570492eefece5ba2bb1d9ab5b3af7e350fd50343e9Leon Scroggins III    const off64_t offset = fAsset->seek(0, SEEK_CUR);
580492eefece5ba2bb1d9ab5b3af7e350fd50343e9Leon Scroggins III    if (offset == -1) {
590492eefece5ba2bb1d9ab5b3af7e350fd50343e9Leon Scroggins III        SkDebugf("---- fAsset->seek(0, SEEK_CUR) failed\n");
600492eefece5ba2bb1d9ab5b3af7e350fd50343e9Leon Scroggins III        return 0;
610492eefece5ba2bb1d9ab5b3af7e350fd50343e9Leon Scroggins III    }
620492eefece5ba2bb1d9ab5b3af7e350fd50343e9Leon Scroggins III
630492eefece5ba2bb1d9ab5b3af7e350fd50343e9Leon Scroggins III    return offset;
640492eefece5ba2bb1d9ab5b3af7e350fd50343e9Leon Scroggins III}
650492eefece5ba2bb1d9ab5b3af7e350fd50343e9Leon Scroggins III
660492eefece5ba2bb1d9ab5b3af7e350fd50343e9Leon Scroggins IIIbool AssetStreamAdaptor::seek(size_t position) {
670492eefece5ba2bb1d9ab5b3af7e350fd50343e9Leon Scroggins III    if (fAsset->seek(position, SEEK_SET) == -1) {
680492eefece5ba2bb1d9ab5b3af7e350fd50343e9Leon Scroggins III        SkDebugf("---- fAsset->seek(0, SEEK_SET) failed\n");
690492eefece5ba2bb1d9ab5b3af7e350fd50343e9Leon Scroggins III        return false;
700492eefece5ba2bb1d9ab5b3af7e350fd50343e9Leon Scroggins III    }
710492eefece5ba2bb1d9ab5b3af7e350fd50343e9Leon Scroggins III
720492eefece5ba2bb1d9ab5b3af7e350fd50343e9Leon Scroggins III    return true;
730492eefece5ba2bb1d9ab5b3af7e350fd50343e9Leon Scroggins III}
740492eefece5ba2bb1d9ab5b3af7e350fd50343e9Leon Scroggins III
750492eefece5ba2bb1d9ab5b3af7e350fd50343e9Leon Scroggins IIIbool AssetStreamAdaptor::move(long offset) {
760492eefece5ba2bb1d9ab5b3af7e350fd50343e9Leon Scroggins III    if (fAsset->seek(offset, SEEK_CUR) == -1) {
770492eefece5ba2bb1d9ab5b3af7e350fd50343e9Leon Scroggins III        SkDebugf("---- fAsset->seek(%i, SEEK_CUR) failed\n", offset);
780492eefece5ba2bb1d9ab5b3af7e350fd50343e9Leon Scroggins III        return false;
790492eefece5ba2bb1d9ab5b3af7e350fd50343e9Leon Scroggins III    }
800492eefece5ba2bb1d9ab5b3af7e350fd50343e9Leon Scroggins III
810492eefece5ba2bb1d9ab5b3af7e350fd50343e9Leon Scroggins III    return true;
820492eefece5ba2bb1d9ab5b3af7e350fd50343e9Leon Scroggins III}
830492eefece5ba2bb1d9ab5b3af7e350fd50343e9Leon Scroggins III
846b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chensize_t AssetStreamAdaptor::read(void* buffer, size_t size) {
856b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen    ssize_t amount;
866b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen
876b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen    if (NULL == buffer) {
88ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III        if (0 == size) {
89ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III            return 0;
906b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen        }
916b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen        // asset->seek returns new total offset
926b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen        // we want to return amount that was skipped
936b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen
94ddb76c4644756b31be948d70aaa8ee541dd94999Kenny Root        off64_t oldOffset = fAsset->seek(0, SEEK_CUR);
956b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen        if (-1 == oldOffset) {
966b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen            SkDebugf("---- fAsset->seek(oldOffset) failed\n");
976b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen            return 0;
986b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen        }
99ddb76c4644756b31be948d70aaa8ee541dd94999Kenny Root        off64_t newOffset = fAsset->seek(size, SEEK_CUR);
1006b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen        if (-1 == newOffset) {
1016b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen            SkDebugf("---- fAsset->seek(%d) failed\n", size);
1026b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen            return 0;
1036b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen        }
1046b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen        amount = newOffset - oldOffset;
1056b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen    } else {
1066b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen        amount = fAsset->read(buffer, size);
1076b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen    }
1086b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen
1096b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen    if (amount < 0) {
1106b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen        amount = 0;
1116b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen    }
1126b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen    return amount;
1136b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen}
1146b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen
115ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins IIISkMemoryStream* android::CopyAssetToStream(Asset* asset) {
116ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III    if (NULL == asset) {
117ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III        return NULL;
118ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III    }
119ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III
1203449789b9ca58fee7e5cd02ff89d544f4a6bc9b5Leon Scroggins III    const off64_t seekReturnVal = asset->seek(0, SEEK_SET);
1213449789b9ca58fee7e5cd02ff89d544f4a6bc9b5Leon Scroggins III    if ((off64_t)-1 == seekReturnVal) {
122ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III        SkDebugf("---- copyAsset: asset rewind failed\n");
123ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III        return NULL;
124ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III    }
125ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III
1263449789b9ca58fee7e5cd02ff89d544f4a6bc9b5Leon Scroggins III    const off64_t size = asset->getLength();
127ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III    if (size <= 0) {
128ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III        SkDebugf("---- copyAsset: asset->getLength() returned %d\n", size);
129ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III        return NULL;
130ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III    }
131ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III
132d8b5c31904d9f6d1eabaa0b8417a25342407e382Ben Wagner    sk_sp<SkData> data(SkData::MakeUninitialized(size));
1333449789b9ca58fee7e5cd02ff89d544f4a6bc9b5Leon Scroggins III    const off64_t len = asset->read(data->writable_data(), size);
134ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III    if (len != size) {
135ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III        SkDebugf("---- copyAsset: asset->read(%d) returned %d\n", size, len);
1363449789b9ca58fee7e5cd02ff89d544f4a6bc9b5Leon Scroggins III        return NULL;
137ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III    }
1383449789b9ca58fee7e5cd02ff89d544f4a6bc9b5Leon Scroggins III
139d8b5c31904d9f6d1eabaa0b8417a25342407e382Ben Wagner    return new SkMemoryStream(std::move(data));
140ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III}
141ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III
1426b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chenjobject android::nullObjectReturn(const char msg[]) {
1436b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen    if (msg) {
1446b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen        SkDebugf("--- %s\n", msg);
1456b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen    }
1466b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen    return NULL;
1476b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen}
148c1d7b7f71ce1a55548d7e8bb32d728190e2ffd47Yujie Qin
149c1d7b7f71ce1a55548d7e8bb32d728190e2ffd47Yujie Qinbool android::isSeekable(int descriptor) {
150c1d7b7f71ce1a55548d7e8bb32d728190e2ffd47Yujie Qin    return ::lseek64(descriptor, 0, SEEK_CUR) != -1;
151c1d7b7f71ce1a55548d7e8bb32d728190e2ffd47Yujie Qin}
152127d31a6842b6cca49885c3607e7ea35b1885b6fLeon Scroggins III
153127d31a6842b6cca49885c3607e7ea35b1885b6fLeon Scroggins IIIJNIEnv* android::get_env_or_die(JavaVM* jvm) {
154127d31a6842b6cca49885c3607e7ea35b1885b6fLeon Scroggins III    JNIEnv* env;
155127d31a6842b6cca49885c3607e7ea35b1885b6fLeon Scroggins III    if (jvm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
156127d31a6842b6cca49885c3607e7ea35b1885b6fLeon Scroggins III        LOG_ALWAYS_FATAL("Failed to get JNIEnv for JavaVM: %p", jvm);
157127d31a6842b6cca49885c3607e7ea35b1885b6fLeon Scroggins III    }
158127d31a6842b6cca49885c3607e7ea35b1885b6fLeon Scroggins III    return env;
159127d31a6842b6cca49885c3607e7ea35b1885b6fLeon Scroggins III}
160