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