Utils.cpp revision 6b849e2123be98eb2a1a25b8abf0b13a279ce952
116c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck/*
216c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck * Copyright (C) 2010 The Android Open Source Project
316c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck *
416c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck * Licensed under the Apache License, Version 2.0 (the "License");
516c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck * you may not use this file except in compliance with the License.
616c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck * You may obtain a copy of the License at
716c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck *
816c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck *      http://www.apache.org/licenses/LICENSE-2.0
916c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck *
1016c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck * Unless required by applicable law or agreed to in writing, software
1116c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck * distributed under the License is distributed on an "AS IS" BASIS,
1216c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1316c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck * See the License for the specific language governing permissions and
1416c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck * limitations under the License.
1516c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck */
1616c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck
1716c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck#include "Utils.h"
1854fa17f667c285a5c9225e238c8132dfe830ef36Chris Craik#include "SkUtils.h"
1916c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck
2016c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reckusing namespace android;
2116c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck
2227e58b4f54d693ff1db7ab2edb5d47ca296c1278Chris Craikbool AssetStreamAdaptor::rewind() {
2316c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck    off_t pos = fAsset->seek(0, SEEK_SET);
2416c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck    if (pos == (off_t)-1) {
2516c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck        SkDebugf("----- fAsset->seek(rewind) failed\n");
2627e58b4f54d693ff1db7ab2edb5d47ca296c1278Chris Craik        return false;
2716c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck    }
2816c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck    return true;
2916c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck}
3016c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck
3116c9d6a92e1b86d448c00c52a1630f3e71e6df76John Recksize_t AssetStreamAdaptor::read(void* buffer, size_t size) {
3216c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck    ssize_t amount;
3354fa17f667c285a5c9225e238c8132dfe830ef36Chris Craik
3454fa17f667c285a5c9225e238c8132dfe830ef36Chris Craik    if (NULL == buffer) {
3554fa17f667c285a5c9225e238c8132dfe830ef36Chris Craik        if (0 == size) {  // caller is asking us for our total length
3654fa17f667c285a5c9225e238c8132dfe830ef36Chris Craik            return fAsset->getLength();
3716c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck        }
3816c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck        // asset->seek returns new total offset
3916c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck        // we want to return amount that was skipped
4016c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck
4116c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck        off_t oldOffset = fAsset->seek(0, SEEK_CUR);
4254fa17f667c285a5c9225e238c8132dfe830ef36Chris Craik        if (-1 == oldOffset) {
4316c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck            SkDebugf("---- fAsset->seek(oldOffset) failed\n");
4416c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck            return 0;
4516c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck        }
4616c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck        off_t newOffset = fAsset->seek(size, SEEK_CUR);
4716c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck        if (-1 == newOffset) {
4816c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck            SkDebugf("---- fAsset->seek(%d) failed\n", size);
4916c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck            return 0;
5016c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck        }
5116c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck        amount = newOffset - oldOffset;
5216c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck    } else {
5316c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck        amount = fAsset->read(buffer, size);
5416c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck        if (amount <= 0) {
5516c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck            SkDebugf("---- fAsset->read(%d) returned %d\n", size, amount);
5616c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck        }
5716c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck    }
5816c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck
5916c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck    if (amount < 0) {
6016c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck        amount = 0;
6116c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck    }
6216c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck    return amount;
6316c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck}
6416c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck
6516c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reckjobject android::nullObjectReturn(const char msg[]) {
6616c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck    if (msg) {
6754fa17f667c285a5c9225e238c8132dfe830ef36Chris Craik        SkDebugf("--- %s\n", msg);
6816c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck    }
6916c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck    return NULL;
7016c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck}
7116c9d6a92e1b86d448c00c52a1630f3e71e6df76John Reck