Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 24b2aee9 authored by Kenny Root's avatar Kenny Root Committed by Android Git Automerger
Browse files

am 821afa9a: am 54d41379: Merge "Add OBB flags to support overlays" into gingerbread

Merge commit '821afa9aec8d3a4ffd2e72ce797d8097eaf13973'

* commit '821afa9aec8d3a4ffd2e72ce797d8097eaf13973':
  Add OBB flags to support overlays
parents 1f712973 ecf37ec4
Loading
Loading
Loading
Loading
+31 −4
Original line number Original line Diff line number Diff line
@@ -18,12 +18,16 @@
#define OBBFILE_H_
#define OBBFILE_H_


#include <stdint.h>
#include <stdint.h>
#include <strings.h>


#include <utils/RefBase.h>
#include <utils/RefBase.h>
#include <utils/String8.h>
#include <utils/String8.h>


namespace android {
namespace android {


// OBB flags (bit 0)
#define OBB_OVERLAY         (1 << 0)

class ObbFile : public RefBase {
class ObbFile : public RefBase {
protected:
protected:
    virtual ~ObbFile();
    virtual ~ObbFile();
@@ -46,18 +50,38 @@ public:
        return mPackageName;
        return mPackageName;
    }
    }


    int32_t getVersion() const {
        return mVersion;
    }

    void setPackageName(String8 packageName) {
    void setPackageName(String8 packageName) {
        mPackageName = packageName;
        mPackageName = packageName;
    }
    }


    int32_t getVersion() const {
        return mVersion;
    }

    void setVersion(int32_t version) {
    void setVersion(int32_t version) {
        mVersion = version;
        mVersion = version;
    }
    }


    int32_t getFlags() const {
        return mFlags;
    }

    void setFlags(int32_t flags) {
        mFlags = flags;
    }

    bool isOverlay() {
        return (mFlags & OBB_OVERLAY) == OBB_OVERLAY;
    }

    void setOverlay(bool overlay) {
        if (overlay) {
            mFlags |= OBB_OVERLAY;
        } else {
            mFlags &= ~OBB_OVERLAY;
        }
    }

    static inline uint32_t get4LE(const unsigned char* buf) {
    static inline uint32_t get4LE(const unsigned char* buf) {
        return buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);
        return buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);
    }
    }
@@ -76,6 +100,9 @@ private:
    /* Package version this ObbFile is associated with */
    /* Package version this ObbFile is associated with */
    int32_t mVersion;
    int32_t mVersion;


    /* Flags for this OBB type. */
    int32_t mFlags;

    const char* mFileName;
    const char* mFileName;


    size_t mFileSize;
    size_t mFileSize;
+22 −10
Original line number Original line Diff line number Diff line
@@ -29,12 +29,13 @@


#define kFooterTagSize 8  /* last two 32-bit integers */
#define kFooterTagSize 8  /* last two 32-bit integers */


#define kFooterMinSize 21 /* 32-bit signature version
#define kFooterMinSize 25 /* 32-bit signature version (4 bytes)
                           * 32-bit package version
                           * 32-bit package version (4 bytes)
                           * 32-bit package name size
                           * 32-bit flags (4 bytes)
                           * 1-character package name
                           * 32-bit package name size (4-bytes)
                           * 32-bit footer size
                           * >=1-character package name (1 byte)
                           * 32-bit footer marker
                           * 32-bit footer size (4 bytes)
                           * 32-bit footer marker (4 bytes)
                           */
                           */


#define kMaxBufSize    32768 /* Maximum file read buffer */
#define kMaxBufSize    32768 /* Maximum file read buffer */
@@ -45,8 +46,9 @@


/* offsets in version 1 of the header */
/* offsets in version 1 of the header */
#define kPackageVersionOffset 4
#define kPackageVersionOffset 4
#define kPackageNameLenOffset 8
#define kFlagsOffset          8
#define kPackageNameOffset    12
#define kPackageNameLenOffset 12
#define kPackageNameOffset    16


/*
/*
 * TEMP_FAILURE_RETRY is defined by some, but not all, versions of
 * TEMP_FAILURE_RETRY is defined by some, but not all, versions of
@@ -78,7 +80,10 @@ typedef off64_t my_off64_t;
namespace android {
namespace android {


ObbFile::ObbFile() :
ObbFile::ObbFile() :
        mVersion(-1) {
        mPackageName(""),
        mVersion(-1),
        mFlags(0)
{
}
}


ObbFile::~ObbFile() {
ObbFile::~ObbFile() {
@@ -199,6 +204,7 @@ bool ObbFile::parseObbFile(int fd)
    }
    }


    mVersion = (int32_t) get4LE((unsigned char*)scanBuf + kPackageVersionOffset);
    mVersion = (int32_t) get4LE((unsigned char*)scanBuf + kPackageVersionOffset);
    mFlags = (int32_t) get4LE((unsigned char*)scanBuf + kFlagsOffset);


    uint32_t packageNameLen = get4LE((unsigned char*)scanBuf + kPackageNameLenOffset);
    uint32_t packageNameLen = get4LE((unsigned char*)scanBuf + kPackageNameLenOffset);
    if (packageNameLen <= 0
    if (packageNameLen <= 0
@@ -268,6 +274,12 @@ bool ObbFile::writeTo(int fd)
        return false;
        return false;
    }
    }


    put4LE(intBuf, mFlags);
    if (write(fd, &intBuf, sizeof(uint32_t)) != (ssize_t)sizeof(uint32_t)) {
        LOGW("couldn't write package version");
        return false;
    }

    size_t packageNameLen = mPackageName.size();
    size_t packageNameLen = mPackageName.size();
    put4LE(intBuf, packageNameLen);
    put4LE(intBuf, packageNameLen);
    if (write(fd, &intBuf, sizeof(uint32_t)) != (ssize_t)sizeof(uint32_t)) {
    if (write(fd, &intBuf, sizeof(uint32_t)) != (ssize_t)sizeof(uint32_t)) {
@@ -280,7 +292,7 @@ bool ObbFile::writeTo(int fd)
        return false;
        return false;
    }
    }


    put4LE(intBuf, 3*sizeof(uint32_t) + packageNameLen);
    put4LE(intBuf, kPackageNameOffset + packageNameLen);
    if (write(fd, &intBuf, sizeof(uint32_t)) != (ssize_t)sizeof(uint32_t)) {
    if (write(fd, &intBuf, sizeof(uint32_t)) != (ssize_t)sizeof(uint32_t)) {
        LOGW("couldn't write footer size: %s", strerror(errno));
        LOGW("couldn't write footer size: %s", strerror(errno));
        return false;
        return false;