Utils.h revision 5e49b497ae2019586937aae0e8159292363728b5
1/*
2 * Copyright (C) 2006 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef UTILS_DEFINED
18#define UTILS_DEFINED
19
20#include "SkStream.h"
21
22#include "android_util_Binder.h"
23
24#include <jni.h>
25#include <androidfw/Asset.h>
26
27namespace android {
28
29class AssetStreamAdaptor : public SkStreamRewindable {
30public:
31    // Enum passed to constructor. If set to kYes_OwnAsset,
32    // the passed in Asset will be deleted upon destruction.
33    enum OwnAsset {
34        kYes_OwnAsset,
35        kNo_OwnAsset,
36    };
37
38    // Enum passed to constructor. If set to kYes_HasMemoryBase,
39    // getMemoryBase will return the Asset's buffer.
40    enum HasMemoryBase {
41        kYes_HasMemoryBase,
42        kNo_HasMemoryBase,
43    };
44
45    AssetStreamAdaptor(Asset*, OwnAsset, HasMemoryBase);
46    ~AssetStreamAdaptor();
47
48    virtual bool rewind();
49    virtual size_t read(void* buffer, size_t size);
50    virtual bool hasLength() const { return true; }
51    virtual size_t getLength() const;
52    virtual bool isAtEnd() const;
53
54    virtual const void* getMemoryBase() { return fMemoryBase; }
55
56    virtual SkStreamRewindable* duplicate() const;
57private:
58    Asset*              fAsset;
59    const void* const   fMemoryBase;
60    const OwnAsset      fOwnAsset;
61};
62
63/**
64 *  Make a deep copy of the asset, and return it as a stream, or NULL if there
65 *  was an error.
66 *  FIXME: If we could "ref/reopen" the asset, we may not need to copy it here.
67 */
68
69SkMemoryStream* CopyAssetToStream(Asset*);
70
71/** Restore the file descriptor's offset in our destructor
72 */
73class AutoFDSeek {
74public:
75    AutoFDSeek(int fd) : fFD(fd) {
76        fCurr = ::lseek(fd, 0, SEEK_CUR);
77    }
78    ~AutoFDSeek() {
79        if (fCurr >= 0) {
80            ::lseek(fFD, fCurr, SEEK_SET);
81        }
82    }
83private:
84    int     fFD;
85    off64_t   fCurr;
86};
87
88jobject nullObjectReturn(const char msg[]);
89
90}; // namespace android
91
92#endif
93