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"
196b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen
206b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chenusing namespace android;
216b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen
226b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chenbool AssetStreamAdaptor::rewind() {
23ddb76c4644756b31be948d70aaa8ee541dd94999Kenny Root    off64_t pos = fAsset->seek(0, SEEK_SET);
24ddb76c4644756b31be948d70aaa8ee541dd94999Kenny Root    if (pos == (off64_t)-1) {
256b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen        SkDebugf("----- fAsset->seek(rewind) failed\n");
266b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen        return false;
276b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen    }
286b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen    return true;
296b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen}
306b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen
316b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chensize_t AssetStreamAdaptor::read(void* buffer, size_t size) {
326b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen    ssize_t amount;
336b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen
346b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen    if (NULL == buffer) {
356b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen        if (0 == size) {  // caller is asking us for our total length
366b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen            return fAsset->getLength();
376b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen        }
386b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen        // asset->seek returns new total offset
396b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen        // we want to return amount that was skipped
406b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen
41ddb76c4644756b31be948d70aaa8ee541dd94999Kenny Root        off64_t oldOffset = fAsset->seek(0, SEEK_CUR);
426b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen        if (-1 == oldOffset) {
436b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen            SkDebugf("---- fAsset->seek(oldOffset) failed\n");
446b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen            return 0;
456b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen        }
46ddb76c4644756b31be948d70aaa8ee541dd94999Kenny Root        off64_t newOffset = fAsset->seek(size, SEEK_CUR);
476b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen        if (-1 == newOffset) {
486b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen            SkDebugf("---- fAsset->seek(%d) failed\n", size);
496b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen            return 0;
506b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen        }
516b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen        amount = newOffset - oldOffset;
526b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen    } else {
536b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen        amount = fAsset->read(buffer, size);
546b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen        if (amount <= 0) {
556b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen            SkDebugf("---- fAsset->read(%d) returned %d\n", size, amount);
566b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen        }
576b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen    }
586b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen
596b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen    if (amount < 0) {
606b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen        amount = 0;
616b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen    }
626b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen    return amount;
636b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen}
646b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen
656b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chenjobject android::nullObjectReturn(const char msg[]) {
666b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen    if (msg) {
676b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen        SkDebugf("--- %s\n", msg);
686b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen    }
696b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen    return NULL;
706b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen}
71