116c4d154dca43c662571129af31b27433b919a32Adam Lesinski/*
216c4d154dca43c662571129af31b27433b919a32Adam Lesinski * Copyright (C) 2010 The Android Open Source Project
316c4d154dca43c662571129af31b27433b919a32Adam Lesinski *
416c4d154dca43c662571129af31b27433b919a32Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
516c4d154dca43c662571129af31b27433b919a32Adam Lesinski * you may not use this file except in compliance with the License.
616c4d154dca43c662571129af31b27433b919a32Adam Lesinski * You may obtain a copy of the License at
716c4d154dca43c662571129af31b27433b919a32Adam Lesinski *
816c4d154dca43c662571129af31b27433b919a32Adam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
916c4d154dca43c662571129af31b27433b919a32Adam Lesinski *
1016c4d154dca43c662571129af31b27433b919a32Adam Lesinski * Unless required by applicable law or agreed to in writing, software
1116c4d154dca43c662571129af31b27433b919a32Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
1216c4d154dca43c662571129af31b27433b919a32Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1316c4d154dca43c662571129af31b27433b919a32Adam Lesinski * See the License for the specific language governing permissions and
1416c4d154dca43c662571129af31b27433b919a32Adam Lesinski * limitations under the License.
1516c4d154dca43c662571129af31b27433b919a32Adam Lesinski */
1616c4d154dca43c662571129af31b27433b919a32Adam Lesinski
1716c4d154dca43c662571129af31b27433b919a32Adam Lesinski#ifndef OBBFILE_H_
1816c4d154dca43c662571129af31b27433b919a32Adam Lesinski#define OBBFILE_H_
1916c4d154dca43c662571129af31b27433b919a32Adam Lesinski
2016c4d154dca43c662571129af31b27433b919a32Adam Lesinski#include <stdint.h>
2116c4d154dca43c662571129af31b27433b919a32Adam Lesinski#include <strings.h>
2216c4d154dca43c662571129af31b27433b919a32Adam Lesinski
2316c4d154dca43c662571129af31b27433b919a32Adam Lesinski#include <utils/RefBase.h>
2416c4d154dca43c662571129af31b27433b919a32Adam Lesinski#include <utils/String8.h>
2516c4d154dca43c662571129af31b27433b919a32Adam Lesinski
2616c4d154dca43c662571129af31b27433b919a32Adam Lesinskinamespace android {
2716c4d154dca43c662571129af31b27433b919a32Adam Lesinski
2816c4d154dca43c662571129af31b27433b919a32Adam Lesinski// OBB flags (bit 0)
2916c4d154dca43c662571129af31b27433b919a32Adam Lesinski#define OBB_OVERLAY         (1 << 0)
3016c4d154dca43c662571129af31b27433b919a32Adam Lesinski#define OBB_SALTED          (1 << 1)
3116c4d154dca43c662571129af31b27433b919a32Adam Lesinski
3216c4d154dca43c662571129af31b27433b919a32Adam Lesinskiclass ObbFile : public RefBase {
3316c4d154dca43c662571129af31b27433b919a32Adam Lesinskiprotected:
3416c4d154dca43c662571129af31b27433b919a32Adam Lesinski    virtual ~ObbFile();
3516c4d154dca43c662571129af31b27433b919a32Adam Lesinski
3616c4d154dca43c662571129af31b27433b919a32Adam Lesinskipublic:
3716c4d154dca43c662571129af31b27433b919a32Adam Lesinski    ObbFile();
3816c4d154dca43c662571129af31b27433b919a32Adam Lesinski
3916c4d154dca43c662571129af31b27433b919a32Adam Lesinski    bool readFrom(const char* filename);
4016c4d154dca43c662571129af31b27433b919a32Adam Lesinski    bool readFrom(int fd);
4116c4d154dca43c662571129af31b27433b919a32Adam Lesinski    bool writeTo(const char* filename);
4216c4d154dca43c662571129af31b27433b919a32Adam Lesinski    bool writeTo(int fd);
4316c4d154dca43c662571129af31b27433b919a32Adam Lesinski    bool removeFrom(const char* filename);
4416c4d154dca43c662571129af31b27433b919a32Adam Lesinski    bool removeFrom(int fd);
4516c4d154dca43c662571129af31b27433b919a32Adam Lesinski
4616c4d154dca43c662571129af31b27433b919a32Adam Lesinski    const char* getFileName() const {
4716c4d154dca43c662571129af31b27433b919a32Adam Lesinski        return mFileName;
4816c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
4916c4d154dca43c662571129af31b27433b919a32Adam Lesinski
5016c4d154dca43c662571129af31b27433b919a32Adam Lesinski    const String8 getPackageName() const {
5116c4d154dca43c662571129af31b27433b919a32Adam Lesinski        return mPackageName;
5216c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
5316c4d154dca43c662571129af31b27433b919a32Adam Lesinski
5416c4d154dca43c662571129af31b27433b919a32Adam Lesinski    void setPackageName(String8 packageName) {
5516c4d154dca43c662571129af31b27433b919a32Adam Lesinski        mPackageName = packageName;
5616c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
5716c4d154dca43c662571129af31b27433b919a32Adam Lesinski
5816c4d154dca43c662571129af31b27433b919a32Adam Lesinski    int32_t getVersion() const {
5916c4d154dca43c662571129af31b27433b919a32Adam Lesinski        return mVersion;
6016c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
6116c4d154dca43c662571129af31b27433b919a32Adam Lesinski
6216c4d154dca43c662571129af31b27433b919a32Adam Lesinski    void setVersion(int32_t version) {
6316c4d154dca43c662571129af31b27433b919a32Adam Lesinski        mVersion = version;
6416c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
6516c4d154dca43c662571129af31b27433b919a32Adam Lesinski
6616c4d154dca43c662571129af31b27433b919a32Adam Lesinski    int32_t getFlags() const {
6716c4d154dca43c662571129af31b27433b919a32Adam Lesinski        return mFlags;
6816c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
6916c4d154dca43c662571129af31b27433b919a32Adam Lesinski
7016c4d154dca43c662571129af31b27433b919a32Adam Lesinski    void setFlags(int32_t flags) {
7116c4d154dca43c662571129af31b27433b919a32Adam Lesinski        mFlags = flags;
7216c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
7316c4d154dca43c662571129af31b27433b919a32Adam Lesinski
7416c4d154dca43c662571129af31b27433b919a32Adam Lesinski    const unsigned char* getSalt(size_t* length) const {
7516c4d154dca43c662571129af31b27433b919a32Adam Lesinski        if ((mFlags & OBB_SALTED) == 0) {
7616c4d154dca43c662571129af31b27433b919a32Adam Lesinski            *length = 0;
7716c4d154dca43c662571129af31b27433b919a32Adam Lesinski            return NULL;
7816c4d154dca43c662571129af31b27433b919a32Adam Lesinski        }
7916c4d154dca43c662571129af31b27433b919a32Adam Lesinski
8016c4d154dca43c662571129af31b27433b919a32Adam Lesinski        *length = sizeof(mSalt);
8116c4d154dca43c662571129af31b27433b919a32Adam Lesinski        return mSalt;
8216c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
8316c4d154dca43c662571129af31b27433b919a32Adam Lesinski
8416c4d154dca43c662571129af31b27433b919a32Adam Lesinski    bool setSalt(const unsigned char* salt, size_t length) {
8516c4d154dca43c662571129af31b27433b919a32Adam Lesinski        if (length != sizeof(mSalt)) {
8616c4d154dca43c662571129af31b27433b919a32Adam Lesinski            return false;
8716c4d154dca43c662571129af31b27433b919a32Adam Lesinski        }
8816c4d154dca43c662571129af31b27433b919a32Adam Lesinski
8916c4d154dca43c662571129af31b27433b919a32Adam Lesinski        memcpy(mSalt, salt, sizeof(mSalt));
9016c4d154dca43c662571129af31b27433b919a32Adam Lesinski        mFlags |= OBB_SALTED;
9116c4d154dca43c662571129af31b27433b919a32Adam Lesinski        return true;
9216c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
9316c4d154dca43c662571129af31b27433b919a32Adam Lesinski
9416c4d154dca43c662571129af31b27433b919a32Adam Lesinski    bool isOverlay() {
9516c4d154dca43c662571129af31b27433b919a32Adam Lesinski        return (mFlags & OBB_OVERLAY) == OBB_OVERLAY;
9616c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
9716c4d154dca43c662571129af31b27433b919a32Adam Lesinski
9816c4d154dca43c662571129af31b27433b919a32Adam Lesinski    void setOverlay(bool overlay) {
9916c4d154dca43c662571129af31b27433b919a32Adam Lesinski        if (overlay) {
10016c4d154dca43c662571129af31b27433b919a32Adam Lesinski            mFlags |= OBB_OVERLAY;
10116c4d154dca43c662571129af31b27433b919a32Adam Lesinski        } else {
10216c4d154dca43c662571129af31b27433b919a32Adam Lesinski            mFlags &= ~OBB_OVERLAY;
10316c4d154dca43c662571129af31b27433b919a32Adam Lesinski        }
10416c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
10516c4d154dca43c662571129af31b27433b919a32Adam Lesinski
10616c4d154dca43c662571129af31b27433b919a32Adam Lesinski    static inline uint32_t get4LE(const unsigned char* buf) {
10716c4d154dca43c662571129af31b27433b919a32Adam Lesinski        return buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);
10816c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
10916c4d154dca43c662571129af31b27433b919a32Adam Lesinski
11016c4d154dca43c662571129af31b27433b919a32Adam Lesinski    static inline void put4LE(unsigned char* buf, uint32_t val) {
11116c4d154dca43c662571129af31b27433b919a32Adam Lesinski        buf[0] = val & 0xFF;
11216c4d154dca43c662571129af31b27433b919a32Adam Lesinski        buf[1] = (val >> 8) & 0xFF;
11316c4d154dca43c662571129af31b27433b919a32Adam Lesinski        buf[2] = (val >> 16) & 0xFF;
11416c4d154dca43c662571129af31b27433b919a32Adam Lesinski        buf[3] = (val >> 24) & 0xFF;
11516c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
11616c4d154dca43c662571129af31b27433b919a32Adam Lesinski
11716c4d154dca43c662571129af31b27433b919a32Adam Lesinskiprivate:
11816c4d154dca43c662571129af31b27433b919a32Adam Lesinski    /* Package name this ObbFile is associated with */
11916c4d154dca43c662571129af31b27433b919a32Adam Lesinski    String8 mPackageName;
12016c4d154dca43c662571129af31b27433b919a32Adam Lesinski
12116c4d154dca43c662571129af31b27433b919a32Adam Lesinski    /* Package version this ObbFile is associated with */
12216c4d154dca43c662571129af31b27433b919a32Adam Lesinski    int32_t mVersion;
12316c4d154dca43c662571129af31b27433b919a32Adam Lesinski
12416c4d154dca43c662571129af31b27433b919a32Adam Lesinski    /* Flags for this OBB type. */
12516c4d154dca43c662571129af31b27433b919a32Adam Lesinski    int32_t mFlags;
12616c4d154dca43c662571129af31b27433b919a32Adam Lesinski
12716c4d154dca43c662571129af31b27433b919a32Adam Lesinski    /* Whether the file is salted. */
12816c4d154dca43c662571129af31b27433b919a32Adam Lesinski    bool mSalted;
12916c4d154dca43c662571129af31b27433b919a32Adam Lesinski
13016c4d154dca43c662571129af31b27433b919a32Adam Lesinski    /* The encryption salt. */
13116c4d154dca43c662571129af31b27433b919a32Adam Lesinski    unsigned char mSalt[8];
13216c4d154dca43c662571129af31b27433b919a32Adam Lesinski
13316c4d154dca43c662571129af31b27433b919a32Adam Lesinski    const char* mFileName;
13416c4d154dca43c662571129af31b27433b919a32Adam Lesinski
13516c4d154dca43c662571129af31b27433b919a32Adam Lesinski    size_t mFileSize;
13616c4d154dca43c662571129af31b27433b919a32Adam Lesinski
13716c4d154dca43c662571129af31b27433b919a32Adam Lesinski    size_t mFooterStart;
13816c4d154dca43c662571129af31b27433b919a32Adam Lesinski
13916c4d154dca43c662571129af31b27433b919a32Adam Lesinski    unsigned char* mReadBuf;
14016c4d154dca43c662571129af31b27433b919a32Adam Lesinski
14116c4d154dca43c662571129af31b27433b919a32Adam Lesinski    bool parseObbFile(int fd);
14216c4d154dca43c662571129af31b27433b919a32Adam Lesinski};
14316c4d154dca43c662571129af31b27433b919a32Adam Lesinski
14416c4d154dca43c662571129af31b27433b919a32Adam Lesinski}
14516c4d154dca43c662571129af31b27433b919a32Adam Lesinski#endif /* OBBFILE_H_ */
146