diff options
156 files changed, 6588 insertions, 26934 deletions
diff --git a/cmds/keystore/Android.mk b/cmds/keystore/Android.mk deleted file mode 100644 index 5a9b979c64..0000000000 --- a/cmds/keystore/Android.mk +++ /dev/null @@ -1,32 +0,0 @@ -# -# Copyright (C) 2009 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -LOCAL_PATH:= $(call my-dir) - -include $(CLEAR_VARS) -LOCAL_SRC_FILES := keystore.cpp -LOCAL_C_INCLUDES := external/openssl/include -LOCAL_SHARED_LIBRARIES := libcutils libcrypto -LOCAL_MODULE:= keystore -include $(BUILD_EXECUTABLE) - -include $(CLEAR_VARS) -LOCAL_SRC_FILES := keystore_cli.cpp -LOCAL_C_INCLUDES := external/openssl/include -LOCAL_SHARED_LIBRARIES := libcutils libcrypto -LOCAL_MODULE:= keystore_cli -LOCAL_MODULE_TAGS := debug -include $(BUILD_EXECUTABLE) diff --git a/cmds/keystore/keystore.cpp b/cmds/keystore/keystore.cpp deleted file mode 100644 index 2c9cb35b7b..0000000000 --- a/cmds/keystore/keystore.cpp +++ /dev/null @@ -1,810 +0,0 @@ -/* - * Copyright (C) 2009 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include <stdio.h> -#include <stdint.h> -#include <string.h> -#include <unistd.h> -#include <signal.h> -#include <errno.h> -#include <dirent.h> -#include <fcntl.h> -#include <limits.h> -#include <sys/types.h> -#include <sys/socket.h> -#include <sys/stat.h> -#include <sys/time.h> -#include <arpa/inet.h> - -#include <openssl/aes.h> -#include <openssl/evp.h> -#include <openssl/md5.h> - -#define LOG_TAG "keystore" -#include <cutils/log.h> -#include <cutils/sockets.h> -#include <private/android_filesystem_config.h> - -#include "keystore.h" - -/* KeyStore is a secured storage for key-value pairs. In this implementation, - * each file stores one key-value pair. Keys are encoded in file names, and - * values are encrypted with checksums. The encryption key is protected by a - * user-defined password. To keep things simple, buffers are always larger than - * the maximum space we needed, so boundary checks on buffers are omitted. */ - -#define KEY_SIZE ((NAME_MAX - 15) / 2) -#define VALUE_SIZE 32768 -#define PASSWORD_SIZE VALUE_SIZE - -struct Value { - int length; - uint8_t value[VALUE_SIZE]; -}; - -/* Here is the encoding of keys. This is necessary in order to allow arbitrary - * characters in keys. Characters in [0-~] are not encoded. Others are encoded - * into two bytes. The first byte is one of [+-.] which represents the first - * two bits of the character. The second byte encodes the rest of the bits into - * [0-o]. Therefore in the worst case the length of a key gets doubled. Note - * that Base64 cannot be used here due to the need of prefix match on keys. */ - -static int encode_key(char* out, uid_t uid, const Value* key) { - int n = snprintf(out, NAME_MAX, "%u_", uid); - out += n; - const uint8_t* in = key->value; - int length = key->length; - for (int i = length; i > 0; --i, ++in, ++out) { - if (*in >= '0' && *in <= '~') { - *out = *in; - } else { - *out = '+' + (*in >> 6); - *++out = '0' + (*in & 0x3F); - ++length; - } - } - *out = '\0'; - return n + length; -} - -static int decode_key(uint8_t* out, char* in, int length) { - for (int i = 0; i < length; ++i, ++in, ++out) { - if (*in >= '0' && *in <= '~') { - *out = *in; - } else { - *out = (*in - '+') << 6; - *out |= (*++in - '0') & 0x3F; - --length; - } - } - *out = '\0'; - return length; -} - -static size_t readFully(int fd, uint8_t* data, size_t size) { - size_t remaining = size; - while (remaining > 0) { - ssize_t n = TEMP_FAILURE_RETRY(read(fd, data, size)); - if (n == -1 || n == 0) { - return size-remaining; - } - data += n; - remaining -= n; - } - return size; -} - -static size_t writeFully(int fd, uint8_t* data, size_t size) { - size_t remaining = size; - while (remaining > 0) { - ssize_t n = TEMP_FAILURE_RETRY(write(fd, data, size)); - if (n == -1 || n == 0) { - return size-remaining; - } - data += n; - remaining -= n; - } - return size; -} - -class Entropy { -public: - Entropy() : mRandom(-1) {} - ~Entropy() { - if (mRandom != -1) { - close(mRandom); - } - } - - bool open() { - const char* randomDevice = "/dev/urandom"; - mRandom = ::open(randomDevice, O_RDONLY); - if (mRandom == -1) { - ALOGE("open: %s: %s", randomDevice, strerror(errno)); - return false; - } - return true; - } - - bool generate_random_data(uint8_t* data, size_t size) { - return (readFully(mRandom, data, size) == size); - } - -private: - int mRandom; -}; - -/* Here is the file format. There are two parts in blob.value, the secret and - * the description. The secret is stored in ciphertext, and its original size - * can be found in blob.length. The description is stored after the secret in - * plaintext, and its size is specified in blob.info. The total size of the two - * parts must be no more than VALUE_SIZE bytes. The first three bytes of the - * file are reserved for future use and are always set to zero. Fields other - * than blob.info, blob.length, and blob.value are modified by encryptBlob() - * and decryptBlob(). Thus they should not be accessed from outside. */ - -struct __attribute__((packed)) blob { - uint8_t reserved[3]; - uint8_t info; - uint8_t vector[AES_BLOCK_SIZE]; - uint8_t encrypted[0]; - uint8_t digest[MD5_DIGEST_LENGTH]; - uint8_t digested[0]; - int32_t length; // in network byte order when encrypted - uint8_t value[VALUE_SIZE + AES_BLOCK_SIZE]; -}; - -class Blob { -public: - Blob(uint8_t* value, int32_t valueLength, uint8_t* info, uint8_t infoLength) { - mBlob.length = valueLength; - memcpy(mBlob.value, value, valueLength); - - mBlob.info = infoLength; - memcpy(mBlob.value + valueLength, info, infoLength); - } - - Blob(blob b) { - mBlob = b; - } - - Blob() {} - - uint8_t* getValue() { - return mBlob.value; - } - - int32_t getLength() { - return mBlob.length; - } - - uint8_t getInfo() { - return mBlob.info; - } - - ResponseCode encryptBlob(const char* filename, AES_KEY *aes_key, Entropy* entropy) { - if (!entropy->generate_random_data(mBlob.vector, AES_BLOCK_SIZE)) { - return SYSTEM_ERROR; - } - - // data includes the value and the value's length - size_t dataLength = mBlob.length + sizeof(mBlob.length); - // pad data to the AES_BLOCK_SIZE - size_t digestedLength = ((dataLength + AES_BLOCK_SIZE - 1) - / AES_BLOCK_SIZE * AES_BLOCK_SIZE); - // encrypted data includes the digest value - size_t encryptedLength = digestedLength + MD5_DIGEST_LENGTH; - // move info after space for padding - memmove(&mBlob.encrypted[encryptedLength], &mBlob.value[mBlob.length], mBlob.info); - // zero padding area - memset(mBlob.value + mBlob.length, 0, digestedLength - dataLength); - - mBlob.length = htonl(mBlob.length); - MD5(mBlob.digested, digestedLength, mBlob.digest); - - uint8_t vector[AES_BLOCK_SIZE]; - memcpy(vector, mBlob.vector, AES_BLOCK_SIZE); - AES_cbc_encrypt(mBlob.encrypted, mBlob.encrypted, encryptedLength, - aes_key, vector, AES_ENCRYPT); - - memset(mBlob.reserved, 0, sizeof(mBlob.reserved)); - size_t headerLength = (mBlob.encrypted - (uint8_t*) &mBlob); - size_t fileLength = encryptedLength + headerLength + mBlob.info; - - const char* tmpFileName = ".tmp"; - int out = open(tmpFileName, O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR); - if (out == -1) { - return SYSTEM_ERROR; - } - size_t writtenBytes = writeFully(out, (uint8_t*) &mBlob, fileLength); - if (close(out) != 0) { - return SYSTEM_ERROR; - } - if (writtenBytes != fileLength) { - unlink(tmpFileName); - return SYSTEM_ERROR; - } - return (rename(tmpFileName, filename) == 0) ? NO_ERROR : SYSTEM_ERROR; - } - - ResponseCode decryptBlob(const char* filename, AES_KEY *aes_key) { - int in = open(filename, O_RDONLY); - if (in == -1) { - return (errno == ENOENT) ? KEY_NOT_FOUND : SYSTEM_ERROR; - } - // fileLength may be less than sizeof(mBlob) since the in - // memory version has extra padding to tolerate rounding up to - // the AES_BLOCK_SIZE - size_t fileLength = readFully(in, (uint8_t*) &mBlob, sizeof(mBlob)); - if (close(in) != 0) { - return SYSTEM_ERROR; - } - size_t headerLength = (mBlob.encrypted - (uint8_t*) &mBlob); - if (fileLength < headerLength) { - return VALUE_CORRUPTED; - } - - ssize_t encryptedLength = fileLength - (headerLength + mBlob.info); - if (encryptedLength < 0 || encryptedLength % AES_BLOCK_SIZE != 0) { - return VALUE_CORRUPTED; - } - AES_cbc_encrypt(mBlob.encrypted, mBlob.encrypted, encryptedLength, aes_key, - mBlob.vector, AES_DECRYPT); - size_t digestedLength = encryptedLength - MD5_DIGEST_LENGTH; - uint8_t computedDigest[MD5_DIGEST_LENGTH]; - MD5(mBlob.digested, digestedLength, computedDigest); - if (memcmp(mBlob.digest, computedDigest, MD5_DIGEST_LENGTH) != 0) { - return VALUE_CORRUPTED; - } - - ssize_t maxValueLength = digestedLength - sizeof(mBlob.length); - mBlob.length = ntohl(mBlob.length); - if (mBlob.length < 0 || mBlob.length > maxValueLength) { - return VALUE_CORRUPTED; - } - if (mBlob.info != 0) { - // move info from after padding to after data - memmove(&mBlob.value[mBlob.length], &mBlob.value[maxValueLength], mBlob.info); - } - return NO_ERROR; - } - -private: - struct blob mBlob; -}; - -class KeyStore { -public: - KeyStore(Entropy* entropy) : mEntropy(entropy), mRetry(MAX_RETRY) { - if (access(MASTER_KEY_FILE, R_OK) == 0) { - setState(STATE_LOCKED); - } else { - setState(STATE_UNINITIALIZED); - } - } - - State getState() { - return mState; - } - - int8_t getRetry() { - return mRetry; - } - - ResponseCode initialize(Value* pw) { - if (!generateMasterKey()) { - return SYSTEM_ERROR; - } - ResponseCode response = writeMasterKey(pw); - if (response != NO_ERROR) { - return response; - } - setupMasterKeys(); - return NO_ERROR; - } - - ResponseCode writeMasterKey(Value* pw) { - uint8_t passwordKey[MASTER_KEY_SIZE_BYTES]; - generateKeyFromPassword(passwordKey, MASTER_KEY_SIZE_BYTES, pw, mSalt); - AES_KEY passwordAesKey; - AES_set_encrypt_key(passwordKey, MASTER_KEY_SIZE_BITS, &passwordAesKey); - Blob masterKeyBlob(mMasterKey, sizeof(mMasterKey), mSalt, sizeof(mSalt)); - return masterKeyBlob.encryptBlob(MASTER_KEY_FILE, &passwordAesKey, mEntropy); - } - - ResponseCode readMasterKey(Value* pw) { - int in = open(MASTER_KEY_FILE, O_RDONLY); - if (in == -1) { - return SYSTEM_ERROR; - } - - // we read the raw blob to just to get the salt to generate - // the AES key, then we create the Blob to use with decryptBlob - blob rawBlob; - size_t length = readFully(in, (uint8_t*) &rawBlob, sizeof(rawBlob)); - if (close(in) != 0) { - return SYSTEM_ERROR; - } - // find salt at EOF if present, otherwise we have an old file - uint8_t* salt; - if (length > SALT_SIZE && rawBlob.info == SALT_SIZE) { - salt = (uint8_t*) &rawBlob + length - SALT_SIZE; - } else { - salt = NULL; - } - uint8_t passwordKey[MASTER_KEY_SIZE_BYTES]; - generateKeyFromPassword(passwordKey, MASTER_KEY_SIZE_BYTES, pw, salt); - AES_KEY passwordAesKey; - AES_set_decrypt_key(passwordKey, MASTER_KEY_SIZE_BITS, &passwordAesKey); - Blob masterKeyBlob(rawBlob); - ResponseCode response = masterKeyBlob.decryptBlob(MASTER_KEY_FILE, &passwordAesKey); - if (response == SYSTEM_ERROR) { - return SYSTEM_ERROR; - } - if (response == NO_ERROR && masterKeyBlob.getLength() == MASTER_KEY_SIZE_BYTES) { - // if salt was missing, generate one and write a new master key file with the salt. - if (salt == NULL) { - if (!generateSalt()) { - return SYSTEM_ERROR; - } - response = writeMasterKey(pw); - } - if (response == NO_ERROR) { - memcpy(mMasterKey, masterKeyBlob.getValue(), MASTER_KEY_SIZE_BYTES); - setupMasterKeys(); - } - return response; - } - if (mRetry <= 0) { - reset(); - return UNINITIALIZED; - } - --mRetry; - switch (mRetry) { - case 0: return WRONG_PASSWORD_0; - case 1: return WRONG_PASSWORD_1; - case 2: return WRONG_PASSWORD_2; - case 3: return WRONG_PASSWORD_3; - default: return WRONG_PASSWORD_3; - } - } - - bool reset() { - clearMasterKeys(); - setState(STATE_UNINITIALIZED); - - DIR* dir = opendir("."); - struct dirent* file; - - if (!dir) { - return false; - } - while ((file = readdir(dir)) != NULL) { - unlink(file->d_name); - } - closedir(dir); - return true; - } - - bool isEmpty() { - DIR* dir = opendir("."); - struct dirent* file; - if (!dir) { - return true; - } - bool result = true; - while ((file = readdir(dir)) != NULL) { - if (isKeyFile(file->d_name)) { - result = false; - break; - } - } - closedir(dir); - return result; - } - - void lock() { - clearMasterKeys(); - setState(STATE_LOCKED); - } - - ResponseCode get(const char* filename, Blob* keyBlob) { - return keyBlob->decryptBlob(filename, &mMasterKeyDecryption); - } - - ResponseCode put(const char* filename, Blob* keyBlob) { - return keyBlob->encryptBlob(filename, &mMasterKeyEncryption, mEntropy); - } - -private: - static const char* MASTER_KEY_FILE; - static const int MASTER_KEY_SIZE_BYTES = 16; - static const int MASTER_KEY_SIZE_BITS = MASTER_KEY_SIZE_BYTES * 8; - - static const int MAX_RETRY = 4; - static const size_t SALT_SIZE = 16; - - Entropy* mEntropy; - - State mState; - int8_t mRetry; - - uint8_t mMasterKey[MASTER_KEY_SIZE_BYTES]; - uint8_t mSalt[SALT_SIZE]; - - AES_KEY mMasterKeyEncryption; - AES_KEY mMasterKeyDecryption; - - void setState(State state) { - mState = state; - if (mState == STATE_NO_ERROR || mState == STATE_UNINITIALIZED) { - mRetry = MAX_RETRY; - } - } - - bool generateSalt() { - return mEntropy->generate_random_data(mSalt, sizeof(mSalt)); - } - - bool generateMasterKey() { - if (!mEntropy->generate_random_data(mMasterKey, sizeof(mMasterKey))) { - return false; - } - if (!generateSalt()) { - return false; - } - return true; - } - - void setupMasterKeys() { - AES_set_encrypt_key(mMasterKey, MASTER_KEY_SIZE_BITS, &mMasterKeyEncryption); - AES_set_decrypt_key(mMasterKey, MASTER_KEY_SIZE_BITS, &mMasterKeyDecryption); - setState(STATE_NO_ERROR); - } - - void clearMasterKeys() { - memset(mMasterKey, 0, sizeof(mMasterKey)); - memset(mSalt, 0, sizeof(mSalt)); - memset(&mMasterKeyEncryption, 0, sizeof(mMasterKeyEncryption)); - memset(&mMasterKeyDecryption, 0, sizeof(mMasterKeyDecryption)); - } - - static void generateKeyFromPassword(uint8_t* key, ssize_t keySize, Value* pw, uint8_t* salt) { - size_t saltSize; - if (salt != NULL) { - saltSize = SALT_SIZE; - } else { - // pre-gingerbread used this hardwired salt, readMasterKey will rewrite these when found - salt = (uint8_t*) "keystore"; - // sizeof = 9, not strlen = 8 - saltSize = sizeof("keystore"); - } - PKCS5_PBKDF2_HMAC_SHA1((char*) pw->value, pw->length, salt, saltSize, 8192, keySize, key); - } - - static bool isKeyFile(const char* filename) { - return ((strcmp(filename, MASTER_KEY_FILE) != 0) - && (strcmp(filename, ".") != 0) - && (strcmp(filename, "..") != 0)); - } -}; - -const char* KeyStore::MASTER_KEY_FILE = ".masterkey"; - -/* Here is the protocol used in both requests and responses: - * code [length_1 message_1 ... length_n message_n] end-of-file - * where code is one byte long and lengths are unsigned 16-bit integers in - * network order. Thus the maximum length of a message is 65535 bytes. */ - -static int recv_code(int sock, int8_t* code) { - return recv(sock, code, 1, 0) == 1; -} - -static int recv_message(int sock, uint8_t* message, int length) { - uint8_t bytes[2]; - if (recv(sock, &bytes[0], 1, 0) != 1 || - recv(sock, &bytes[1], 1, 0) != 1) { - return -1; - } else { - int offset = bytes[0] << 8 | bytes[1]; - if (length < offset) { - return -1; - } - length = offset; - offset = 0; - while (offset < length) { - int n = recv(sock, &message[offset], length - offset, 0); - if (n <= 0) { - return -1; - } - offset += n; - } - } - return length; -} - -static int recv_end_of_file(int sock) { - uint8_t byte; - return recv(sock, &byte, 1, 0) == 0; -} - -static void send_code(int sock, int8_t code) { - send(sock, &code, 1, 0); -} - -static void send_message(int sock, uint8_t* message, int length) { - uint16_t bytes = htons(length); - send(sock, &bytes, 2, 0); - send(sock, message, length, 0); -} - -/* Here are the actions. Each of them is a function without arguments. All - * information is defined in global variables, which are set properly before - * performing an action. The number of parameters required by each action is - * fixed and defined in a table. If the return value of an action is positive, - * it will be treated as a response code and transmitted to the client. Note - * that the lengths of parameters are checked when they are received, so - * boundary checks on parameters are omitted. */ - -static const ResponseCode NO_ERROR_RESPONSE_CODE_SENT = (ResponseCode) 0; - -static ResponseCode test(KeyStore* keyStore, int sock, uid_t uid, Value*, Value*) { - return (ResponseCode) keyStore->getState(); -} - -static ResponseCode get(KeyStore* keyStore, int sock, uid_t uid, Value* keyName, Value*) { - char filename[NAME_MAX]; - encode_key(filename, uid, keyName); - Blob keyBlob; - ResponseCode responseCode = keyStore->get(filename, &keyBlob); - if (responseCode != NO_ERROR) { - return responseCode; - } - send_code(sock, NO_ERROR); - send_message(sock, keyBlob.getValue(), keyBlob.getLength()); - return NO_ERROR_RESPONSE_CODE_SENT; -} - -static ResponseCode insert(KeyStore* keyStore, int sock, uid_t uid, Value* keyName, Value* val) { - char filename[NAME_MAX]; - encode_key(filename, uid, keyName); - Blob keyBlob(val->value, val->length, NULL, 0); - return keyStore->put(filename, &keyBlob); -} - -static ResponseCode del(KeyStore* keyStore, int sock, uid_t uid, Value* keyName, Value*) { - char filename[NAME_MAX]; - encode_key(filename, uid, keyName); - return (unlink(filename) && errno != ENOENT) ? SYSTEM_ERROR : NO_ERROR; -} - -static ResponseCode exist(KeyStore* keyStore, int sock, uid_t uid, Value* keyName, Value*) { - char filename[NAME_MAX]; - encode_key(filename, uid, keyName); - if (access(filename, R_OK) == -1) { - return (errno != ENOENT) ? SYSTEM_ERROR : KEY_NOT_FOUND; - } - return NO_ERROR; -} - -static ResponseCode saw(KeyStore* keyStore, int sock, uid_t uid, Value* keyPrefix, Value*) { - DIR* dir = opendir("."); - if (!dir) { - return SYSTEM_ERROR; - } - char filename[NAME_MAX]; - int n = encode_key(filename, uid, keyPrefix); - send_code(sock, NO_ERROR); - - struct dirent* file; - while ((file = readdir(dir)) != NULL) { - if (!strncmp(filename, file->d_name, n)) { - char* p = &file->d_name[n]; - keyPrefix->length = decode_key(keyPrefix->value, p, strlen(p)); - send_message(sock, keyPrefix->value, keyPrefix->length); - } - } - closedir(dir); - return NO_ERROR_RESPONSE_CODE_SENT; -} - -static ResponseCode reset(KeyStore* keyStore, int sock, uid_t uid, Value*, Value*) { - return keyStore->reset() ? NO_ERROR : SYSTEM_ERROR; -} - -/* Here is the history. To improve the security, the parameters to generate the - * master key has been changed. To make a seamless transition, we update the - * file using the same password when the user unlock it for the first time. If - * any thing goes wrong during the transition, the new file will not overwrite - * the old one. This avoids permanent damages of the existing data. */ - -static ResponseCode password(KeyStore* keyStore, int sock, uid_t uid, Value* pw, Value*) { - switch (keyStore->getState()) { - case STATE_UNINITIALIZED: { - // generate master key, encrypt with password, write to file, initialize mMasterKey*. - return keyStore->initialize(pw); - } - case STATE_NO_ERROR: { - // rewrite master key with new password. - return keyStore->writeMasterKey(pw); - } - case STATE_LOCKED: { - // read master key, decrypt with password, initialize mMasterKey*. - return keyStore->readMasterKey(pw); - } - } - return SYSTEM_ERROR; -} - -static ResponseCode lock(KeyStore* keyStore, int sock, uid_t uid, Value*, Value*) { - keyStore->lock(); - return NO_ERROR; -} - -static ResponseCode unlock(KeyStore* keyStore, int sock, uid_t uid, Value* pw, Value* unused) { - return password(keyStore, sock, uid, pw, unused); -} - -static ResponseCode zero(KeyStore* keyStore, int sock, uid_t uid, Value*, Value*) { - return keyStore->isEmpty() ? KEY_NOT_FOUND : NO_ERROR; -} - -/* Here are the permissions, actions, users, and the main function. */ - -enum perm { - TEST = 1, - GET = 2, - INSERT = 4, - DELETE = 8, - EXIST = 16, - SAW = 32, - RESET = 64, - PASSWORD = 128, - LOCK = 256, - UNLOCK = 512, - ZERO = 1024, -}; - -static const int MAX_PARAM = 2; - -static const State STATE_ANY = (State) 0; - -static struct action { - ResponseCode (*run)(KeyStore* keyStore, int sock, uid_t uid, Value* param1, Value* param2); - int8_t code; - State state; - uint32_t perm; - int lengths[MAX_PARAM]; -} actions[] = { - {test, 't', STATE_ANY, TEST, {0, 0}}, - {get, 'g', STATE_NO_ERROR, GET, {KEY_SIZE, 0}}, - {insert, 'i', STATE_NO_ERROR, INSERT, {KEY_SIZE, VALUE_SIZE}}, - {del, 'd', STATE_ANY, DELETE, {KEY_SIZE, 0}}, - {exist, 'e', STATE_ANY, EXIST, {KEY_SIZE, 0}}, - {saw, 's', STATE_ANY, SAW, {KEY_SIZE, 0}}, - {reset, 'r', STATE_ANY, RESET, {0, 0}}, - {password, 'p', STATE_ANY, PASSWORD, {PASSWORD_SIZE, 0}}, - {lock, 'l', STATE_NO_ERROR, LOCK, {0, 0}}, - {unlock, 'u', STATE_LOCKED, UNLOCK, {PASSWORD_SIZE, 0}}, - {zero, 'z', STATE_ANY, ZERO, {0, 0}}, - {NULL, 0 , STATE_ANY, 0, {0, 0}}, -}; - -static struct user { - uid_t uid; - uid_t euid; - uint32_t perms; -} users[] = { - {AID_SYSTEM, ~0, ~0}, - {AID_VPN, AID_SYSTEM, GET}, - {AID_WIFI, AID_SYSTEM, GET}, - {AID_ROOT, AID_SYSTEM, GET}, - {~0, ~0, TEST | GET | INSERT | DELETE | EXIST | SAW}, -}; - -static ResponseCode process(KeyStore* keyStore, int sock, uid_t uid, int8_t code) { - struct user* user = users; - struct action* action = actions; - int i; - - while (~user->uid && user->uid != uid) { - ++user; - } - while (action->code && action->code != code) { - ++action; - } - if (!action->code) { - return UNDEFINED_ACTION; - } - if (!(action->perm & user->perms)) { - return PERMISSION_DENIED; - } - if (action->state != STATE_ANY && action->state != keyStore->getState()) { - return (ResponseCode) keyStore->getState(); - } - if (~user->euid) { - uid = user->euid; - } - Value params[MAX_PARAM]; - for (i = 0; i < MAX_PARAM && action->lengths[i] != 0; ++i) { - params[i].length = recv_message(sock, params[i].value, action->lengths[i]); - if (params[i].length < 0) { - return PROTOCOL_ERROR; - } - } - if (!recv_end_of_file(sock)) { - return PROTOCOL_ERROR; - } - return action->run(keyStore, sock, uid, ¶ms[0], ¶ms[1]); -} - -int main(int argc, char* argv[]) { - int controlSocket = android_get_control_socket("keystore"); - if (argc < 2) { - ALOGE("A directory must be specified!"); - return 1; - } - if (chdir(argv[1]) == -1) { - ALOGE("chdir: %s: %s", argv[1], strerror(errno)); - return 1; - } - - Entropy entropy; - if (!entropy.open()) { - return 1; - } - if (listen(controlSocket, 3) == -1) { - ALOGE("listen: %s", strerror(errno)); - return 1; - } - - signal(SIGPIPE, SIG_IGN); - - KeyStore keyStore(&entropy); - int sock; - while ((sock = accept(controlSocket, NULL, 0)) != -1) { - struct timeval tv; - tv.tv_sec = 3; - setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); - setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv)); - - struct ucred cred; - socklen_t size = sizeof(cred); - int credResult = getsockopt(sock, SOL_SOCKET, SO_PEERCRED, &cred, &size); - if (credResult != 0) { - ALOGW("getsockopt: %s", strerror(errno)); - } else { - int8_t request; - if (recv_code(sock, &request)) { - State old_state = keyStore.getState(); - ResponseCode response = process(&keyStore, sock, cred.uid, request); - if (response == NO_ERROR_RESPONSE_CODE_SENT) { - response = NO_ERROR; - } else { - send_code(sock, response); - } - ALOGI("uid: %d action: %c -> %d state: %d -> %d retry: %d", - cred.uid, - request, response, - old_state, keyStore.getState(), - keyStore.getRetry()); - } - } - close(sock); - } - ALOGE("accept: %s", strerror(errno)); - return 1; -} diff --git a/cmds/keystore/keystore.h b/cmds/keystore/keystore.h deleted file mode 100644 index 5ae3d24ace..0000000000 --- a/cmds/keystore/keystore.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2009 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __KEYSTORE_H__ -#define __KEYSTORE_H__ - -// note state values overlap with ResponseCode for the purposes of the state() API -enum State { - STATE_NO_ERROR = 1, - STATE_LOCKED = 2, - STATE_UNINITIALIZED = 3, -}; - -enum ResponseCode { - NO_ERROR = STATE_NO_ERROR, // 1 - LOCKED = STATE_LOCKED, // 2 - UNINITIALIZED = STATE_UNINITIALIZED, // 3 - SYSTEM_ERROR = 4, - PROTOCOL_ERROR = 5, - PERMISSION_DENIED = 6, - KEY_NOT_FOUND = 7, - VALUE_CORRUPTED = 8, - UNDEFINED_ACTION = 9, - WRONG_PASSWORD_0 = 10, - WRONG_PASSWORD_1 = 11, - WRONG_PASSWORD_2 = 12, - WRONG_PASSWORD_3 = 13, // MAX_RETRY = 4 -}; - -#endif diff --git a/cmds/keystore/keystore_cli.cpp b/cmds/keystore/keystore_cli.cpp deleted file mode 100644 index dcd3bcb8fc..0000000000 --- a/cmds/keystore/keystore_cli.cpp +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright (C) 2009 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include <stdio.h> -#include <stdint.h> -#include <string.h> -#include <sys/types.h> -#include <sys/socket.h> - -#include <cutils/sockets.h> - -#include "keystore.h" - -static const char* responses[] = { - NULL, - /* [NO_ERROR] = */ "No error", - /* [LOCKED] = */ "Locked", - /* [UNINITIALIZED] = */ "Uninitialized", - /* [SYSTEM_ERROR] = */ "System error", - /* [PROTOCOL_ERROR] = */ "Protocol error", - /* [PERMISSION_DENIED] = */ "Permission denied", - /* [KEY_NOT_FOUND] = */ "Key not found", - /* [VALUE_CORRUPTED] = */ "Value corrupted", - /* [UNDEFINED_ACTION] = */ "Undefined action", - /* [WRONG_PASSWORD] = */ "Wrong password (last chance)", - /* [WRONG_PASSWORD + 1] = */ "Wrong password (2 tries left)", - /* [WRONG_PASSWORD + 2] = */ "Wrong password (3 tries left)", - /* [WRONG_PASSWORD + 3] = */ "Wrong password (4 tries left)", -}; - -int main(int argc, char* argv[]) -{ - if (argc < 2) { - printf("Usage: %s action [parameter ...]\n", argv[0]); - return 0; - } - - int sock = socket_local_client("keystore", ANDROID_SOCKET_NAMESPACE_RESERVED, - SOCK_STREAM); - if (sock == -1) { - puts("Failed to connect"); - return 1; - } - - send(sock, argv[1], 1, 0); - uint8_t bytes[65536]; - for (int i = 2; i < argc; ++i) { - uint16_t length = strlen(argv[i]); - bytes[0] = length >> 8; - bytes[1] = length; - send(sock, &bytes, 2, 0); - send(sock, argv[i], length, 0); - } - shutdown(sock, SHUT_WR); - - uint8_t code; - if (recv(sock, &code, 1, 0) != 1) { - puts("Failed to receive"); - return 1; - } - printf("%d %s\n", code , responses[code] ? responses[code] : "Unknown"); - int i; - while ((i = recv(sock, &bytes[0], 1, 0)) == 1) { - int length; - int offset; - if ((i = recv(sock, &bytes[1], 1, 0)) != 1) { - puts("Failed to receive"); - return 1; - } - length = bytes[0] << 8 | bytes[1]; - for (offset = 0; offset < length; offset += i) { - i = recv(sock, &bytes[offset], length - offset, 0); - if (i <= 0) { - puts("Failed to receive"); - return 1; - } - } - fwrite(bytes, 1, length, stdout); - puts(""); - } - return 0; -} diff --git a/cmds/keystore/keystore_get.h b/cmds/keystore/keystore_get.h deleted file mode 100644 index 4b4923e5c7..0000000000 --- a/cmds/keystore/keystore_get.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (C) 2009 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __KEYSTORE_GET_H__ -#define __KEYSTORE_GET_H__ - -#include <stdio.h> -#include <stdint.h> -#include <unistd.h> -#include <sys/types.h> -#include <sys/socket.h> - -#include <cutils/sockets.h> - -#define KEYSTORE_MESSAGE_SIZE 65535 - -#ifdef __cplusplus -extern "C" { -#endif - -/* This function is provided for native components to get values from keystore. - * Users are required to link against libcutils. Keys and values are 8-bit safe. - * The first two arguments are the key and its length. The third argument - * specifies the buffer to store the retrieved value, which must be an array of - * KEYSTORE_MESSAGE_SIZE bytes. This function returns the length of the value or - * -1 if an error happens. */ -static int keystore_get(const char *key, int length, char *value) -{ - uint8_t bytes[2] = {length >> 8, length}; - uint8_t code = 'g'; - int sock; - - if (length < 0 || length > KEYSTORE_MESSAGE_SIZE) { - return -1; - } - sock = socket_local_client("keystore", ANDROID_SOCKET_NAMESPACE_RESERVED, - SOCK_STREAM); - if (sock == -1) { - return -1; - } - if (send(sock, &code, 1, 0) == 1 && send(sock, bytes, 2, 0) == 2 && - send(sock, key, length, 0) == length && shutdown(sock, SHUT_WR) == 0 && - recv(sock, &code, 1, 0) == 1 && code == /* NO_ERROR */ 1 && - recv(sock, &bytes[0], 1, 0) == 1 && recv(sock, &bytes[1], 1, 0) == 1) { - int offset = 0; - length = bytes[0] << 8 | bytes[1]; - while (offset < length) { - int n = recv(sock, &value[offset], length - offset, 0); - if (n <= 0) { - length = -1; - break; - } - offset += n; - } - } else { - length = -1; - } - - close(sock); - return length; -} - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/cmds/keystore/test-keystore b/cmds/keystore/test-keystore deleted file mode 100755 index 3be51b3e7b..0000000000 --- a/cmds/keystore/test-keystore +++ /dev/null @@ -1,273 +0,0 @@ -#!/bin/bash -# -# Copyright 2011, The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -set -e - -prefix=$0 -log_file=$prefix.log -baseline_file=$prefix.baseline - -function cleanup_output() { - rm -f $log_file - rm -f $baseline_file -} - -function log() { - echo "$@" - append $log_file \# "$@" - append $baseline_file \# "$@" -} - -function expect() { - append $baseline_file "$@" -} - -function append() { - declare -r file=$1 - shift - echo "$@" >> $file -} - -function run() { - # strip out carriage returns from adb - # strip out date/time from ls -l - "$@" | tr --delete '\r' | sed -E 's/[0-9]{4}-[0-9]{2}-[0-9]{2} +[0-9]{1,2}:[0-9]{2} //' >> $log_file -} - -function keystore() { - declare -r user=$1 - shift - run adb shell su $user keystore_cli "$@" -} - -function list_keystore_directory() { - run adb shell ls -al /data/misc/keystore -} - -function compare() { - log "comparing $baseline_file and $log_file" - diff $baseline_file $log_file || (log $tag FAILED && exit 1) -} - -function test_basic() { - - # - # reset - # - log "reset keystore as system user" - keystore system r - expect "1 No error" - list_keystore_directory - - # - # basic tests as system/root - # - log "root does not have permission to run test" - keystore root t - expect "6 Permission denied" - - log "but system user does" - keystore system t - expect "3 Uninitialized" - list_keystore_directory - - log "password is now bar" - keystore system p bar - expect "1 No error" - list_keystore_directory - expect "-rw------- keystore keystore 84 .masterkey" - - log "no error implies initialized and unlocked" - keystore system t - expect "1 No error" - - log "saw with no argument" - keystore system s - expect "5 Protocol error" - - log "saw nothing" - keystore system s "" - expect "1 No error" - - log "add key baz" - keystore system i baz quux - expect "1 No error" - - log "1000 is uid of system" - list_keystore_directory - expect "-rw------- keystore keystore 84 .masterkey" - expect "-rw------- keystore keystore 52 1000_baz" - - log "saw baz" - keystore system s "" - expect "1 No error" - expect "baz" - - log "get baz" - keystore system g baz - expect "1 No error" - expect "quux" - - log "root can read system user keys (as can wifi or vpn users)" - keystore root g baz - expect "1 No error" - expect "quux" - - # - # app user tests - # - - # app_0 has uid 10000, as seen below - log "other uses cannot see the system keys" - keystore app_0 g baz - expect "7 Key not found" - - log "app user cannot use reset, password, lock, unlock" - keystore app_0 r - expect "6 Permission denied" - keystore app_0 p - expect "6 Permission denied" - keystore app_0 l - expect "6 Permission denied" - keystore app_0 u - expect "6 Permission denied" - - log "install app_0 key" - keystore app_0 i 0x deadbeef - expect 1 No error - list_keystore_directory - expect "-rw------- keystore keystore 84 .masterkey" - expect "-rw------- keystore keystore 52 10000_0x" - expect "-rw------- keystore keystore 52 1000_baz" - - log "get with no argument" - keystore app_0 g - expect "5 Protocol error" - - keystore app_0 g 0x - expect "1 No error" - expect "deadbeef" - - keystore app_0 i fred barney - expect "1 No error" - - keystore app_0 s "" - expect "1 No error" - expect "0x" - expect "fred" - - log "note that saw returns the suffix of prefix matches" - keystore app_0 s fr # fred - expect "1 No error" - expect "ed" # fred - - # - # lock tests - # - log "lock the store as system" - keystore system l - expect "1 No error" - keystore system t - expect "2 Locked" - - log "saw works while locked" - keystore app_0 s "" - expect "1 No error" - expect "0x" - expect "fred" - - log "...but cannot read keys..." - keystore app_0 g 0x - expect "2 Locked" - - log "...but they can be deleted." - keystore app_0 e 0x - expect "1 No error" - keystore app_0 d 0x - expect "1 No error" - keystore app_0 e 0x - expect "7 Key not found" - - # - # password - # - log "wrong password" - keystore system u foo - expect "13 Wrong password (4 tries left)" - log "right password" - keystore system u bar - expect "1 No error" - - log "make the password foo" - keystore system p foo - expect "1 No error" - - # - # final reset - # - log "reset wipes everything for all users" - keystore system r - expect "1 No error" - list_keystore_directory - - keystore system t - expect "3 Uninitialized" - -} - -function test_4599735() { - # http://b/4599735 - log "start regression test for b/4599735" - keystore system r - expect "1 No error" - - keystore system p foo - expect "1 No error" - - keystore system i baz quux - expect "1 No error" - - keystore root g baz - expect "1 No error" - expect "quux" - - keystore system l - expect "1 No error" - - keystore system p foo - expect "1 No error" - - log "after unlock, regression led to result of '8 Value corrupted'" - keystore root g baz - expect "1 No error" - expect "quux" - - keystore system r - expect "1 No error" - log "end regression test for b/4599735" -} - -function main() { - cleanup_output - log $tag START - test_basic - test_4599735 - compare - log $tag PASSED - cleanup_output -} - -main diff --git a/include/gui/BufferQueue.h b/include/gui/BufferQueue.h index ae99160181..dd1558ca9c 100644 --- a/include/gui/BufferQueue.h +++ b/include/gui/BufferQueue.h @@ -19,9 +19,9 @@ #include <EGL/egl.h> +#include <gui/IGraphicBufferAlloc.h> #include <gui/ISurfaceTexture.h> -#include <surfaceflinger/IGraphicBufferAlloc.h> #include <ui/GraphicBuffer.h> #include <utils/String8.h> diff --git a/include/surfaceflinger/IGraphicBufferAlloc.h b/include/gui/IGraphicBufferAlloc.h index d3b2062233..cee41d9341 100644 --- a/include/surfaceflinger/IGraphicBufferAlloc.h +++ b/include/gui/IGraphicBufferAlloc.h @@ -14,15 +14,15 @@ * limitations under the License. */ -#ifndef ANDROID_SF_IGRAPHIC_BUFFER_ALLOC_H -#define ANDROID_SF_IGRAPHIC_BUFFER_ALLOC_H +#ifndef ANDROID_GUI_IGRAPHIC_BUFFER_ALLOC_H +#define ANDROID_GUI_IGRAPHIC_BUFFER_ALLOC_H #include <stdint.h> #include <sys/types.h> -#include <utils/RefBase.h> - #include <binder/IInterface.h> +#include <ui/PixelFormat.h> +#include <utils/RefBase.h> namespace android { // ---------------------------------------------------------------------------- @@ -55,4 +55,4 @@ public: }; // namespace android -#endif // ANDROID_SF_IGRAPHIC_BUFFER_ALLOC_H +#endif // ANDROID_GUI_IGRAPHIC_BUFFER_ALLOC_H diff --git a/include/surfaceflinger/ISurface.h b/include/gui/ISurface.h index 5fdf234e5f..c0ff9fcb1e 100644 --- a/include/surfaceflinger/ISurface.h +++ b/include/gui/ISurface.h @@ -14,8 +14,8 @@ * limitations under the License. */ -#ifndef ANDROID_SF_ISURFACE_H -#define ANDROID_SF_ISURFACE_H +#ifndef ANDROID_GUI_ISURFACE_H +#define ANDROID_GUI_ISURFACE_H #include <stdint.h> #include <sys/types.h> @@ -61,4 +61,4 @@ public: }; // namespace android -#endif // ANDROID_SF_ISURFACE_H +#endif // ANDROID_GUI_ISURFACE_H diff --git a/include/surfaceflinger/ISurfaceComposer.h b/include/gui/ISurfaceComposer.h index 58fd89d3b6..f3c0ecbc81 100644 --- a/include/surfaceflinger/ISurfaceComposer.h +++ b/include/gui/ISurfaceComposer.h @@ -14,8 +14,8 @@ * limitations under the License. */ -#ifndef ANDROID_SF_ISURFACE_COMPOSER_H -#define ANDROID_SF_ISURFACE_COMPOSER_H +#ifndef ANDROID_GUI_ISURFACE_COMPOSER_H +#define ANDROID_GUI_ISURFACE_COMPOSER_H #include <stdint.h> #include <sys/types.h> @@ -27,8 +27,8 @@ #include <ui/PixelFormat.h> -#include <surfaceflinger/ISurfaceComposerClient.h> -#include <surfaceflinger/IGraphicBufferAlloc.h> +#include <gui/IGraphicBufferAlloc.h> +#include <gui/ISurfaceComposerClient.h> namespace android { // ---------------------------------------------------------------------------- @@ -171,4 +171,4 @@ public: }; // namespace android -#endif // ANDROID_SF_ISURFACE_COMPOSER_H +#endif // ANDROID_GUI_ISURFACE_COMPOSER_H diff --git a/include/surfaceflinger/ISurfaceComposerClient.h b/include/gui/ISurfaceComposerClient.h index 02cabc1cdc..c793933f65 100644 --- a/include/surfaceflinger/ISurfaceComposerClient.h +++ b/include/gui/ISurfaceComposerClient.h @@ -14,8 +14,8 @@ * limitations under the License. */ -#ifndef ANDROID_SF_ISURFACE_COMPOSER_CLIENT_H -#define ANDROID_SF_ISURFACE_COMPOSER_CLIENT_H +#ifndef ANDROID_GUI_ISURFACE_COMPOSER_CLIENT_H +#define ANDROID_GUI_ISURFACE_COMPOSER_CLIENT_H #include <stdint.h> #include <sys/types.h> @@ -27,7 +27,7 @@ #include <ui/PixelFormat.h> -#include <surfaceflinger/ISurface.h> +#include <gui/ISurface.h> namespace android { @@ -81,4 +81,4 @@ public: }; // namespace android -#endif // ANDROID_SF_ISURFACE_COMPOSER_CLIENT_H +#endif // ANDROID_GUI_ISURFACE_COMPOSER_CLIENT_H diff --git a/include/surfaceflinger/Surface.h b/include/gui/Surface.h index 0460bbd35a..1f90c595aa 100644 --- a/include/surfaceflinger/Surface.h +++ b/include/gui/Surface.h @@ -14,8 +14,8 @@ * limitations under the License. */ -#ifndef ANDROID_SF_SURFACE_H -#define ANDROID_SF_SURFACE_H +#ifndef ANDROID_GUI_SURFACE_H +#define ANDROID_GUI_SURFACE_H #include <stdint.h> #include <sys/types.h> @@ -26,12 +26,10 @@ #include <ui/PixelFormat.h> #include <ui/Region.h> -#include <ui/egl/android_natives.h> #include <gui/SurfaceTextureClient.h> - -#include <surfaceflinger/ISurface.h> -#include <surfaceflinger/ISurfaceComposerClient.h> +#include <gui/ISurface.h> +#include <gui/ISurfaceComposerClient.h> #define ANDROID_VIEW_SURFACE_JNI_ID "mNativeSurface" @@ -174,4 +172,4 @@ private: }; // namespace android -#endif // ANDROID_SF_SURFACE_H +#endif // ANDROID_GUI_SURFACE_H diff --git a/include/surfaceflinger/SurfaceComposerClient.h b/include/gui/SurfaceComposerClient.h index 99affdae64..d971031c01 100644 --- a/include/surfaceflinger/SurfaceComposerClient.h +++ b/include/gui/SurfaceComposerClient.h @@ -14,8 +14,8 @@ * limitations under the License. */ -#ifndef ANDROID_SF_SURFACE_COMPOSER_CLIENT_H -#define ANDROID_SF_SURFACE_COMPOSER_CLIENT_H +#ifndef ANDROID_GUI_SURFACE_COMPOSER_CLIENT_H +#define ANDROID_GUI_SURFACE_COMPOSER_CLIENT_H #include <stdint.h> #include <sys/types.h> @@ -29,7 +29,7 @@ #include <ui/PixelFormat.h> -#include <surfaceflinger/Surface.h> +#include <gui/Surface.h> namespace android { @@ -174,4 +174,4 @@ public: // --------------------------------------------------------------------------- }; // namespace android -#endif // ANDROID_SF_SURFACE_COMPOSER_CLIENT_H +#endif // ANDROID_GUI_SURFACE_COMPOSER_CLIENT_H diff --git a/include/gui/SurfaceTextureClient.h b/include/gui/SurfaceTextureClient.h index 971a1b80dc..aa7fe48a52 100644 --- a/include/gui/SurfaceTextureClient.h +++ b/include/gui/SurfaceTextureClient.h @@ -20,7 +20,7 @@ #include <gui/ISurfaceTexture.h> #include <gui/SurfaceTexture.h> -#include <ui/egl/android_natives.h> +#include <ui/ANativeObjectBase.h> #include <ui/Region.h> #include <utils/RefBase.h> @@ -31,7 +31,7 @@ namespace android { class Surface; class SurfaceTextureClient - : public EGLNativeBase<ANativeWindow, SurfaceTextureClient, RefBase> + : public ANativeObjectBase<ANativeWindow, SurfaceTextureClient, RefBase> { public: SurfaceTextureClient(const sp<ISurfaceTexture>& surfaceTexture); diff --git a/include/private/surfaceflinger/LayerState.h b/include/private/gui/LayerState.h index 3eb5c99f6f..ca277e02b9 100644 --- a/include/private/surfaceflinger/LayerState.h +++ b/include/private/gui/LayerState.h @@ -23,8 +23,7 @@ #include <utils/Errors.h> #include <ui/Region.h> - -#include <surfaceflinger/ISurface.h> +#include <gui/ISurface.h> namespace android { diff --git a/include/private/surfaceflinger/SharedBufferStack.h b/include/private/gui/SharedBufferStack.h index 0da03d1343..0da03d1343 100644 --- a/include/private/surfaceflinger/SharedBufferStack.h +++ b/include/private/gui/SharedBufferStack.h diff --git a/include/private/opengles/gl_context.h b/include/private/opengles/gl_context.h deleted file mode 100644 index 6b1fa77028..0000000000 --- a/include/private/opengles/gl_context.h +++ /dev/null @@ -1,640 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef ANDROID_OPENGLES_CONTEXT_H -#define ANDROID_OPENGLES_CONTEXT_H - -#include <stdint.h> -#include <stddef.h> -#include <sys/types.h> -#include <pthread.h> -#ifdef HAVE_ANDROID_OS -#include <bionic_tls.h> -#endif - -#include <private/pixelflinger/ggl_context.h> -#include <hardware/gralloc.h> - -#include <GLES/gl.h> -#include <GLES/glext.h> - -namespace android { - - -const unsigned int OGLES_NUM_COMPRESSED_TEXTURE_FORMATS = 10 -#ifdef GL_OES_compressed_ETC1_RGB8_texture - + 1 -#endif - ; - -class EGLTextureObject; -class EGLSurfaceManager; -class EGLBufferObjectManager; - -namespace gl { - -struct ogles_context_t; -struct matrixx_t; -struct transform_t; -struct buffer_t; - -ogles_context_t* getGlContext(); - -template<typename T> -static inline void swap(T& a, T& b) { - T t(a); a = b; b = t; -} -template<typename T> -inline T max(T a, T b) { - return a<b ? b : a; -} -template<typename T> -inline T max(T a, T b, T c) { - return max(a, max(b, c)); -} -template<typename T> -inline T min(T a, T b) { - return a<b ? a : b; -} -template<typename T> -inline T min(T a, T b, T c) { - return min(a, min(b, c)); -} -template<typename T> -inline T min(T a, T b, T c, T d) { - return min(min(a,b), min(c,d)); -} - -// ---------------------------------------------------------------------------- -// vertices -// ---------------------------------------------------------------------------- - -struct vec3_t { - union { - struct { GLfixed x, y, z; }; - struct { GLfixed r, g, b; }; - struct { GLfixed S, T, R; }; - GLfixed v[3]; - }; -}; - -struct vec4_t { - union { - struct { GLfixed x, y, z, w; }; - struct { GLfixed r, g, b, a; }; - struct { GLfixed S, T, R, Q; }; - GLfixed v[4]; - }; -}; - -struct vertex_t { - enum { - // these constant matter for our clipping - CLIP_L = 0x0001, // clipping flags - CLIP_R = 0x0002, - CLIP_B = 0x0004, - CLIP_T = 0x0008, - CLIP_N = 0x0010, - CLIP_F = 0x0020, - - EYE = 0x0040, - RESERVED = 0x0080, - - USER_CLIP_0 = 0x0100, // user clipping flags - USER_CLIP_1 = 0x0200, - USER_CLIP_2 = 0x0400, - USER_CLIP_3 = 0x0800, - USER_CLIP_4 = 0x1000, - USER_CLIP_5 = 0x2000, - - LIT = 0x4000, // lighting has been applied - TT = 0x8000, // texture coords transformed - - FRUSTUM_CLIP_ALL= 0x003F, - USER_CLIP_ALL = 0x3F00, - CLIP_ALL = 0x3F3F, - }; - - // the fields below are arranged to minimize d-cache usage - // we group together, by cache-line, the fields most likely to be used - - union { - vec4_t obj; - vec4_t eye; - }; - vec4_t clip; - - uint32_t flags; - size_t index; // cache tag, and vertex index - GLfixed fog; - uint8_t locked; - uint8_t mru; - uint8_t reserved[2]; - vec4_t window; - - vec4_t color; - vec4_t texture[GGL_TEXTURE_UNIT_COUNT]; - uint32_t reserved1[4]; - - inline void clear() { - flags = index = locked = mru = 0; - } -}; - -struct point_size_t { - GGLcoord size; - GLboolean smooth; -}; - -struct line_width_t { - GGLcoord width; - GLboolean smooth; -}; - -struct polygon_offset_t { - GLfixed factor; - GLfixed units; - GLboolean enable; -}; - -// ---------------------------------------------------------------------------- -// arrays -// ---------------------------------------------------------------------------- - -struct array_t { - typedef void (*fetcher_t)(ogles_context_t*, GLfixed*, const GLvoid*); - fetcher_t fetch; - GLvoid const* physical_pointer; - GLint size; - GLsizei stride; - GLvoid const* pointer; - buffer_t const* bo; - uint16_t type; - GLboolean enable; - GLboolean pad; - GLsizei bounds; - void init(GLint, GLenum, GLsizei, const GLvoid *, const buffer_t*, GLsizei); - inline void resolve(); - inline const GLubyte* element(GLint i) const { - return (const GLubyte*)physical_pointer + i * stride; - } -}; - -struct array_machine_t { - array_t vertex; - array_t normal; - array_t color; - array_t texture[GGL_TEXTURE_UNIT_COUNT]; - uint8_t activeTexture; - uint8_t tmu; - uint16_t cull; - uint32_t flags; - GLenum indicesType; - buffer_t const* array_buffer; - buffer_t const* element_array_buffer; - - void (*compileElements)(ogles_context_t*, vertex_t*, GLint, GLsizei); - void (*compileElement)(ogles_context_t*, vertex_t*, GLint); - - void (*mvp_transform)(transform_t const*, vec4_t*, vec4_t const*); - void (*mv_transform)(transform_t const*, vec4_t*, vec4_t const*); - void (*tex_transform[2])(transform_t const*, vec4_t*, vec4_t const*); - void (*perspective)(ogles_context_t*c, vertex_t* v); - void (*clipVertex)(ogles_context_t* c, vertex_t* nv, - GGLfixed t, const vertex_t* s, const vertex_t* p); - void (*clipEye)(ogles_context_t* c, vertex_t* nv, - GGLfixed t, const vertex_t* s, const vertex_t* p); -}; - -struct vertex_cache_t { - enum { - // must be at least 4 - // 3 vertice for triangles - // or 2 + 2 for indexed triangles w/ cache contention - VERTEX_BUFFER_SIZE = 8, - // must be a power of two and at least 3 - VERTEX_CACHE_SIZE = 64, // 8 KB - - INDEX_BITS = 16, - INDEX_MASK = ((1LU<<INDEX_BITS)-1), - INDEX_SEQ = 1LU<<INDEX_BITS, - }; - vertex_t* vBuffer; - vertex_t* vCache; - uint32_t sequence; - void* base; - uint32_t total; - uint32_t misses; - int64_t startTime; - void init(); - void uninit(); - void clear(); - void dump_stats(GLenum mode); -}; - -// ---------------------------------------------------------------------------- -// fog -// ---------------------------------------------------------------------------- - -struct fog_t { - GLfixed density; - GLfixed start; - GLfixed end; - GLfixed invEndMinusStart; - GLenum mode; - GLfixed (*fog)(ogles_context_t* c, GLfixed z); -}; - -// ---------------------------------------------------------------------------- -// user clip planes -// ---------------------------------------------------------------------------- - -const unsigned int OGLES_MAX_CLIP_PLANES = 6; - -struct clip_plane_t { - vec4_t equation; -}; - -struct user_clip_planes_t { - clip_plane_t plane[OGLES_MAX_CLIP_PLANES]; - uint32_t enable; -}; - -// ---------------------------------------------------------------------------- -// lighting -// ---------------------------------------------------------------------------- - -const unsigned int OGLES_MAX_LIGHTS = 8; - -struct light_t { - vec4_t ambient; - vec4_t diffuse; - vec4_t specular; - vec4_t implicitAmbient; - vec4_t implicitDiffuse; - vec4_t implicitSpecular; - vec4_t position; // position in eye space - vec4_t objPosition; - vec4_t normalizedObjPosition; - vec4_t spotDir; - vec4_t normalizedSpotDir; - GLfixed spotExp; - GLfixed spotCutoff; - GLfixed spotCutoffCosine; - GLfixed attenuation[3]; - GLfixed rConstAttenuation; - GLboolean enable; -}; - -struct material_t { - vec4_t ambient; - vec4_t diffuse; - vec4_t specular; - vec4_t emission; - GLfixed shininess; -}; - -struct light_model_t { - vec4_t ambient; - GLboolean twoSide; -}; - -struct color_material_t { - GLenum face; - GLenum mode; - GLboolean enable; -}; - -struct lighting_t { - light_t lights[OGLES_MAX_LIGHTS]; - material_t front; - light_model_t lightModel; - color_material_t colorMaterial; - vec4_t implicitSceneEmissionAndAmbient; - vec4_t objViewer; - uint32_t enabledLights; - GLboolean enable; - GLenum shadeModel; - typedef void (*light_fct_t)(ogles_context_t*, vertex_t*); - void (*lightVertex)(ogles_context_t* c, vertex_t* v); - void (*lightTriangle)(ogles_context_t* c, - vertex_t* v0, vertex_t* v1, vertex_t* v2); -}; - -struct culling_t { - GLenum cullFace; - GLenum frontFace; - GLboolean enable; -}; - -// ---------------------------------------------------------------------------- -// textures -// ---------------------------------------------------------------------------- - -struct texture_unit_t { - GLuint name; - EGLTextureObject* texture; - uint8_t dirty; -}; - -struct texture_state_t -{ - texture_unit_t tmu[GGL_TEXTURE_UNIT_COUNT]; - int active; // active tmu - EGLTextureObject* defaultTexture; - GGLContext* ggl; - uint8_t packAlignment; - uint8_t unpackAlignment; -}; - -// ---------------------------------------------------------------------------- -// transformation and matrices -// ---------------------------------------------------------------------------- - -struct matrixf_t; - -struct matrixx_t { - GLfixed m[16]; - void load(const matrixf_t& rhs); -}; - -struct matrix_stack_t; - - -struct matrixf_t { - void loadIdentity(); - void load(const matrixf_t& rhs); - - inline GLfloat* editElements() { return m; } - inline GLfloat const* elements() const { return m; } - - void set(const GLfixed* rhs); - void set(const GLfloat* rhs); - - static void multiply(matrixf_t& r, - const matrixf_t& lhs, const matrixf_t& rhs); - - void dump(const char* what); - -private: - friend struct matrix_stack_t; - GLfloat m[16]; - void load(const GLfixed* rhs); - void load(const GLfloat* rhs); - void multiply(const matrixf_t& rhs); - void translate(GLfloat x, GLfloat y, GLfloat z); - void scale(GLfloat x, GLfloat y, GLfloat z); - void rotate(GLfloat a, GLfloat x, GLfloat y, GLfloat z); -}; - -enum { - OP_IDENTITY = 0x00, - OP_TRANSLATE = 0x01, - OP_UNIFORM_SCALE = 0x02, - OP_SCALE = 0x05, - OP_ROTATE = 0x08, - OP_SKEW = 0x10, - OP_ALL = 0x1F -}; - -struct transform_t { - enum { - FLAGS_2D_PROJECTION = 0x1 - }; - matrixx_t matrix; - uint32_t flags; - uint32_t ops; - - union { - struct { - void (*point2)(transform_t const* t, vec4_t*, vec4_t const*); - void (*point3)(transform_t const* t, vec4_t*, vec4_t const*); - void (*point4)(transform_t const* t, vec4_t*, vec4_t const*); - }; - void (*pointv[3])(transform_t const* t, vec4_t*, vec4_t const*); - }; - - void loadIdentity(); - void picker(); - void dump(const char* what); -}; - -struct mvui_transform_t : public transform_t -{ - void picker(); -}; - -struct matrix_stack_t { - enum { - DO_PICKER = 0x1, - DO_FLOAT_TO_FIXED = 0x2 - }; - transform_t transform; - uint8_t maxDepth; - uint8_t depth; - uint8_t dirty; - uint8_t reserved; - matrixf_t *stack; - uint8_t *ops; - void init(int depth); - void uninit(); - void loadIdentity(); - void load(const GLfixed* rhs); - void load(const GLfloat* rhs); - void multiply(const matrixf_t& rhs); - void translate(GLfloat x, GLfloat y, GLfloat z); - void scale(GLfloat x, GLfloat y, GLfloat z); - void rotate(GLfloat a, GLfloat x, GLfloat y, GLfloat z); - GLint push(); - GLint pop(); - void validate(); - matrixf_t& top() { return stack[depth]; } - const matrixf_t& top() const { return stack[depth]; } - uint32_t top_ops() const { return ops[depth]; } - inline bool isRigidBody() const { - return !(ops[depth] & ~(OP_TRANSLATE|OP_UNIFORM_SCALE|OP_ROTATE)); - } -}; - -struct vp_transform_t { - transform_t transform; - matrixf_t matrix; - GLfloat zNear; - GLfloat zFar; - void loadIdentity(); -}; - -struct transform_state_t { - enum { - MODELVIEW = 0x01, - PROJECTION = 0x02, - VIEWPORT = 0x04, - TEXTURE = 0x08, - MVUI = 0x10, - MVIT = 0x20, - MVP = 0x40, - }; - matrix_stack_t *current; - matrix_stack_t modelview; - matrix_stack_t projection; - matrix_stack_t texture[GGL_TEXTURE_UNIT_COUNT]; - - // modelview * projection - transform_t mvp __attribute__((aligned(32))); - // viewport transformation - vp_transform_t vpt __attribute__((aligned(32))); - // same for 4-D vertices - transform_t mvp4; - // full modelview inverse transpose - transform_t mvit4; - // upper 3x3 of mv-inverse-transpose (for normals) - mvui_transform_t mvui; - - GLenum matrixMode; - GLenum rescaleNormals; - uint32_t dirty; - void invalidate(); - void update_mvp(); - void update_mvit(); - void update_mvui(); -}; - -struct viewport_t { - GLint x; - GLint y; - GLsizei w; - GLsizei h; - struct { - GLint x; - GLint y; - } surfaceport; - struct { - GLint x; - GLint y; - GLsizei w; - GLsizei h; - } scissor; -}; - -// ---------------------------------------------------------------------------- -// Lerping -// ---------------------------------------------------------------------------- - -struct compute_iterators_t -{ - void initTriangle( - vertex_t const* v0, - vertex_t const* v1, - vertex_t const* v2); - - void initLine( - vertex_t const* v0, - vertex_t const* v1); - - inline void initLerp(vertex_t const* v0, uint32_t enables); - - int iteratorsScale(int32_t it[3], - int32_t c0, int32_t c1, int32_t c2) const; - - void iterators1616(GGLfixed it[3], - GGLfixed c0, GGLfixed c1, GGLfixed c2) const; - - void iterators0032(int32_t it[3], - int32_t c0, int32_t c1, int32_t c2) const; - - void iterators0032(int64_t it[3], - int32_t c0, int32_t c1, int32_t c2) const; - - GGLcoord area() const { return m_area; } - -private: - // don't change order of members here -- used by iterators.S - GGLcoord m_dx01, m_dy10, m_dx20, m_dy02; - GGLcoord m_x0, m_y0; - GGLcoord m_area; - uint8_t m_scale; - uint8_t m_area_scale; - uint8_t m_reserved[2]; - -}; - -// ---------------------------------------------------------------------------- -// state -// ---------------------------------------------------------------------------- - -#ifdef HAVE_ANDROID_OS - // We have a dedicated TLS slot in bionic - inline void setGlThreadSpecific(ogles_context_t *value) { - ((uint32_t *)__get_tls())[TLS_SLOT_OPENGL] = (uint32_t)value; - } - inline ogles_context_t* getGlThreadSpecific() { - return (ogles_context_t *)(((unsigned *)__get_tls())[TLS_SLOT_OPENGL]); - } -#else - extern pthread_key_t gGLKey; - inline void setGlThreadSpecific(ogles_context_t *value) { - pthread_setspecific(gGLKey, value); - } - inline ogles_context_t* getGlThreadSpecific() { - return static_cast<ogles_context_t*>(pthread_getspecific(gGLKey)); - } -#endif - - -struct prims_t { - typedef ogles_context_t* GL; - void (*renderPoint)(GL, vertex_t*); - void (*renderLine)(GL, vertex_t*, vertex_t*); - void (*renderTriangle)(GL, vertex_t*, vertex_t*, vertex_t*); -}; - -struct ogles_context_t { - context_t rasterizer; - array_machine_t arrays __attribute__((aligned(32))); - texture_state_t textures; - transform_state_t transforms; - vertex_cache_t vc; - prims_t prims; - culling_t cull; - lighting_t lighting; - user_clip_planes_t clipPlanes; - compute_iterators_t lerp; __attribute__((aligned(32))); - vertex_t current; - vec4_t currentColorClamped; - vec3_t currentNormal; - viewport_t viewport; - point_size_t point; - line_width_t line; - polygon_offset_t polygonOffset; - fog_t fog; - uint32_t perspective : 1; - uint32_t transformTextures : 1; - EGLSurfaceManager* surfaceManager; - EGLBufferObjectManager* bufferObjectManager; - - GLenum error; - - static inline ogles_context_t* get() { - return getGlThreadSpecific(); - } - -}; - -}; // namespace gl -}; // namespace android - -#endif // ANDROID_OPENGLES_CONTEXT_H - diff --git a/include/private/ui/android_natives_priv.h b/include/private/ui/android_natives_priv.h deleted file mode 100644 index 6b9f524dcf..0000000000 --- a/include/private/ui/android_natives_priv.h +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright (C) 2009 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include <ui/android_native_buffer.h> diff --git a/include/ui/egl/android_natives.h b/include/ui/ANativeObjectBase.h index 9ac50a5a39..76e850fa27 100644 --- a/include/ui/egl/android_natives.h +++ b/include/ui/ANativeObjectBase.h @@ -22,8 +22,7 @@ #include <hardware/gralloc.h> #include <system/window.h> -// FIXME: remove this header, it's for legacy use. native_window is pulled from frameworks/base/native/include/android/ -#include <android/native_window.h> + // --------------------------------------------------------------------------- /* FIXME: this is legacy for pixmaps */ @@ -52,11 +51,11 @@ typedef struct egl_native_pixmap_t namespace android { /* - * This helper class turns an EGL android_native_xxx type into a C++ + * This helper class turns a ANativeXXX object type into a C++ * reference-counted object; with proper type conversions. */ template <typename NATIVE_TYPE, typename TYPE, typename REF> -class EGLNativeBase : public NATIVE_TYPE, public REF +class ANativeObjectBase : public NATIVE_TYPE, public REF { public: // Disambiguate between the incStrong in REF and NATIVE_TYPE @@ -68,8 +67,8 @@ public: } protected: - typedef EGLNativeBase<NATIVE_TYPE, TYPE, REF> BASE; - EGLNativeBase() : NATIVE_TYPE(), REF() { + typedef ANativeObjectBase<NATIVE_TYPE, TYPE, REF> BASE; + ANativeObjectBase() : NATIVE_TYPE(), REF() { NATIVE_TYPE::common.incRef = incRef; NATIVE_TYPE::common.decRef = decRef; } @@ -86,11 +85,11 @@ protected: return getSelf(reinterpret_cast<NATIVE_TYPE const*>(base)); } static void incRef(android_native_base_t* base) { - EGLNativeBase* self = getSelf(base); + ANativeObjectBase* self = getSelf(base); self->incStrong(self); } static void decRef(android_native_base_t* base) { - EGLNativeBase* self = getSelf(base); + ANativeObjectBase* self = getSelf(base); self->decStrong(self); } }; diff --git a/include/ui/EGLNativeSurface.h b/include/ui/EGLNativeSurface.h deleted file mode 100644 index 7964e7c6ba..0000000000 --- a/include/ui/EGLNativeSurface.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2007 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef ANDROID_EGL_NATIVE_SURFACE_H -#define ANDROID_EGL_NATIVE_SURFACE_H - -#include <stdint.h> -#include <sys/types.h> - -#include <cutils/atomic.h> -#include <utils/RefBase.h> - -#include <EGL/eglnatives.h> - -// --------------------------------------------------------------------------- -namespace android { -// --------------------------------------------------------------------------- - -template <class TYPE> -class EGLNativeSurface : public egl_native_window_t, public LightRefBase<TYPE> -{ -public: - EGLNativeSurface() { - memset(egl_native_window_t::reserved, 0, - sizeof(egl_native_window_t::reserved)); - memset(egl_native_window_t::reserved_proc, 0, - sizeof(egl_native_window_t::reserved_proc)); - memset(egl_native_window_t::oem, 0, - sizeof(egl_native_window_t::oem)); - } -protected: - EGLNativeSurface& operator = (const EGLNativeSurface& rhs); - EGLNativeSurface(const EGLNativeSurface& rhs); - inline ~EGLNativeSurface() { }; -}; - -// --------------------------------------------------------------------------- -}; // namespace android -// --------------------------------------------------------------------------- - -#endif // ANDROID_EGL_SURFACE_H - diff --git a/include/ui/EGLUtils.h b/include/ui/EGLUtils.h deleted file mode 100644 index a5bff81239..0000000000 --- a/include/ui/EGLUtils.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2009 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -#ifndef ANDROID_UI_EGLUTILS_H -#define ANDROID_UI_EGLUTILS_H - -#include <utils/Errors.h> -#include <ui/PixelFormat.h> -#include <EGL/egl.h> - - -// ---------------------------------------------------------------------------- -namespace android { -// ---------------------------------------------------------------------------- - -class EGLUtils -{ -public: - - static const char *strerror(EGLint err); - - static status_t selectConfigForPixelFormat( - EGLDisplay dpy, - EGLint const* attrs, - PixelFormat format, - EGLConfig* outConfig); - - static status_t selectConfigForNativeWindow( - EGLDisplay dpy, - EGLint const* attrs, - EGLNativeWindowType window, - EGLConfig* outConfig); -}; - -// ---------------------------------------------------------------------------- -}; // namespace android -// ---------------------------------------------------------------------------- - -#endif /* ANDROID_UI_EGLUTILS_H */ diff --git a/include/ui/FramebufferNativeWindow.h b/include/ui/FramebufferNativeWindow.h index 302d01239e..b202b95b1c 100644 --- a/include/ui/FramebufferNativeWindow.h +++ b/include/ui/FramebufferNativeWindow.h @@ -24,11 +24,9 @@ #include <utils/threads.h> #include <utils/String8.h> -#include <ui/Rect.h> - -#include <pixelflinger/pixelflinger.h> -#include <ui/egl/android_natives.h> +#include <ui/ANativeObjectBase.h> +#include <ui/Rect.h> #define NUM_FRAME_BUFFERS 2 @@ -44,7 +42,7 @@ class NativeBuffer; // --------------------------------------------------------------------------- class FramebufferNativeWindow - : public EGLNativeBase< + : public ANativeObjectBase< ANativeWindow, FramebufferNativeWindow, LightRefBase<FramebufferNativeWindow> > diff --git a/include/ui/GraphicBuffer.h b/include/ui/GraphicBuffer.h index 6ab01f4c98..f318cd899f 100644 --- a/include/ui/GraphicBuffer.h +++ b/include/ui/GraphicBuffer.h @@ -20,11 +20,11 @@ #include <stdint.h> #include <sys/types.h> -#include <ui/android_native_buffer.h> +#include <ui/ANativeObjectBase.h> #include <ui/PixelFormat.h> #include <ui/Rect.h> #include <utils/Flattenable.h> -#include <pixelflinger/pixelflinger.h> + struct ANativeWindowBuffer; @@ -37,7 +37,7 @@ class GraphicBufferMapper; // =========================================================================== class GraphicBuffer - : public EGLNativeBase< + : public ANativeObjectBase< ANativeWindowBuffer, GraphicBuffer, LightRefBase<GraphicBuffer> >, public Flattenable @@ -93,7 +93,6 @@ public: status_t lock(uint32_t usage, void** vaddr); status_t lock(uint32_t usage, const Rect& rect, void** vaddr); - status_t lock(GGLSurface* surface, uint32_t usage); status_t unlock(); ANativeWindowBuffer* getNativeBuffer() const; diff --git a/include/ui/Input.h b/include/ui/Input.h deleted file mode 100644 index c2cbe1d6e8..0000000000 --- a/include/ui/Input.h +++ /dev/null @@ -1,897 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef _UI_INPUT_H -#define _UI_INPUT_H - -/** - * Native input event structures. - */ - -#include <android/input.h> -#include <utils/Vector.h> -#include <utils/KeyedVector.h> -#include <utils/Timers.h> -#include <utils/RefBase.h> -#include <utils/String8.h> -#include <utils/BitSet.h> - -#ifdef HAVE_ANDROID_OS -class SkMatrix; -#endif - -/* - * Additional private constants not defined in ndk/ui/input.h. - */ -enum { - /* Private control to determine when an app is tracking a key sequence. */ - AKEY_EVENT_FLAG_START_TRACKING = 0x40000000, - - /* Key event is inconsistent with previously sent key events. */ - AKEY_EVENT_FLAG_TAINTED = 0x80000000, -}; - -enum { - /* Motion event is inconsistent with previously sent motion events. */ - AMOTION_EVENT_FLAG_TAINTED = 0x80000000, -}; - -enum { - /* - * Indicates that an input device has switches. - * This input source flag is hidden from the API because switches are only used by the system - * and applications have no way to interact with them. - */ - AINPUT_SOURCE_SWITCH = 0x80000000, -}; - -/* - * SystemUiVisibility constants from View. - */ -enum { - ASYSTEM_UI_VISIBILITY_STATUS_BAR_VISIBLE = 0, - ASYSTEM_UI_VISIBILITY_STATUS_BAR_HIDDEN = 0x00000001, -}; - -/* - * Maximum number of pointers supported per motion event. - * Smallest number of pointers is 1. - * (We want at least 10 but some touch controllers obstensibly configured for 10 pointers - * will occasionally emit 11. There is not much harm making this constant bigger.) - */ -#define MAX_POINTERS 16 - -/* - * Maximum pointer id value supported in a motion event. - * Smallest pointer id is 0. - * (This is limited by our use of BitSet32 to track pointer assignments.) - */ -#define MAX_POINTER_ID 31 - -/* - * Declare a concrete type for the NDK's input event forward declaration. - */ -struct AInputEvent { - virtual ~AInputEvent() { } -}; - -/* - * Declare a concrete type for the NDK's input device forward declaration. - */ -struct AInputDevice { - virtual ~AInputDevice() { } -}; - - -namespace android { - -#ifdef HAVE_ANDROID_OS -class Parcel; -#endif - -/* - * Flags that flow alongside events in the input dispatch system to help with certain - * policy decisions such as waking from device sleep. - * - * These flags are also defined in frameworks/base/core/java/android/view/WindowManagerPolicy.java. - */ -enum { - /* These flags originate in RawEvents and are generally set in the key map. - * NOTE: If you edit these flags, also edit labels in KeycodeLabels.h. */ - - POLICY_FLAG_WAKE = 0x00000001, - POLICY_FLAG_WAKE_DROPPED = 0x00000002, - POLICY_FLAG_SHIFT = 0x00000004, - POLICY_FLAG_CAPS_LOCK = 0x00000008, - POLICY_FLAG_ALT = 0x00000010, - POLICY_FLAG_ALT_GR = 0x00000020, - POLICY_FLAG_MENU = 0x00000040, - POLICY_FLAG_LAUNCHER = 0x00000080, - POLICY_FLAG_VIRTUAL = 0x00000100, - POLICY_FLAG_FUNCTION = 0x00000200, - - POLICY_FLAG_RAW_MASK = 0x0000ffff, - - /* These flags are set by the input dispatcher. */ - - // Indicates that the input event was injected. - POLICY_FLAG_INJECTED = 0x01000000, - - // Indicates that the input event is from a trusted source such as a directly attached - // input device or an application with system-wide event injection permission. - POLICY_FLAG_TRUSTED = 0x02000000, - - // Indicates that the input event has passed through an input filter. - POLICY_FLAG_FILTERED = 0x04000000, - - // Disables automatic key repeating behavior. - POLICY_FLAG_DISABLE_KEY_REPEAT = 0x08000000, - - /* These flags are set by the input reader policy as it intercepts each event. */ - - // Indicates that the screen was off when the event was received and the event - // should wake the device. - POLICY_FLAG_WOKE_HERE = 0x10000000, - - // Indicates that the screen was dim when the event was received and the event - // should brighten the device. - POLICY_FLAG_BRIGHT_HERE = 0x20000000, - - // Indicates that the event should be dispatched to applications. - // The input event should still be sent to the InputDispatcher so that it can see all - // input events received include those that it will not deliver. - POLICY_FLAG_PASS_TO_USER = 0x40000000, -}; - -/* - * Describes the basic configuration of input devices that are present. - */ -struct InputConfiguration { - enum { - TOUCHSCREEN_UNDEFINED = 0, - TOUCHSCREEN_NOTOUCH = 1, - TOUCHSCREEN_STYLUS = 2, - TOUCHSCREEN_FINGER = 3 - }; - - enum { - KEYBOARD_UNDEFINED = 0, - KEYBOARD_NOKEYS = 1, - KEYBOARD_QWERTY = 2, - KEYBOARD_12KEY = 3 - }; - - enum { - NAVIGATION_UNDEFINED = 0, - NAVIGATION_NONAV = 1, - NAVIGATION_DPAD = 2, - NAVIGATION_TRACKBALL = 3, - NAVIGATION_WHEEL = 4 - }; - - int32_t touchScreen; - int32_t keyboard; - int32_t navigation; -}; - -/* - * Pointer coordinate data. - */ -struct PointerCoords { - enum { MAX_AXES = 14 }; // 14 so that sizeof(PointerCoords) == 64 - - // Bitfield of axes that are present in this structure. - uint64_t bits; - - // Values of axes that are stored in this structure packed in order by axis id - // for each axis that is present in the structure according to 'bits'. - float values[MAX_AXES]; - - inline void clear() { - bits = 0; - } - - float getAxisValue(int32_t axis) const; - status_t setAxisValue(int32_t axis, float value); - - void scale(float scale); - - inline float getX() const { - return getAxisValue(AMOTION_EVENT_AXIS_X); - } - - inline float getY() const { - return getAxisValue(AMOTION_EVENT_AXIS_Y); - } - -#ifdef HAVE_ANDROID_OS - status_t readFromParcel(Parcel* parcel); - status_t writeToParcel(Parcel* parcel) const; -#endif - - bool operator==(const PointerCoords& other) const; - inline bool operator!=(const PointerCoords& other) const { - return !(*this == other); - } - - void copyFrom(const PointerCoords& other); - -private: - void tooManyAxes(int axis); -}; - -/* - * Pointer property data. - */ -struct PointerProperties { - // The id of the pointer. - int32_t id; - - // The pointer tool type. - int32_t toolType; - - inline void clear() { - id = -1; - toolType = 0; - } - - bool operator==(const PointerProperties& other) const; - inline bool operator!=(const PointerProperties& other) const { - return !(*this == other); - } - - void copyFrom(const PointerProperties& other); -}; - -/* - * Input events. - */ -class InputEvent : public AInputEvent { -public: - virtual ~InputEvent() { } - - virtual int32_t getType() const = 0; - - inline int32_t getDeviceId() const { return mDeviceId; } - - inline int32_t getSource() const { return mSource; } - - inline void setSource(int32_t source) { mSource = source; } - -protected: - void initialize(int32_t deviceId, int32_t source); - void initialize(const InputEvent& from); - - int32_t mDeviceId; - int32_t mSource; -}; - -/* - * Key events. - */ -class KeyEvent : public InputEvent { -public: - virtual ~KeyEvent() { } - - virtual int32_t getType() const { return AINPUT_EVENT_TYPE_KEY; } - - inline int32_t getAction() const { return mAction; } - - inline int32_t getFlags() const { return mFlags; } - - inline int32_t getKeyCode() const { return mKeyCode; } - - inline int32_t getScanCode() const { return mScanCode; } - - inline int32_t getMetaState() const { return mMetaState; } - - inline int32_t getRepeatCount() const { return mRepeatCount; } - - inline nsecs_t getDownTime() const { return mDownTime; } - - inline nsecs_t getEventTime() const { return mEventTime; } - - // Return true if this event may have a default action implementation. - static bool hasDefaultAction(int32_t keyCode); - bool hasDefaultAction() const; - - // Return true if this event represents a system key. - static bool isSystemKey(int32_t keyCode); - bool isSystemKey() const; - - void initialize( - int32_t deviceId, - int32_t source, - int32_t action, - int32_t flags, - int32_t keyCode, - int32_t scanCode, - int32_t metaState, - int32_t repeatCount, - nsecs_t downTime, - nsecs_t eventTime); - void initialize(const KeyEvent& from); - -protected: - int32_t mAction; - int32_t mFlags; - int32_t mKeyCode; - int32_t mScanCode; - int32_t mMetaState; - int32_t mRepeatCount; - nsecs_t mDownTime; - nsecs_t mEventTime; -}; - -/* - * Motion events. - */ -class MotionEvent : public InputEvent { -public: - virtual ~MotionEvent() { } - - virtual int32_t getType() const { return AINPUT_EVENT_TYPE_MOTION; } - - inline int32_t getAction() const { return mAction; } - - inline int32_t getActionMasked() const { return mAction & AMOTION_EVENT_ACTION_MASK; } - - inline int32_t getActionIndex() const { - return (mAction & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK) - >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT; - } - - inline void setAction(int32_t action) { mAction = action; } - - inline int32_t getFlags() const { return mFlags; } - - inline void setFlags(int32_t flags) { mFlags = flags; } - - inline int32_t getEdgeFlags() const { return mEdgeFlags; } - - inline void setEdgeFlags(int32_t edgeFlags) { mEdgeFlags = edgeFlags; } - - inline int32_t getMetaState() const { return mMetaState; } - - inline void setMetaState(int32_t metaState) { mMetaState = metaState; } - - inline int32_t getButtonState() const { return mButtonState; } - - inline float getXOffset() const { return mXOffset; } - - inline float getYOffset() const { return mYOffset; } - - inline float getXPrecision() const { return mXPrecision; } - - inline float getYPrecision() const { return mYPrecision; } - - inline nsecs_t getDownTime() const { return mDownTime; } - - inline void setDownTime(nsecs_t downTime) { mDownTime = downTime; } - - inline size_t getPointerCount() const { return mPointerProperties.size(); } - - inline const PointerProperties* getPointerProperties(size_t pointerIndex) const { - return &mPointerProperties[pointerIndex]; - } - - inline int32_t getPointerId(size_t pointerIndex) const { - return mPointerProperties[pointerIndex].id; - } - - inline int32_t getToolType(size_t pointerIndex) const { - return mPointerProperties[pointerIndex].toolType; - } - - inline nsecs_t getEventTime() const { return mSampleEventTimes[getHistorySize()]; } - - const PointerCoords* getRawPointerCoords(size_t pointerIndex) const; - - float getRawAxisValue(int32_t axis, size_t pointerIndex) const; - - inline float getRawX(size_t pointerIndex) const { - return getRawAxisValue(AMOTION_EVENT_AXIS_X, pointerIndex); - } - - inline float getRawY(size_t pointerIndex) const { - return getRawAxisValue(AMOTION_EVENT_AXIS_Y, pointerIndex); - } - - float getAxisValue(int32_t axis, size_t pointerIndex) const; - - inline float getX(size_t pointerIndex) const { - return getAxisValue(AMOTION_EVENT_AXIS_X, pointerIndex); - } - - inline float getY(size_t pointerIndex) const { - return getAxisValue(AMOTION_EVENT_AXIS_Y, pointerIndex); - } - - inline float getPressure(size_t pointerIndex) const { - return getAxisValue(AMOTION_EVENT_AXIS_PRESSURE, pointerIndex); - } - - inline float getSize(size_t pointerIndex) const { - return getAxisValue(AMOTION_EVENT_AXIS_SIZE, pointerIndex); - } - - inline float getTouchMajor(size_t pointerIndex) const { - return getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR, pointerIndex); - } - - inline float getTouchMinor(size_t pointerIndex) const { - return getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR, pointerIndex); - } - - inline float getToolMajor(size_t pointerIndex) const { - return getAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR, pointerIndex); - } - - inline float getToolMinor(size_t pointerIndex) const { - return getAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR, pointerIndex); - } - - inline float getOrientation(size_t pointerIndex) const { - return getAxisValue(AMOTION_EVENT_AXIS_ORIENTATION, pointerIndex); - } - - inline size_t getHistorySize() const { return mSampleEventTimes.size() - 1; } - - inline nsecs_t getHistoricalEventTime(size_t historicalIndex) const { - return mSampleEventTimes[historicalIndex]; - } - - const PointerCoords* getHistoricalRawPointerCoords( - size_t pointerIndex, size_t historicalIndex) const; - - float getHistoricalRawAxisValue(int32_t axis, size_t pointerIndex, - size_t historicalIndex) const; - - inline float getHistoricalRawX(size_t pointerIndex, size_t historicalIndex) const { - return getHistoricalRawAxisValue( - AMOTION_EVENT_AXIS_X, pointerIndex, historicalIndex); - } - - inline float getHistoricalRawY(size_t pointerIndex, size_t historicalIndex) const { - return getHistoricalRawAxisValue( - AMOTION_EVENT_AXIS_Y, pointerIndex, historicalIndex); - } - - float getHistoricalAxisValue(int32_t axis, size_t pointerIndex, size_t historicalIndex) const; - - inline float getHistoricalX(size_t pointerIndex, size_t historicalIndex) const { - return getHistoricalAxisValue( - AMOTION_EVENT_AXIS_X, pointerIndex, historicalIndex); - } - - inline float getHistoricalY(size_t pointerIndex, size_t historicalIndex) const { - return getHistoricalAxisValue( - AMOTION_EVENT_AXIS_Y, pointerIndex, historicalIndex); - } - - inline float getHistoricalPressure(size_t pointerIndex, size_t historicalIndex) const { - return getHistoricalAxisValue( - AMOTION_EVENT_AXIS_PRESSURE, pointerIndex, historicalIndex); - } - - inline float getHistoricalSize(size_t pointerIndex, size_t historicalIndex) const { - return getHistoricalAxisValue( - AMOTION_EVENT_AXIS_SIZE, pointerIndex, historicalIndex); - } - - inline float getHistoricalTouchMajor(size_t pointerIndex, size_t historicalIndex) const { - return getHistoricalAxisValue( - AMOTION_EVENT_AXIS_TOUCH_MAJOR, pointerIndex, historicalIndex); - } - - inline float getHistoricalTouchMinor(size_t pointerIndex, size_t historicalIndex) const { - return getHistoricalAxisValue( - AMOTION_EVENT_AXIS_TOUCH_MINOR, pointerIndex, historicalIndex); - } - - inline float getHistoricalToolMajor(size_t pointerIndex, size_t historicalIndex) const { - return getHistoricalAxisValue( - AMOTION_EVENT_AXIS_TOOL_MAJOR, pointerIndex, historicalIndex); - } - - inline float getHistoricalToolMinor(size_t pointerIndex, size_t historicalIndex) const { - return getHistoricalAxisValue( - AMOTION_EVENT_AXIS_TOOL_MINOR, pointerIndex, historicalIndex); - } - - inline float getHistoricalOrientation(size_t pointerIndex, size_t historicalIndex) const { - return getHistoricalAxisValue( - AMOTION_EVENT_AXIS_ORIENTATION, pointerIndex, historicalIndex); - } - - ssize_t findPointerIndex(int32_t pointerId) const; - - void initialize( - int32_t deviceId, - int32_t source, - int32_t action, - int32_t flags, - int32_t edgeFlags, - int32_t metaState, - int32_t buttonState, - float xOffset, - float yOffset, - float xPrecision, - float yPrecision, - nsecs_t downTime, - nsecs_t eventTime, - size_t pointerCount, - const PointerProperties* pointerProperties, - const PointerCoords* pointerCoords); - - void copyFrom(const MotionEvent* other, bool keepHistory); - - void addSample( - nsecs_t eventTime, - const PointerCoords* pointerCoords); - - void offsetLocation(float xOffset, float yOffset); - - void scale(float scaleFactor); - -#ifdef HAVE_ANDROID_OS - void transform(const SkMatrix* matrix); - - status_t readFromParcel(Parcel* parcel); - status_t writeToParcel(Parcel* parcel) const; -#endif - - static bool isTouchEvent(int32_t source, int32_t action); - inline bool isTouchEvent() const { - return isTouchEvent(mSource, mAction); - } - - // Low-level accessors. - inline const PointerProperties* getPointerProperties() const { - return mPointerProperties.array(); - } - inline const nsecs_t* getSampleEventTimes() const { return mSampleEventTimes.array(); } - inline const PointerCoords* getSamplePointerCoords() const { - return mSamplePointerCoords.array(); - } - -protected: - int32_t mAction; - int32_t mFlags; - int32_t mEdgeFlags; - int32_t mMetaState; - int32_t mButtonState; - float mXOffset; - float mYOffset; - float mXPrecision; - float mYPrecision; - nsecs_t mDownTime; - Vector<PointerProperties> mPointerProperties; - Vector<nsecs_t> mSampleEventTimes; - Vector<PointerCoords> mSamplePointerCoords; -}; - -/* - * Input event factory. - */ -class InputEventFactoryInterface { -protected: - virtual ~InputEventFactoryInterface() { } - -public: - InputEventFactoryInterface() { } - - virtual KeyEvent* createKeyEvent() = 0; - virtual MotionEvent* createMotionEvent() = 0; -}; - -/* - * A simple input event factory implementation that uses a single preallocated instance - * of each type of input event that are reused for each request. - */ -class PreallocatedInputEventFactory : public InputEventFactoryInterface { -public: - PreallocatedInputEventFactory() { } - virtual ~PreallocatedInputEventFactory() { } - - virtual KeyEvent* createKeyEvent() { return & mKeyEvent; } - virtual MotionEvent* createMotionEvent() { return & mMotionEvent; } - -private: - KeyEvent mKeyEvent; - MotionEvent mMotionEvent; -}; - -/* - * Calculates the velocity of pointer movements over time. - */ -class VelocityTracker { -public: - // Default polynomial degree. (used by getVelocity) - static const uint32_t DEFAULT_DEGREE = 2; - - // Default sample horizon. (used by getVelocity) - // We don't use too much history by default since we want to react to quick - // changes in direction. - static const nsecs_t DEFAULT_HORIZON = 100 * 1000000; // 100 ms - - struct Position { - float x, y; - }; - - struct Estimator { - static const size_t MAX_DEGREE = 2; - - // Polynomial coefficients describing motion in X and Y. - float xCoeff[MAX_DEGREE + 1], yCoeff[MAX_DEGREE + 1]; - - // Polynomial degree (number of coefficients), or zero if no information is - // available. - uint32_t degree; - - // Confidence (coefficient of determination), between 0 (no fit) and 1 (perfect fit). - float confidence; - - inline void clear() { - degree = 0; - confidence = 0; - for (size_t i = 0; i <= MAX_DEGREE; i++) { - xCoeff[i] = 0; - yCoeff[i] = 0; - } - } - }; - - VelocityTracker(); - - // Resets the velocity tracker state. - void clear(); - - // Resets the velocity tracker state for specific pointers. - // Call this method when some pointers have changed and may be reusing - // an id that was assigned to a different pointer earlier. - void clearPointers(BitSet32 idBits); - - // Adds movement information for a set of pointers. - // The idBits bitfield specifies the pointer ids of the pointers whose positions - // are included in the movement. - // The positions array contains position information for each pointer in order by - // increasing id. Its size should be equal to the number of one bits in idBits. - void addMovement(nsecs_t eventTime, BitSet32 idBits, const Position* positions); - - // Adds movement information for all pointers in a MotionEvent, including historical samples. - void addMovement(const MotionEvent* event); - - // Gets the velocity of the specified pointer id in position units per second. - // Returns false and sets the velocity components to zero if there is - // insufficient movement information for the pointer. - bool getVelocity(uint32_t id, float* outVx, float* outVy) const; - - // Gets a quadratic estimator for the movements of the specified pointer id. - // Returns false and clears the estimator if there is no information available - // about the pointer. - bool getEstimator(uint32_t id, uint32_t degree, nsecs_t horizon, - Estimator* outEstimator) const; - - // Gets the active pointer id, or -1 if none. - inline int32_t getActivePointerId() const { return mActivePointerId; } - - // Gets a bitset containing all pointer ids from the most recent movement. - inline BitSet32 getCurrentPointerIdBits() const { return mMovements[mIndex].idBits; } - -private: - // Number of samples to keep. - static const uint32_t HISTORY_SIZE = 20; - - struct Movement { - nsecs_t eventTime; - BitSet32 idBits; - Position positions[MAX_POINTERS]; - - inline const Position& getPosition(uint32_t id) const { - return positions[idBits.getIndexOfBit(id)]; - } - }; - - uint32_t mIndex; - Movement mMovements[HISTORY_SIZE]; - int32_t mActivePointerId; -}; - - -/* - * Specifies parameters that govern pointer or wheel acceleration. - */ -struct VelocityControlParameters { - // A scale factor that is multiplied with the raw velocity deltas - // prior to applying any other velocity control factors. The scale - // factor should be used to adapt the input device resolution - // (eg. counts per inch) to the output device resolution (eg. pixels per inch). - // - // Must be a positive value. - // Default is 1.0 (no scaling). - float scale; - - // The scaled speed at which acceleration begins to be applied. - // This value establishes the upper bound of a low speed regime for - // small precise motions that are performed without any acceleration. - // - // Must be a non-negative value. - // Default is 0.0 (no low threshold). - float lowThreshold; - - // The scaled speed at which maximum acceleration is applied. - // The difference between highThreshold and lowThreshold controls - // the range of speeds over which the acceleration factor is interpolated. - // The wider the range, the smoother the acceleration. - // - // Must be a non-negative value greater than or equal to lowThreshold. - // Default is 0.0 (no high threshold). - float highThreshold; - - // The acceleration factor. - // When the speed is above the low speed threshold, the velocity will scaled - // by an interpolated value between 1.0 and this amount. - // - // Must be a positive greater than or equal to 1.0. - // Default is 1.0 (no acceleration). - float acceleration; - - VelocityControlParameters() : - scale(1.0f), lowThreshold(0.0f), highThreshold(0.0f), acceleration(1.0f) { - } - - VelocityControlParameters(float scale, float lowThreshold, - float highThreshold, float acceleration) : - scale(scale), lowThreshold(lowThreshold), - highThreshold(highThreshold), acceleration(acceleration) { - } -}; - -/* - * Implements mouse pointer and wheel speed control and acceleration. - */ -class VelocityControl { -public: - VelocityControl(); - - /* Sets the various parameters. */ - void setParameters(const VelocityControlParameters& parameters); - - /* Resets the current movement counters to zero. - * This has the effect of nullifying any acceleration. */ - void reset(); - - /* Translates a raw movement delta into an appropriately - * scaled / accelerated delta based on the current velocity. */ - void move(nsecs_t eventTime, float* deltaX, float* deltaY); - -private: - // If no movements are received within this amount of time, - // we assume the movement has stopped and reset the movement counters. - static const nsecs_t STOP_TIME = 500 * 1000000; // 500 ms - - VelocityControlParameters mParameters; - - nsecs_t mLastMovementTime; - VelocityTracker::Position mRawPosition; - VelocityTracker mVelocityTracker; -}; - - -/* - * Describes the characteristics and capabilities of an input device. - */ -class InputDeviceInfo { -public: - InputDeviceInfo(); - InputDeviceInfo(const InputDeviceInfo& other); - ~InputDeviceInfo(); - - struct MotionRange { - int32_t axis; - uint32_t source; - float min; - float max; - float flat; - float fuzz; - }; - - void initialize(int32_t id, const String8& name); - - inline int32_t getId() const { return mId; } - inline const String8 getName() const { return mName; } - inline uint32_t getSources() const { return mSources; } - - const MotionRange* getMotionRange(int32_t axis, uint32_t source) const; - - void addSource(uint32_t source); - void addMotionRange(int32_t axis, uint32_t source, - float min, float max, float flat, float fuzz); - void addMotionRange(const MotionRange& range); - - inline void setKeyboardType(int32_t keyboardType) { mKeyboardType = keyboardType; } - inline int32_t getKeyboardType() const { return mKeyboardType; } - - inline void setKeyCharacterMapFile(const String8& value) { mKeyCharacterMapFile = value; } - inline const String8& getKeyCharacterMapFile() const { return mKeyCharacterMapFile; } - - inline const Vector<MotionRange>& getMotionRanges() const { - return mMotionRanges; - } - -private: - int32_t mId; - String8 mName; - uint32_t mSources; - int32_t mKeyboardType; - String8 mKeyCharacterMapFile; - - Vector<MotionRange> mMotionRanges; -}; - -/* - * Identifies a device. - */ -struct InputDeviceIdentifier { - inline InputDeviceIdentifier() : - bus(0), vendor(0), product(0), version(0) { - } - - String8 name; - String8 location; - String8 uniqueId; - uint16_t bus; - uint16_t vendor; - uint16_t product; - uint16_t version; -}; - -/* Types of input device configuration files. */ -enum InputDeviceConfigurationFileType { - INPUT_DEVICE_CONFIGURATION_FILE_TYPE_CONFIGURATION = 0, /* .idc file */ - INPUT_DEVICE_CONFIGURATION_FILE_TYPE_KEY_LAYOUT = 1, /* .kl file */ - INPUT_DEVICE_CONFIGURATION_FILE_TYPE_KEY_CHARACTER_MAP = 2, /* .kcm file */ -}; - -/* - * Gets the path of an input device configuration file, if one is available. - * Considers both system provided and user installed configuration files. - * - * The device identifier is used to construct several default configuration file - * names to try based on the device name, vendor, product, and version. - * - * Returns an empty string if not found. - */ -extern String8 getInputDeviceConfigurationFilePathByDeviceIdentifier( - const InputDeviceIdentifier& deviceIdentifier, - InputDeviceConfigurationFileType type); - -/* - * Gets the path of an input device configuration file, if one is available. - * Considers both system provided and user installed configuration files. - * - * The name is case-sensitive and is used to construct the filename to resolve. - * All characters except 'a'-'z', 'A'-'Z', '0'-'9', '-', and '_' are replaced by underscores. - * - * Returns an empty string if not found. - */ -extern String8 getInputDeviceConfigurationFilePathByName( - const String8& name, InputDeviceConfigurationFileType type); - -} // namespace android - -#endif // _UI_INPUT_H diff --git a/include/ui/InputTransport.h b/include/ui/InputTransport.h deleted file mode 100644 index 0facce313f..0000000000 --- a/include/ui/InputTransport.h +++ /dev/null @@ -1,335 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef _UI_INPUT_TRANSPORT_H -#define _UI_INPUT_TRANSPORT_H - -/** - * Native input transport. - * - * The InputChannel provides a mechanism for exchanging InputMessage structures across processes. - * - * The InputPublisher and InputConsumer each handle one end-point of an input channel. - * The InputPublisher is used by the input dispatcher to send events to the application. - * The InputConsumer is used by the application to receive events from the input dispatcher. - */ - -#include <ui/Input.h> -#include <utils/Errors.h> -#include <utils/Timers.h> -#include <utils/RefBase.h> -#include <utils/String8.h> - -namespace android { - -/* - * Intermediate representation used to send input events and related signals. - */ -struct InputMessage { - enum { - TYPE_KEY = 1, - TYPE_MOTION = 2, - TYPE_FINISHED = 3, - }; - - struct Header { - uint32_t type; - uint32_t padding; // 8 byte alignment for the body that follows - } header; - - union Body { - struct Key { - uint32_t seq; - nsecs_t eventTime; - int32_t deviceId; - int32_t source; - int32_t action; - int32_t flags; - int32_t keyCode; - int32_t scanCode; - int32_t metaState; - int32_t repeatCount; - nsecs_t downTime; - - inline size_t size() const { - return sizeof(Key); - } - } key; - - struct Motion { - uint32_t seq; - nsecs_t eventTime; - int32_t deviceId; - int32_t source; - int32_t action; - int32_t flags; - int32_t metaState; - int32_t buttonState; - int32_t edgeFlags; - nsecs_t downTime; - float xOffset; - float yOffset; - float xPrecision; - float yPrecision; - size_t pointerCount; - struct Pointer { - PointerProperties properties; - PointerCoords coords; - } pointers[MAX_POINTERS]; - - inline size_t size() const { - return sizeof(Motion) - sizeof(Pointer) * MAX_POINTERS - + sizeof(Pointer) * pointerCount; - } - } motion; - - struct Finished { - uint32_t seq; - bool handled; - - inline size_t size() const { - return sizeof(Finished); - } - } finished; - } body; - - bool isValid(size_t actualSize) const; - size_t size() const; -}; - -/* - * An input channel consists of a local unix domain socket used to send and receive - * input messages across processes. Each channel has a descriptive name for debugging purposes. - * - * Each endpoint has its own InputChannel object that specifies its file descriptor. - * - * The input channel is closed when all references to it are released. - */ -class InputChannel : public RefBase { -protected: - virtual ~InputChannel(); - -public: - InputChannel(const String8& name, int fd); - - /* Creates a pair of input channels. - * - * Returns OK on success. - */ - static status_t openInputChannelPair(const String8& name, - sp<InputChannel>& outServerChannel, sp<InputChannel>& outClientChannel); - - inline String8 getName() const { return mName; } - inline int getFd() const { return mFd; } - - /* Sends a message to the other endpoint. - * - * If the channel is full then the message is guaranteed not to have been sent at all. - * Try again after the consumer has sent a finished signal indicating that it has - * consumed some of the pending messages from the channel. - * - * Returns OK on success. - * Returns WOULD_BLOCK if the channel is full. - * Returns DEAD_OBJECT if the channel's peer has been closed. - * Other errors probably indicate that the channel is broken. - */ - status_t sendMessage(const InputMessage* msg); - - /* Receives a message sent by the other endpoint. - * - * If there is no message present, try again after poll() indicates that the fd - * is readable. - * - * Returns OK on success. - * Returns WOULD_BLOCK if there is no message present. - * Returns DEAD_OBJECT if the channel's peer has been closed. - * Other errors probably indicate that the channel is broken. - */ - status_t receiveMessage(InputMessage* msg); - -private: - String8 mName; - int mFd; -}; - -/* - * Publishes input events to an input channel. - */ -class InputPublisher { -public: - /* Creates a publisher associated with an input channel. */ - explicit InputPublisher(const sp<InputChannel>& channel); - - /* Destroys the publisher and releases its input channel. */ - ~InputPublisher(); - - /* Gets the underlying input channel. */ - inline sp<InputChannel> getChannel() { return mChannel; } - - /* Publishes a key event to the input channel. - * - * Returns OK on success. - * Returns WOULD_BLOCK if the channel is full. - * Returns DEAD_OBJECT if the channel's peer has been closed. - * Returns BAD_VALUE if seq is 0. - * Other errors probably indicate that the channel is broken. - */ - status_t publishKeyEvent( - uint32_t seq, - int32_t deviceId, - int32_t source, - int32_t action, - int32_t flags, - int32_t keyCode, - int32_t scanCode, - int32_t metaState, - int32_t repeatCount, - nsecs_t downTime, - nsecs_t eventTime); - - /* Publishes a motion event to the input channel. - * - * Returns OK on success. - * Returns WOULD_BLOCK if the channel is full. - * Returns DEAD_OBJECT if the channel's peer has been closed. - * Returns BAD_VALUE if seq is 0 or if pointerCount is less than 1 or greater than MAX_POINTERS. - * Other errors probably indicate that the channel is broken. - */ - status_t publishMotionEvent( - uint32_t seq, - int32_t deviceId, - int32_t source, - int32_t action, - int32_t flags, - int32_t edgeFlags, - int32_t metaState, - int32_t buttonState, - float xOffset, - float yOffset, - float xPrecision, - float yPrecision, - nsecs_t downTime, - nsecs_t eventTime, - size_t pointerCount, - const PointerProperties* pointerProperties, - const PointerCoords* pointerCoords); - - /* Receives the finished signal from the consumer in reply to the original dispatch signal. - * If a signal was received, returns the message sequence number, - * and whether the consumer handled the message. - * - * The returned sequence number is never 0 unless the operation failed. - * - * Returns OK on success. - * Returns WOULD_BLOCK if there is no signal present. - * Returns DEAD_OBJECT if the channel's peer has been closed. - * Other errors probably indicate that the channel is broken. - */ - status_t receiveFinishedSignal(uint32_t* outSeq, bool* outHandled); - -private: - sp<InputChannel> mChannel; -}; - -/* - * Consumes input events from an input channel. - */ -class InputConsumer { -public: - /* Creates a consumer associated with an input channel. */ - explicit InputConsumer(const sp<InputChannel>& channel); - - /* Destroys the consumer and releases its input channel. */ - ~InputConsumer(); - - /* Gets the underlying input channel. */ - inline sp<InputChannel> getChannel() { return mChannel; } - - /* Consumes an input event from the input channel and copies its contents into - * an InputEvent object created using the specified factory. - * - * Tries to combine a series of move events into larger batches whenever possible. - * - * If consumeBatches is false, then defers consuming pending batched events if it - * is possible for additional samples to be added to them later. Call hasPendingBatch() - * to determine whether a pending batch is available to be consumed. - * - * If consumeBatches is true, then events are still batched but they are consumed - * immediately as soon as the input channel is exhausted. - * - * The returned sequence number is never 0 unless the operation failed. - * - * Returns OK on success. - * Returns WOULD_BLOCK if there is no event present. - * Returns DEAD_OBJECT if the channel's peer has been closed. - * Returns NO_MEMORY if the event could not be created. - * Other errors probably indicate that the channel is broken. - */ - status_t consume(InputEventFactoryInterface* factory, bool consumeBatches, - uint32_t* outSeq, InputEvent** outEvent); - - /* Sends a finished signal to the publisher to inform it that the message - * with the specified sequence number has finished being process and whether - * the message was handled by the consumer. - * - * Returns OK on success. - * Returns BAD_VALUE if seq is 0. - * Other errors probably indicate that the channel is broken. - */ - status_t sendFinishedSignal(uint32_t seq, bool handled); - - /* Returns true if there is a pending batch. */ - bool hasPendingBatch() const; - -private: - sp<InputChannel> mChannel; - - // The current input message. - InputMessage mMsg; - - // True if mMsg contains a valid input message that was deferred from the previous - // call to consume and that still needs to be handled. - bool mMsgDeferred; - - // Batched motion events per device and source. - struct Batch { - uint32_t seq; // sequence number of last input message batched in the event - MotionEvent event; - }; - Vector<Batch> mBatches; - - // Chain of batched sequence numbers. When multiple input messages are combined into - // a batch, we append a record here that associates the last sequence number in the - // batch with the previous one. When the finished signal is sent, we traverse the - // chain to individually finish all input messages that were part of the batch. - struct SeqChain { - uint32_t seq; // sequence number of batched input message - uint32_t chain; // sequence number of previous batched input message - }; - Vector<SeqChain> mSeqChains; - - ssize_t findBatch(int32_t deviceId, int32_t source) const; - status_t sendUnchainedFinishedSignal(uint32_t seq, bool handled); - - static void initializeKeyEvent(KeyEvent* event, const InputMessage* msg); - static void initializeMotionEvent(MotionEvent* event, const InputMessage* msg); - static bool canAppendSamples(const MotionEvent* event, const InputMessage* msg); - static void appendSamples(MotionEvent* event, const InputMessage* msg); -}; - -} // namespace android - -#endif // _UI_INPUT_TRANSPORT_H diff --git a/include/ui/KeyCharacterMap.h b/include/ui/KeyCharacterMap.h deleted file mode 100644 index be14432ae5..0000000000 --- a/include/ui/KeyCharacterMap.h +++ /dev/null @@ -1,199 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef _UI_KEY_CHARACTER_MAP_H -#define _UI_KEY_CHARACTER_MAP_H - -#include <stdint.h> - -#include <ui/Input.h> -#include <utils/Errors.h> -#include <utils/KeyedVector.h> -#include <utils/Tokenizer.h> -#include <utils/String8.h> -#include <utils/Unicode.h> - -namespace android { - -/** - * Describes a mapping from Android key codes to characters. - * Also specifies other functions of the keyboard such as the keyboard type - * and key modifier semantics. - */ -class KeyCharacterMap { -public: - enum KeyboardType { - KEYBOARD_TYPE_UNKNOWN = 0, - KEYBOARD_TYPE_NUMERIC = 1, - KEYBOARD_TYPE_PREDICTIVE = 2, - KEYBOARD_TYPE_ALPHA = 3, - KEYBOARD_TYPE_FULL = 4, - KEYBOARD_TYPE_SPECIAL_FUNCTION = 5, - }; - - // Substitute key code and meta state for fallback action. - struct FallbackAction { - int32_t keyCode; - int32_t metaState; - }; - - ~KeyCharacterMap(); - - static status_t load(const String8& filename, KeyCharacterMap** outMap); - - /* Gets the keyboard type. */ - int32_t getKeyboardType() const; - - /* Gets the primary character for this key as in the label physically printed on it. - * Returns 0 if none (eg. for non-printing keys). */ - char16_t getDisplayLabel(int32_t keyCode) const; - - /* Gets the Unicode character for the number or symbol generated by the key - * when the keyboard is used as a dialing pad. - * Returns 0 if no number or symbol is generated. - */ - char16_t getNumber(int32_t keyCode) const; - - /* Gets the Unicode character generated by the key and meta key modifiers. - * Returns 0 if no character is generated. - */ - char16_t getCharacter(int32_t keyCode, int32_t metaState) const; - - /* Gets the fallback action to use by default if the application does not - * handle the specified key. - * Returns true if an action was available, false if none. - */ - bool getFallbackAction(int32_t keyCode, int32_t metaState, - FallbackAction* outFallbackAction) const; - - /* Gets the first matching Unicode character that can be generated by the key, - * preferring the one with the specified meta key modifiers. - * Returns 0 if no matching character is generated. - */ - char16_t getMatch(int32_t keyCode, const char16_t* chars, - size_t numChars, int32_t metaState) const; - - /* Gets a sequence of key events that could plausibly generate the specified - * character sequence. Returns false if some of the characters cannot be generated. - */ - bool getEvents(int32_t deviceId, const char16_t* chars, size_t numChars, - Vector<KeyEvent>& outEvents) const; - -private: - struct Behavior { - Behavior(); - - /* The next behavior in the list, or NULL if none. */ - Behavior* next; - - /* The meta key modifiers for this behavior. */ - int32_t metaState; - - /* The character to insert. */ - char16_t character; - - /* The fallback keycode if the key is not handled. */ - int32_t fallbackKeyCode; - }; - - struct Key { - Key(); - ~Key(); - - /* The single character label printed on the key, or 0 if none. */ - char16_t label; - - /* The number or symbol character generated by the key, or 0 if none. */ - char16_t number; - - /* The list of key behaviors sorted from most specific to least specific - * meta key binding. */ - Behavior* firstBehavior; - }; - - class Parser { - enum State { - STATE_TOP = 0, - STATE_KEY = 1, - }; - - enum { - PROPERTY_LABEL = 1, - PROPERTY_NUMBER = 2, - PROPERTY_META = 3, - }; - - struct Property { - inline Property(int32_t property = 0, int32_t metaState = 0) : - property(property), metaState(metaState) { } - - int32_t property; - int32_t metaState; - }; - - KeyCharacterMap* mMap; - Tokenizer* mTokenizer; - State mState; - int32_t mKeyCode; - - public: - Parser(KeyCharacterMap* map, Tokenizer* tokenizer); - ~Parser(); - status_t parse(); - - private: - status_t parseType(); - status_t parseKey(); - status_t parseKeyProperty(); - status_t parseModifier(const String8& token, int32_t* outMetaState); - status_t parseCharacterLiteral(char16_t* outCharacter); - }; - - KeyedVector<int32_t, Key*> mKeys; - int mType; - - KeyCharacterMap(); - - bool getKey(int32_t keyCode, const Key** outKey) const; - bool getKeyBehavior(int32_t keyCode, int32_t metaState, - const Key** outKey, const Behavior** outBehavior) const; - - bool findKey(char16_t ch, int32_t* outKeyCode, int32_t* outMetaState) const; - - static void addKey(Vector<KeyEvent>& outEvents, - int32_t deviceId, int32_t keyCode, int32_t metaState, bool down, nsecs_t time); - static void addMetaKeys(Vector<KeyEvent>& outEvents, - int32_t deviceId, int32_t metaState, bool down, nsecs_t time, - int32_t* currentMetaState); - static bool addSingleEphemeralMetaKey(Vector<KeyEvent>& outEvents, - int32_t deviceId, int32_t metaState, bool down, nsecs_t time, - int32_t keyCode, int32_t keyMetaState, - int32_t* currentMetaState); - static void addDoubleEphemeralMetaKey(Vector<KeyEvent>& outEvents, - int32_t deviceId, int32_t metaState, bool down, nsecs_t time, - int32_t leftKeyCode, int32_t leftKeyMetaState, - int32_t rightKeyCode, int32_t rightKeyMetaState, - int32_t eitherKeyMetaState, - int32_t* currentMetaState); - static void addLockedMetaKey(Vector<KeyEvent>& outEvents, - int32_t deviceId, int32_t metaState, nsecs_t time, - int32_t keyCode, int32_t keyMetaState, - int32_t* currentMetaState); -}; - -} // namespace android - -#endif // _UI_KEY_CHARACTER_MAP_H diff --git a/include/ui/KeyLayoutMap.h b/include/ui/KeyLayoutMap.h deleted file mode 100644 index d82d0c8e0e..0000000000 --- a/include/ui/KeyLayoutMap.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef _UI_KEY_LAYOUT_MAP_H -#define _UI_KEY_LAYOUT_MAP_H - -#include <stdint.h> -#include <utils/Errors.h> -#include <utils/KeyedVector.h> -#include <utils/Tokenizer.h> - -namespace android { - -struct AxisInfo { - enum Mode { - // Axis value is reported directly. - MODE_NORMAL = 0, - // Axis value should be inverted before reporting. - MODE_INVERT = 1, - // Axis value should be split into two axes - MODE_SPLIT = 2, - }; - - // Axis mode. - Mode mode; - - // Axis id. - // When split, this is the axis used for values smaller than the split position. - int32_t axis; - - // When split, this is the axis used for values after higher than the split position. - int32_t highAxis; - - // The split value, or 0 if not split. - int32_t splitValue; - - // The flat value, or -1 if none. - int32_t flatOverride; - - AxisInfo() : mode(MODE_NORMAL), axis(-1), highAxis(-1), splitValue(0), flatOverride(-1) { - } -}; - -/** - * Describes a mapping from keyboard scan codes and joystick axes to Android key codes and axes. - */ -class KeyLayoutMap { -public: - ~KeyLayoutMap(); - - static status_t load(const String8& filename, KeyLayoutMap** outMap); - - status_t mapKey(int32_t scanCode, int32_t* keyCode, uint32_t* flags) const; - status_t findScanCodesForKey(int32_t keyCode, Vector<int32_t>* outScanCodes) const; - - status_t mapAxis(int32_t scanCode, AxisInfo* outAxisInfo) const; - -private: - struct Key { - int32_t keyCode; - uint32_t flags; - }; - - KeyedVector<int32_t, Key> mKeys; - KeyedVector<int32_t, AxisInfo> mAxes; - - KeyLayoutMap(); - - class Parser { - KeyLayoutMap* mMap; - Tokenizer* mTokenizer; - - public: - Parser(KeyLayoutMap* map, Tokenizer* tokenizer); - ~Parser(); - status_t parse(); - - private: - status_t parseKey(); - status_t parseAxis(); - }; -}; - -} // namespace android - -#endif // _UI_KEY_LAYOUT_MAP_H diff --git a/include/ui/Keyboard.h b/include/ui/Keyboard.h deleted file mode 100644 index 274f5264f4..0000000000 --- a/include/ui/Keyboard.h +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef _UI_KEYBOARD_H -#define _UI_KEYBOARD_H - -#include <ui/Input.h> -#include <utils/Errors.h> -#include <utils/String8.h> -#include <utils/PropertyMap.h> - -namespace android { - -enum { - /* Device id of the built in keyboard. */ - DEVICE_ID_BUILT_IN_KEYBOARD = 0, - - /* Device id of a generic virtual keyboard with a full layout that can be used - * to synthesize key events. */ - DEVICE_ID_VIRTUAL_KEYBOARD = -1, -}; - -class KeyLayoutMap; -class KeyCharacterMap; - -/** - * Loads the key layout map and key character map for a keyboard device. - */ -class KeyMap { -public: - String8 keyLayoutFile; - KeyLayoutMap* keyLayoutMap; - - String8 keyCharacterMapFile; - KeyCharacterMap* keyCharacterMap; - - KeyMap(); - ~KeyMap(); - - status_t load(const InputDeviceIdentifier& deviceIdenfier, - const PropertyMap* deviceConfiguration); - - inline bool haveKeyLayout() const { - return !keyLayoutFile.isEmpty(); - } - - inline bool haveKeyCharacterMap() const { - return !keyCharacterMapFile.isEmpty(); - } - - inline bool isComplete() const { - return haveKeyLayout() && haveKeyCharacterMap(); - } - -private: - bool probeKeyMap(const InputDeviceIdentifier& deviceIdentifier, const String8& name); - status_t loadKeyLayout(const InputDeviceIdentifier& deviceIdentifier, const String8& name); - status_t loadKeyCharacterMap(const InputDeviceIdentifier& deviceIdentifier, - const String8& name); - String8 getPath(const InputDeviceIdentifier& deviceIdentifier, - const String8& name, InputDeviceConfigurationFileType type); -}; - -/** - * Returns true if the keyboard is eligible for use as a built-in keyboard. - */ -extern bool isEligibleBuiltInKeyboard(const InputDeviceIdentifier& deviceIdentifier, - const PropertyMap* deviceConfiguration, const KeyMap* keyMap); - -/** - * Gets a key code by its short form label, eg. "HOME". - * Returns 0 if unknown. - */ -extern int32_t getKeyCodeByLabel(const char* label); - -/** - * Gets a key flag by its short form label, eg. "WAKE". - * Returns 0 if unknown. - */ -extern uint32_t getKeyFlagByLabel(const char* label); - -/** - * Gets a axis by its short form label, eg. "X". - * Returns -1 if unknown. - */ -extern int32_t getAxisByLabel(const char* label); - -/** - * Gets a axis label by its id. - * Returns NULL if unknown. - */ -extern const char* getAxisLabel(int32_t axisId); - -/** - * Updates a meta state field when a key is pressed or released. - */ -extern int32_t updateMetaState(int32_t keyCode, bool down, int32_t oldMetaState); - -/** - * Returns true if a key is a meta key like ALT or CAPS_LOCK. - */ -extern bool isMetaKey(int32_t keyCode); - -} // namespace android - -#endif // _UI_KEYBOARD_H diff --git a/include/ui/KeycodeLabels.h b/include/ui/KeycodeLabels.h deleted file mode 100755 index c5bd0c5446..0000000000 --- a/include/ui/KeycodeLabels.h +++ /dev/null @@ -1,310 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef _UI_KEYCODE_LABELS_H -#define _UI_KEYCODE_LABELS_H - -#include <android/keycodes.h> - -struct KeycodeLabel { - const char *literal; - int value; -}; - -static const KeycodeLabel KEYCODES[] = { - { "SOFT_LEFT", 1 }, - { "SOFT_RIGHT", 2 }, - { "HOME", 3 }, - { "BACK", 4 }, - { "CALL", 5 }, - { "ENDCALL", 6 }, - { "0", 7 }, - { "1", 8 }, - { "2", 9 }, - { "3", 10 }, - { "4", 11 }, - { "5", 12 }, - { "6", 13 }, - { "7", 14 }, - { "8", 15 }, - { "9", 16 }, - { "STAR", 17 }, - { "POUND", 18 }, - { "DPAD_UP", 19 }, - { "DPAD_DOWN", 20 }, - { "DPAD_LEFT", 21 }, - { "DPAD_RIGHT", 22 }, - { "DPAD_CENTER", 23 }, - { "VOLUME_UP", 24 }, - { "VOLUME_DOWN", 25 }, - { "POWER", 26 }, - { "CAMERA", 27 }, - { "CLEAR", 28 }, - { "A", 29 }, - { "B", 30 }, - { "C", 31 }, - { "D", 32 }, - { "E", 33 }, - { "F", 34 }, - { "G", 35 }, - { "H", 36 }, - { "I", 37 }, - { "J", 38 }, - { "K", 39 }, - { "L", 40 }, - { "M", 41 }, - { "N", 42 }, - { "O", 43 }, - { "P", 44 }, - { "Q", 45 }, - { "R", 46 }, - { "S", 47 }, - { "T", 48 }, - { "U", 49 }, - { "V", 50 }, - { "W", 51 }, - { "X", 52 }, - { "Y", 53 }, - { "Z", 54 }, - { "COMMA", 55 }, - { "PERIOD", 56 }, - { "ALT_LEFT", 57 }, - { "ALT_RIGHT", 58 }, - { "SHIFT_LEFT", 59 }, - { "SHIFT_RIGHT", 60 }, - { "TAB", 61 }, - { "SPACE", 62 }, - { "SYM", 63 }, - { "EXPLORER", 64 }, - { "ENVELOPE", 65 }, - { "ENTER", 66 }, - { "DEL", 67 }, - { "GRAVE", 68 }, - { "MINUS", 69 }, - { "EQUALS", 70 }, - { "LEFT_BRACKET", 71 }, - { "RIGHT_BRACKET", 72 }, - { "BACKSLASH", 73 }, - { "SEMICOLON", 74 }, - { "APOSTROPHE", 75 }, - { "SLASH", 76 }, - { "AT", 77 }, - { "NUM", 78 }, - { "HEADSETHOOK", 79 }, - { "FOCUS", 80 }, - { "PLUS", 81 }, - { "MENU", 82 }, - { "NOTIFICATION", 83 }, - { "SEARCH", 84 }, - { "MEDIA_PLAY_PAUSE", 85 }, - { "MEDIA_STOP", 86 }, - { "MEDIA_NEXT", 87 }, - { "MEDIA_PREVIOUS", 88 }, - { "MEDIA_REWIND", 89 }, - { "MEDIA_FAST_FORWARD", 90 }, - { "MUTE", 91 }, - { "PAGE_UP", 92 }, - { "PAGE_DOWN", 93 }, - { "PICTSYMBOLS", 94 }, - { "SWITCH_CHARSET", 95 }, - { "BUTTON_A", 96 }, - { "BUTTON_B", 97 }, - { "BUTTON_C", 98 }, - { "BUTTON_X", 99 }, - { "BUTTON_Y", 100 }, - { "BUTTON_Z", 101 }, - { "BUTTON_L1", 102 }, - { "BUTTON_R1", 103 }, - { "BUTTON_L2", 104 }, - { "BUTTON_R2", 105 }, - { "BUTTON_THUMBL", 106 }, - { "BUTTON_THUMBR", 107 }, - { "BUTTON_START", 108 }, - { "BUTTON_SELECT", 109 }, - { "BUTTON_MODE", 110 }, - { "ESCAPE", 111 }, - { "FORWARD_DEL", 112 }, - { "CTRL_LEFT", 113 }, - { "CTRL_RIGHT", 114 }, - { "CAPS_LOCK", 115 }, - { "SCROLL_LOCK", 116 }, - { "META_LEFT", 117 }, - { "META_RIGHT", 118 }, - { "FUNCTION", 119 }, - { "SYSRQ", 120 }, - { "BREAK", 121 }, - { "MOVE_HOME", 122 }, - { "MOVE_END", 123 }, - { "INSERT", 124 }, - { "FORWARD", 125 }, - { "MEDIA_PLAY", 126 }, - { "MEDIA_PAUSE", 127 }, - { "MEDIA_CLOSE", 128 }, - { "MEDIA_EJECT", 129 }, - { "MEDIA_RECORD", 130 }, - { "F1", 131 }, - { "F2", 132 }, - { "F3", 133 }, - { "F4", 134 }, - { "F5", 135 }, - { "F6", 136 }, - { "F7", 137 }, - { "F8", 138 }, - { "F9", 139 }, - { "F10", 140 }, - { "F11", 141 }, - { "F12", 142 }, - { "NUM_LOCK", 143 }, - { "NUMPAD_0", 144 }, - { "NUMPAD_1", 145 }, - { "NUMPAD_2", 146 }, - { "NUMPAD_3", 147 }, - { "NUMPAD_4", 148 }, - { "NUMPAD_5", 149 }, - { "NUMPAD_6", 150 }, - { "NUMPAD_7", 151 }, - { "NUMPAD_8", 152 }, - { "NUMPAD_9", 153 }, - { "NUMPAD_DIVIDE", 154 }, - { "NUMPAD_MULTIPLY", 155 }, - { "NUMPAD_SUBTRACT", 156 }, - { "NUMPAD_ADD", 157 }, - { "NUMPAD_DOT", 158 }, - { "NUMPAD_COMMA", 159 }, - { "NUMPAD_ENTER", 160 }, - { "NUMPAD_EQUALS", 161 }, - { "NUMPAD_LEFT_PAREN", 162 }, - { "NUMPAD_RIGHT_PAREN", 163 }, - { "VOLUME_MUTE", 164 }, - { "INFO", 165 }, - { "CHANNEL_UP", 166 }, - { "CHANNEL_DOWN", 167 }, - { "ZOOM_IN", 168 }, - { "ZOOM_OUT", 169 }, - { "TV", 170 }, - { "WINDOW", 171 }, - { "GUIDE", 172 }, - { "DVR", 173 }, - { "BOOKMARK", 174 }, - { "CAPTIONS", 175 }, - { "SETTINGS", 176 }, - { "TV_POWER", 177 }, - { "TV_INPUT", 178 }, - { "STB_POWER", 179 }, - { "STB_INPUT", 180 }, - { "AVR_POWER", 181 }, - { "AVR_INPUT", 182 }, - { "PROG_RED", 183 }, - { "PROG_GREEN", 184 }, - { "PROG_YELLOW", 185 }, - { "PROG_BLUE", 186 }, - { "APP_SWITCH", 187 }, - { "BUTTON_1", 188 }, - { "BUTTON_2", 189 }, - { "BUTTON_3", 190 }, - { "BUTTON_4", 191 }, - { "BUTTON_5", 192 }, - { "BUTTON_6", 193 }, - { "BUTTON_7", 194 }, - { "BUTTON_8", 195 }, - { "BUTTON_9", 196 }, - { "BUTTON_10", 197 }, - { "BUTTON_11", 198 }, - { "BUTTON_12", 199 }, - { "BUTTON_13", 200 }, - { "BUTTON_14", 201 }, - { "BUTTON_15", 202 }, - { "BUTTON_16", 203 }, - { "LANGUAGE_SWITCH", 204 }, - { "MANNER_MODE", 205 }, - { "3D_MODE", 206 }, - { "CONTACTS", 207 }, - { "CALENDAR", 208 }, - { "MUSIC", 209 }, - { "CALCULATOR", 210 }, - - // NOTE: If you add a new keycode here you must also add it to several other files. - // Refer to frameworks/base/core/java/android/view/KeyEvent.java for the full list. - - { NULL, 0 } -}; - -// NOTE: If you edit these flags, also edit policy flags in Input.h. -static const KeycodeLabel FLAGS[] = { - { "WAKE", 0x00000001 }, - { "WAKE_DROPPED", 0x00000002 }, - { "SHIFT", 0x00000004 }, - { "CAPS_LOCK", 0x00000008 }, - { "ALT", 0x00000010 }, - { "ALT_GR", 0x00000020 }, - { "MENU", 0x00000040 }, - { "LAUNCHER", 0x00000080 }, - { "VIRTUAL", 0x00000100 }, - { "FUNCTION", 0x00000200 }, - { NULL, 0 } -}; - -static const KeycodeLabel AXES[] = { - { "X", 0 }, - { "Y", 1 }, - { "PRESSURE", 2 }, - { "SIZE", 3 }, - { "TOUCH_MAJOR", 4 }, - { "TOUCH_MINOR", 5 }, - { "TOOL_MAJOR", 6 }, - { "TOOL_MINOR", 7 }, - { "ORIENTATION", 8 }, - { "VSCROLL", 9 }, - { "HSCROLL", 10 }, - { "Z", 11 }, - { "RX", 12 }, - { "RY", 13 }, - { "RZ", 14 }, - { "HAT_X", 15 }, - { "HAT_Y", 16 }, - { "LTRIGGER", 17 }, - { "RTRIGGER", 18 }, - { "THROTTLE", 19 }, - { "RUDDER", 20 }, - { "WHEEL", 21 }, - { "GAS", 22 }, - { "BRAKE", 23 }, - { "DISTANCE", 24 }, - { "TILT", 25 }, - { "GENERIC_1", 32 }, - { "GENERIC_2", 33 }, - { "GENERIC_3", 34 }, - { "GENERIC_4", 35 }, - { "GENERIC_5", 36 }, - { "GENERIC_6", 37 }, - { "GENERIC_7", 38 }, - { "GENERIC_8", 39 }, - { "GENERIC_9", 40 }, - { "GENERIC_10", 41 }, - { "GENERIC_11", 42 }, - { "GENERIC_12", 43 }, - { "GENERIC_13", 44 }, - { "GENERIC_14", 45 }, - { "GENERIC_15", 46 }, - { "GENERIC_16", 47 }, - - // NOTE: If you add a new axis here you must also add it to several other files. - // Refer to frameworks/base/core/java/android/view/MotionEvent.java for the full list. - - { NULL, -1 } -}; - -#endif // _UI_KEYCODE_LABELS_H diff --git a/include/ui/PixelFormat.h b/include/ui/PixelFormat.h index 848c5a1149..9f3e267139 100644 --- a/include/ui/PixelFormat.h +++ b/include/ui/PixelFormat.h @@ -21,7 +21,6 @@ // skia or SurfaceFlinger are not required to support all of these formats // (either as source or destination) -// XXX: we should consolidate these formats and skia's #ifndef UI_PIXELFORMAT_H #define UI_PIXELFORMAT_H @@ -29,7 +28,6 @@ #include <stdint.h> #include <sys/types.h> #include <utils/Errors.h> -#include <pixelflinger/format.h> #include <hardware/hardware.h> namespace android { @@ -65,19 +63,12 @@ enum { PIXEL_FORMAT_BGRA_8888 = HAL_PIXEL_FORMAT_BGRA_8888, // 4x8-bit BGRA PIXEL_FORMAT_RGBA_5551 = HAL_PIXEL_FORMAT_RGBA_5551, // 16-bit ARGB PIXEL_FORMAT_RGBA_4444 = HAL_PIXEL_FORMAT_RGBA_4444, // 16-bit ARGB - PIXEL_FORMAT_A_8 = GGL_PIXEL_FORMAT_A_8, // 8-bit A - PIXEL_FORMAT_L_8 = GGL_PIXEL_FORMAT_L_8, // 8-bit L (R=G=B=L) - PIXEL_FORMAT_LA_88 = GGL_PIXEL_FORMAT_LA_88, // 16-bit LA - PIXEL_FORMAT_RGB_332 = GGL_PIXEL_FORMAT_RGB_332, // 8-bit RGB - - // New formats can be added if they're also defined in - // pixelflinger/format.h + PIXEL_FORMAT_A_8 = 8, // 8-bit A }; typedef int32_t PixelFormat; -struct PixelFormatInfo -{ +struct PixelFormatInfo { enum { INDEX_ALPHA = 0, INDEX_RED = 1, @@ -86,12 +77,12 @@ struct PixelFormatInfo }; enum { // components - ALPHA = 1, - RGB = 2, - RGBA = 3, - LUMINANCE = 4, - LUMINANCE_ALPHA = 5, - OTHER = 0xFF + ALPHA = 1, + RGB = 2, + RGBA = 3, + L = 4, + LA = 5, + OTHER = 0xFF }; struct szinfo { diff --git a/include/ui/PowerManager.h b/include/ui/PowerManager.h deleted file mode 100644 index dd80318e63..0000000000 --- a/include/ui/PowerManager.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef _UI_POWER_MANAGER_H -#define _UI_POWER_MANAGER_H - - -namespace android { - -enum { - POWER_MANAGER_OTHER_EVENT = 0, - POWER_MANAGER_BUTTON_EVENT = 1, - POWER_MANAGER_TOUCH_EVENT = 2, - - POWER_MANAGER_LAST_EVENT = POWER_MANAGER_TOUCH_EVENT, // Last valid event code. -}; - -} // namespace android - -#endif // _UI_POWER_MANAGER_H diff --git a/include/ui/VirtualKeyMap.h b/include/ui/VirtualKeyMap.h deleted file mode 100644 index 7813d9d032..0000000000 --- a/include/ui/VirtualKeyMap.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef _UI_VIRTUAL_KEY_MAP_H -#define _UI_VIRTUAL_KEY_MAP_H - -#include <stdint.h> - -#include <ui/Input.h> -#include <utils/Errors.h> -#include <utils/KeyedVector.h> -#include <utils/Tokenizer.h> -#include <utils/String8.h> -#include <utils/Unicode.h> - -namespace android { - -/* Describes a virtual key. */ -struct VirtualKeyDefinition { - int32_t scanCode; - - // configured position data, specified in display coords - int32_t centerX; - int32_t centerY; - int32_t width; - int32_t height; -}; - - -/** - * Describes a collection of virtual keys on a touch screen in terms of - * virtual scan codes and hit rectangles. - */ -class VirtualKeyMap { -public: - ~VirtualKeyMap(); - - static status_t load(const String8& filename, VirtualKeyMap** outMap); - - inline const Vector<VirtualKeyDefinition>& getVirtualKeys() const { - return mVirtualKeys; - } - -private: - class Parser { - VirtualKeyMap* mMap; - Tokenizer* mTokenizer; - - public: - Parser(VirtualKeyMap* map, Tokenizer* tokenizer); - ~Parser(); - status_t parse(); - - private: - bool consumeFieldDelimiterAndSkipWhitespace(); - bool parseNextIntField(int32_t* outValue); - }; - - Vector<VirtualKeyDefinition> mVirtualKeys; - - VirtualKeyMap(); -}; - -} // namespace android - -#endif // _UI_KEY_CHARACTER_MAP_H diff --git a/include/ui/android_native_buffer.h b/include/ui/android_native_buffer.h deleted file mode 100644 index b6e1db4600..0000000000 --- a/include/ui/android_native_buffer.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (C) 2009 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef ANDROID_ANDROID_NATIVES_PRIV_H -#define ANDROID_ANDROID_NATIVES_PRIV_H - -#include <ui/egl/android_natives.h> - -#endif /* ANDROID_ANDROID_NATIVES_PRIV_H */ diff --git a/include/utils/AndroidThreads.h b/include/utils/AndroidThreads.h new file mode 100644 index 0000000000..f9f7aa41a0 --- /dev/null +++ b/include/utils/AndroidThreads.h @@ -0,0 +1,136 @@ +/* + * Copyright (C) 2007 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _LIBS_UTILS_ANDROID_THREADS_H +#define _LIBS_UTILS_ANDROID_THREADS_H + +#include <stdint.h> +#include <sys/types.h> + +#if defined(HAVE_PTHREADS) +# include <pthread.h> +#endif + +#include <utils/ThreadDefs.h> + +// --------------------------------------------------------------------------- +// C API + +#ifdef __cplusplus +extern "C" { +#endif + +// Create and run a new thread. +extern int androidCreateThread(android_thread_func_t, void *); + +// Create thread with lots of parameters +extern int androidCreateThreadEtc(android_thread_func_t entryFunction, + void *userData, + const char* threadName, + int32_t threadPriority, + size_t threadStackSize, + android_thread_id_t *threadId); + +// Get some sort of unique identifier for the current thread. +extern android_thread_id_t androidGetThreadId(); + +// Low-level thread creation -- never creates threads that can +// interact with the Java VM. +extern int androidCreateRawThreadEtc(android_thread_func_t entryFunction, + void *userData, + const char* threadName, + int32_t threadPriority, + size_t threadStackSize, + android_thread_id_t *threadId); + +// Used by the Java Runtime to control how threads are created, so that +// they can be proper and lovely Java threads. +typedef int (*android_create_thread_fn)(android_thread_func_t entryFunction, + void *userData, + const char* threadName, + int32_t threadPriority, + size_t threadStackSize, + android_thread_id_t *threadId); + +extern void androidSetCreateThreadFunc(android_create_thread_fn func); + +// ------------------------------------------------------------------ +// Extra functions working with raw pids. + +// Get pid for the current thread. +extern pid_t androidGetTid(); + +// Change the scheduling group of a particular thread. The group +// should be one of the ANDROID_TGROUP constants. Returns BAD_VALUE if +// grp is out of range, else another non-zero value with errno set if +// the operation failed. Thread ID zero means current thread. +extern int androidSetThreadSchedulingGroup(pid_t tid, int grp); + +// Change the priority AND scheduling group of a particular thread. The priority +// should be one of the ANDROID_PRIORITY constants. Returns INVALID_OPERATION +// if the priority set failed, else another value if just the group set failed; +// in either case errno is set. Thread ID zero means current thread. +extern int androidSetThreadPriority(pid_t tid, int prio); + +// Get the current priority of a particular thread. Returns one of the +// ANDROID_PRIORITY constants or a negative result in case of error. +extern int androidGetThreadPriority(pid_t tid); + +// Get the current scheduling group of a particular thread. Normally returns +// one of the ANDROID_TGROUP constants other than ANDROID_TGROUP_DEFAULT. +// Returns ANDROID_TGROUP_DEFAULT if no pthread support (e.g. on host) or if +// scheduling groups are disabled. Returns INVALID_OPERATION if unexpected error. +// Thread ID zero means current thread. +extern int androidGetThreadSchedulingGroup(pid_t tid); + +#ifdef __cplusplus +} // extern "C" +#endif + +// ---------------------------------------------------------------------------- +// C++ API +#ifdef __cplusplus +namespace android { +// ---------------------------------------------------------------------------- + +// Create and run a new thread. +inline bool createThread(thread_func_t f, void *a) { + return androidCreateThread(f, a) ? true : false; +} + +// Create thread with lots of parameters +inline bool createThreadEtc(thread_func_t entryFunction, + void *userData, + const char* threadName = "android:unnamed_thread", + int32_t threadPriority = PRIORITY_DEFAULT, + size_t threadStackSize = 0, + thread_id_t *threadId = 0) +{ + return androidCreateThreadEtc(entryFunction, userData, threadName, + threadPriority, threadStackSize, threadId) ? true : false; +} + +// Get some sort of unique identifier for the current thread. +inline thread_id_t getThreadId() { + return androidGetThreadId(); +} + +// ---------------------------------------------------------------------------- +}; // namespace android +#endif // __cplusplus +// ---------------------------------------------------------------------------- + +#endif // _LIBS_UTILS_ANDROID_THREADS_H diff --git a/include/utils/Asset.h b/include/utils/Asset.h deleted file mode 100644 index 1fe0e063c8..0000000000 --- a/include/utils/Asset.h +++ /dev/null @@ -1,322 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// -// Class providing access to a read-only asset. Asset objects are NOT -// thread-safe, and should not be shared across threads. -// -#ifndef __LIBS_ASSET_H -#define __LIBS_ASSET_H - -#include <stdio.h> -#include <sys/types.h> - -#include <utils/Compat.h> -#include <utils/Errors.h> -#include <utils/FileMap.h> -#include <utils/String8.h> - -namespace android { - -/* - * Instances of this class provide read-only operations on a byte stream. - * - * Access may be optimized for streaming, random, or whole buffer modes. All - * operations are supported regardless of how the file was opened, but some - * things will be less efficient. [pass that in??] - * - * "Asset" is the base class for all types of assets. The classes below - * provide most of the implementation. The AssetManager uses one of the - * static "create" functions defined here to create a new instance. - */ -class Asset { -public: - virtual ~Asset(void); - - static int32_t getGlobalCount(); - static String8 getAssetAllocations(); - - /* used when opening an asset */ - typedef enum AccessMode { - ACCESS_UNKNOWN = 0, - - /* read chunks, and seek forward and backward */ - ACCESS_RANDOM, - - /* read sequentially, with an occasional forward seek */ - ACCESS_STREAMING, - - /* caller plans to ask for a read-only buffer with all data */ - ACCESS_BUFFER, - } AccessMode; - - /* - * Read data from the current offset. Returns the actual number of - * bytes read, 0 on EOF, or -1 on error. - */ - virtual ssize_t read(void* buf, size_t count) = 0; - - /* - * Seek to the specified offset. "whence" uses the same values as - * lseek/fseek. Returns the new position on success, or (off64_t) -1 - * on failure. - */ - virtual off64_t seek(off64_t offset, int whence) = 0; - - /* - * Close the asset, freeing all associated resources. - */ - virtual void close(void) = 0; - - /* - * Get a pointer to a buffer with the entire contents of the file. - */ - virtual const void* getBuffer(bool wordAligned) = 0; - - /* - * Get the total amount of data that can be read. - */ - virtual off64_t getLength(void) const = 0; - - /* - * Get the total amount of data that can be read from the current position. - */ - virtual off64_t getRemainingLength(void) const = 0; - - /* - * Open a new file descriptor that can be used to read this asset. - * Returns -1 if you can not use the file descriptor (for example if the - * asset is compressed). - */ - virtual int openFileDescriptor(off64_t* outStart, off64_t* outLength) const = 0; - - /* - * Return whether this asset's buffer is allocated in RAM (not mmapped). - * Note: not virtual so it is safe to call even when being destroyed. - */ - virtual bool isAllocated(void) const { return false; } - - /* - * Get a string identifying the asset's source. This might be a full - * path, it might be a colon-separated list of identifiers. - * - * This is NOT intended to be used for anything except debug output. - * DO NOT try to parse this or use it to open a file. - */ - const char* getAssetSource(void) const { return mAssetSource.string(); } - -protected: - Asset(void); // constructor; only invoked indirectly - - /* handle common seek() housekeeping */ - off64_t handleSeek(off64_t offset, int whence, off64_t curPosn, off64_t maxPosn); - - /* set the asset source string */ - void setAssetSource(const String8& path) { mAssetSource = path; } - - AccessMode getAccessMode(void) const { return mAccessMode; } - -private: - /* these operations are not implemented */ - Asset(const Asset& src); - Asset& operator=(const Asset& src); - - /* AssetManager needs access to our "create" functions */ - friend class AssetManager; - - /* - * Create the asset from a named file on disk. - */ - static Asset* createFromFile(const char* fileName, AccessMode mode); - - /* - * Create the asset from a named, compressed file on disk (e.g. ".gz"). - */ - static Asset* createFromCompressedFile(const char* fileName, - AccessMode mode); - -#if 0 - /* - * Create the asset from a segment of an open file. This will fail - * if "offset" and "length" don't fit within the bounds of the file. - * - * The asset takes ownership of the file descriptor. - */ - static Asset* createFromFileSegment(int fd, off64_t offset, size_t length, - AccessMode mode); - - /* - * Create from compressed data. "fd" should be seeked to the start of - * the compressed data. This could be inside a gzip file or part of a - * Zip archive. - * - * The asset takes ownership of the file descriptor. - * - * This may not verify the validity of the compressed data until first - * use. - */ - static Asset* createFromCompressedData(int fd, off64_t offset, - int compressionMethod, size_t compressedLength, - size_t uncompressedLength, AccessMode mode); -#endif - - /* - * Create the asset from a memory-mapped file segment. - * - * The asset takes ownership of the FileMap. - */ - static Asset* createFromUncompressedMap(FileMap* dataMap, AccessMode mode); - - /* - * Create the asset from a memory-mapped file segment with compressed - * data. "method" is a Zip archive compression method constant. - * - * The asset takes ownership of the FileMap. - */ - static Asset* createFromCompressedMap(FileMap* dataMap, int method, - size_t uncompressedLen, AccessMode mode); - - - /* - * Create from a reference-counted chunk of shared memory. - */ - // TODO - - AccessMode mAccessMode; // how the asset was opened - String8 mAssetSource; // debug string - - Asset* mNext; // linked list. - Asset* mPrev; -}; - - -/* - * =========================================================================== - * - * Innards follow. Do not use these classes directly. - */ - -/* - * An asset based on an uncompressed file on disk. It may encompass the - * entire file or just a piece of it. Access is through fread/fseek. - */ -class _FileAsset : public Asset { -public: - _FileAsset(void); - virtual ~_FileAsset(void); - - /* - * Use a piece of an already-open file. - * - * On success, the object takes ownership of "fd". - */ - status_t openChunk(const char* fileName, int fd, off64_t offset, size_t length); - - /* - * Use a memory-mapped region. - * - * On success, the object takes ownership of "dataMap". - */ - status_t openChunk(FileMap* dataMap); - - /* - * Standard Asset interfaces. - */ - virtual ssize_t read(void* buf, size_t count); - virtual off64_t seek(off64_t offset, int whence); - virtual void close(void); - virtual const void* getBuffer(bool wordAligned); - virtual off64_t getLength(void) const { return mLength; } - virtual off64_t getRemainingLength(void) const { return mLength-mOffset; } - virtual int openFileDescriptor(off64_t* outStart, off64_t* outLength) const; - virtual bool isAllocated(void) const { return mBuf != NULL; } - -private: - off64_t mStart; // absolute file offset of start of chunk - off64_t mLength; // length of the chunk - off64_t mOffset; // current local offset, 0 == mStart - FILE* mFp; // for read/seek - char* mFileName; // for opening - - /* - * To support getBuffer() we either need to read the entire thing into - * a buffer or memory-map it. For small files it's probably best to - * just read them in. - */ - enum { kReadVsMapThreshold = 4096 }; - - FileMap* mMap; // for memory map - unsigned char* mBuf; // for read - - const void* ensureAlignment(FileMap* map); -}; - - -/* - * An asset based on compressed data in a file. - */ -class _CompressedAsset : public Asset { -public: - _CompressedAsset(void); - virtual ~_CompressedAsset(void); - - /* - * Use a piece of an already-open file. - * - * On success, the object takes ownership of "fd". - */ - status_t openChunk(int fd, off64_t offset, int compressionMethod, - size_t uncompressedLen, size_t compressedLen); - - /* - * Use a memory-mapped region. - * - * On success, the object takes ownership of "fd". - */ - status_t openChunk(FileMap* dataMap, int compressionMethod, - size_t uncompressedLen); - - /* - * Standard Asset interfaces. - */ - virtual ssize_t read(void* buf, size_t count); - virtual off64_t seek(off64_t offset, int whence); - virtual void close(void); - virtual const void* getBuffer(bool wordAligned); - virtual off64_t getLength(void) const { return mUncompressedLen; } - virtual off64_t getRemainingLength(void) const { return mUncompressedLen-mOffset; } - virtual int openFileDescriptor(off64_t* outStart, off64_t* outLength) const { return -1; } - virtual bool isAllocated(void) const { return mBuf != NULL; } - -private: - off64_t mStart; // offset to start of compressed data - off64_t mCompressedLen; // length of the compressed data - off64_t mUncompressedLen; // length of the uncompressed data - off64_t mOffset; // current offset, 0 == start of uncomp data - - FileMap* mMap; // for memory-mapped input - int mFd; // for file input - - class StreamingZipInflater* mZipInflater; // for streaming large compressed assets - - unsigned char* mBuf; // for getBuffer() -}; - -// need: shared mmap version? - -}; // namespace android - -#endif // __LIBS_ASSET_H diff --git a/include/utils/AssetDir.h b/include/utils/AssetDir.h deleted file mode 100644 index abf8a3595d..0000000000 --- a/include/utils/AssetDir.h +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// -// Access a chunk of the asset hierarchy as if it were a single directory. -// -#ifndef __LIBS_ASSETDIR_H -#define __LIBS_ASSETDIR_H - -#include <utils/String8.h> -#include <utils/Vector.h> -#include <utils/SortedVector.h> -#include <utils/misc.h> -#include <sys/types.h> - -namespace android { - -/* - * This provides vector-style access to a directory. We do this rather - * than modeling opendir/readdir access because it's simpler and the - * nature of the operation requires us to have all data on hand anyway. - * - * The list of files will be sorted in ascending order by ASCII value. - * - * The contents are populated by our friend, the AssetManager. - */ -class AssetDir { -public: - AssetDir(void) - : mFileInfo(NULL) - {} - virtual ~AssetDir(void) { - delete mFileInfo; - } - - /* - * Vector-style access. - */ - size_t getFileCount(void) { return mFileInfo->size(); } - const String8& getFileName(int idx) { - return mFileInfo->itemAt(idx).getFileName(); - } - const String8& getSourceName(int idx) { - return mFileInfo->itemAt(idx).getSourceName(); - } - - /* - * Get the type of a file (usually regular or directory). - */ - FileType getFileType(int idx) { - return mFileInfo->itemAt(idx).getFileType(); - } - -private: - /* these operations are not implemented */ - AssetDir(const AssetDir& src); - const AssetDir& operator=(const AssetDir& src); - - friend class AssetManager; - - /* - * This holds information about files in the asset hierarchy. - */ - class FileInfo { - public: - FileInfo(void) {} - FileInfo(const String8& path) // useful for e.g. svect.indexOf - : mFileName(path), mFileType(kFileTypeUnknown) - {} - ~FileInfo(void) {} - FileInfo(const FileInfo& src) { - copyMembers(src); - } - const FileInfo& operator= (const FileInfo& src) { - if (this != &src) - copyMembers(src); - return *this; - } - - void copyMembers(const FileInfo& src) { - mFileName = src.mFileName; - mFileType = src.mFileType; - mSourceName = src.mSourceName; - } - - /* need this for SortedVector; must compare only on file name */ - bool operator< (const FileInfo& rhs) const { - return mFileName < rhs.mFileName; - } - - /* used by AssetManager */ - bool operator== (const FileInfo& rhs) const { - return mFileName == rhs.mFileName; - } - - void set(const String8& path, FileType type) { - mFileName = path; - mFileType = type; - } - - const String8& getFileName(void) const { return mFileName; } - void setFileName(const String8& path) { mFileName = path; } - - FileType getFileType(void) const { return mFileType; } - void setFileType(FileType type) { mFileType = type; } - - const String8& getSourceName(void) const { return mSourceName; } - void setSourceName(const String8& path) { mSourceName = path; } - - /* - * Handy utility for finding an entry in a sorted vector of FileInfo. - * Returns the index of the matching entry, or -1 if none found. - */ - static int findEntry(const SortedVector<FileInfo>* pVector, - const String8& fileName); - - private: - String8 mFileName; // filename only - FileType mFileType; // regular, directory, etc - - String8 mSourceName; // currently debug-only - }; - - /* AssetManager uses this to initialize us */ - void setFileList(SortedVector<FileInfo>* list) { mFileInfo = list; } - - SortedVector<FileInfo>* mFileInfo; -}; - -}; // namespace android - -#endif // __LIBS_ASSETDIR_H diff --git a/include/utils/AssetManager.h b/include/utils/AssetManager.h deleted file mode 100644 index a8c7ddbd78..0000000000 --- a/include/utils/AssetManager.h +++ /dev/null @@ -1,373 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// -// Asset management class. AssetManager objects are thread-safe. -// -#ifndef __LIBS_ASSETMANAGER_H -#define __LIBS_ASSETMANAGER_H - -#include <utils/Asset.h> -#include <utils/AssetDir.h> -#include <utils/KeyedVector.h> -#include <utils/String8.h> -#include <utils/Vector.h> -#include <utils/String16.h> -#include <utils/ZipFileRO.h> -#include <utils/threads.h> - -/* - * Native-app access is via the opaque typedef struct AAssetManager in the C namespace. - */ -#ifdef __cplusplus -extern "C" { -#endif - -struct AAssetManager { }; - -#ifdef __cplusplus -}; -#endif - - -/* - * Now the proper C++ android-namespace definitions - */ - -namespace android { - -class Asset; // fwd decl for things that include Asset.h first -class ResTable; -struct ResTable_config; - -/* - * Every application that uses assets needs one instance of this. A - * single instance may be shared across multiple threads, and a single - * thread may have more than one instance (the latter is discouraged). - * - * The purpose of the AssetManager is to create Asset objects. To do - * this efficiently it may cache information about the locations of - * files it has seen. This can be controlled with the "cacheMode" - * argument. - * - * The asset hierarchy may be examined like a filesystem, using - * AssetDir objects to peruse a single directory. - */ -class AssetManager : public AAssetManager { -public: - typedef enum CacheMode { - CACHE_UNKNOWN = 0, - CACHE_OFF, // don't try to cache file locations - CACHE_DEFER, // construct cache as pieces are needed - //CACHE_SCAN, // scan full(!) asset hierarchy at init() time - } CacheMode; - - AssetManager(CacheMode cacheMode = CACHE_OFF); - virtual ~AssetManager(void); - - static int32_t getGlobalCount(); - - /* - * Add a new source for assets. This can be called multiple times to - * look in multiple places for assets. It can be either a directory (for - * finding assets as raw files on the disk) or a ZIP file. This newly - * added asset path will be examined first when searching for assets, - * before any that were previously added. - * - * Returns "true" on success, "false" on failure. If 'cookie' is non-NULL, - * then on success, *cookie is set to the value corresponding to the - * newly-added asset source. - */ - bool addAssetPath(const String8& path, void** cookie); - - /* - * Convenience for adding the standard system assets. Uses the - * ANDROID_ROOT environment variable to find them. - */ - bool addDefaultAssets(); - - /* - * Iterate over the asset paths in this manager. (Previously - * added via addAssetPath() and addDefaultAssets().) On first call, - * 'cookie' must be NULL, resulting in the first cookie being returned. - * Each next cookie will be returned there-after, until NULL indicating - * the end has been reached. - */ - void* nextAssetPath(void* cookie) const; - - /* - * Return an asset path in the manager. 'which' must be between 0 and - * countAssetPaths(). - */ - String8 getAssetPath(void* cookie) const; - - /* - * Set the current locale and vendor. The locale can change during - * the lifetime of an AssetManager if the user updates the device's - * language setting. The vendor is less likely to change. - * - * Pass in NULL to indicate no preference. - */ - void setLocale(const char* locale); - void setVendor(const char* vendor); - - /* - * Choose screen orientation for resources values returned. - */ - void setConfiguration(const ResTable_config& config, const char* locale = NULL); - - void getConfiguration(ResTable_config* outConfig) const; - - typedef Asset::AccessMode AccessMode; // typing shortcut - - /* - * Open an asset. - * - * This will search through locale-specific and vendor-specific - * directories and packages to find the file. - * - * The object returned does not depend on the AssetManager. It should - * be freed by calling Asset::close(). - */ - Asset* open(const char* fileName, AccessMode mode); - - /* - * Open a non-asset file as an asset. - * - * This is for opening files that are included in an asset package - * but aren't assets. These sit outside the usual "locale/vendor" - * path hierarchy, and will not be seen by "AssetDir" or included - * in our filename cache. - */ - Asset* openNonAsset(const char* fileName, AccessMode mode); - - /* - * Explicit non-asset file. The file explicitly named by the cookie (the - * resource set to look in) and fileName will be opened and returned. - */ - Asset* openNonAsset(void* cookie, const char* fileName, AccessMode mode); - - /* - * Open a directory within the asset hierarchy. - * - * The contents of the directory are an amalgam of vendor-specific, - * locale-specific, and generic assets stored loosely or in asset - * packages. Depending on the cache setting and previous accesses, - * this call may incur significant disk overhead. - * - * To open the top-level directory, pass in "". - */ - AssetDir* openDir(const char* dirName); - - /* - * Open a directory within a particular path of the asset manager. - * - * The contents of the directory are an amalgam of vendor-specific, - * locale-specific, and generic assets stored loosely or in asset - * packages. Depending on the cache setting and previous accesses, - * this call may incur significant disk overhead. - * - * To open the top-level directory, pass in "". - */ - AssetDir* openNonAssetDir(void* cookie, const char* dirName); - - /* - * Get the type of a file in the asset hierarchy. They will either - * be "regular" or "directory". [Currently only works for "regular".] - * - * Can also be used as a quick test for existence of a file. - */ - FileType getFileType(const char* fileName); - - /* - * Return the complete resource table to find things in the package. - */ - const ResTable& getResources(bool required = true) const; - - /* - * Discard cached filename information. This only needs to be called - * if somebody has updated the set of "loose" files, and we want to - * discard our cached notion of what's where. - */ - void purge(void) { purgeFileNameCacheLocked(); } - - /* - * Return true if the files this AssetManager references are all - * up-to-date (have not been changed since it was created). If false - * is returned, you will need to create a new AssetManager to get - * the current data. - */ - bool isUpToDate(); - - /** - * Get the known locales for this asset manager object. - */ - void getLocales(Vector<String8>* locales) const; - -private: - struct asset_path - { - String8 path; - FileType type; - String8 idmap; - }; - - Asset* openInPathLocked(const char* fileName, AccessMode mode, - const asset_path& path); - Asset* openNonAssetInPathLocked(const char* fileName, AccessMode mode, - const asset_path& path); - Asset* openInLocaleVendorLocked(const char* fileName, AccessMode mode, - const asset_path& path, const char* locale, const char* vendor); - String8 createPathNameLocked(const asset_path& path, const char* locale, - const char* vendor); - String8 createPathNameLocked(const asset_path& path, const char* rootDir); - String8 createZipSourceNameLocked(const String8& zipFileName, - const String8& dirName, const String8& fileName); - - ZipFileRO* getZipFileLocked(const asset_path& path); - Asset* openAssetFromFileLocked(const String8& fileName, AccessMode mode); - Asset* openAssetFromZipLocked(const ZipFileRO* pZipFile, - const ZipEntryRO entry, AccessMode mode, const String8& entryName); - - bool scanAndMergeDirLocked(SortedVector<AssetDir::FileInfo>* pMergedInfo, - const asset_path& path, const char* rootDir, const char* dirName); - SortedVector<AssetDir::FileInfo>* scanDirLocked(const String8& path); - bool scanAndMergeZipLocked(SortedVector<AssetDir::FileInfo>* pMergedInfo, - const asset_path& path, const char* rootDir, const char* dirName); - void mergeInfoLocked(SortedVector<AssetDir::FileInfo>* pMergedInfo, - const SortedVector<AssetDir::FileInfo>* pContents); - - void loadFileNameCacheLocked(void); - void fncScanLocked(SortedVector<AssetDir::FileInfo>* pMergedInfo, - const char* dirName); - bool fncScanAndMergeDirLocked( - SortedVector<AssetDir::FileInfo>* pMergedInfo, - const asset_path& path, const char* locale, const char* vendor, - const char* dirName); - void purgeFileNameCacheLocked(void); - - const ResTable* getResTable(bool required = true) const; - void setLocaleLocked(const char* locale); - void updateResourceParamsLocked() const; - - bool createIdmapFileLocked(const String8& originalPath, const String8& overlayPath, - const String8& idmapPath); - - bool isIdmapStaleLocked(const String8& originalPath, const String8& overlayPath, - const String8& idmapPath); - - Asset* openIdmapLocked(const struct asset_path& ap) const; - - bool getZipEntryCrcLocked(const String8& zipPath, const char* entryFilename, uint32_t* pCrc); - - class SharedZip : public RefBase { - public: - static sp<SharedZip> get(const String8& path); - - ZipFileRO* getZip(); - - Asset* getResourceTableAsset(); - Asset* setResourceTableAsset(Asset* asset); - - ResTable* getResourceTable(); - ResTable* setResourceTable(ResTable* res); - - bool isUpToDate(); - - protected: - ~SharedZip(); - - private: - SharedZip(const String8& path, time_t modWhen); - SharedZip(); // <-- not implemented - - String8 mPath; - ZipFileRO* mZipFile; - time_t mModWhen; - - Asset* mResourceTableAsset; - ResTable* mResourceTable; - - static Mutex gLock; - static DefaultKeyedVector<String8, wp<SharedZip> > gOpen; - }; - - /* - * Manage a set of Zip files. For each file we need a pointer to the - * ZipFile and a time_t with the file's modification date. - * - * We currently only have two zip files (current app, "common" app). - * (This was originally written for 8, based on app/locale/vendor.) - */ - class ZipSet { - public: - ZipSet(void); - ~ZipSet(void); - - /* - * Return a ZipFileRO structure for a ZipFileRO with the specified - * parameters. - */ - ZipFileRO* getZip(const String8& path); - - Asset* getZipResourceTableAsset(const String8& path); - Asset* setZipResourceTableAsset(const String8& path, Asset* asset); - - ResTable* getZipResourceTable(const String8& path); - ResTable* setZipResourceTable(const String8& path, ResTable* res); - - // generate path, e.g. "common/en-US-noogle.zip" - static String8 getPathName(const char* path); - - bool isUpToDate(); - - private: - void closeZip(int idx); - - int getIndex(const String8& zip) const; - mutable Vector<String8> mZipPath; - mutable Vector<sp<SharedZip> > mZipFile; - }; - - // Protect all internal state. - mutable Mutex mLock; - - ZipSet mZipSet; - - Vector<asset_path> mAssetPaths; - char* mLocale; - char* mVendor; - - mutable ResTable* mResources; - ResTable_config* mConfig; - - /* - * Cached data for "loose" files. This lets us avoid poking at the - * filesystem when searching for loose assets. Each entry is the - * "extended partial" path, e.g. "default/default/foo/bar.txt". The - * full set of files is present, including ".EXCLUDE" entries. - * - * We do not cache directory names. We don't retain the ".gz", - * because to our clients "foo" and "foo.gz" both look like "foo". - */ - CacheMode mCacheMode; // is the cache enabled? - bool mCacheValid; // clear when locale or vendor changes - SortedVector<AssetDir::FileInfo> mCache; -}; - -}; // namespace android - -#endif // __LIBS_ASSETMANAGER_H diff --git a/include/utils/BackupHelpers.h b/include/utils/BackupHelpers.h deleted file mode 100644 index 1bb04a7123..0000000000 --- a/include/utils/BackupHelpers.h +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Copyright (C) 2009 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef _UTILS_BACKUP_HELPERS_H -#define _UTILS_BACKUP_HELPERS_H - -#include <utils/Errors.h> -#include <utils/String8.h> -#include <utils/KeyedVector.h> - -namespace android { - -enum { - BACKUP_HEADER_ENTITY_V1 = 0x61746144, // Data (little endian) -}; - -typedef struct { - int type; // BACKUP_HEADER_ENTITY_V1 - int keyLen; // length of the key name, not including the null terminator - int dataSize; // size of the data, not including the padding, -1 means delete -} entity_header_v1; - -struct SnapshotHeader { - int magic0; - int fileCount; - int magic1; - int totalSize; -}; - -struct FileState { - int modTime_sec; - int modTime_nsec; - int mode; - int size; - int crc32; - int nameLen; -}; - -struct FileRec { - String8 file; - bool deleted; - FileState s; -}; - - -/** - * Writes the data. - * - * If an error occurs, it poisons this object and all write calls will fail - * with the error that occurred. - */ -class BackupDataWriter -{ -public: - BackupDataWriter(int fd); - // does not close fd - ~BackupDataWriter(); - - status_t WriteEntityHeader(const String8& key, size_t dataSize); - - /* Note: WriteEntityData will write arbitrary data into the file without - * validation or a previously-supplied header. The full backup implementation - * uses it this way to generate a controlled binary stream that is not - * entity-structured. If the implementation here is changed, either this - * use case must remain valid, or the full backup implementation should be - * adjusted to use some other appropriate mechanism. - */ - status_t WriteEntityData(const void* data, size_t size); - - void SetKeyPrefix(const String8& keyPrefix); - -private: - explicit BackupDataWriter(); - status_t write_padding_for(int n); - - int m_fd; - status_t m_status; - ssize_t m_pos; - int m_entityCount; - String8 m_keyPrefix; -}; - -/** - * Reads the data. - * - * If an error occurs, it poisons this object and all write calls will fail - * with the error that occurred. - */ -class BackupDataReader -{ -public: - BackupDataReader(int fd); - // does not close fd - ~BackupDataReader(); - - status_t Status(); - status_t ReadNextHeader(bool* done, int* type); - - bool HasEntities(); - status_t ReadEntityHeader(String8* key, size_t* dataSize); - status_t SkipEntityData(); // must be called with the pointer at the beginning of the data. - ssize_t ReadEntityData(void* data, size_t size); - -private: - explicit BackupDataReader(); - status_t skip_padding(); - - int m_fd; - bool m_done; - status_t m_status; - ssize_t m_pos; - ssize_t m_dataEndPos; - int m_entityCount; - union { - int type; - entity_header_v1 entity; - } m_header; - String8 m_key; -}; - -int back_up_files(int oldSnapshotFD, BackupDataWriter* dataStream, int newSnapshotFD, - char const* const* files, char const* const *keys, int fileCount); - -int write_tarfile(const String8& packageName, const String8& domain, - const String8& rootPath, const String8& filePath, BackupDataWriter* outputStream); - -class RestoreHelperBase -{ -public: - RestoreHelperBase(); - ~RestoreHelperBase(); - - status_t WriteFile(const String8& filename, BackupDataReader* in); - status_t WriteSnapshot(int fd); - -private: - void* m_buf; - bool m_loggedUnknownMetadata; - KeyedVector<String8,FileRec> m_files; -}; - -#define TEST_BACKUP_HELPERS 1 - -#if TEST_BACKUP_HELPERS -int backup_helper_test_empty(); -int backup_helper_test_four(); -int backup_helper_test_files(); -int backup_helper_test_null_base(); -int backup_helper_test_missing_file(); -int backup_helper_test_data_writer(); -int backup_helper_test_data_reader(); -#endif - -} // namespace android - -#endif // _UTILS_BACKUP_HELPERS_H diff --git a/include/utils/Condition.h b/include/utils/Condition.h new file mode 100644 index 0000000000..8852d53330 --- /dev/null +++ b/include/utils/Condition.h @@ -0,0 +1,134 @@ +/* + * Copyright (C) 2007 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _LIBS_UTILS_CONDITION_H +#define _LIBS_UTILS_CONDITION_H + +#include <stdint.h> +#include <sys/types.h> +#include <time.h> + +#if defined(HAVE_PTHREADS) +# include <pthread.h> +#endif + +#include <utils/Errors.h> +#include <utils/Mutex.h> +#include <utils/Timers.h> + +// --------------------------------------------------------------------------- +namespace android { +// --------------------------------------------------------------------------- + +/* + * Condition variable class. The implementation is system-dependent. + * + * Condition variables are paired up with mutexes. Lock the mutex, + * call wait(), then either re-wait() if things aren't quite what you want, + * or unlock the mutex and continue. All threads calling wait() must + * use the same mutex for a given Condition. + */ +class Condition { +public: + enum { + PRIVATE = 0, + SHARED = 1 + }; + + Condition(); + Condition(int type); + ~Condition(); + // Wait on the condition variable. Lock the mutex before calling. + status_t wait(Mutex& mutex); + // same with relative timeout + status_t waitRelative(Mutex& mutex, nsecs_t reltime); + // Signal the condition variable, allowing one thread to continue. + void signal(); + // Signal the condition variable, allowing all threads to continue. + void broadcast(); + +private: +#if defined(HAVE_PTHREADS) + pthread_cond_t mCond; +#else + void* mState; +#endif +}; + +// --------------------------------------------------------------------------- + +#if defined(HAVE_PTHREADS) + +inline Condition::Condition() { + pthread_cond_init(&mCond, NULL); +} +inline Condition::Condition(int type) { + if (type == SHARED) { + pthread_condattr_t attr; + pthread_condattr_init(&attr); + pthread_condattr_setpshared(&attr, PTHREAD_PROCESS_SHARED); + pthread_cond_init(&mCond, &attr); + pthread_condattr_destroy(&attr); + } else { + pthread_cond_init(&mCond, NULL); + } +} +inline Condition::~Condition() { + pthread_cond_destroy(&mCond); +} +inline status_t Condition::wait(Mutex& mutex) { + return -pthread_cond_wait(&mCond, &mutex.mMutex); +} +inline status_t Condition::waitRelative(Mutex& mutex, nsecs_t reltime) { +#if defined(HAVE_PTHREAD_COND_TIMEDWAIT_RELATIVE) + struct timespec ts; + ts.tv_sec = reltime/1000000000; + ts.tv_nsec = reltime%1000000000; + return -pthread_cond_timedwait_relative_np(&mCond, &mutex.mMutex, &ts); +#else // HAVE_PTHREAD_COND_TIMEDWAIT_RELATIVE + struct timespec ts; +#if defined(HAVE_POSIX_CLOCKS) + clock_gettime(CLOCK_REALTIME, &ts); +#else // HAVE_POSIX_CLOCKS + // we don't support the clocks here. + struct timeval t; + gettimeofday(&t, NULL); + ts.tv_sec = t.tv_sec; + ts.tv_nsec= t.tv_usec*1000; +#endif // HAVE_POSIX_CLOCKS + ts.tv_sec += reltime/1000000000; + ts.tv_nsec+= reltime%1000000000; + if (ts.tv_nsec >= 1000000000) { + ts.tv_nsec -= 1000000000; + ts.tv_sec += 1; + } + return -pthread_cond_timedwait(&mCond, &mutex.mMutex, &ts); +#endif // HAVE_PTHREAD_COND_TIMEDWAIT_RELATIVE +} +inline void Condition::signal() { + pthread_cond_signal(&mCond); +} +inline void Condition::broadcast() { + pthread_cond_broadcast(&mCond); +} + +#endif // HAVE_PTHREADS + +// --------------------------------------------------------------------------- +}; // namespace android +// --------------------------------------------------------------------------- + +#endif // _LIBS_UTILS_CONDITON_H diff --git a/include/utils/KeyedVector.h b/include/utils/KeyedVector.h index fcc3bcfa00..85535bd61e 100644 --- a/include/utils/KeyedVector.h +++ b/include/utils/KeyedVector.h @@ -122,7 +122,7 @@ ssize_t KeyedVector<KEY,VALUE>::indexOfKey(const KEY& key) const { template<typename KEY, typename VALUE> inline const VALUE& KeyedVector<KEY,VALUE>::valueFor(const KEY& key) const { - ssize_t i = indexOfKey(key); + ssize_t i = this->indexOfKey(key); assert(i>=0); return mVector.itemAt(i).value; } @@ -139,7 +139,7 @@ const KEY& KeyedVector<KEY,VALUE>::keyAt(size_t index) const { template<typename KEY, typename VALUE> inline VALUE& KeyedVector<KEY,VALUE>::editValueFor(const KEY& key) { - ssize_t i = indexOfKey(key); + ssize_t i = this->indexOfKey(key); assert(i>=0); return mVector.editItemAt(i).value; } @@ -190,7 +190,7 @@ DefaultKeyedVector<KEY,VALUE>::DefaultKeyedVector(const VALUE& defValue) template<typename KEY, typename VALUE> inline const VALUE& DefaultKeyedVector<KEY,VALUE>::valueFor(const KEY& key) const { - ssize_t i = indexOfKey(key); + ssize_t i = this->indexOfKey(key); return i >= 0 ? KeyedVector<KEY,VALUE>::valueAt(i) : mDefault; } diff --git a/include/utils/Mutex.h b/include/utils/Mutex.h new file mode 100644 index 0000000000..de6fb394ad --- /dev/null +++ b/include/utils/Mutex.h @@ -0,0 +1,137 @@ +/* + * Copyright (C) 2007 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _LIBS_UTILS_MUTEX_H +#define _LIBS_UTILS_MUTEX_H + +#include <stdint.h> +#include <sys/types.h> +#include <time.h> + +#if defined(HAVE_PTHREADS) +# include <pthread.h> +#endif + +#include <utils/Errors.h> + +// --------------------------------------------------------------------------- +namespace android { +// --------------------------------------------------------------------------- + +class Condition; + +/* + * Simple mutex class. The implementation is system-dependent. + * + * The mutex must be unlocked by the thread that locked it. They are not + * recursive, i.e. the same thread can't lock it multiple times. + */ +class Mutex { +public: + enum { + PRIVATE = 0, + SHARED = 1 + }; + + Mutex(); + Mutex(const char* name); + Mutex(int type, const char* name = NULL); + ~Mutex(); + + // lock or unlock the mutex + status_t lock(); + void unlock(); + + // lock if possible; returns 0 on success, error otherwise + status_t tryLock(); + + // Manages the mutex automatically. It'll be locked when Autolock is + // constructed and released when Autolock goes out of scope. + class Autolock { + public: + inline Autolock(Mutex& mutex) : mLock(mutex) { mLock.lock(); } + inline Autolock(Mutex* mutex) : mLock(*mutex) { mLock.lock(); } + inline ~Autolock() { mLock.unlock(); } + private: + Mutex& mLock; + }; + +private: + friend class Condition; + + // A mutex cannot be copied + Mutex(const Mutex&); + Mutex& operator = (const Mutex&); + +#if defined(HAVE_PTHREADS) + pthread_mutex_t mMutex; +#else + void _init(); + void* mState; +#endif +}; + +// --------------------------------------------------------------------------- + +#if defined(HAVE_PTHREADS) + +inline Mutex::Mutex() { + pthread_mutex_init(&mMutex, NULL); +} +inline Mutex::Mutex(const char* name) { + pthread_mutex_init(&mMutex, NULL); +} +inline Mutex::Mutex(int type, const char* name) { + if (type == SHARED) { + pthread_mutexattr_t attr; + pthread_mutexattr_init(&attr); + pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED); + pthread_mutex_init(&mMutex, &attr); + pthread_mutexattr_destroy(&attr); + } else { + pthread_mutex_init(&mMutex, NULL); + } +} +inline Mutex::~Mutex() { + pthread_mutex_destroy(&mMutex); +} +inline status_t Mutex::lock() { + return -pthread_mutex_lock(&mMutex); +} +inline void Mutex::unlock() { + pthread_mutex_unlock(&mMutex); +} +inline status_t Mutex::tryLock() { + return -pthread_mutex_trylock(&mMutex); +} + +#endif // HAVE_PTHREADS + +// --------------------------------------------------------------------------- + +/* + * Automatic mutex. Declare one of these at the top of a function. + * When the function returns, it will go out of scope, and release the + * mutex. + */ + +typedef Mutex::Autolock AutoMutex; + +// --------------------------------------------------------------------------- +}; // namespace android +// --------------------------------------------------------------------------- + +#endif // _LIBS_UTILS_MUTEX_H diff --git a/include/utils/ObbFile.h b/include/utils/ObbFile.h deleted file mode 100644 index 47559cdd0d..0000000000 --- a/include/utils/ObbFile.h +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OBBFILE_H_ -#define OBBFILE_H_ - -#include <stdint.h> -#include <strings.h> - -#include <utils/RefBase.h> -#include <utils/String8.h> - -namespace android { - -// OBB flags (bit 0) -#define OBB_OVERLAY (1 << 0) -#define OBB_SALTED (1 << 1) - -class ObbFile : public RefBase { -protected: - virtual ~ObbFile(); - -public: - ObbFile(); - - bool readFrom(const char* filename); - bool readFrom(int fd); - bool writeTo(const char* filename); - bool writeTo(int fd); - bool removeFrom(const char* filename); - bool removeFrom(int fd); - - const char* getFileName() const { - return mFileName; - } - - const String8 getPackageName() const { - return mPackageName; - } - - void setPackageName(String8 packageName) { - mPackageName = packageName; - } - - int32_t getVersion() const { - return mVersion; - } - - void setVersion(int32_t version) { - mVersion = version; - } - - int32_t getFlags() const { - return mFlags; - } - - void setFlags(int32_t flags) { - mFlags = flags; - } - - const unsigned char* getSalt(size_t* length) const { - if ((mFlags & OBB_SALTED) == 0) { - *length = 0; - return NULL; - } - - *length = sizeof(mSalt); - return mSalt; - } - - bool setSalt(const unsigned char* salt, size_t length) { - if (length != sizeof(mSalt)) { - return false; - } - - memcpy(mSalt, salt, sizeof(mSalt)); - mFlags |= OBB_SALTED; - return true; - } - - 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) { - return buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24); - } - - static inline void put4LE(unsigned char* buf, uint32_t val) { - buf[0] = val & 0xFF; - buf[1] = (val >> 8) & 0xFF; - buf[2] = (val >> 16) & 0xFF; - buf[3] = (val >> 24) & 0xFF; - } - -private: - /* Package name this ObbFile is associated with */ - String8 mPackageName; - - /* Package version this ObbFile is associated with */ - int32_t mVersion; - - /* Flags for this OBB type. */ - int32_t mFlags; - - /* Whether the file is salted. */ - bool mSalted; - - /* The encryption salt. */ - unsigned char mSalt[8]; - - const char* mFileName; - - size_t mFileSize; - - size_t mFooterStart; - - unsigned char* mReadBuf; - - bool parseObbFile(int fd); -}; - -} -#endif /* OBBFILE_H_ */ diff --git a/include/utils/RWLock.h b/include/utils/RWLock.h new file mode 100644 index 0000000000..a5abea2b8f --- /dev/null +++ b/include/utils/RWLock.h @@ -0,0 +1,126 @@ +/* + * Copyright (C) 2007 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _LIBS_UTILS_RWLOCK_H +#define _LIBS_UTILS_RWLOCK_H + +#include <stdint.h> +#include <sys/types.h> + +#if defined(HAVE_PTHREADS) +# include <pthread.h> +#endif + +#include <utils/Errors.h> +#include <utils/ThreadDefs.h> + +// --------------------------------------------------------------------------- +namespace android { +// --------------------------------------------------------------------------- + +#if defined(HAVE_PTHREADS) + +/* + * Simple mutex class. The implementation is system-dependent. + * + * The mutex must be unlocked by the thread that locked it. They are not + * recursive, i.e. the same thread can't lock it multiple times. + */ +class RWLock { +public: + enum { + PRIVATE = 0, + SHARED = 1 + }; + + RWLock(); + RWLock(const char* name); + RWLock(int type, const char* name = NULL); + ~RWLock(); + + status_t readLock(); + status_t tryReadLock(); + status_t writeLock(); + status_t tryWriteLock(); + void unlock(); + + class AutoRLock { + public: + inline AutoRLock(RWLock& rwlock) : mLock(rwlock) { mLock.readLock(); } + inline ~AutoRLock() { mLock.unlock(); } + private: + RWLock& mLock; + }; + + class AutoWLock { + public: + inline AutoWLock(RWLock& rwlock) : mLock(rwlock) { mLock.writeLock(); } + inline ~AutoWLock() { mLock.unlock(); } + private: + RWLock& mLock; + }; + +private: + // A RWLock cannot be copied + RWLock(const RWLock&); + RWLock& operator = (const RWLock&); + + pthread_rwlock_t mRWLock; +}; + +inline RWLock::RWLock() { + pthread_rwlock_init(&mRWLock, NULL); +} +inline RWLock::RWLock(const char* name) { + pthread_rwlock_init(&mRWLock, NULL); +} +inline RWLock::RWLock(int type, const char* name) { + if (type == SHARED) { + pthread_rwlockattr_t attr; + pthread_rwlockattr_init(&attr); + pthread_rwlockattr_setpshared(&attr, PTHREAD_PROCESS_SHARED); + pthread_rwlock_init(&mRWLock, &attr); + pthread_rwlockattr_destroy(&attr); + } else { + pthread_rwlock_init(&mRWLock, NULL); + } +} +inline RWLock::~RWLock() { + pthread_rwlock_destroy(&mRWLock); +} +inline status_t RWLock::readLock() { + return -pthread_rwlock_rdlock(&mRWLock); +} +inline status_t RWLock::tryReadLock() { + return -pthread_rwlock_tryrdlock(&mRWLock); +} +inline status_t RWLock::writeLock() { + return -pthread_rwlock_wrlock(&mRWLock); +} +inline status_t RWLock::tryWriteLock() { + return -pthread_rwlock_trywrlock(&mRWLock); +} +inline void RWLock::unlock() { + pthread_rwlock_unlock(&mRWLock); +} + +#endif // HAVE_PTHREADS + +// --------------------------------------------------------------------------- +}; // namespace android +// --------------------------------------------------------------------------- + +#endif // _LIBS_UTILS_RWLOCK_H diff --git a/include/utils/ResourceTypes.h b/include/utils/ResourceTypes.h deleted file mode 100644 index c496da6bac..0000000000 --- a/include/utils/ResourceTypes.h +++ /dev/null @@ -1,1592 +0,0 @@ -/* - * Copyright (C) 2005 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// -// Definitions of resource data structures. -// -#ifndef _LIBS_UTILS_RESOURCE_TYPES_H -#define _LIBS_UTILS_RESOURCE_TYPES_H - -#include <utils/Asset.h> -#include <utils/ByteOrder.h> -#include <utils/Errors.h> -#include <utils/String16.h> -#include <utils/Vector.h> - -#include <utils/threads.h> - -#include <stdint.h> -#include <sys/types.h> - -#include <android/configuration.h> - -namespace android { - -/** ******************************************************************** - * PNG Extensions - * - * New private chunks that may be placed in PNG images. - * - *********************************************************************** */ - -/** - * This chunk specifies how to split an image into segments for - * scaling. - * - * There are J horizontal and K vertical segments. These segments divide - * the image into J*K regions as follows (where J=4 and K=3): - * - * F0 S0 F1 S1 - * +-----+----+------+-------+ - * S2| 0 | 1 | 2 | 3 | - * +-----+----+------+-------+ - * | | | | | - * | | | | | - * F2| 4 | 5 | 6 | 7 | - * | | | | | - * | | | | | - * +-----+----+------+-------+ - * S3| 8 | 9 | 10 | 11 | - * +-----+----+------+-------+ - * - * Each horizontal and vertical segment is considered to by either - * stretchable (marked by the Sx labels) or fixed (marked by the Fy - * labels), in the horizontal or vertical axis, respectively. In the - * above example, the first is horizontal segment (F0) is fixed, the - * next is stretchable and then they continue to alternate. Note that - * the segment list for each axis can begin or end with a stretchable - * or fixed segment. - * - * The relative sizes of the stretchy segments indicates the relative - * amount of stretchiness of the regions bordered by the segments. For - * example, regions 3, 7 and 11 above will take up more horizontal space - * than regions 1, 5 and 9 since the horizontal segment associated with - * the first set of regions is larger than the other set of regions. The - * ratios of the amount of horizontal (or vertical) space taken by any - * two stretchable slices is exactly the ratio of their corresponding - * segment lengths. - * - * xDivs and yDivs point to arrays of horizontal and vertical pixel - * indices. The first pair of Divs (in either array) indicate the - * starting and ending points of the first stretchable segment in that - * axis. The next pair specifies the next stretchable segment, etc. So - * in the above example xDiv[0] and xDiv[1] specify the horizontal - * coordinates for the regions labeled 1, 5 and 9. xDiv[2] and - * xDiv[3] specify the coordinates for regions 3, 7 and 11. Note that - * the leftmost slices always start at x=0 and the rightmost slices - * always end at the end of the image. So, for example, the regions 0, - * 4 and 8 (which are fixed along the X axis) start at x value 0 and - * go to xDiv[0] and slices 2, 6 and 10 start at xDiv[1] and end at - * xDiv[2]. - * - * The array pointed to by the colors field lists contains hints for - * each of the regions. They are ordered according left-to-right and - * top-to-bottom as indicated above. For each segment that is a solid - * color the array entry will contain that color value; otherwise it - * will contain NO_COLOR. Segments that are completely transparent - * will always have the value TRANSPARENT_COLOR. - * - * The PNG chunk type is "npTc". - */ -struct Res_png_9patch -{ - Res_png_9patch() : wasDeserialized(false), xDivs(NULL), - yDivs(NULL), colors(NULL) { } - - int8_t wasDeserialized; - int8_t numXDivs; - int8_t numYDivs; - int8_t numColors; - - // These tell where the next section of a patch starts. - // For example, the first patch includes the pixels from - // 0 to xDivs[0]-1 and the second patch includes the pixels - // from xDivs[0] to xDivs[1]-1. - // Note: allocation/free of these pointers is left to the caller. - int32_t* xDivs; - int32_t* yDivs; - - int32_t paddingLeft, paddingRight; - int32_t paddingTop, paddingBottom; - - enum { - // The 9 patch segment is not a solid color. - NO_COLOR = 0x00000001, - - // The 9 patch segment is completely transparent. - TRANSPARENT_COLOR = 0x00000000 - }; - // Note: allocation/free of this pointer is left to the caller. - uint32_t* colors; - - // Convert data from device representation to PNG file representation. - void deviceToFile(); - // Convert data from PNG file representation to device representation. - void fileToDevice(); - // Serialize/Marshall the patch data into a newly malloc-ed block - void* serialize(); - // Serialize/Marshall the patch data - void serialize(void* outData); - // Deserialize/Unmarshall the patch data - static Res_png_9patch* deserialize(const void* data); - // Compute the size of the serialized data structure - size_t serializedSize(); -}; - -/** ******************************************************************** - * Base Types - * - * These are standard types that are shared between multiple specific - * resource types. - * - *********************************************************************** */ - -/** - * Header that appears at the front of every data chunk in a resource. - */ -struct ResChunk_header -{ - // Type identifier for this chunk. The meaning of this value depends - // on the containing chunk. - uint16_t type; - - // Size of the chunk header (in bytes). Adding this value to - // the address of the chunk allows you to find its associated data - // (if any). - uint16_t headerSize; - - // Total size of this chunk (in bytes). This is the chunkSize plus - // the size of any data associated with the chunk. Adding this value - // to the chunk allows you to completely skip its contents (including - // any child chunks). If this value is the same as chunkSize, there is - // no data associated with the chunk. - uint32_t size; -}; - -enum { - RES_NULL_TYPE = 0x0000, - RES_STRING_POOL_TYPE = 0x0001, - RES_TABLE_TYPE = 0x0002, - RES_XML_TYPE = 0x0003, - - // Chunk types in RES_XML_TYPE - RES_XML_FIRST_CHUNK_TYPE = 0x0100, - RES_XML_START_NAMESPACE_TYPE= 0x0100, - RES_XML_END_NAMESPACE_TYPE = 0x0101, - RES_XML_START_ELEMENT_TYPE = 0x0102, - RES_XML_END_ELEMENT_TYPE = 0x0103, - RES_XML_CDATA_TYPE = 0x0104, - RES_XML_LAST_CHUNK_TYPE = 0x017f, - // This contains a uint32_t array mapping strings in the string - // pool back to resource identifiers. It is optional. - RES_XML_RESOURCE_MAP_TYPE = 0x0180, - - // Chunk types in RES_TABLE_TYPE - RES_TABLE_PACKAGE_TYPE = 0x0200, - RES_TABLE_TYPE_TYPE = 0x0201, - RES_TABLE_TYPE_SPEC_TYPE = 0x0202 -}; - -/** - * Macros for building/splitting resource identifiers. - */ -#define Res_VALIDID(resid) (resid != 0) -#define Res_CHECKID(resid) ((resid&0xFFFF0000) != 0) -#define Res_MAKEID(package, type, entry) \ - (((package+1)<<24) | (((type+1)&0xFF)<<16) | (entry&0xFFFF)) -#define Res_GETPACKAGE(id) ((id>>24)-1) -#define Res_GETTYPE(id) (((id>>16)&0xFF)-1) -#define Res_GETENTRY(id) (id&0xFFFF) - -#define Res_INTERNALID(resid) ((resid&0xFFFF0000) != 0 && (resid&0xFF0000) == 0) -#define Res_MAKEINTERNAL(entry) (0x01000000 | (entry&0xFFFF)) -#define Res_MAKEARRAY(entry) (0x02000000 | (entry&0xFFFF)) - -#define Res_MAXPACKAGE 255 - -/** - * Representation of a value in a resource, supplying type - * information. - */ -struct Res_value -{ - // Number of bytes in this structure. - uint16_t size; - - // Always set to 0. - uint8_t res0; - - // Type of the data value. - enum { - // Contains no data. - TYPE_NULL = 0x00, - // The 'data' holds a ResTable_ref, a reference to another resource - // table entry. - TYPE_REFERENCE = 0x01, - // The 'data' holds an attribute resource identifier. - TYPE_ATTRIBUTE = 0x02, - // The 'data' holds an index into the containing resource table's - // global value string pool. - TYPE_STRING = 0x03, - // The 'data' holds a single-precision floating point number. - TYPE_FLOAT = 0x04, - // The 'data' holds a complex number encoding a dimension value, - // such as "100in". - TYPE_DIMENSION = 0x05, - // The 'data' holds a complex number encoding a fraction of a - // container. - TYPE_FRACTION = 0x06, - - // Beginning of integer flavors... - TYPE_FIRST_INT = 0x10, - - // The 'data' is a raw integer value of the form n..n. - TYPE_INT_DEC = 0x10, - // The 'data' is a raw integer value of the form 0xn..n. - TYPE_INT_HEX = 0x11, - // The 'data' is either 0 or 1, for input "false" or "true" respectively. - TYPE_INT_BOOLEAN = 0x12, - - // Beginning of color integer flavors... - TYPE_FIRST_COLOR_INT = 0x1c, - - // The 'data' is a raw integer value of the form #aarrggbb. - TYPE_INT_COLOR_ARGB8 = 0x1c, - // The 'data' is a raw integer value of the form #rrggbb. - TYPE_INT_COLOR_RGB8 = 0x1d, - // The 'data' is a raw integer value of the form #argb. - TYPE_INT_COLOR_ARGB4 = 0x1e, - // The 'data' is a raw integer value of the form #rgb. - TYPE_INT_COLOR_RGB4 = 0x1f, - - // ...end of integer flavors. - TYPE_LAST_COLOR_INT = 0x1f, - - // ...end of integer flavors. - TYPE_LAST_INT = 0x1f - }; - uint8_t dataType; - - // Structure of complex data values (TYPE_UNIT and TYPE_FRACTION) - enum { - // Where the unit type information is. This gives us 16 possible - // types, as defined below. - COMPLEX_UNIT_SHIFT = 0, - COMPLEX_UNIT_MASK = 0xf, - - // TYPE_DIMENSION: Value is raw pixels. - COMPLEX_UNIT_PX = 0, - // TYPE_DIMENSION: Value is Device Independent Pixels. - COMPLEX_UNIT_DIP = 1, - // TYPE_DIMENSION: Value is a Scaled device independent Pixels. - COMPLEX_UNIT_SP = 2, - // TYPE_DIMENSION: Value is in points. - COMPLEX_UNIT_PT = 3, - // TYPE_DIMENSION: Value is in inches. - COMPLEX_UNIT_IN = 4, - // TYPE_DIMENSION: Value is in millimeters. - COMPLEX_UNIT_MM = 5, - - // TYPE_FRACTION: A basic fraction of the overall size. - COMPLEX_UNIT_FRACTION = 0, - // TYPE_FRACTION: A fraction of the parent size. - COMPLEX_UNIT_FRACTION_PARENT = 1, - - // Where the radix information is, telling where the decimal place - // appears in the mantissa. This give us 4 possible fixed point - // representations as defined below. - COMPLEX_RADIX_SHIFT = 4, - COMPLEX_RADIX_MASK = 0x3, - - // The mantissa is an integral number -- i.e., 0xnnnnnn.0 - COMPLEX_RADIX_23p0 = 0, - // The mantissa magnitude is 16 bits -- i.e, 0xnnnn.nn - COMPLEX_RADIX_16p7 = 1, - // The mantissa magnitude is 8 bits -- i.e, 0xnn.nnnn - COMPLEX_RADIX_8p15 = 2, - // The mantissa magnitude is 0 bits -- i.e, 0x0.nnnnnn - COMPLEX_RADIX_0p23 = 3, - - // Where the actual value is. This gives us 23 bits of - // precision. The top bit is the sign. - COMPLEX_MANTISSA_SHIFT = 8, - COMPLEX_MANTISSA_MASK = 0xffffff - }; - - // The data for this item, as interpreted according to dataType. - uint32_t data; - - void copyFrom_dtoh(const Res_value& src); -}; - -/** - * This is a reference to a unique entry (a ResTable_entry structure) - * in a resource table. The value is structured as: 0xpptteeee, - * where pp is the package index, tt is the type index in that - * package, and eeee is the entry index in that type. The package - * and type values start at 1 for the first item, to help catch cases - * where they have not been supplied. - */ -struct ResTable_ref -{ - uint32_t ident; -}; - -/** - * Reference to a string in a string pool. - */ -struct ResStringPool_ref -{ - // Index into the string pool table (uint32_t-offset from the indices - // immediately after ResStringPool_header) at which to find the location - // of the string data in the pool. - uint32_t index; -}; - -/** ******************************************************************** - * String Pool - * - * A set of strings that can be references by others through a - * ResStringPool_ref. - * - *********************************************************************** */ - -/** - * Definition for a pool of strings. The data of this chunk is an - * array of uint32_t providing indices into the pool, relative to - * stringsStart. At stringsStart are all of the UTF-16 strings - * concatenated together; each starts with a uint16_t of the string's - * length and each ends with a 0x0000 terminator. If a string is > - * 32767 characters, the high bit of the length is set meaning to take - * those 15 bits as a high word and it will be followed by another - * uint16_t containing the low word. - * - * If styleCount is not zero, then immediately following the array of - * uint32_t indices into the string table is another array of indices - * into a style table starting at stylesStart. Each entry in the - * style table is an array of ResStringPool_span structures. - */ -struct ResStringPool_header -{ - struct ResChunk_header header; - - // Number of strings in this pool (number of uint32_t indices that follow - // in the data). - uint32_t stringCount; - - // Number of style span arrays in the pool (number of uint32_t indices - // follow the string indices). - uint32_t styleCount; - - // Flags. - enum { - // If set, the string index is sorted by the string values (based - // on strcmp16()). - SORTED_FLAG = 1<<0, - - // String pool is encoded in UTF-8 - UTF8_FLAG = 1<<8 - }; - uint32_t flags; - - // Index from header of the string data. - uint32_t stringsStart; - - // Index from header of the style data. - uint32_t stylesStart; -}; - -/** - * This structure defines a span of style information associated with - * a string in the pool. - */ -struct ResStringPool_span -{ - enum { - END = 0xFFFFFFFF - }; - - // This is the name of the span -- that is, the name of the XML - // tag that defined it. The special value END (0xFFFFFFFF) indicates - // the end of an array of spans. - ResStringPool_ref name; - - // The range of characters in the string that this span applies to. - uint32_t firstChar, lastChar; -}; - -/** - * Convenience class for accessing data in a ResStringPool resource. - */ -class ResStringPool -{ -public: - ResStringPool(); - ResStringPool(const void* data, size_t size, bool copyData=false); - ~ResStringPool(); - - status_t setTo(const void* data, size_t size, bool copyData=false); - - status_t getError() const; - - void uninit(); - - // Return string entry as UTF16; if the pool is UTF8, the string will - // be converted before returning. - inline const char16_t* stringAt(const ResStringPool_ref& ref, size_t* outLen) const { - return stringAt(ref.index, outLen); - } - const char16_t* stringAt(size_t idx, size_t* outLen) const; - - // Note: returns null if the string pool is not UTF8. - const char* string8At(size_t idx, size_t* outLen) const; - - // Return string whether the pool is UTF8 or UTF16. Does not allow you - // to distinguish null. - const String8 string8ObjectAt(size_t idx) const; - - const ResStringPool_span* styleAt(const ResStringPool_ref& ref) const; - const ResStringPool_span* styleAt(size_t idx) const; - - ssize_t indexOfString(const char16_t* str, size_t strLen) const; - - size_t size() const; - size_t styleCount() const; - size_t bytes() const; - - bool isSorted() const; - bool isUTF8() const; - -private: - status_t mError; - void* mOwnedData; - const ResStringPool_header* mHeader; - size_t mSize; - mutable Mutex mDecodeLock; - const uint32_t* mEntries; - const uint32_t* mEntryStyles; - const void* mStrings; - char16_t** mCache; - uint32_t mStringPoolSize; // number of uint16_t - const uint32_t* mStyles; - uint32_t mStylePoolSize; // number of uint32_t -}; - -/** ******************************************************************** - * XML Tree - * - * Binary representation of an XML document. This is designed to - * express everything in an XML document, in a form that is much - * easier to parse on the device. - * - *********************************************************************** */ - -/** - * XML tree header. This appears at the front of an XML tree, - * describing its content. It is followed by a flat array of - * ResXMLTree_node structures; the hierarchy of the XML document - * is described by the occurrance of RES_XML_START_ELEMENT_TYPE - * and corresponding RES_XML_END_ELEMENT_TYPE nodes in the array. - */ -struct ResXMLTree_header -{ - struct ResChunk_header header; -}; - -/** - * Basic XML tree node. A single item in the XML document. Extended info - * about the node can be found after header.headerSize. - */ -struct ResXMLTree_node -{ - struct ResChunk_header header; - - // Line number in original source file at which this element appeared. - uint32_t lineNumber; - - // Optional XML comment that was associated with this element; -1 if none. - struct ResStringPool_ref comment; -}; - -/** - * Extended XML tree node for CDATA tags -- includes the CDATA string. - * Appears header.headerSize bytes after a ResXMLTree_node. - */ -struct ResXMLTree_cdataExt -{ - // The raw CDATA character data. - struct ResStringPool_ref data; - - // The typed value of the character data if this is a CDATA node. - struct Res_value typedData; -}; - -/** - * Extended XML tree node for namespace start/end nodes. - * Appears header.headerSize bytes after a ResXMLTree_node. - */ -struct ResXMLTree_namespaceExt -{ - // The prefix of the namespace. - struct ResStringPool_ref prefix; - - // The URI of the namespace. - struct ResStringPool_ref uri; -}; - -/** - * Extended XML tree node for element start/end nodes. - * Appears header.headerSize bytes after a ResXMLTree_node. - */ -struct ResXMLTree_endElementExt -{ - // String of the full namespace of this element. - struct ResStringPool_ref ns; - - // String name of this node if it is an ELEMENT; the raw - // character data if this is a CDATA node. - struct ResStringPool_ref name; -}; - -/** - * Extended XML tree node for start tags -- includes attribute - * information. - * Appears header.headerSize bytes after a ResXMLTree_node. - */ -struct ResXMLTree_attrExt -{ - // String of the full namespace of this element. - struct ResStringPool_ref ns; - - // String name of this node if it is an ELEMENT; the raw - // character data if this is a CDATA node. - struct ResStringPool_ref name; - - // Byte offset from the start of this structure where the attributes start. - uint16_t attributeStart; - - // Size of the ResXMLTree_attribute structures that follow. - uint16_t attributeSize; - - // Number of attributes associated with an ELEMENT. These are - // available as an array of ResXMLTree_attribute structures - // immediately following this node. - uint16_t attributeCount; - - // Index (1-based) of the "id" attribute. 0 if none. - uint16_t idIndex; - - // Index (1-based) of the "class" attribute. 0 if none. - uint16_t classIndex; - - // Index (1-based) of the "style" attribute. 0 if none. - uint16_t styleIndex; -}; - -struct ResXMLTree_attribute -{ - // Namespace of this attribute. - struct ResStringPool_ref ns; - - // Name of this attribute. - struct ResStringPool_ref name; - - // The original raw string value of this attribute. - struct ResStringPool_ref rawValue; - - // Processesd typed value of this attribute. - struct Res_value typedValue; -}; - -class ResXMLTree; - -class ResXMLParser -{ -public: - ResXMLParser(const ResXMLTree& tree); - - enum event_code_t { - BAD_DOCUMENT = -1, - START_DOCUMENT = 0, - END_DOCUMENT = 1, - - FIRST_CHUNK_CODE = RES_XML_FIRST_CHUNK_TYPE, - - START_NAMESPACE = RES_XML_START_NAMESPACE_TYPE, - END_NAMESPACE = RES_XML_END_NAMESPACE_TYPE, - START_TAG = RES_XML_START_ELEMENT_TYPE, - END_TAG = RES_XML_END_ELEMENT_TYPE, - TEXT = RES_XML_CDATA_TYPE - }; - - struct ResXMLPosition - { - event_code_t eventCode; - const ResXMLTree_node* curNode; - const void* curExt; - }; - - void restart(); - - const ResStringPool& getStrings() const; - - event_code_t getEventType() const; - // Note, unlike XmlPullParser, the first call to next() will return - // START_TAG of the first element. - event_code_t next(); - - // These are available for all nodes: - int32_t getCommentID() const; - const uint16_t* getComment(size_t* outLen) const; - uint32_t getLineNumber() const; - - // This is available for TEXT: - int32_t getTextID() const; - const uint16_t* getText(size_t* outLen) const; - ssize_t getTextValue(Res_value* outValue) const; - - // These are available for START_NAMESPACE and END_NAMESPACE: - int32_t getNamespacePrefixID() const; - const uint16_t* getNamespacePrefix(size_t* outLen) const; - int32_t getNamespaceUriID() const; - const uint16_t* getNamespaceUri(size_t* outLen) const; - - // These are available for START_TAG and END_TAG: - int32_t getElementNamespaceID() const; - const uint16_t* getElementNamespace(size_t* outLen) const; - int32_t getElementNameID() const; - const uint16_t* getElementName(size_t* outLen) const; - - // Remaining methods are for retrieving information about attributes - // associated with a START_TAG: - - size_t getAttributeCount() const; - - // Returns -1 if no namespace, -2 if idx out of range. - int32_t getAttributeNamespaceID(size_t idx) const; - const uint16_t* getAttributeNamespace(size_t idx, size_t* outLen) const; - - int32_t getAttributeNameID(size_t idx) const; - const uint16_t* getAttributeName(size_t idx, size_t* outLen) const; - uint32_t getAttributeNameResID(size_t idx) const; - - int32_t getAttributeValueStringID(size_t idx) const; - const uint16_t* getAttributeStringValue(size_t idx, size_t* outLen) const; - - int32_t getAttributeDataType(size_t idx) const; - int32_t getAttributeData(size_t idx) const; - ssize_t getAttributeValue(size_t idx, Res_value* outValue) const; - - ssize_t indexOfAttribute(const char* ns, const char* attr) const; - ssize_t indexOfAttribute(const char16_t* ns, size_t nsLen, - const char16_t* attr, size_t attrLen) const; - - ssize_t indexOfID() const; - ssize_t indexOfClass() const; - ssize_t indexOfStyle() const; - - void getPosition(ResXMLPosition* pos) const; - void setPosition(const ResXMLPosition& pos); - -private: - friend class ResXMLTree; - - event_code_t nextNode(); - - const ResXMLTree& mTree; - event_code_t mEventCode; - const ResXMLTree_node* mCurNode; - const void* mCurExt; -}; - -/** - * Convenience class for accessing data in a ResXMLTree resource. - */ -class ResXMLTree : public ResXMLParser -{ -public: - ResXMLTree(); - ResXMLTree(const void* data, size_t size, bool copyData=false); - ~ResXMLTree(); - - status_t setTo(const void* data, size_t size, bool copyData=false); - - status_t getError() const; - - void uninit(); - -private: - friend class ResXMLParser; - - status_t validateNode(const ResXMLTree_node* node) const; - - status_t mError; - void* mOwnedData; - const ResXMLTree_header* mHeader; - size_t mSize; - const uint8_t* mDataEnd; - ResStringPool mStrings; - const uint32_t* mResIds; - size_t mNumResIds; - const ResXMLTree_node* mRootNode; - const void* mRootExt; - event_code_t mRootCode; -}; - -/** ******************************************************************** - * RESOURCE TABLE - * - *********************************************************************** */ - -/** - * Header for a resource table. Its data contains a series of - * additional chunks: - * * A ResStringPool_header containing all table values. This string pool - * contains all of the string values in the entire resource table (not - * the names of entries or type identifiers however). - * * One or more ResTable_package chunks. - * - * Specific entries within a resource table can be uniquely identified - * with a single integer as defined by the ResTable_ref structure. - */ -struct ResTable_header -{ - struct ResChunk_header header; - - // The number of ResTable_package structures. - uint32_t packageCount; -}; - -/** - * A collection of resource data types within a package. Followed by - * one or more ResTable_type and ResTable_typeSpec structures containing the - * entry values for each resource type. - */ -struct ResTable_package -{ - struct ResChunk_header header; - - // If this is a base package, its ID. Package IDs start - // at 1 (corresponding to the value of the package bits in a - // resource identifier). 0 means this is not a base package. - uint32_t id; - - // Actual name of this package, \0-terminated. - char16_t name[128]; - - // Offset to a ResStringPool_header defining the resource - // type symbol table. If zero, this package is inheriting from - // another base package (overriding specific values in it). - uint32_t typeStrings; - - // Last index into typeStrings that is for public use by others. - uint32_t lastPublicType; - - // Offset to a ResStringPool_header defining the resource - // key symbol table. If zero, this package is inheriting from - // another base package (overriding specific values in it). - uint32_t keyStrings; - - // Last index into keyStrings that is for public use by others. - uint32_t lastPublicKey; -}; - -/** - * Describes a particular resource configuration. - */ -struct ResTable_config -{ - // Number of bytes in this structure. - uint32_t size; - - union { - struct { - // Mobile country code (from SIM). 0 means "any". - uint16_t mcc; - // Mobile network code (from SIM). 0 means "any". - uint16_t mnc; - }; - uint32_t imsi; - }; - - union { - struct { - // \0\0 means "any". Otherwise, en, fr, etc. - char language[2]; - - // \0\0 means "any". Otherwise, US, CA, etc. - char country[2]; - }; - uint32_t locale; - }; - - enum { - ORIENTATION_ANY = ACONFIGURATION_ORIENTATION_ANY, - ORIENTATION_PORT = ACONFIGURATION_ORIENTATION_PORT, - ORIENTATION_LAND = ACONFIGURATION_ORIENTATION_LAND, - ORIENTATION_SQUARE = ACONFIGURATION_ORIENTATION_SQUARE, - }; - - enum { - TOUCHSCREEN_ANY = ACONFIGURATION_TOUCHSCREEN_ANY, - TOUCHSCREEN_NOTOUCH = ACONFIGURATION_TOUCHSCREEN_NOTOUCH, - TOUCHSCREEN_STYLUS = ACONFIGURATION_TOUCHSCREEN_STYLUS, - TOUCHSCREEN_FINGER = ACONFIGURATION_TOUCHSCREEN_FINGER, - }; - - enum { - DENSITY_DEFAULT = ACONFIGURATION_DENSITY_DEFAULT, - DENSITY_LOW = ACONFIGURATION_DENSITY_LOW, - DENSITY_MEDIUM = ACONFIGURATION_DENSITY_MEDIUM, - DENSITY_TV = ACONFIGURATION_DENSITY_TV, - DENSITY_HIGH = ACONFIGURATION_DENSITY_HIGH, - DENSITY_XHIGH = ACONFIGURATION_DENSITY_XHIGH, - DENSITY_XXHIGH = ACONFIGURATION_DENSITY_XXHIGH, - DENSITY_NONE = ACONFIGURATION_DENSITY_NONE - }; - - union { - struct { - uint8_t orientation; - uint8_t touchscreen; - uint16_t density; - }; - uint32_t screenType; - }; - - enum { - KEYBOARD_ANY = ACONFIGURATION_KEYBOARD_ANY, - KEYBOARD_NOKEYS = ACONFIGURATION_KEYBOARD_NOKEYS, - KEYBOARD_QWERTY = ACONFIGURATION_KEYBOARD_QWERTY, - KEYBOARD_12KEY = ACONFIGURATION_KEYBOARD_12KEY, - }; - - enum { - NAVIGATION_ANY = ACONFIGURATION_NAVIGATION_ANY, - NAVIGATION_NONAV = ACONFIGURATION_NAVIGATION_NONAV, - NAVIGATION_DPAD = ACONFIGURATION_NAVIGATION_DPAD, - NAVIGATION_TRACKBALL = ACONFIGURATION_NAVIGATION_TRACKBALL, - NAVIGATION_WHEEL = ACONFIGURATION_NAVIGATION_WHEEL, - }; - - enum { - MASK_KEYSHIDDEN = 0x0003, - KEYSHIDDEN_ANY = ACONFIGURATION_KEYSHIDDEN_ANY, - KEYSHIDDEN_NO = ACONFIGURATION_KEYSHIDDEN_NO, - KEYSHIDDEN_YES = ACONFIGURATION_KEYSHIDDEN_YES, - KEYSHIDDEN_SOFT = ACONFIGURATION_KEYSHIDDEN_SOFT, - }; - - enum { - MASK_NAVHIDDEN = 0x000c, - SHIFT_NAVHIDDEN = 2, - NAVHIDDEN_ANY = ACONFIGURATION_NAVHIDDEN_ANY << SHIFT_NAVHIDDEN, - NAVHIDDEN_NO = ACONFIGURATION_NAVHIDDEN_NO << SHIFT_NAVHIDDEN, - NAVHIDDEN_YES = ACONFIGURATION_NAVHIDDEN_YES << SHIFT_NAVHIDDEN, - }; - - union { - struct { - uint8_t keyboard; - uint8_t navigation; - uint8_t inputFlags; - uint8_t inputPad0; - }; - uint32_t input; - }; - - enum { - SCREENWIDTH_ANY = 0 - }; - - enum { - SCREENHEIGHT_ANY = 0 - }; - - union { - struct { - uint16_t screenWidth; - uint16_t screenHeight; - }; - uint32_t screenSize; - }; - - enum { - SDKVERSION_ANY = 0 - }; - - enum { - MINORVERSION_ANY = 0 - }; - - union { - struct { - uint16_t sdkVersion; - // For now minorVersion must always be 0!!! Its meaning - // is currently undefined. - uint16_t minorVersion; - }; - uint32_t version; - }; - - enum { - // screenLayout bits for screen size class. - MASK_SCREENSIZE = 0x0f, - SCREENSIZE_ANY = ACONFIGURATION_SCREENSIZE_ANY, - SCREENSIZE_SMALL = ACONFIGURATION_SCREENSIZE_SMALL, - SCREENSIZE_NORMAL = ACONFIGURATION_SCREENSIZE_NORMAL, - SCREENSIZE_LARGE = ACONFIGURATION_SCREENSIZE_LARGE, - SCREENSIZE_XLARGE = ACONFIGURATION_SCREENSIZE_XLARGE, - - // screenLayout bits for wide/long screen variation. - MASK_SCREENLONG = 0x30, - SHIFT_SCREENLONG = 4, - SCREENLONG_ANY = ACONFIGURATION_SCREENLONG_ANY << SHIFT_SCREENLONG, - SCREENLONG_NO = ACONFIGURATION_SCREENLONG_NO << SHIFT_SCREENLONG, - SCREENLONG_YES = ACONFIGURATION_SCREENLONG_YES << SHIFT_SCREENLONG, - }; - - enum { - // uiMode bits for the mode type. - MASK_UI_MODE_TYPE = 0x0f, - UI_MODE_TYPE_ANY = ACONFIGURATION_UI_MODE_TYPE_ANY, - UI_MODE_TYPE_NORMAL = ACONFIGURATION_UI_MODE_TYPE_NORMAL, - UI_MODE_TYPE_DESK = ACONFIGURATION_UI_MODE_TYPE_DESK, - UI_MODE_TYPE_CAR = ACONFIGURATION_UI_MODE_TYPE_CAR, - UI_MODE_TYPE_TELEVISION = ACONFIGURATION_UI_MODE_TYPE_TELEVISION, - UI_MODE_TYPE_APPLIANCE = ACONFIGURATION_UI_MODE_TYPE_APPLIANCE, - - // uiMode bits for the night switch. - MASK_UI_MODE_NIGHT = 0x30, - SHIFT_UI_MODE_NIGHT = 4, - UI_MODE_NIGHT_ANY = ACONFIGURATION_UI_MODE_NIGHT_ANY << SHIFT_UI_MODE_NIGHT, - UI_MODE_NIGHT_NO = ACONFIGURATION_UI_MODE_NIGHT_NO << SHIFT_UI_MODE_NIGHT, - UI_MODE_NIGHT_YES = ACONFIGURATION_UI_MODE_NIGHT_YES << SHIFT_UI_MODE_NIGHT, - }; - - union { - struct { - uint8_t screenLayout; - uint8_t uiMode; - uint16_t smallestScreenWidthDp; - }; - uint32_t screenConfig; - }; - - union { - struct { - uint16_t screenWidthDp; - uint16_t screenHeightDp; - }; - uint32_t screenSizeDp; - }; - - void copyFromDeviceNoSwap(const ResTable_config& o); - - void copyFromDtoH(const ResTable_config& o); - - void swapHtoD(); - - int compare(const ResTable_config& o) const; - int compareLogical(const ResTable_config& o) const; - - // Flags indicating a set of config values. These flag constants must - // match the corresponding ones in android.content.pm.ActivityInfo and - // attrs_manifest.xml. - enum { - CONFIG_MCC = ACONFIGURATION_MCC, - CONFIG_MNC = ACONFIGURATION_MCC, - CONFIG_LOCALE = ACONFIGURATION_LOCALE, - CONFIG_TOUCHSCREEN = ACONFIGURATION_TOUCHSCREEN, - CONFIG_KEYBOARD = ACONFIGURATION_KEYBOARD, - CONFIG_KEYBOARD_HIDDEN = ACONFIGURATION_KEYBOARD_HIDDEN, - CONFIG_NAVIGATION = ACONFIGURATION_NAVIGATION, - CONFIG_ORIENTATION = ACONFIGURATION_ORIENTATION, - CONFIG_DENSITY = ACONFIGURATION_DENSITY, - CONFIG_SCREEN_SIZE = ACONFIGURATION_SCREEN_SIZE, - CONFIG_SMALLEST_SCREEN_SIZE = ACONFIGURATION_SMALLEST_SCREEN_SIZE, - CONFIG_VERSION = ACONFIGURATION_VERSION, - CONFIG_SCREEN_LAYOUT = ACONFIGURATION_SCREEN_LAYOUT, - CONFIG_UI_MODE = ACONFIGURATION_UI_MODE - }; - - // Compare two configuration, returning CONFIG_* flags set for each value - // that is different. - int diff(const ResTable_config& o) const; - - // Return true if 'this' is more specific than 'o'. - bool isMoreSpecificThan(const ResTable_config& o) const; - - // Return true if 'this' is a better match than 'o' for the 'requested' - // configuration. This assumes that match() has already been used to - // remove any configurations that don't match the requested configuration - // at all; if they are not first filtered, non-matching results can be - // considered better than matching ones. - // The general rule per attribute: if the request cares about an attribute - // (it normally does), if the two (this and o) are equal it's a tie. If - // they are not equal then one must be generic because only generic and - // '==requested' will pass the match() call. So if this is not generic, - // it wins. If this IS generic, o wins (return false). - bool isBetterThan(const ResTable_config& o, const ResTable_config* requested) const; - - // Return true if 'this' can be considered a match for the parameters in - // 'settings'. - // Note this is asymetric. A default piece of data will match every request - // but a request for the default should not match odd specifics - // (ie, request with no mcc should not match a particular mcc's data) - // settings is the requested settings - bool match(const ResTable_config& settings) const; - - void getLocale(char str[6]) const; - - String8 toString() const; -}; - -/** - * A specification of the resources defined by a particular type. - * - * There should be one of these chunks for each resource type. - * - * This structure is followed by an array of integers providing the set of - * configuation change flags (ResTable_config::CONFIG_*) that have multiple - * resources for that configuration. In addition, the high bit is set if that - * resource has been made public. - */ -struct ResTable_typeSpec -{ - struct ResChunk_header header; - - // The type identifier this chunk is holding. Type IDs start - // at 1 (corresponding to the value of the type bits in a - // resource identifier). 0 is invalid. - uint8_t id; - - // Must be 0. - uint8_t res0; - // Must be 0. - uint16_t res1; - - // Number of uint32_t entry configuration masks that follow. - uint32_t entryCount; - - enum { - // Additional flag indicating an entry is public. - SPEC_PUBLIC = 0x40000000 - }; -}; - -/** - * A collection of resource entries for a particular resource data - * type. Followed by an array of uint32_t defining the resource - * values, corresponding to the array of type strings in the - * ResTable_package::typeStrings string block. Each of these hold an - * index from entriesStart; a value of NO_ENTRY means that entry is - * not defined. - * - * There may be multiple of these chunks for a particular resource type, - * supply different configuration variations for the resource values of - * that type. - * - * It would be nice to have an additional ordered index of entries, so - * we can do a binary search if trying to find a resource by string name. - */ -struct ResTable_type -{ - struct ResChunk_header header; - - enum { - NO_ENTRY = 0xFFFFFFFF - }; - - // The type identifier this chunk is holding. Type IDs start - // at 1 (corresponding to the value of the type bits in a - // resource identifier). 0 is invalid. - uint8_t id; - - // Must be 0. - uint8_t res0; - // Must be 0. - uint16_t res1; - - // Number of uint32_t entry indices that follow. - uint32_t entryCount; - - // Offset from header where ResTable_entry data starts. - uint32_t entriesStart; - - // Configuration this collection of entries is designed for. - ResTable_config config; -}; - -/** - * This is the beginning of information about an entry in the resource - * table. It holds the reference to the name of this entry, and is - * immediately followed by one of: - * * A Res_value structure, if FLAG_COMPLEX is -not- set. - * * An array of ResTable_map structures, if FLAG_COMPLEX is set. - * These supply a set of name/value mappings of data. - */ -struct ResTable_entry -{ - // Number of bytes in this structure. - uint16_t size; - - enum { - // If set, this is a complex entry, holding a set of name/value - // mappings. It is followed by an array of ResTable_map structures. - FLAG_COMPLEX = 0x0001, - // If set, this resource has been declared public, so libraries - // are allowed to reference it. - FLAG_PUBLIC = 0x0002 - }; - uint16_t flags; - - // Reference into ResTable_package::keyStrings identifying this entry. - struct ResStringPool_ref key; -}; - -/** - * Extended form of a ResTable_entry for map entries, defining a parent map - * resource from which to inherit values. - */ -struct ResTable_map_entry : public ResTable_entry -{ - // Resource identifier of the parent mapping, or 0 if there is none. - ResTable_ref parent; - // Number of name/value pairs that follow for FLAG_COMPLEX. - uint32_t count; -}; - -/** - * A single name/value mapping that is part of a complex resource - * entry. - */ -struct ResTable_map -{ - // The resource identifier defining this mapping's name. For attribute - // resources, 'name' can be one of the following special resource types - // to supply meta-data about the attribute; for all other resource types - // it must be an attribute resource. - ResTable_ref name; - - // Special values for 'name' when defining attribute resources. - enum { - // This entry holds the attribute's type code. - ATTR_TYPE = Res_MAKEINTERNAL(0), - - // For integral attributes, this is the minimum value it can hold. - ATTR_MIN = Res_MAKEINTERNAL(1), - - // For integral attributes, this is the maximum value it can hold. - ATTR_MAX = Res_MAKEINTERNAL(2), - - // Localization of this resource is can be encouraged or required with - // an aapt flag if this is set - ATTR_L10N = Res_MAKEINTERNAL(3), - - // for plural support, see android.content.res.PluralRules#attrForQuantity(int) - ATTR_OTHER = Res_MAKEINTERNAL(4), - ATTR_ZERO = Res_MAKEINTERNAL(5), - ATTR_ONE = Res_MAKEINTERNAL(6), - ATTR_TWO = Res_MAKEINTERNAL(7), - ATTR_FEW = Res_MAKEINTERNAL(8), - ATTR_MANY = Res_MAKEINTERNAL(9) - - }; - - // Bit mask of allowed types, for use with ATTR_TYPE. - enum { - // No type has been defined for this attribute, use generic - // type handling. The low 16 bits are for types that can be - // handled generically; the upper 16 require additional information - // in the bag so can not be handled generically for TYPE_ANY. - TYPE_ANY = 0x0000FFFF, - - // Attribute holds a references to another resource. - TYPE_REFERENCE = 1<<0, - - // Attribute holds a generic string. - TYPE_STRING = 1<<1, - - // Attribute holds an integer value. ATTR_MIN and ATTR_MIN can - // optionally specify a constrained range of possible integer values. - TYPE_INTEGER = 1<<2, - - // Attribute holds a boolean integer. - TYPE_BOOLEAN = 1<<3, - - // Attribute holds a color value. - TYPE_COLOR = 1<<4, - - // Attribute holds a floating point value. - TYPE_FLOAT = 1<<5, - - // Attribute holds a dimension value, such as "20px". - TYPE_DIMENSION = 1<<6, - - // Attribute holds a fraction value, such as "20%". - TYPE_FRACTION = 1<<7, - - // Attribute holds an enumeration. The enumeration values are - // supplied as additional entries in the map. - TYPE_ENUM = 1<<16, - - // Attribute holds a bitmaks of flags. The flag bit values are - // supplied as additional entries in the map. - TYPE_FLAGS = 1<<17 - }; - - // Enum of localization modes, for use with ATTR_L10N. - enum { - L10N_NOT_REQUIRED = 0, - L10N_SUGGESTED = 1 - }; - - // This mapping's value. - Res_value value; -}; - -/** - * Convenience class for accessing data in a ResTable resource. - */ -class ResTable -{ -public: - ResTable(); - ResTable(const void* data, size_t size, void* cookie, - bool copyData=false); - ~ResTable(); - - status_t add(const void* data, size_t size, void* cookie, - bool copyData=false, const void* idmap = NULL); - status_t add(Asset* asset, void* cookie, - bool copyData=false, const void* idmap = NULL); - status_t add(ResTable* src); - - status_t getError() const; - - void uninit(); - - struct resource_name - { - const char16_t* package; - size_t packageLen; - const char16_t* type; - size_t typeLen; - const char16_t* name; - size_t nameLen; - }; - - bool getResourceName(uint32_t resID, resource_name* outName) const; - - /** - * Retrieve the value of a resource. If the resource is found, returns a - * value >= 0 indicating the table it is in (for use with - * getTableStringBlock() and getTableCookie()) and fills in 'outValue'. If - * not found, returns a negative error code. - * - * Note that this function does not do reference traversal. If you want - * to follow references to other resources to get the "real" value to - * use, you need to call resolveReference() after this function. - * - * @param resID The desired resoruce identifier. - * @param outValue Filled in with the resource data that was found. - * - * @return ssize_t Either a >= 0 table index or a negative error code. - */ - ssize_t getResource(uint32_t resID, Res_value* outValue, bool mayBeBag = false, - uint16_t density = 0, - uint32_t* outSpecFlags = NULL, - ResTable_config* outConfig = NULL) const; - - inline ssize_t getResource(const ResTable_ref& res, Res_value* outValue, - uint32_t* outSpecFlags=NULL) const { - return getResource(res.ident, outValue, false, 0, outSpecFlags, NULL); - } - - ssize_t resolveReference(Res_value* inOutValue, - ssize_t blockIndex, - uint32_t* outLastRef = NULL, - uint32_t* inoutTypeSpecFlags = NULL, - ResTable_config* outConfig = NULL) const; - - enum { - TMP_BUFFER_SIZE = 16 - }; - const char16_t* valueToString(const Res_value* value, size_t stringBlock, - char16_t tmpBuffer[TMP_BUFFER_SIZE], - size_t* outLen); - - struct bag_entry { - ssize_t stringBlock; - ResTable_map map; - }; - - /** - * Retrieve the bag of a resource. If the resoruce is found, returns the - * number of bags it contains and 'outBag' points to an array of their - * values. If not found, a negative error code is returned. - * - * Note that this function -does- do reference traversal of the bag data. - * - * @param resID The desired resource identifier. - * @param outBag Filled inm with a pointer to the bag mappings. - * - * @return ssize_t Either a >= 0 bag count of negative error code. - */ - ssize_t lockBag(uint32_t resID, const bag_entry** outBag) const; - - void unlockBag(const bag_entry* bag) const; - - void lock() const; - - ssize_t getBagLocked(uint32_t resID, const bag_entry** outBag, - uint32_t* outTypeSpecFlags=NULL) const; - - void unlock() const; - - class Theme { - public: - Theme(const ResTable& table); - ~Theme(); - - inline const ResTable& getResTable() const { return mTable; } - - status_t applyStyle(uint32_t resID, bool force=false); - status_t setTo(const Theme& other); - - /** - * Retrieve a value in the theme. If the theme defines this - * value, returns a value >= 0 indicating the table it is in - * (for use with getTableStringBlock() and getTableCookie) and - * fills in 'outValue'. If not found, returns a negative error - * code. - * - * Note that this function does not do reference traversal. If you want - * to follow references to other resources to get the "real" value to - * use, you need to call resolveReference() after this function. - * - * @param resID A resource identifier naming the desired theme - * attribute. - * @param outValue Filled in with the theme value that was - * found. - * - * @return ssize_t Either a >= 0 table index or a negative error code. - */ - ssize_t getAttribute(uint32_t resID, Res_value* outValue, - uint32_t* outTypeSpecFlags = NULL) const; - - /** - * This is like ResTable::resolveReference(), but also takes - * care of resolving attribute references to the theme. - */ - ssize_t resolveAttributeReference(Res_value* inOutValue, - ssize_t blockIndex, uint32_t* outLastRef = NULL, - uint32_t* inoutTypeSpecFlags = NULL, - ResTable_config* inoutConfig = NULL) const; - - void dumpToLog() const; - - private: - Theme(const Theme&); - Theme& operator=(const Theme&); - - struct theme_entry { - ssize_t stringBlock; - uint32_t typeSpecFlags; - Res_value value; - }; - struct type_info { - size_t numEntries; - theme_entry* entries; - }; - struct package_info { - size_t numTypes; - type_info types[]; - }; - - void free_package(package_info* pi); - package_info* copy_package(package_info* pi); - - const ResTable& mTable; - package_info* mPackages[Res_MAXPACKAGE]; - }; - - void setParameters(const ResTable_config* params); - void getParameters(ResTable_config* params) const; - - // Retrieve an identifier (which can be passed to getResource) - // for a given resource name. The 'name' can be fully qualified - // (<package>:<type>.<basename>) or the package or type components - // can be dropped if default values are supplied here. - // - // Returns 0 if no such resource was found, else a valid resource ID. - uint32_t identifierForName(const char16_t* name, size_t nameLen, - const char16_t* type = 0, size_t typeLen = 0, - const char16_t* defPackage = 0, - size_t defPackageLen = 0, - uint32_t* outTypeSpecFlags = NULL) const; - - static bool expandResourceRef(const uint16_t* refStr, size_t refLen, - String16* outPackage, - String16* outType, - String16* outName, - const String16* defType = NULL, - const String16* defPackage = NULL, - const char** outErrorMsg = NULL, - bool* outPublicOnly = NULL); - - static bool stringToInt(const char16_t* s, size_t len, Res_value* outValue); - static bool stringToFloat(const char16_t* s, size_t len, Res_value* outValue); - - // Used with stringToValue. - class Accessor - { - public: - inline virtual ~Accessor() { } - - virtual uint32_t getCustomResource(const String16& package, - const String16& type, - const String16& name) const = 0; - virtual uint32_t getCustomResourceWithCreation(const String16& package, - const String16& type, - const String16& name, - const bool createIfNeeded = false) = 0; - virtual uint32_t getRemappedPackage(uint32_t origPackage) const = 0; - virtual bool getAttributeType(uint32_t attrID, uint32_t* outType) = 0; - virtual bool getAttributeMin(uint32_t attrID, uint32_t* outMin) = 0; - virtual bool getAttributeMax(uint32_t attrID, uint32_t* outMax) = 0; - virtual bool getAttributeEnum(uint32_t attrID, - const char16_t* name, size_t nameLen, - Res_value* outValue) = 0; - virtual bool getAttributeFlags(uint32_t attrID, - const char16_t* name, size_t nameLen, - Res_value* outValue) = 0; - virtual uint32_t getAttributeL10N(uint32_t attrID) = 0; - virtual bool getLocalizationSetting() = 0; - virtual void reportError(void* accessorCookie, const char* fmt, ...) = 0; - }; - - // Convert a string to a resource value. Handles standard "@res", - // "#color", "123", and "0x1bd" types; performs escaping of strings. - // The resulting value is placed in 'outValue'; if it is a string type, - // 'outString' receives the string. If 'attrID' is supplied, the value is - // type checked against this attribute and it is used to perform enum - // evaluation. If 'acccessor' is supplied, it will be used to attempt to - // resolve resources that do not exist in this ResTable. If 'attrType' is - // supplied, the value will be type checked for this format if 'attrID' - // is not supplied or found. - bool stringToValue(Res_value* outValue, String16* outString, - const char16_t* s, size_t len, - bool preserveSpaces, bool coerceType, - uint32_t attrID = 0, - const String16* defType = NULL, - const String16* defPackage = NULL, - Accessor* accessor = NULL, - void* accessorCookie = NULL, - uint32_t attrType = ResTable_map::TYPE_ANY, - bool enforcePrivate = true) const; - - // Perform processing of escapes and quotes in a string. - static bool collectString(String16* outString, - const char16_t* s, size_t len, - bool preserveSpaces, - const char** outErrorMsg = NULL, - bool append = false); - - size_t getBasePackageCount() const; - const char16_t* getBasePackageName(size_t idx) const; - uint32_t getBasePackageId(size_t idx) const; - - // Return the number of resource tables that the object contains. - size_t getTableCount() const; - // Return the values string pool for the resource table at the given - // index. This string pool contains all of the strings for values - // contained in the resource table -- that is the item values themselves, - // but not the names their entries or types. - const ResStringPool* getTableStringBlock(size_t index) const; - // Return unique cookie identifier for the given resource table. - void* getTableCookie(size_t index) const; - - // Return the configurations (ResTable_config) that we know about - void getConfigurations(Vector<ResTable_config>* configs) const; - - void getLocales(Vector<String8>* locales) const; - - // Generate an idmap. - // - // Return value: on success: NO_ERROR; caller is responsible for free-ing - // outData (using free(3)). On failure, any status_t value other than - // NO_ERROR; the caller should not free outData. - status_t createIdmap(const ResTable& overlay, uint32_t originalCrc, uint32_t overlayCrc, - void** outData, size_t* outSize) const; - - enum { - IDMAP_HEADER_SIZE_BYTES = 3 * sizeof(uint32_t), - }; - // Retrieve idmap meta-data. - // - // This function only requires the idmap header (the first - // IDMAP_HEADER_SIZE_BYTES) bytes of an idmap file. - static bool getIdmapInfo(const void* idmap, size_t size, - uint32_t* pOriginalCrc, uint32_t* pOverlayCrc); - -#ifndef HAVE_ANDROID_OS - void print(bool inclValues) const; - static String8 normalizeForOutput(const char* input); -#endif - -private: - struct Header; - struct Type; - struct Package; - struct PackageGroup; - struct bag_set; - - status_t add(const void* data, size_t size, void* cookie, - Asset* asset, bool copyData, const Asset* idmap); - - ssize_t getResourcePackageIndex(uint32_t resID) const; - ssize_t getEntry( - const Package* package, int typeIndex, int entryIndex, - const ResTable_config* config, - const ResTable_type** outType, const ResTable_entry** outEntry, - const Type** outTypeClass) const; - status_t parsePackage( - const ResTable_package* const pkg, const Header* const header, uint32_t idmap_id); - - void print_value(const Package* pkg, const Res_value& value) const; - - mutable Mutex mLock; - - status_t mError; - - ResTable_config mParams; - - // Array of all resource tables. - Vector<Header*> mHeaders; - - // Array of packages in all resource tables. - Vector<PackageGroup*> mPackageGroups; - - // Mapping from resource package IDs to indices into the internal - // package array. - uint8_t mPackageMap[256]; -}; - -} // namespace android - -#endif // _LIBS_UTILS_RESOURCE_TYPES_H diff --git a/include/utils/StreamingZipInflater.h b/include/utils/StreamingZipInflater.h deleted file mode 100644 index 3ace5d5a83..0000000000 --- a/include/utils/StreamingZipInflater.h +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __LIBS_STREAMINGZIPINFLATER_H -#define __LIBS_STREAMINGZIPINFLATER_H - -#include <unistd.h> -#include <inttypes.h> -#include <zlib.h> - -#include <utils/Compat.h> - -namespace android { - -class StreamingZipInflater { -public: - static const size_t INPUT_CHUNK_SIZE = 64 * 1024; - static const size_t OUTPUT_CHUNK_SIZE = 64 * 1024; - - // Flavor that pages in the compressed data from a fd - StreamingZipInflater(int fd, off64_t compDataStart, size_t uncompSize, size_t compSize); - - // Flavor that gets the compressed data from an in-memory buffer - StreamingZipInflater(class FileMap* dataMap, size_t uncompSize); - - ~StreamingZipInflater(); - - // read 'count' bytes of uncompressed data from the current position. outBuf may - // be NULL, in which case the data is consumed and discarded. - ssize_t read(void* outBuf, size_t count); - - // seeking backwards requires uncompressing fom the beginning, so is very - // expensive. seeking forwards only requires uncompressing from the current - // position to the destination. - off64_t seekAbsolute(off64_t absoluteInputPosition); - -private: - void initInflateState(); - int readNextChunk(); - - // where to find the uncompressed data - int mFd; - off64_t mInFileStart; // where the compressed data lives in the file - class FileMap* mDataMap; - - z_stream mInflateState; - bool mStreamNeedsInit; - - // output invariants for this asset - uint8_t* mOutBuf; // output buf for decompressed bytes - size_t mOutBufSize; // allocated size of mOutBuf - size_t mOutTotalSize; // total uncompressed size of the blob - - // current output state bookkeeping - off64_t mOutCurPosition; // current position in total offset - size_t mOutLastDecoded; // last decoded byte + 1 in mOutbuf - size_t mOutDeliverable; // next undelivered byte of decoded output in mOutBuf - - // input invariants - uint8_t* mInBuf; - size_t mInBufSize; // allocated size of mInBuf; - size_t mInTotalSize; // total size of compressed data for this blob - - // input state bookkeeping - size_t mInNextChunkOffset; // offset from start of blob at which the next input chunk lies - // the z_stream contains state about input block consumption -}; - -} - -#endif diff --git a/include/utils/Thread.h b/include/utils/Thread.h new file mode 100644 index 0000000000..4a34abd788 --- /dev/null +++ b/include/utils/Thread.h @@ -0,0 +1,113 @@ +/* + * Copyright (C) 2007 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _LIBS_UTILS_THREAD_H +#define _LIBS_UTILS_THREAD_H + +#include <stdint.h> +#include <sys/types.h> +#include <time.h> + +#if defined(HAVE_PTHREADS) +# include <pthread.h> +#endif + +#include <utils/Condition.h> +#include <utils/Errors.h> +#include <utils/Mutex.h> +#include <utils/RefBase.h> +#include <utils/Timers.h> +#include <utils/ThreadDefs.h> + +// --------------------------------------------------------------------------- +namespace android { +// --------------------------------------------------------------------------- + +class Thread : virtual public RefBase +{ +public: + // Create a Thread object, but doesn't create or start the associated + // thread. See the run() method. + Thread(bool canCallJava = true); + virtual ~Thread(); + + // Start the thread in threadLoop() which needs to be implemented. + virtual status_t run( const char* name = 0, + int32_t priority = PRIORITY_DEFAULT, + size_t stack = 0); + + // Ask this object's thread to exit. This function is asynchronous, when the + // function returns the thread might still be running. Of course, this + // function can be called from a different thread. + virtual void requestExit(); + + // Good place to do one-time initializations + virtual status_t readyToRun(); + + // Call requestExit() and wait until this object's thread exits. + // BE VERY CAREFUL of deadlocks. In particular, it would be silly to call + // this function from this object's thread. Will return WOULD_BLOCK in + // that case. + status_t requestExitAndWait(); + + // Wait until this object's thread exits. Returns immediately if not yet running. + // Do not call from this object's thread; will return WOULD_BLOCK in that case. + status_t join(); + +#ifdef HAVE_ANDROID_OS + // Return the thread's kernel ID, same as the thread itself calling gettid() or + // androidGetTid(), or -1 if the thread is not running. + pid_t getTid() const; +#endif + +protected: + // exitPending() returns true if requestExit() has been called. + bool exitPending() const; + +private: + // Derived class must implement threadLoop(). The thread starts its life + // here. There are two ways of using the Thread object: + // 1) loop: if threadLoop() returns true, it will be called again if + // requestExit() wasn't called. + // 2) once: if threadLoop() returns false, the thread will exit upon return. + virtual bool threadLoop() = 0; + +private: + Thread& operator=(const Thread&); + static int _threadLoop(void* user); + const bool mCanCallJava; + // always hold mLock when reading or writing + thread_id_t mThread; + mutable Mutex mLock; + Condition mThreadExitedCondition; + status_t mStatus; + // note that all accesses of mExitPending and mRunning need to hold mLock + volatile bool mExitPending; + volatile bool mRunning; + sp<Thread> mHoldSelf; +#ifdef HAVE_ANDROID_OS + // legacy for debugging, not used by getTid() as it is set by the child thread + // and so is not initialized until the child reaches that point + pid_t mTid; +#endif +}; + + +}; // namespace android + +// --------------------------------------------------------------------------- +#endif // _LIBS_UTILS_THREAD_H +// --------------------------------------------------------------------------- diff --git a/include/utils/ThreadDefs.h b/include/utils/ThreadDefs.h new file mode 100644 index 0000000000..3e563734ec --- /dev/null +++ b/include/utils/ThreadDefs.h @@ -0,0 +1,123 @@ +/* + * Copyright (C) 2007 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _LIBS_UTILS_THREAD_DEFS_H +#define _LIBS_UTILS_THREAD_DEFS_H + +#include <stdint.h> +#include <sys/types.h> +#include <system/graphics.h> + +// --------------------------------------------------------------------------- +// C API + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void* android_thread_id_t; + +typedef int (*android_thread_func_t)(void*); + +enum { + /* + * *********************************************** + * ** Keep in sync with android.os.Process.java ** + * *********************************************** + * + * This maps directly to the "nice" priorities we use in Android. + * A thread priority should be chosen inverse-proportionally to + * the amount of work the thread is expected to do. The more work + * a thread will do, the less favorable priority it should get so that + * it doesn't starve the system. Threads not behaving properly might + * be "punished" by the kernel. + * Use the levels below when appropriate. Intermediate values are + * acceptable, preferably use the {MORE|LESS}_FAVORABLE constants below. + */ + ANDROID_PRIORITY_LOWEST = 19, + + /* use for background tasks */ + ANDROID_PRIORITY_BACKGROUND = 10, + + /* most threads run at normal priority */ + ANDROID_PRIORITY_NORMAL = 0, + + /* threads currently running a UI that the user is interacting with */ + ANDROID_PRIORITY_FOREGROUND = -2, + + /* the main UI thread has a slightly more favorable priority */ + ANDROID_PRIORITY_DISPLAY = -4, + + /* ui service treads might want to run at a urgent display (uncommon) */ + ANDROID_PRIORITY_URGENT_DISPLAY = HAL_PRIORITY_URGENT_DISPLAY, + + /* all normal audio threads */ + ANDROID_PRIORITY_AUDIO = -16, + + /* service audio threads (uncommon) */ + ANDROID_PRIORITY_URGENT_AUDIO = -19, + + /* should never be used in practice. regular process might not + * be allowed to use this level */ + ANDROID_PRIORITY_HIGHEST = -20, + + ANDROID_PRIORITY_DEFAULT = ANDROID_PRIORITY_NORMAL, + ANDROID_PRIORITY_MORE_FAVORABLE = -1, + ANDROID_PRIORITY_LESS_FAVORABLE = +1, +}; + +enum { + ANDROID_TGROUP_DEFAULT = 0, + ANDROID_TGROUP_BG_NONINTERACT = 1, + ANDROID_TGROUP_FG_BOOST = 2, + ANDROID_TGROUP_MAX = ANDROID_TGROUP_FG_BOOST, +}; + +#ifdef __cplusplus +} // extern "C" +#endif + +// --------------------------------------------------------------------------- +// C++ API +#ifdef __cplusplus +namespace android { +// --------------------------------------------------------------------------- + +typedef android_thread_id_t thread_id_t; +typedef android_thread_func_t thread_func_t; + +enum { + PRIORITY_LOWEST = ANDROID_PRIORITY_LOWEST, + PRIORITY_BACKGROUND = ANDROID_PRIORITY_BACKGROUND, + PRIORITY_NORMAL = ANDROID_PRIORITY_NORMAL, + PRIORITY_FOREGROUND = ANDROID_PRIORITY_FOREGROUND, + PRIORITY_DISPLAY = ANDROID_PRIORITY_DISPLAY, + PRIORITY_URGENT_DISPLAY = ANDROID_PRIORITY_URGENT_DISPLAY, + PRIORITY_AUDIO = ANDROID_PRIORITY_AUDIO, + PRIORITY_URGENT_AUDIO = ANDROID_PRIORITY_URGENT_AUDIO, + PRIORITY_HIGHEST = ANDROID_PRIORITY_HIGHEST, + PRIORITY_DEFAULT = ANDROID_PRIORITY_DEFAULT, + PRIORITY_MORE_FAVORABLE = ANDROID_PRIORITY_MORE_FAVORABLE, + PRIORITY_LESS_FAVORABLE = ANDROID_PRIORITY_LESS_FAVORABLE, +}; + +// --------------------------------------------------------------------------- +}; // namespace android +#endif // __cplusplus +// --------------------------------------------------------------------------- + + +#endif // _LIBS_UTILS_THREAD_DEFS_H diff --git a/include/utils/ZipFileCRO.h b/include/utils/ZipFileCRO.h deleted file mode 100644 index 3e42a958bf..0000000000 --- a/include/utils/ZipFileCRO.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// -// C API for ead-only access to Zip archives, with minimal heap allocation. -// -#ifndef __LIBS_ZIPFILECRO_H -#define __LIBS_ZIPFILECRO_H - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - -#include <utils/Compat.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Trivial typedef to ensure that ZipFileCRO is not treated as a simple integer. - */ -typedef void* ZipFileCRO; - -/* - * Trivial typedef to ensure that ZipEntryCRO is not treated as a simple - * integer. We use NULL to indicate an invalid value. - */ -typedef void* ZipEntryCRO; - -extern ZipFileCRO ZipFileXRO_open(const char* path); - -extern void ZipFileCRO_destroy(ZipFileCRO zip); - -extern ZipEntryCRO ZipFileCRO_findEntryByName(ZipFileCRO zip, - const char* fileName); - -extern bool ZipFileCRO_getEntryInfo(ZipFileCRO zip, ZipEntryCRO entry, - int* pMethod, size_t* pUncompLen, - size_t* pCompLen, off64_t* pOffset, long* pModWhen, long* pCrc32); - -extern bool ZipFileCRO_uncompressEntry(ZipFileCRO zip, ZipEntryCRO entry, int fd); - -#ifdef __cplusplus -} -#endif - -#endif /*__LIBS_ZIPFILECRO_H*/ diff --git a/include/utils/ZipFileRO.h b/include/utils/ZipFileRO.h deleted file mode 100644 index 547e36a098..0000000000 --- a/include/utils/ZipFileRO.h +++ /dev/null @@ -1,262 +0,0 @@ -/* - * Copyright (C) 2007 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Read-only access to Zip archives, with minimal heap allocation. - * - * This is similar to the more-complete ZipFile class, but no attempt - * has been made to make them interchangeable. This class operates under - * a very different set of assumptions and constraints. - * - * One such assumption is that if you're getting file descriptors for - * use with this class as a child of a fork() operation, you must be on - * a pread() to guarantee correct operation. This is because pread() can - * atomically read at a file offset without worrying about a lock around an - * lseek() + read() pair. - */ -#ifndef __LIBS_ZIPFILERO_H -#define __LIBS_ZIPFILERO_H - -#include <utils/Compat.h> -#include <utils/Errors.h> -#include <utils/FileMap.h> -#include <utils/threads.h> - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <time.h> - -namespace android { - -/* - * Trivial typedef to ensure that ZipEntryRO is not treated as a simple - * integer. We use NULL to indicate an invalid value. - */ -typedef void* ZipEntryRO; - -/* - * Open a Zip archive for reading. - * - * We want "open" and "find entry by name" to be fast operations, and we - * want to use as little memory as possible. We memory-map the file, - * and load a hash table with pointers to the filenames (which aren't - * null-terminated). The other fields are at a fixed offset from the - * filename, so we don't need to extract those (but we do need to byte-read - * and endian-swap them every time we want them). - * - * To speed comparisons when doing a lookup by name, we could make the mapping - * "private" (copy-on-write) and null-terminate the filenames after verifying - * the record structure. However, this requires a private mapping of - * every page that the Central Directory touches. Easier to tuck a copy - * of the string length into the hash table entry. - * - * NOTE: If this is used on file descriptors inherited from a fork() operation, - * you must be on a platform that implements pread() to guarantee correctness - * on the shared file descriptors. - */ -class ZipFileRO { -public: - ZipFileRO() - : mFd(-1), mFileName(NULL), mFileLength(-1), - mDirectoryMap(NULL), - mNumEntries(-1), mDirectoryOffset(-1), - mHashTableSize(-1), mHashTable(NULL) - {} - - ~ZipFileRO(); - - /* - * Open an archive. - */ - status_t open(const char* zipFileName); - - /* - * Find an entry, by name. Returns the entry identifier, or NULL if - * not found. - * - * If two entries have the same name, one will be chosen at semi-random. - */ - ZipEntryRO findEntryByName(const char* fileName) const; - - /* - * Return the #of entries in the Zip archive. - */ - int getNumEntries(void) const { - return mNumEntries; - } - - /* - * Return the Nth entry. Zip file entries are not stored in sorted - * order, and updated entries may appear at the end, so anyone walking - * the archive needs to avoid making ordering assumptions. We take - * that further by returning the Nth non-empty entry in the hash table - * rather than the Nth entry in the archive. - * - * Valid values are [0..numEntries). - * - * [This is currently O(n). If it needs to be fast we can allocate an - * additional data structure or provide an iterator interface.] - */ - ZipEntryRO findEntryByIndex(int idx) const; - - /* - * Copy the filename into the supplied buffer. Returns 0 on success, - * -1 if "entry" is invalid, or the filename length if it didn't fit. The - * length, and the returned string, include the null-termination. - */ - int getEntryFileName(ZipEntryRO entry, char* buffer, int bufLen) const; - - /* - * Get the vital stats for an entry. Pass in NULL pointers for anything - * you don't need. - * - * "*pOffset" holds the Zip file offset of the entry's data. - * - * Returns "false" if "entry" is bogus or if the data in the Zip file - * appears to be bad. - */ - bool getEntryInfo(ZipEntryRO entry, int* pMethod, size_t* pUncompLen, - size_t* pCompLen, off64_t* pOffset, long* pModWhen, long* pCrc32) const; - - /* - * Create a new FileMap object that maps a subset of the archive. For - * an uncompressed entry this effectively provides a pointer to the - * actual data, for a compressed entry this provides the input buffer - * for inflate(). - */ - FileMap* createEntryFileMap(ZipEntryRO entry) const; - - /* - * Uncompress the data into a buffer. Depending on the compression - * format, this is either an "inflate" operation or a memcpy. - * - * Use "uncompLen" from getEntryInfo() to determine the required - * buffer size. - * - * Returns "true" on success. - */ - bool uncompressEntry(ZipEntryRO entry, void* buffer) const; - - /* - * Uncompress the data to an open file descriptor. - */ - bool uncompressEntry(ZipEntryRO entry, int fd) const; - - /* Zip compression methods we support */ - enum { - kCompressStored = 0, // no compression - kCompressDeflated = 8, // standard deflate - }; - - /* - * Utility function: uncompress deflated data, buffer to buffer. - */ - static bool inflateBuffer(void* outBuf, const void* inBuf, - size_t uncompLen, size_t compLen); - - /* - * Utility function: uncompress deflated data, buffer to fd. - */ - static bool inflateBuffer(int fd, const void* inBuf, - size_t uncompLen, size_t compLen); - - /* - * Utility function to convert ZIP's time format to a timespec struct. - */ - static inline void zipTimeToTimespec(long when, struct tm* timespec) { - const long date = when >> 16; - timespec->tm_year = ((date >> 9) & 0x7F) + 80; // Zip is years since 1980 - timespec->tm_mon = (date >> 5) & 0x0F; - timespec->tm_mday = date & 0x1F; - - timespec->tm_hour = (when >> 11) & 0x1F; - timespec->tm_min = (when >> 5) & 0x3F; - timespec->tm_sec = (when & 0x1F) << 1; - } - - /* - * Some basic functions for raw data manipulation. "LE" means - * Little Endian. - */ - static inline unsigned short get2LE(const unsigned char* buf) { - return buf[0] | (buf[1] << 8); - } - static inline unsigned long get4LE(const unsigned char* buf) { - return buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24); - } - -private: - /* these are private and not defined */ - ZipFileRO(const ZipFileRO& src); - ZipFileRO& operator=(const ZipFileRO& src); - - /* locate and parse the central directory */ - bool mapCentralDirectory(void); - - /* parse the archive, prepping internal structures */ - bool parseZipArchive(void); - - /* add a new entry to the hash table */ - void addToHash(const char* str, int strLen, unsigned int hash); - - /* compute string hash code */ - static unsigned int computeHash(const char* str, int len); - - /* convert a ZipEntryRO back to a hash table index */ - int entryToIndex(const ZipEntryRO entry) const; - - /* - * One entry in the hash table. - */ - typedef struct HashEntry { - const char* name; - unsigned short nameLen; - //unsigned int hash; - } HashEntry; - - /* open Zip archive */ - int mFd; - - /* Lock for handling the file descriptor (seeks, etc) */ - mutable Mutex mFdLock; - - /* zip file name */ - char* mFileName; - - /* length of file */ - size_t mFileLength; - - /* mapped file */ - FileMap* mDirectoryMap; - - /* number of entries in the Zip archive */ - int mNumEntries; - - /* CD directory offset in the Zip archive */ - off64_t mDirectoryOffset; - - /* - * We know how many entries are in the Zip archive, so we have a - * fixed-size hash table. We probe for an empty slot. - */ - int mHashTableSize; - HashEntry* mHashTable; -}; - -}; // namespace android - -#endif /*__LIBS_ZIPFILERO_H*/ diff --git a/include/utils/ZipUtils.h b/include/utils/ZipUtils.h deleted file mode 100644 index 42c42b6c0f..0000000000 --- a/include/utils/ZipUtils.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (C) 2007 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// -// Miscellaneous zip/gzip utility functions. -// -#ifndef __LIBS_ZIPUTILS_H -#define __LIBS_ZIPUTILS_H - -#include <stdio.h> - -namespace android { - -/* - * Container class for utility functions, primarily for namespace reasons. - */ -class ZipUtils { -public: - /* - * General utility function for uncompressing "deflate" data from a file - * to a buffer. - */ - static bool inflateToBuffer(int fd, void* buf, long uncompressedLen, - long compressedLen); - static bool inflateToBuffer(FILE* fp, void* buf, long uncompressedLen, - long compressedLen); - - /* - * Someday we might want to make this generic and handle bzip2 ".bz2" - * files too. - * - * We could declare gzip to be a sub-class of zip that has exactly - * one always-compressed entry, but we currently want to treat Zip - * and gzip as distinct, so there's no value. - * - * The zlib library has some gzip utilities, but it has no interface - * for extracting the uncompressed length of the file (you do *not* - * want to gzseek to the end). - * - * Pass in a seeked file pointer for the gzip file. If this is a gzip - * file, we set our return values appropriately and return "true" with - * the file seeked to the start of the compressed data. - */ - static bool examineGzip(FILE* fp, int* pCompressionMethod, - long* pUncompressedLen, long* pCompressedLen, unsigned long* pCRC32); - -private: - ZipUtils() {} - ~ZipUtils() {} -}; - -}; // namespace android - -#endif /*__LIBS_ZIPUTILS_H*/ diff --git a/include/utils/threads.h b/include/utils/threads.h index b4a8b7c0e1..9de3382118 100644 --- a/include/utils/threads.h +++ b/include/utils/threads.h @@ -17,556 +17,22 @@ #ifndef _LIBS_UTILS_THREADS_H #define _LIBS_UTILS_THREADS_H -#include <stdint.h> -#include <sys/types.h> -#include <time.h> -#include <system/graphics.h> - -#if defined(HAVE_PTHREADS) -# include <pthread.h> -#endif - -// ------------------------------------------------------------------ -// C API - -#ifdef __cplusplus -extern "C" { -#endif - -typedef void* android_thread_id_t; - -typedef int (*android_thread_func_t)(void*); - -enum { - /* - * *********************************************** - * ** Keep in sync with android.os.Process.java ** - * *********************************************** - * - * This maps directly to the "nice" priorities we use in Android. - * A thread priority should be chosen inverse-proportionally to - * the amount of work the thread is expected to do. The more work - * a thread will do, the less favorable priority it should get so that - * it doesn't starve the system. Threads not behaving properly might - * be "punished" by the kernel. - * Use the levels below when appropriate. Intermediate values are - * acceptable, preferably use the {MORE|LESS}_FAVORABLE constants below. - */ - ANDROID_PRIORITY_LOWEST = 19, - - /* use for background tasks */ - ANDROID_PRIORITY_BACKGROUND = 10, - - /* most threads run at normal priority */ - ANDROID_PRIORITY_NORMAL = 0, - - /* threads currently running a UI that the user is interacting with */ - ANDROID_PRIORITY_FOREGROUND = -2, - - /* the main UI thread has a slightly more favorable priority */ - ANDROID_PRIORITY_DISPLAY = -4, - - /* ui service treads might want to run at a urgent display (uncommon) */ - ANDROID_PRIORITY_URGENT_DISPLAY = HAL_PRIORITY_URGENT_DISPLAY, - - /* all normal audio threads */ - ANDROID_PRIORITY_AUDIO = -16, - - /* service audio threads (uncommon) */ - ANDROID_PRIORITY_URGENT_AUDIO = -19, - - /* should never be used in practice. regular process might not - * be allowed to use this level */ - ANDROID_PRIORITY_HIGHEST = -20, - - ANDROID_PRIORITY_DEFAULT = ANDROID_PRIORITY_NORMAL, - ANDROID_PRIORITY_MORE_FAVORABLE = -1, - ANDROID_PRIORITY_LESS_FAVORABLE = +1, -}; - -enum { - ANDROID_TGROUP_DEFAULT = 0, - ANDROID_TGROUP_BG_NONINTERACT = 1, - ANDROID_TGROUP_FG_BOOST = 2, - ANDROID_TGROUP_MAX = ANDROID_TGROUP_FG_BOOST, -}; - -// Create and run a new thread. -extern int androidCreateThread(android_thread_func_t, void *); - -// Create thread with lots of parameters -extern int androidCreateThreadEtc(android_thread_func_t entryFunction, - void *userData, - const char* threadName, - int32_t threadPriority, - size_t threadStackSize, - android_thread_id_t *threadId); - -// Get some sort of unique identifier for the current thread. -extern android_thread_id_t androidGetThreadId(); - -// Low-level thread creation -- never creates threads that can -// interact with the Java VM. -extern int androidCreateRawThreadEtc(android_thread_func_t entryFunction, - void *userData, - const char* threadName, - int32_t threadPriority, - size_t threadStackSize, - android_thread_id_t *threadId); - -// Used by the Java Runtime to control how threads are created, so that -// they can be proper and lovely Java threads. -typedef int (*android_create_thread_fn)(android_thread_func_t entryFunction, - void *userData, - const char* threadName, - int32_t threadPriority, - size_t threadStackSize, - android_thread_id_t *threadId); - -extern void androidSetCreateThreadFunc(android_create_thread_fn func); - -// ------------------------------------------------------------------ -// Extra functions working with raw pids. - -// Get pid for the current thread. -extern pid_t androidGetTid(); - -// Change the scheduling group of a particular thread. The group -// should be one of the ANDROID_TGROUP constants. Returns BAD_VALUE if -// grp is out of range, else another non-zero value with errno set if -// the operation failed. Thread ID zero means current thread. -extern int androidSetThreadSchedulingGroup(pid_t tid, int grp); - -// Change the priority AND scheduling group of a particular thread. The priority -// should be one of the ANDROID_PRIORITY constants. Returns INVALID_OPERATION -// if the priority set failed, else another value if just the group set failed; -// in either case errno is set. Thread ID zero means current thread. -extern int androidSetThreadPriority(pid_t tid, int prio); - -// Get the current priority of a particular thread. Returns one of the -// ANDROID_PRIORITY constants or a negative result in case of error. -extern int androidGetThreadPriority(pid_t tid); - -// Get the current scheduling group of a particular thread. Normally returns -// one of the ANDROID_TGROUP constants other than ANDROID_TGROUP_DEFAULT. -// Returns ANDROID_TGROUP_DEFAULT if no pthread support (e.g. on host) or if -// scheduling groups are disabled. Returns INVALID_OPERATION if unexpected error. -// Thread ID zero means current thread. -extern int androidGetThreadSchedulingGroup(pid_t tid); - -#ifdef __cplusplus -} -#endif - -// ------------------------------------------------------------------ -// C++ API - -#ifdef __cplusplus - -#include <utils/Errors.h> -#include <utils/RefBase.h> -#include <utils/Timers.h> - -namespace android { - -typedef android_thread_id_t thread_id_t; - -typedef android_thread_func_t thread_func_t; - -enum { - PRIORITY_LOWEST = ANDROID_PRIORITY_LOWEST, - PRIORITY_BACKGROUND = ANDROID_PRIORITY_BACKGROUND, - PRIORITY_NORMAL = ANDROID_PRIORITY_NORMAL, - PRIORITY_FOREGROUND = ANDROID_PRIORITY_FOREGROUND, - PRIORITY_DISPLAY = ANDROID_PRIORITY_DISPLAY, - PRIORITY_URGENT_DISPLAY = ANDROID_PRIORITY_URGENT_DISPLAY, - PRIORITY_AUDIO = ANDROID_PRIORITY_AUDIO, - PRIORITY_URGENT_AUDIO = ANDROID_PRIORITY_URGENT_AUDIO, - PRIORITY_HIGHEST = ANDROID_PRIORITY_HIGHEST, - PRIORITY_DEFAULT = ANDROID_PRIORITY_DEFAULT, - PRIORITY_MORE_FAVORABLE = ANDROID_PRIORITY_MORE_FAVORABLE, - PRIORITY_LESS_FAVORABLE = ANDROID_PRIORITY_LESS_FAVORABLE, -}; - -// Create and run a new thread. -inline bool createThread(thread_func_t f, void *a) { - return androidCreateThread(f, a) ? true : false; -} - -// Create thread with lots of parameters -inline bool createThreadEtc(thread_func_t entryFunction, - void *userData, - const char* threadName = "android:unnamed_thread", - int32_t threadPriority = PRIORITY_DEFAULT, - size_t threadStackSize = 0, - thread_id_t *threadId = 0) -{ - return androidCreateThreadEtc(entryFunction, userData, threadName, - threadPriority, threadStackSize, threadId) ? true : false; -} - -// Get some sort of unique identifier for the current thread. -inline thread_id_t getThreadId() { - return androidGetThreadId(); -} - -/*****************************************************************************/ - /* - * Simple mutex class. The implementation is system-dependent. + * Please, DO NOT USE! * - * The mutex must be unlocked by the thread that locked it. They are not - * recursive, i.e. the same thread can't lock it multiple times. - */ -class Mutex { -public: - enum { - PRIVATE = 0, - SHARED = 1 - }; - - Mutex(); - Mutex(const char* name); - Mutex(int type, const char* name = NULL); - ~Mutex(); - - // lock or unlock the mutex - status_t lock(); - void unlock(); - - // lock if possible; returns 0 on success, error otherwise - status_t tryLock(); - - // Manages the mutex automatically. It'll be locked when Autolock is - // constructed and released when Autolock goes out of scope. - class Autolock { - public: - inline Autolock(Mutex& mutex) : mLock(mutex) { mLock.lock(); } - inline Autolock(Mutex* mutex) : mLock(*mutex) { mLock.lock(); } - inline ~Autolock() { mLock.unlock(); } - private: - Mutex& mLock; - }; - -private: - friend class Condition; - - // A mutex cannot be copied - Mutex(const Mutex&); - Mutex& operator = (const Mutex&); - -#if defined(HAVE_PTHREADS) - pthread_mutex_t mMutex; -#else - void _init(); - void* mState; -#endif -}; - -#if defined(HAVE_PTHREADS) - -inline Mutex::Mutex() { - pthread_mutex_init(&mMutex, NULL); -} -inline Mutex::Mutex(const char* name) { - pthread_mutex_init(&mMutex, NULL); -} -inline Mutex::Mutex(int type, const char* name) { - if (type == SHARED) { - pthread_mutexattr_t attr; - pthread_mutexattr_init(&attr); - pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED); - pthread_mutex_init(&mMutex, &attr); - pthread_mutexattr_destroy(&attr); - } else { - pthread_mutex_init(&mMutex, NULL); - } -} -inline Mutex::~Mutex() { - pthread_mutex_destroy(&mMutex); -} -inline status_t Mutex::lock() { - return -pthread_mutex_lock(&mMutex); -} -inline void Mutex::unlock() { - pthread_mutex_unlock(&mMutex); -} -inline status_t Mutex::tryLock() { - return -pthread_mutex_trylock(&mMutex); -} - -#endif // HAVE_PTHREADS - -/* - * Automatic mutex. Declare one of these at the top of a function. - * When the function returns, it will go out of scope, and release the - * mutex. - */ - -typedef Mutex::Autolock AutoMutex; - -/*****************************************************************************/ - -#if defined(HAVE_PTHREADS) - -/* - * Simple mutex class. The implementation is system-dependent. - * - * The mutex must be unlocked by the thread that locked it. They are not - * recursive, i.e. the same thread can't lock it multiple times. - */ -class RWLock { -public: - enum { - PRIVATE = 0, - SHARED = 1 - }; - - RWLock(); - RWLock(const char* name); - RWLock(int type, const char* name = NULL); - ~RWLock(); - - status_t readLock(); - status_t tryReadLock(); - status_t writeLock(); - status_t tryWriteLock(); - void unlock(); - - class AutoRLock { - public: - inline AutoRLock(RWLock& rwlock) : mLock(rwlock) { mLock.readLock(); } - inline ~AutoRLock() { mLock.unlock(); } - private: - RWLock& mLock; - }; - - class AutoWLock { - public: - inline AutoWLock(RWLock& rwlock) : mLock(rwlock) { mLock.writeLock(); } - inline ~AutoWLock() { mLock.unlock(); } - private: - RWLock& mLock; - }; - -private: - // A RWLock cannot be copied - RWLock(const RWLock&); - RWLock& operator = (const RWLock&); - - pthread_rwlock_t mRWLock; -}; - -inline RWLock::RWLock() { - pthread_rwlock_init(&mRWLock, NULL); -} -inline RWLock::RWLock(const char* name) { - pthread_rwlock_init(&mRWLock, NULL); -} -inline RWLock::RWLock(int type, const char* name) { - if (type == SHARED) { - pthread_rwlockattr_t attr; - pthread_rwlockattr_init(&attr); - pthread_rwlockattr_setpshared(&attr, PTHREAD_PROCESS_SHARED); - pthread_rwlock_init(&mRWLock, &attr); - pthread_rwlockattr_destroy(&attr); - } else { - pthread_rwlock_init(&mRWLock, NULL); - } -} -inline RWLock::~RWLock() { - pthread_rwlock_destroy(&mRWLock); -} -inline status_t RWLock::readLock() { - return -pthread_rwlock_rdlock(&mRWLock); -} -inline status_t RWLock::tryReadLock() { - return -pthread_rwlock_tryrdlock(&mRWLock); -} -inline status_t RWLock::writeLock() { - return -pthread_rwlock_wrlock(&mRWLock); -} -inline status_t RWLock::tryWriteLock() { - return -pthread_rwlock_trywrlock(&mRWLock); -} -inline void RWLock::unlock() { - pthread_rwlock_unlock(&mRWLock); -} - -#endif // HAVE_PTHREADS - -/*****************************************************************************/ - -/* - * Condition variable class. The implementation is system-dependent. + * This file is here only for legacy reasons. Instead, include directly + * the headers you need below. * - * Condition variables are paired up with mutexes. Lock the mutex, - * call wait(), then either re-wait() if things aren't quite what you want, - * or unlock the mutex and continue. All threads calling wait() must - * use the same mutex for a given Condition. - */ -class Condition { -public: - enum { - PRIVATE = 0, - SHARED = 1 - }; - - Condition(); - Condition(int type); - ~Condition(); - // Wait on the condition variable. Lock the mutex before calling. - status_t wait(Mutex& mutex); - // same with relative timeout - status_t waitRelative(Mutex& mutex, nsecs_t reltime); - // Signal the condition variable, allowing one thread to continue. - void signal(); - // Signal the condition variable, allowing all threads to continue. - void broadcast(); - -private: -#if defined(HAVE_PTHREADS) - pthread_cond_t mCond; -#else - void* mState; -#endif -}; - -#if defined(HAVE_PTHREADS) - -inline Condition::Condition() { - pthread_cond_init(&mCond, NULL); -} -inline Condition::Condition(int type) { - if (type == SHARED) { - pthread_condattr_t attr; - pthread_condattr_init(&attr); - pthread_condattr_setpshared(&attr, PTHREAD_PROCESS_SHARED); - pthread_cond_init(&mCond, &attr); - pthread_condattr_destroy(&attr); - } else { - pthread_cond_init(&mCond, NULL); - } -} -inline Condition::~Condition() { - pthread_cond_destroy(&mCond); -} -inline status_t Condition::wait(Mutex& mutex) { - return -pthread_cond_wait(&mCond, &mutex.mMutex); -} -inline status_t Condition::waitRelative(Mutex& mutex, nsecs_t reltime) { -#if defined(HAVE_PTHREAD_COND_TIMEDWAIT_RELATIVE) - struct timespec ts; - ts.tv_sec = reltime/1000000000; - ts.tv_nsec = reltime%1000000000; - return -pthread_cond_timedwait_relative_np(&mCond, &mutex.mMutex, &ts); -#else // HAVE_PTHREAD_COND_TIMEDWAIT_RELATIVE - struct timespec ts; -#if defined(HAVE_POSIX_CLOCKS) - clock_gettime(CLOCK_REALTIME, &ts); -#else // HAVE_POSIX_CLOCKS - // we don't support the clocks here. - struct timeval t; - gettimeofday(&t, NULL); - ts.tv_sec = t.tv_sec; - ts.tv_nsec= t.tv_usec*1000; -#endif // HAVE_POSIX_CLOCKS - ts.tv_sec += reltime/1000000000; - ts.tv_nsec+= reltime%1000000000; - if (ts.tv_nsec >= 1000000000) { - ts.tv_nsec -= 1000000000; - ts.tv_sec += 1; - } - return -pthread_cond_timedwait(&mCond, &mutex.mMutex, &ts); -#endif // HAVE_PTHREAD_COND_TIMEDWAIT_RELATIVE -} -inline void Condition::signal() { - pthread_cond_signal(&mCond); -} -inline void Condition::broadcast() { - pthread_cond_broadcast(&mCond); -} - -#endif // HAVE_PTHREADS - -/*****************************************************************************/ - -/* - * This is our spiffy thread object! */ -class Thread : virtual public RefBase -{ -public: - // Create a Thread object, but doesn't create or start the associated - // thread. See the run() method. - Thread(bool canCallJava = true); - virtual ~Thread(); +#include <utils/AndroidThreads.h> - // Start the thread in threadLoop() which needs to be implemented. - virtual status_t run( const char* name = 0, - int32_t priority = PRIORITY_DEFAULT, - size_t stack = 0); - - // Ask this object's thread to exit. This function is asynchronous, when the - // function returns the thread might still be running. Of course, this - // function can be called from a different thread. - virtual void requestExit(); - - // Good place to do one-time initializations - virtual status_t readyToRun(); - - // Call requestExit() and wait until this object's thread exits. - // BE VERY CAREFUL of deadlocks. In particular, it would be silly to call - // this function from this object's thread. Will return WOULD_BLOCK in - // that case. - status_t requestExitAndWait(); - - // Wait until this object's thread exits. Returns immediately if not yet running. - // Do not call from this object's thread; will return WOULD_BLOCK in that case. - status_t join(); - -#ifdef HAVE_ANDROID_OS - // Return the thread's kernel ID, same as the thread itself calling gettid() or - // androidGetTid(), or -1 if the thread is not running. - pid_t getTid() const; -#endif - -protected: - // exitPending() returns true if requestExit() has been called. - bool exitPending() const; - -private: - // Derived class must implement threadLoop(). The thread starts its life - // here. There are two ways of using the Thread object: - // 1) loop: if threadLoop() returns true, it will be called again if - // requestExit() wasn't called. - // 2) once: if threadLoop() returns false, the thread will exit upon return. - virtual bool threadLoop() = 0; - -private: - Thread& operator=(const Thread&); - static int _threadLoop(void* user); - const bool mCanCallJava; - // always hold mLock when reading or writing - thread_id_t mThread; - mutable Mutex mLock; - Condition mThreadExitedCondition; - status_t mStatus; - // note that all accesses of mExitPending and mRunning need to hold mLock - volatile bool mExitPending; - volatile bool mRunning; - sp<Thread> mHoldSelf; -#ifdef HAVE_ANDROID_OS - // legacy for debugging, not used by getTid() as it is set by the child thread - // and so is not initialized until the child reaches that point - pid_t mTid; +#ifdef __cplusplus +#include <utils/Condition.h> +#include <utils/Errors.h> +#include <utils/Mutex.h> +#include <utils/RWLock.h> +#include <utils/Thread.h> #endif -}; - - -}; // namespace android - -#endif // __cplusplus #endif // _LIBS_UTILS_THREADS_H diff --git a/libs/gui/BufferQueue.cpp b/libs/gui/BufferQueue.cpp index 0791de2269..261336a5f9 100644 --- a/libs/gui/BufferQueue.cpp +++ b/libs/gui/BufferQueue.cpp @@ -23,8 +23,8 @@ #include <EGL/eglext.h> #include <gui/BufferQueue.h> +#include <gui/ISurfaceComposer.h> #include <private/gui/ComposerService.h> -#include <surfaceflinger/ISurfaceComposer.h> #include <utils/Log.h> diff --git a/libs/gui/DisplayEventReceiver.cpp b/libs/gui/DisplayEventReceiver.cpp index 6a4763d5a7..a6790ad072 100644 --- a/libs/gui/DisplayEventReceiver.cpp +++ b/libs/gui/DisplayEventReceiver.cpp @@ -21,11 +21,10 @@ #include <gui/BitTube.h> #include <gui/DisplayEventReceiver.h> #include <gui/IDisplayEventConnection.h> +#include <gui/ISurfaceComposer.h> #include <private/gui/ComposerService.h> -#include <surfaceflinger/ISurfaceComposer.h> - // --------------------------------------------------------------------------- namespace android { diff --git a/libs/gui/IGraphicBufferAlloc.cpp b/libs/gui/IGraphicBufferAlloc.cpp index 30f8d003c8..a70a5e8ad4 100644 --- a/libs/gui/IGraphicBufferAlloc.cpp +++ b/libs/gui/IGraphicBufferAlloc.cpp @@ -24,7 +24,7 @@ #include <ui/GraphicBuffer.h> -#include <surfaceflinger/IGraphicBufferAlloc.h> +#include <gui/IGraphicBufferAlloc.h> // --------------------------------------------------------------------------- diff --git a/libs/gui/ISurface.cpp b/libs/gui/ISurface.cpp index 96155d7458..c2ea183077 100644 --- a/libs/gui/ISurface.cpp +++ b/libs/gui/ISurface.cpp @@ -22,8 +22,8 @@ #include <binder/Parcel.h> +#include <gui/ISurface.h> #include <gui/ISurfaceTexture.h> -#include <surfaceflinger/ISurface.h> namespace android { diff --git a/libs/gui/ISurfaceComposer.cpp b/libs/gui/ISurfaceComposer.cpp index 95b2379344..1f1794cbe4 100644 --- a/libs/gui/ISurfaceComposer.cpp +++ b/libs/gui/ISurfaceComposer.cpp @@ -25,16 +25,14 @@ #include <binder/IPCThreadState.h> #include <binder/IServiceManager.h> -#include <private/surfaceflinger/LayerState.h> - -#include <surfaceflinger/ISurfaceComposer.h> - #include <gui/BitTube.h> #include <gui/IDisplayEventConnection.h> +#include <gui/ISurfaceComposer.h> +#include <gui/ISurfaceTexture.h> -#include <ui/DisplayInfo.h> +#include <private/gui/LayerState.h> -#include <gui/ISurfaceTexture.h> +#include <ui/DisplayInfo.h> #include <utils/Log.h> diff --git a/libs/gui/ISurfaceComposerClient.cpp b/libs/gui/ISurfaceComposerClient.cpp index 8fe96b182e..ca9ed5b545 100644 --- a/libs/gui/ISurfaceComposerClient.cpp +++ b/libs/gui/ISurfaceComposerClient.cpp @@ -29,9 +29,9 @@ #include <ui/Point.h> #include <ui/Rect.h> -#include <surfaceflinger/ISurface.h> -#include <surfaceflinger/ISurfaceComposerClient.h> -#include <private/surfaceflinger/LayerState.h> +#include <gui/ISurface.h> +#include <gui/ISurfaceComposerClient.h> +#include <private/gui/LayerState.h> // --------------------------------------------------------------------------- diff --git a/libs/gui/LayerState.cpp b/libs/gui/LayerState.cpp index 87901e87f7..224c30587c 100644 --- a/libs/gui/LayerState.cpp +++ b/libs/gui/LayerState.cpp @@ -16,8 +16,8 @@ #include <utils/Errors.h> #include <binder/Parcel.h> -#include <private/surfaceflinger/LayerState.h> -#include <surfaceflinger/ISurfaceComposerClient.h> +#include <gui/ISurfaceComposerClient.h> +#include <private/gui/LayerState.h> namespace android { diff --git a/libs/gui/Surface.cpp b/libs/gui/Surface.cpp index 337950c3e6..72b27edaaa 100644 --- a/libs/gui/Surface.cpp +++ b/libs/gui/Surface.cpp @@ -28,16 +28,15 @@ #include <binder/IPCThreadState.h> -#include <gui/SurfaceTextureClient.h> - #include <ui/DisplayInfo.h> #include <ui/GraphicBuffer.h> #include <ui/Rect.h> -#include <surfaceflinger/ISurface.h> -#include <surfaceflinger/ISurfaceComposer.h> -#include <surfaceflinger/Surface.h> -#include <surfaceflinger/SurfaceComposerClient.h> +#include <gui/ISurface.h> +#include <gui/ISurfaceComposer.h> +#include <gui/Surface.h> +#include <gui/SurfaceComposerClient.h> +#include <gui/SurfaceTextureClient.h> namespace android { diff --git a/libs/gui/SurfaceComposerClient.cpp b/libs/gui/SurfaceComposerClient.cpp index 699438c0d7..ceb1ba6d89 100644 --- a/libs/gui/SurfaceComposerClient.cpp +++ b/libs/gui/SurfaceComposerClient.cpp @@ -31,15 +31,14 @@ #include <ui/DisplayInfo.h> -#include <surfaceflinger/ISurface.h> -#include <surfaceflinger/ISurfaceComposer.h> -#include <surfaceflinger/ISurfaceComposerClient.h> -#include <surfaceflinger/SurfaceComposerClient.h> - -#include <private/surfaceflinger/LayerState.h> -#include <private/surfaceflinger/SharedBufferStack.h> +#include <gui/ISurface.h> +#include <gui/ISurfaceComposer.h> +#include <gui/ISurfaceComposerClient.h> +#include <gui/SurfaceComposerClient.h> #include <private/gui/ComposerService.h> +#include <private/gui/LayerState.h> +#include <private/gui/SharedBufferStack.h> namespace android { // --------------------------------------------------------------------------- diff --git a/libs/gui/SurfaceTexture.cpp b/libs/gui/SurfaceTexture.cpp index a7bfc613aa..5f0013c06a 100644 --- a/libs/gui/SurfaceTexture.cpp +++ b/libs/gui/SurfaceTexture.cpp @@ -25,15 +25,14 @@ #include <GLES2/gl2.h> #include <GLES2/gl2ext.h> -#include <gui/SurfaceTexture.h> - #include <hardware/hardware.h> -#include <private/gui/ComposerService.h> +#include <gui/IGraphicBufferAlloc.h> +#include <gui/ISurfaceComposer.h> +#include <gui/SurfaceComposerClient.h> +#include <gui/SurfaceTexture.h> -#include <surfaceflinger/ISurfaceComposer.h> -#include <surfaceflinger/SurfaceComposerClient.h> -#include <surfaceflinger/IGraphicBufferAlloc.h> +#include <private/gui/ComposerService.h> #include <utils/Log.h> #include <utils/String8.h> diff --git a/libs/gui/SurfaceTextureClient.cpp b/libs/gui/SurfaceTextureClient.cpp index d0934ba8aa..dac54a8b11 100644 --- a/libs/gui/SurfaceTextureClient.cpp +++ b/libs/gui/SurfaceTextureClient.cpp @@ -17,12 +17,12 @@ #define LOG_TAG "SurfaceTextureClient" //#define LOG_NDEBUG 0 -#include <gui/SurfaceTextureClient.h> -#include <surfaceflinger/ISurfaceComposer.h> -#include <surfaceflinger/SurfaceComposerClient.h> - #include <utils/Log.h> +#include <gui/ISurfaceComposer.h> +#include <gui/SurfaceComposerClient.h> +#include <gui/SurfaceTextureClient.h> + #include <private/gui/ComposerService.h> namespace android { diff --git a/libs/gui/tests/SurfaceTexture_test.cpp b/libs/gui/tests/SurfaceTexture_test.cpp index b18e7b057e..8c6defec0c 100644 --- a/libs/gui/tests/SurfaceTexture_test.cpp +++ b/libs/gui/tests/SurfaceTexture_test.cpp @@ -24,9 +24,9 @@ #include <utils/String8.h> #include <utils/threads.h> -#include <surfaceflinger/ISurfaceComposer.h> -#include <surfaceflinger/Surface.h> -#include <surfaceflinger/SurfaceComposerClient.h> +#include <gui/ISurfaceComposer.h> +#include <gui/Surface.h> +#include <gui/SurfaceComposerClient.h> #include <EGL/egl.h> #include <EGL/eglext.h> diff --git a/libs/gui/tests/Surface_test.cpp b/libs/gui/tests/Surface_test.cpp index ea527504b1..b585d68ded 100644 --- a/libs/gui/tests/Surface_test.cpp +++ b/libs/gui/tests/Surface_test.cpp @@ -17,9 +17,9 @@ #include <gtest/gtest.h> #include <binder/IMemory.h> -#include <surfaceflinger/ISurfaceComposer.h> -#include <surfaceflinger/Surface.h> -#include <surfaceflinger/SurfaceComposerClient.h> +#include <gui/ISurfaceComposer.h> +#include <gui/Surface.h> +#include <gui/SurfaceComposerClient.h> #include <utils/String8.h> #include <private/gui/ComposerService.h> diff --git a/libs/surfaceflinger_client/Android.mk b/libs/surfaceflinger_client/Android.mk deleted file mode 100644 index 5fca1ce5b3..0000000000 --- a/libs/surfaceflinger_client/Android.mk +++ /dev/null @@ -1,10 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_SRC_FILES:= - -LOCAL_SHARED_LIBRARIES := - -LOCAL_MODULE:= libsurfaceflinger_client - -include $(BUILD_SHARED_LIBRARY) diff --git a/libs/ui/Android.mk b/libs/ui/Android.mk index f8b4452330..5aff7a4614 100644 --- a/libs/ui/Android.mk +++ b/libs/ui/Android.mk @@ -13,41 +13,13 @@ # limitations under the License. LOCAL_PATH:= $(call my-dir) - -# libui is partially built for the host (used by build time keymap validation tool) -# These files are common to host and target builds. -commonSources:= \ - Input.cpp \ - Keyboard.cpp \ - KeyLayoutMap.cpp \ - KeyCharacterMap.cpp \ - VirtualKeyMap.cpp - -# For the host -# ===================================================== - -include $(CLEAR_VARS) - -LOCAL_SRC_FILES:= $(commonSources) - -LOCAL_MODULE:= libui - -include $(BUILD_HOST_STATIC_LIBRARY) - - -# For the device -# ===================================================== - include $(CLEAR_VARS) LOCAL_SRC_FILES:= \ - $(commonSources) \ - EGLUtils.cpp \ FramebufferNativeWindow.cpp \ GraphicBuffer.cpp \ GraphicBufferAllocator.cpp \ GraphicBufferMapper.cpp \ - InputTransport.cpp \ PixelFormat.cpp \ Rect.cpp \ Region.cpp @@ -55,15 +27,11 @@ LOCAL_SRC_FILES:= \ LOCAL_SHARED_LIBRARIES := \ libcutils \ libutils \ - libEGL \ - libpixelflinger \ - libhardware \ - libhardware_legacy \ - libskia \ - libbinder + libhardware -LOCAL_C_INCLUDES := \ - external/skia/include/core +ifneq ($(BOARD_FRAMEBUFFER_FORCE_FORMAT),) +LOCAL_CFLAGS += -DFRAMEBUFFER_FORCE_FORMAT=$(BOARD_FRAMEBUFFER_FORCE_FORMAT) +endif LOCAL_MODULE:= libui diff --git a/libs/ui/FramebufferNativeWindow.cpp b/libs/ui/FramebufferNativeWindow.cpp index d1dca0c906..dec99b6c70 100644 --- a/libs/ui/FramebufferNativeWindow.cpp +++ b/libs/ui/FramebufferNativeWindow.cpp @@ -27,25 +27,21 @@ #include <utils/threads.h> #include <utils/RefBase.h> -#include <ui/Rect.h> +#include <ui/ANativeObjectBase.h> #include <ui/FramebufferNativeWindow.h> +#include <ui/Rect.h> #include <EGL/egl.h> -#include <pixelflinger/format.h> -#include <pixelflinger/pixelflinger.h> - #include <hardware/hardware.h> #include <hardware/gralloc.h> -#include <private/ui/android_natives_priv.h> - // ---------------------------------------------------------------------------- namespace android { // ---------------------------------------------------------------------------- class NativeBuffer - : public EGLNativeBase< + : public ANativeObjectBase< ANativeWindowBuffer, NativeBuffer, LightRefBase<NativeBuffer> > @@ -100,6 +96,18 @@ FramebufferNativeWindow::FramebufferNativeWindow() mNumFreeBuffers = NUM_FRAME_BUFFERS; mBufferHead = mNumBuffers-1; + /* + * This does not actually change the framebuffer format. It merely + * fakes this format to surfaceflinger so that when it creates + * framebuffer surfaces it will use this format. It's really a giant + * HACK to allow interworking with buggy gralloc+GPU driver + * implementations. You should *NEVER* need to set this for shipping + * devices. + */ +#ifdef FRAMEBUFFER_FORCE_FORMAT + *((uint32_t *)&fbDev->format) = FRAMEBUFFER_FORCE_FORMAT; +#endif + for (i = 0; i < mNumBuffers; i++) { buffers[i] = new NativeBuffer( diff --git a/libs/ui/GraphicBuffer.cpp b/libs/ui/GraphicBuffer.cpp index f549a3795f..57063e5246 100644 --- a/libs/ui/GraphicBuffer.cpp +++ b/libs/ui/GraphicBuffer.cpp @@ -28,8 +28,6 @@ #include <ui/GraphicBufferMapper.h> #include <ui/PixelFormat.h> -#include <pixelflinger/pixelflinger.h> - namespace android { // =========================================================================== @@ -182,21 +180,6 @@ status_t GraphicBuffer::unlock() return res; } -status_t GraphicBuffer::lock(GGLSurface* sur, uint32_t usage) -{ - void* vaddr; - status_t res = GraphicBuffer::lock(usage, &vaddr); - if (res == NO_ERROR && sur) { - sur->version = sizeof(GGLSurface); - sur->width = width; - sur->height = height; - sur->stride = stride; - sur->format = format; - sur->data = static_cast<GGLubyte*>(vaddr); - } - return res; -} - size_t GraphicBuffer::getFlattenedSize() const { return (8 + (handle ? handle->numInts : 0))*sizeof(int); } diff --git a/libs/ui/Input.cpp b/libs/ui/Input.cpp deleted file mode 100644 index 263c8d9198..0000000000 --- a/libs/ui/Input.cpp +++ /dev/null @@ -1,1223 +0,0 @@ -// -// Copyright 2010 The Android Open Source Project -// -// Provides a pipe-based transport for native events in the NDK. -// -#define LOG_TAG "Input" - -//#define LOG_NDEBUG 0 - -// Log debug messages about keymap probing. -#define DEBUG_PROBE 0 - -// Log debug messages about velocity tracking. -#define DEBUG_VELOCITY 0 - -// Log debug messages about least squares fitting. -#define DEBUG_LEAST_SQUARES 0 - -// Log debug messages about acceleration. -#define DEBUG_ACCELERATION 0 - - -#include <stdlib.h> -#include <unistd.h> -#include <ctype.h> - -#include <ui/Input.h> - -#include <math.h> -#include <limits.h> - -#ifdef HAVE_ANDROID_OS -#include <binder/Parcel.h> - -#include "SkPoint.h" -#include "SkMatrix.h" -#include "SkScalar.h" -#endif - -namespace android { - -static const char* CONFIGURATION_FILE_DIR[] = { - "idc/", - "keylayout/", - "keychars/", -}; - -static const char* CONFIGURATION_FILE_EXTENSION[] = { - ".idc", - ".kl", - ".kcm", -}; - -static bool isValidNameChar(char ch) { - return isascii(ch) && (isdigit(ch) || isalpha(ch) || ch == '-' || ch == '_'); -} - -static void appendInputDeviceConfigurationFileRelativePath(String8& path, - const String8& name, InputDeviceConfigurationFileType type) { - path.append(CONFIGURATION_FILE_DIR[type]); - for (size_t i = 0; i < name.length(); i++) { - char ch = name[i]; - if (!isValidNameChar(ch)) { - ch = '_'; - } - path.append(&ch, 1); - } - path.append(CONFIGURATION_FILE_EXTENSION[type]); -} - -String8 getInputDeviceConfigurationFilePathByDeviceIdentifier( - const InputDeviceIdentifier& deviceIdentifier, - InputDeviceConfigurationFileType type) { - if (deviceIdentifier.vendor !=0 && deviceIdentifier.product != 0) { - if (deviceIdentifier.version != 0) { - // Try vendor product version. - String8 versionPath(getInputDeviceConfigurationFilePathByName( - String8::format("Vendor_%04x_Product_%04x_Version_%04x", - deviceIdentifier.vendor, deviceIdentifier.product, - deviceIdentifier.version), - type)); - if (!versionPath.isEmpty()) { - return versionPath; - } - } - - // Try vendor product. - String8 productPath(getInputDeviceConfigurationFilePathByName( - String8::format("Vendor_%04x_Product_%04x", - deviceIdentifier.vendor, deviceIdentifier.product), - type)); - if (!productPath.isEmpty()) { - return productPath; - } - } - - // Try device name. - return getInputDeviceConfigurationFilePathByName(deviceIdentifier.name, type); -} - -String8 getInputDeviceConfigurationFilePathByName( - const String8& name, InputDeviceConfigurationFileType type) { - // Search system repository. - String8 path; - path.setTo(getenv("ANDROID_ROOT")); - path.append("/usr/"); - appendInputDeviceConfigurationFileRelativePath(path, name, type); -#if DEBUG_PROBE - ALOGD("Probing for system provided input device configuration file: path='%s'", path.string()); -#endif - if (!access(path.string(), R_OK)) { -#if DEBUG_PROBE - ALOGD("Found"); -#endif - return path; - } - - // Search user repository. - // TODO Should only look here if not in safe mode. - path.setTo(getenv("ANDROID_DATA")); - path.append("/system/devices/"); - appendInputDeviceConfigurationFileRelativePath(path, name, type); -#if DEBUG_PROBE - ALOGD("Probing for system user input device configuration file: path='%s'", path.string()); -#endif - if (!access(path.string(), R_OK)) { -#if DEBUG_PROBE - ALOGD("Found"); -#endif - return path; - } - - // Not found. -#if DEBUG_PROBE - ALOGD("Probe failed to find input device configuration file: name='%s', type=%d", - name.string(), type); -#endif - return String8(); -} - - -// --- InputEvent --- - -void InputEvent::initialize(int32_t deviceId, int32_t source) { - mDeviceId = deviceId; - mSource = source; -} - -void InputEvent::initialize(const InputEvent& from) { - mDeviceId = from.mDeviceId; - mSource = from.mSource; -} - -// --- KeyEvent --- - -bool KeyEvent::hasDefaultAction(int32_t keyCode) { - switch (keyCode) { - case AKEYCODE_HOME: - case AKEYCODE_BACK: - case AKEYCODE_CALL: - case AKEYCODE_ENDCALL: - case AKEYCODE_VOLUME_UP: - case AKEYCODE_VOLUME_DOWN: - case AKEYCODE_VOLUME_MUTE: - case AKEYCODE_POWER: - case AKEYCODE_CAMERA: - case AKEYCODE_HEADSETHOOK: - case AKEYCODE_MENU: - case AKEYCODE_NOTIFICATION: - case AKEYCODE_FOCUS: - case AKEYCODE_SEARCH: - case AKEYCODE_MEDIA_PLAY: - case AKEYCODE_MEDIA_PAUSE: - case AKEYCODE_MEDIA_PLAY_PAUSE: - case AKEYCODE_MEDIA_STOP: - case AKEYCODE_MEDIA_NEXT: - case AKEYCODE_MEDIA_PREVIOUS: - case AKEYCODE_MEDIA_REWIND: - case AKEYCODE_MEDIA_RECORD: - case AKEYCODE_MEDIA_FAST_FORWARD: - case AKEYCODE_MUTE: - return true; - } - - return false; -} - -bool KeyEvent::hasDefaultAction() const { - return hasDefaultAction(getKeyCode()); -} - -bool KeyEvent::isSystemKey(int32_t keyCode) { - switch (keyCode) { - case AKEYCODE_MENU: - case AKEYCODE_SOFT_RIGHT: - case AKEYCODE_HOME: - case AKEYCODE_BACK: - case AKEYCODE_CALL: - case AKEYCODE_ENDCALL: - case AKEYCODE_VOLUME_UP: - case AKEYCODE_VOLUME_DOWN: - case AKEYCODE_VOLUME_MUTE: - case AKEYCODE_MUTE: - case AKEYCODE_POWER: - case AKEYCODE_HEADSETHOOK: - case AKEYCODE_MEDIA_PLAY: - case AKEYCODE_MEDIA_PAUSE: - case AKEYCODE_MEDIA_PLAY_PAUSE: - case AKEYCODE_MEDIA_STOP: - case AKEYCODE_MEDIA_NEXT: - case AKEYCODE_MEDIA_PREVIOUS: - case AKEYCODE_MEDIA_REWIND: - case AKEYCODE_MEDIA_RECORD: - case AKEYCODE_MEDIA_FAST_FORWARD: - case AKEYCODE_CAMERA: - case AKEYCODE_FOCUS: - case AKEYCODE_SEARCH: - return true; - } - - return false; -} - -bool KeyEvent::isSystemKey() const { - return isSystemKey(getKeyCode()); -} - -void KeyEvent::initialize( - int32_t deviceId, - int32_t source, - int32_t action, - int32_t flags, - int32_t keyCode, - int32_t scanCode, - int32_t metaState, - int32_t repeatCount, - nsecs_t downTime, - nsecs_t eventTime) { - InputEvent::initialize(deviceId, source); - mAction = action; - mFlags = flags; - mKeyCode = keyCode; - mScanCode = scanCode; - mMetaState = metaState; - mRepeatCount = repeatCount; - mDownTime = downTime; - mEventTime = eventTime; -} - -void KeyEvent::initialize(const KeyEvent& from) { - InputEvent::initialize(from); - mAction = from.mAction; - mFlags = from.mFlags; - mKeyCode = from.mKeyCode; - mScanCode = from.mScanCode; - mMetaState = from.mMetaState; - mRepeatCount = from.mRepeatCount; - mDownTime = from.mDownTime; - mEventTime = from.mEventTime; -} - - -// --- PointerCoords --- - -float PointerCoords::getAxisValue(int32_t axis) const { - if (axis < 0 || axis > 63) { - return 0; - } - - uint64_t axisBit = 1LL << axis; - if (!(bits & axisBit)) { - return 0; - } - uint32_t index = __builtin_popcountll(bits & (axisBit - 1LL)); - return values[index]; -} - -status_t PointerCoords::setAxisValue(int32_t axis, float value) { - if (axis < 0 || axis > 63) { - return NAME_NOT_FOUND; - } - - uint64_t axisBit = 1LL << axis; - uint32_t index = __builtin_popcountll(bits & (axisBit - 1LL)); - if (!(bits & axisBit)) { - if (value == 0) { - return OK; // axes with value 0 do not need to be stored - } - uint32_t count = __builtin_popcountll(bits); - if (count >= MAX_AXES) { - tooManyAxes(axis); - return NO_MEMORY; - } - bits |= axisBit; - for (uint32_t i = count; i > index; i--) { - values[i] = values[i - 1]; - } - } - values[index] = value; - return OK; -} - -static inline void scaleAxisValue(PointerCoords& c, int axis, float scaleFactor) { - float value = c.getAxisValue(axis); - if (value != 0) { - c.setAxisValue(axis, value * scaleFactor); - } -} - -void PointerCoords::scale(float scaleFactor) { - // No need to scale pressure or size since they are normalized. - // No need to scale orientation since it is meaningless to do so. - scaleAxisValue(*this, AMOTION_EVENT_AXIS_X, scaleFactor); - scaleAxisValue(*this, AMOTION_EVENT_AXIS_Y, scaleFactor); - scaleAxisValue(*this, AMOTION_EVENT_AXIS_TOUCH_MAJOR, scaleFactor); - scaleAxisValue(*this, AMOTION_EVENT_AXIS_TOUCH_MINOR, scaleFactor); - scaleAxisValue(*this, AMOTION_EVENT_AXIS_TOOL_MAJOR, scaleFactor); - scaleAxisValue(*this, AMOTION_EVENT_AXIS_TOOL_MINOR, scaleFactor); -} - -#ifdef HAVE_ANDROID_OS -status_t PointerCoords::readFromParcel(Parcel* parcel) { - bits = parcel->readInt64(); - - uint32_t count = __builtin_popcountll(bits); - if (count > MAX_AXES) { - return BAD_VALUE; - } - - for (uint32_t i = 0; i < count; i++) { - values[i] = parcel->readInt32(); - } - return OK; -} - -status_t PointerCoords::writeToParcel(Parcel* parcel) const { - parcel->writeInt64(bits); - - uint32_t count = __builtin_popcountll(bits); - for (uint32_t i = 0; i < count; i++) { - parcel->writeInt32(values[i]); - } - return OK; -} -#endif - -void PointerCoords::tooManyAxes(int axis) { - ALOGW("Could not set value for axis %d because the PointerCoords structure is full and " - "cannot contain more than %d axis values.", axis, int(MAX_AXES)); -} - -bool PointerCoords::operator==(const PointerCoords& other) const { - if (bits != other.bits) { - return false; - } - uint32_t count = __builtin_popcountll(bits); - for (uint32_t i = 0; i < count; i++) { - if (values[i] != other.values[i]) { - return false; - } - } - return true; -} - -void PointerCoords::copyFrom(const PointerCoords& other) { - bits = other.bits; - uint32_t count = __builtin_popcountll(bits); - for (uint32_t i = 0; i < count; i++) { - values[i] = other.values[i]; - } -} - - -// --- PointerProperties --- - -bool PointerProperties::operator==(const PointerProperties& other) const { - return id == other.id - && toolType == other.toolType; -} - -void PointerProperties::copyFrom(const PointerProperties& other) { - id = other.id; - toolType = other.toolType; -} - - -// --- MotionEvent --- - -void MotionEvent::initialize( - int32_t deviceId, - int32_t source, - int32_t action, - int32_t flags, - int32_t edgeFlags, - int32_t metaState, - int32_t buttonState, - float xOffset, - float yOffset, - float xPrecision, - float yPrecision, - nsecs_t downTime, - nsecs_t eventTime, - size_t pointerCount, - const PointerProperties* pointerProperties, - const PointerCoords* pointerCoords) { - InputEvent::initialize(deviceId, source); - mAction = action; - mFlags = flags; - mEdgeFlags = edgeFlags; - mMetaState = metaState; - mButtonState = buttonState; - mXOffset = xOffset; - mYOffset = yOffset; - mXPrecision = xPrecision; - mYPrecision = yPrecision; - mDownTime = downTime; - mPointerProperties.clear(); - mPointerProperties.appendArray(pointerProperties, pointerCount); - mSampleEventTimes.clear(); - mSamplePointerCoords.clear(); - addSample(eventTime, pointerCoords); -} - -void MotionEvent::copyFrom(const MotionEvent* other, bool keepHistory) { - InputEvent::initialize(other->mDeviceId, other->mSource); - mAction = other->mAction; - mFlags = other->mFlags; - mEdgeFlags = other->mEdgeFlags; - mMetaState = other->mMetaState; - mButtonState = other->mButtonState; - mXOffset = other->mXOffset; - mYOffset = other->mYOffset; - mXPrecision = other->mXPrecision; - mYPrecision = other->mYPrecision; - mDownTime = other->mDownTime; - mPointerProperties = other->mPointerProperties; - - if (keepHistory) { - mSampleEventTimes = other->mSampleEventTimes; - mSamplePointerCoords = other->mSamplePointerCoords; - } else { - mSampleEventTimes.clear(); - mSampleEventTimes.push(other->getEventTime()); - mSamplePointerCoords.clear(); - size_t pointerCount = other->getPointerCount(); - size_t historySize = other->getHistorySize(); - mSamplePointerCoords.appendArray(other->mSamplePointerCoords.array() - + (historySize * pointerCount), pointerCount); - } -} - -void MotionEvent::addSample( - int64_t eventTime, - const PointerCoords* pointerCoords) { - mSampleEventTimes.push(eventTime); - mSamplePointerCoords.appendArray(pointerCoords, getPointerCount()); -} - -const PointerCoords* MotionEvent::getRawPointerCoords(size_t pointerIndex) const { - return &mSamplePointerCoords[getHistorySize() * getPointerCount() + pointerIndex]; -} - -float MotionEvent::getRawAxisValue(int32_t axis, size_t pointerIndex) const { - return getRawPointerCoords(pointerIndex)->getAxisValue(axis); -} - -float MotionEvent::getAxisValue(int32_t axis, size_t pointerIndex) const { - float value = getRawPointerCoords(pointerIndex)->getAxisValue(axis); - switch (axis) { - case AMOTION_EVENT_AXIS_X: - return value + mXOffset; - case AMOTION_EVENT_AXIS_Y: - return value + mYOffset; - } - return value; -} - -const PointerCoords* MotionEvent::getHistoricalRawPointerCoords( - size_t pointerIndex, size_t historicalIndex) const { - return &mSamplePointerCoords[historicalIndex * getPointerCount() + pointerIndex]; -} - -float MotionEvent::getHistoricalRawAxisValue(int32_t axis, size_t pointerIndex, - size_t historicalIndex) const { - return getHistoricalRawPointerCoords(pointerIndex, historicalIndex)->getAxisValue(axis); -} - -float MotionEvent::getHistoricalAxisValue(int32_t axis, size_t pointerIndex, - size_t historicalIndex) const { - float value = getHistoricalRawPointerCoords(pointerIndex, historicalIndex)->getAxisValue(axis); - switch (axis) { - case AMOTION_EVENT_AXIS_X: - return value + mXOffset; - case AMOTION_EVENT_AXIS_Y: - return value + mYOffset; - } - return value; -} - -ssize_t MotionEvent::findPointerIndex(int32_t pointerId) const { - size_t pointerCount = mPointerProperties.size(); - for (size_t i = 0; i < pointerCount; i++) { - if (mPointerProperties.itemAt(i).id == pointerId) { - return i; - } - } - return -1; -} - -void MotionEvent::offsetLocation(float xOffset, float yOffset) { - mXOffset += xOffset; - mYOffset += yOffset; -} - -void MotionEvent::scale(float scaleFactor) { - mXOffset *= scaleFactor; - mYOffset *= scaleFactor; - mXPrecision *= scaleFactor; - mYPrecision *= scaleFactor; - - size_t numSamples = mSamplePointerCoords.size(); - for (size_t i = 0; i < numSamples; i++) { - mSamplePointerCoords.editItemAt(i).scale(scaleFactor); - } -} - -#ifdef HAVE_ANDROID_OS -static inline float transformAngle(const SkMatrix* matrix, float angleRadians) { - // Construct and transform a vector oriented at the specified clockwise angle from vertical. - // Coordinate system: down is increasing Y, right is increasing X. - SkPoint vector; - vector.fX = SkFloatToScalar(sinf(angleRadians)); - vector.fY = SkFloatToScalar(-cosf(angleRadians)); - matrix->mapVectors(& vector, 1); - - // Derive the transformed vector's clockwise angle from vertical. - float result = atan2f(SkScalarToFloat(vector.fX), SkScalarToFloat(-vector.fY)); - if (result < - M_PI_2) { - result += M_PI; - } else if (result > M_PI_2) { - result -= M_PI; - } - return result; -} - -void MotionEvent::transform(const SkMatrix* matrix) { - float oldXOffset = mXOffset; - float oldYOffset = mYOffset; - - // The tricky part of this implementation is to preserve the value of - // rawX and rawY. So we apply the transformation to the first point - // then derive an appropriate new X/Y offset that will preserve rawX and rawY. - SkPoint point; - float rawX = getRawX(0); - float rawY = getRawY(0); - matrix->mapXY(SkFloatToScalar(rawX + oldXOffset), SkFloatToScalar(rawY + oldYOffset), - & point); - float newX = SkScalarToFloat(point.fX); - float newY = SkScalarToFloat(point.fY); - float newXOffset = newX - rawX; - float newYOffset = newY - rawY; - - mXOffset = newXOffset; - mYOffset = newYOffset; - - // Apply the transformation to all samples. - size_t numSamples = mSamplePointerCoords.size(); - for (size_t i = 0; i < numSamples; i++) { - PointerCoords& c = mSamplePointerCoords.editItemAt(i); - float x = c.getAxisValue(AMOTION_EVENT_AXIS_X) + oldXOffset; - float y = c.getAxisValue(AMOTION_EVENT_AXIS_Y) + oldYOffset; - matrix->mapXY(SkFloatToScalar(x), SkFloatToScalar(y), &point); - c.setAxisValue(AMOTION_EVENT_AXIS_X, SkScalarToFloat(point.fX) - newXOffset); - c.setAxisValue(AMOTION_EVENT_AXIS_Y, SkScalarToFloat(point.fY) - newYOffset); - - float orientation = c.getAxisValue(AMOTION_EVENT_AXIS_ORIENTATION); - c.setAxisValue(AMOTION_EVENT_AXIS_ORIENTATION, transformAngle(matrix, orientation)); - } -} - -status_t MotionEvent::readFromParcel(Parcel* parcel) { - size_t pointerCount = parcel->readInt32(); - size_t sampleCount = parcel->readInt32(); - if (pointerCount == 0 || pointerCount > MAX_POINTERS || sampleCount == 0) { - return BAD_VALUE; - } - - mDeviceId = parcel->readInt32(); - mSource = parcel->readInt32(); - mAction = parcel->readInt32(); - mFlags = parcel->readInt32(); - mEdgeFlags = parcel->readInt32(); - mMetaState = parcel->readInt32(); - mButtonState = parcel->readInt32(); - mXOffset = parcel->readFloat(); - mYOffset = parcel->readFloat(); - mXPrecision = parcel->readFloat(); - mYPrecision = parcel->readFloat(); - mDownTime = parcel->readInt64(); - - mPointerProperties.clear(); - mPointerProperties.setCapacity(pointerCount); - mSampleEventTimes.clear(); - mSampleEventTimes.setCapacity(sampleCount); - mSamplePointerCoords.clear(); - mSamplePointerCoords.setCapacity(sampleCount * pointerCount); - - for (size_t i = 0; i < pointerCount; i++) { - mPointerProperties.push(); - PointerProperties& properties = mPointerProperties.editTop(); - properties.id = parcel->readInt32(); - properties.toolType = parcel->readInt32(); - } - - while (sampleCount-- > 0) { - mSampleEventTimes.push(parcel->readInt64()); - for (size_t i = 0; i < pointerCount; i++) { - mSamplePointerCoords.push(); - status_t status = mSamplePointerCoords.editTop().readFromParcel(parcel); - if (status) { - return status; - } - } - } - return OK; -} - -status_t MotionEvent::writeToParcel(Parcel* parcel) const { - size_t pointerCount = mPointerProperties.size(); - size_t sampleCount = mSampleEventTimes.size(); - - parcel->writeInt32(pointerCount); - parcel->writeInt32(sampleCount); - - parcel->writeInt32(mDeviceId); - parcel->writeInt32(mSource); - parcel->writeInt32(mAction); - parcel->writeInt32(mFlags); - parcel->writeInt32(mEdgeFlags); - parcel->writeInt32(mMetaState); - parcel->writeInt32(mButtonState); - parcel->writeFloat(mXOffset); - parcel->writeFloat(mYOffset); - parcel->writeFloat(mXPrecision); - parcel->writeFloat(mYPrecision); - parcel->writeInt64(mDownTime); - - for (size_t i = 0; i < pointerCount; i++) { - const PointerProperties& properties = mPointerProperties.itemAt(i); - parcel->writeInt32(properties.id); - parcel->writeInt32(properties.toolType); - } - - const PointerCoords* pc = mSamplePointerCoords.array(); - for (size_t h = 0; h < sampleCount; h++) { - parcel->writeInt64(mSampleEventTimes.itemAt(h)); - for (size_t i = 0; i < pointerCount; i++) { - status_t status = (pc++)->writeToParcel(parcel); - if (status) { - return status; - } - } - } - return OK; -} -#endif - -bool MotionEvent::isTouchEvent(int32_t source, int32_t action) { - if (source & AINPUT_SOURCE_CLASS_POINTER) { - // Specifically excludes HOVER_MOVE and SCROLL. - switch (action & AMOTION_EVENT_ACTION_MASK) { - case AMOTION_EVENT_ACTION_DOWN: - case AMOTION_EVENT_ACTION_MOVE: - case AMOTION_EVENT_ACTION_UP: - case AMOTION_EVENT_ACTION_POINTER_DOWN: - case AMOTION_EVENT_ACTION_POINTER_UP: - case AMOTION_EVENT_ACTION_CANCEL: - case AMOTION_EVENT_ACTION_OUTSIDE: - return true; - } - } - return false; -} - - -// --- VelocityTracker --- - -const uint32_t VelocityTracker::DEFAULT_DEGREE; -const nsecs_t VelocityTracker::DEFAULT_HORIZON; -const uint32_t VelocityTracker::HISTORY_SIZE; - -static inline float vectorDot(const float* a, const float* b, uint32_t m) { - float r = 0; - while (m--) { - r += *(a++) * *(b++); - } - return r; -} - -static inline float vectorNorm(const float* a, uint32_t m) { - float r = 0; - while (m--) { - float t = *(a++); - r += t * t; - } - return sqrtf(r); -} - -#if DEBUG_LEAST_SQUARES || DEBUG_VELOCITY -static String8 vectorToString(const float* a, uint32_t m) { - String8 str; - str.append("["); - while (m--) { - str.appendFormat(" %f", *(a++)); - if (m) { - str.append(","); - } - } - str.append(" ]"); - return str; -} - -static String8 matrixToString(const float* a, uint32_t m, uint32_t n, bool rowMajor) { - String8 str; - str.append("["); - for (size_t i = 0; i < m; i++) { - if (i) { - str.append(","); - } - str.append(" ["); - for (size_t j = 0; j < n; j++) { - if (j) { - str.append(","); - } - str.appendFormat(" %f", a[rowMajor ? i * n + j : j * m + i]); - } - str.append(" ]"); - } - str.append(" ]"); - return str; -} -#endif - -VelocityTracker::VelocityTracker() { - clear(); -} - -void VelocityTracker::clear() { - mIndex = 0; - mMovements[0].idBits.clear(); - mActivePointerId = -1; -} - -void VelocityTracker::clearPointers(BitSet32 idBits) { - BitSet32 remainingIdBits(mMovements[mIndex].idBits.value & ~idBits.value); - mMovements[mIndex].idBits = remainingIdBits; - - if (mActivePointerId >= 0 && idBits.hasBit(mActivePointerId)) { - mActivePointerId = !remainingIdBits.isEmpty() ? remainingIdBits.firstMarkedBit() : -1; - } -} - -void VelocityTracker::addMovement(nsecs_t eventTime, BitSet32 idBits, const Position* positions) { - if (++mIndex == HISTORY_SIZE) { - mIndex = 0; - } - - while (idBits.count() > MAX_POINTERS) { - idBits.clearLastMarkedBit(); - } - - Movement& movement = mMovements[mIndex]; - movement.eventTime = eventTime; - movement.idBits = idBits; - uint32_t count = idBits.count(); - for (uint32_t i = 0; i < count; i++) { - movement.positions[i] = positions[i]; - } - - if (mActivePointerId < 0 || !idBits.hasBit(mActivePointerId)) { - mActivePointerId = count != 0 ? idBits.firstMarkedBit() : -1; - } - -#if DEBUG_VELOCITY - ALOGD("VelocityTracker: addMovement eventTime=%lld, idBits=0x%08x, activePointerId=%d", - eventTime, idBits.value, mActivePointerId); - for (BitSet32 iterBits(idBits); !iterBits.isEmpty(); ) { - uint32_t id = iterBits.firstMarkedBit(); - uint32_t index = idBits.getIndexOfBit(id); - iterBits.clearBit(id); - Estimator estimator; - getEstimator(id, DEFAULT_DEGREE, DEFAULT_HORIZON, &estimator); - ALOGD(" %d: position (%0.3f, %0.3f), " - "estimator (degree=%d, xCoeff=%s, yCoeff=%s, confidence=%f)", - id, positions[index].x, positions[index].y, - int(estimator.degree), - vectorToString(estimator.xCoeff, estimator.degree).string(), - vectorToString(estimator.yCoeff, estimator.degree).string(), - estimator.confidence); - } -#endif -} - -void VelocityTracker::addMovement(const MotionEvent* event) { - int32_t actionMasked = event->getActionMasked(); - - switch (actionMasked) { - case AMOTION_EVENT_ACTION_DOWN: - case AMOTION_EVENT_ACTION_HOVER_ENTER: - // Clear all pointers on down before adding the new movement. - clear(); - break; - case AMOTION_EVENT_ACTION_POINTER_DOWN: { - // Start a new movement trace for a pointer that just went down. - // We do this on down instead of on up because the client may want to query the - // final velocity for a pointer that just went up. - BitSet32 downIdBits; - downIdBits.markBit(event->getPointerId(event->getActionIndex())); - clearPointers(downIdBits); - break; - } - case AMOTION_EVENT_ACTION_MOVE: - case AMOTION_EVENT_ACTION_HOVER_MOVE: - break; - default: - // Ignore all other actions because they do not convey any new information about - // pointer movement. We also want to preserve the last known velocity of the pointers. - // Note that ACTION_UP and ACTION_POINTER_UP always report the last known position - // of the pointers that went up. ACTION_POINTER_UP does include the new position of - // pointers that remained down but we will also receive an ACTION_MOVE with this - // information if any of them actually moved. Since we don't know how many pointers - // will be going up at once it makes sense to just wait for the following ACTION_MOVE - // before adding the movement. - return; - } - - size_t pointerCount = event->getPointerCount(); - if (pointerCount > MAX_POINTERS) { - pointerCount = MAX_POINTERS; - } - - BitSet32 idBits; - for (size_t i = 0; i < pointerCount; i++) { - idBits.markBit(event->getPointerId(i)); - } - - nsecs_t eventTime; - Position positions[pointerCount]; - - size_t historySize = event->getHistorySize(); - for (size_t h = 0; h < historySize; h++) { - eventTime = event->getHistoricalEventTime(h); - for (size_t i = 0; i < pointerCount; i++) { - positions[i].x = event->getHistoricalX(i, h); - positions[i].y = event->getHistoricalY(i, h); - } - addMovement(eventTime, idBits, positions); - } - - eventTime = event->getEventTime(); - for (size_t i = 0; i < pointerCount; i++) { - positions[i].x = event->getX(i); - positions[i].y = event->getY(i); - } - addMovement(eventTime, idBits, positions); -} - -/** - * Solves a linear least squares problem to obtain a N degree polynomial that fits - * the specified input data as nearly as possible. - * - * Returns true if a solution is found, false otherwise. - * - * The input consists of two vectors of data points X and Y with indices 0..m-1. - * The output is a vector B with indices 0..n-1 that describes a polynomial - * that fits the data, such the sum of abs(Y[i] - (B[0] + B[1] X[i] + B[2] X[i]^2 ... B[n] X[i]^n)) - * for all i between 0 and m-1 is minimized. - * - * That is to say, the function that generated the input data can be approximated - * by y(x) ~= B[0] + B[1] x + B[2] x^2 + ... + B[n] x^n. - * - * The coefficient of determination (R^2) is also returned to describe the goodness - * of fit of the model for the given data. It is a value between 0 and 1, where 1 - * indicates perfect correspondence. - * - * This function first expands the X vector to a m by n matrix A such that - * A[i][0] = 1, A[i][1] = X[i], A[i][2] = X[i]^2, ..., A[i][n] = X[i]^n. - * - * Then it calculates the QR decomposition of A yielding an m by m orthonormal matrix Q - * and an m by n upper triangular matrix R. Because R is upper triangular (lower - * part is all zeroes), we can simplify the decomposition into an m by n matrix - * Q1 and a n by n matrix R1 such that A = Q1 R1. - * - * Finally we solve the system of linear equations given by R1 B = (Qtranspose Y) - * to find B. - * - * For efficiency, we lay out A and Q column-wise in memory because we frequently - * operate on the column vectors. Conversely, we lay out R row-wise. - * - * http://en.wikipedia.org/wiki/Numerical_methods_for_linear_least_squares - * http://en.wikipedia.org/wiki/Gram-Schmidt - */ -static bool solveLeastSquares(const float* x, const float* y, uint32_t m, uint32_t n, - float* outB, float* outDet) { -#if DEBUG_LEAST_SQUARES - ALOGD("solveLeastSquares: m=%d, n=%d, x=%s, y=%s", int(m), int(n), - vectorToString(x, m).string(), vectorToString(y, m).string()); -#endif - - // Expand the X vector to a matrix A. - float a[n][m]; // column-major order - for (uint32_t h = 0; h < m; h++) { - a[0][h] = 1; - for (uint32_t i = 1; i < n; i++) { - a[i][h] = a[i - 1][h] * x[h]; - } - } -#if DEBUG_LEAST_SQUARES - ALOGD(" - a=%s", matrixToString(&a[0][0], m, n, false /*rowMajor*/).string()); -#endif - - // Apply the Gram-Schmidt process to A to obtain its QR decomposition. - float q[n][m]; // orthonormal basis, column-major order - float r[n][n]; // upper triangular matrix, row-major order - for (uint32_t j = 0; j < n; j++) { - for (uint32_t h = 0; h < m; h++) { - q[j][h] = a[j][h]; - } - for (uint32_t i = 0; i < j; i++) { - float dot = vectorDot(&q[j][0], &q[i][0], m); - for (uint32_t h = 0; h < m; h++) { - q[j][h] -= dot * q[i][h]; - } - } - - float norm = vectorNorm(&q[j][0], m); - if (norm < 0.000001f) { - // vectors are linearly dependent or zero so no solution -#if DEBUG_LEAST_SQUARES - ALOGD(" - no solution, norm=%f", norm); -#endif - return false; - } - - float invNorm = 1.0f / norm; - for (uint32_t h = 0; h < m; h++) { - q[j][h] *= invNorm; - } - for (uint32_t i = 0; i < n; i++) { - r[j][i] = i < j ? 0 : vectorDot(&q[j][0], &a[i][0], m); - } - } -#if DEBUG_LEAST_SQUARES - ALOGD(" - q=%s", matrixToString(&q[0][0], m, n, false /*rowMajor*/).string()); - ALOGD(" - r=%s", matrixToString(&r[0][0], n, n, true /*rowMajor*/).string()); - - // calculate QR, if we factored A correctly then QR should equal A - float qr[n][m]; - for (uint32_t h = 0; h < m; h++) { - for (uint32_t i = 0; i < n; i++) { - qr[i][h] = 0; - for (uint32_t j = 0; j < n; j++) { - qr[i][h] += q[j][h] * r[j][i]; - } - } - } - ALOGD(" - qr=%s", matrixToString(&qr[0][0], m, n, false /*rowMajor*/).string()); -#endif - - // Solve R B = Qt Y to find B. This is easy because R is upper triangular. - // We just work from bottom-right to top-left calculating B's coefficients. - for (uint32_t i = n; i-- != 0; ) { - outB[i] = vectorDot(&q[i][0], y, m); - for (uint32_t j = n - 1; j > i; j--) { - outB[i] -= r[i][j] * outB[j]; - } - outB[i] /= r[i][i]; - } -#if DEBUG_LEAST_SQUARES - ALOGD(" - b=%s", vectorToString(outB, n).string()); -#endif - - // Calculate the coefficient of determination as 1 - (SSerr / SStot) where - // SSerr is the residual sum of squares (squared variance of the error), - // and SStot is the total sum of squares (squared variance of the data). - float ymean = 0; - for (uint32_t h = 0; h < m; h++) { - ymean += y[h]; - } - ymean /= m; - - float sserr = 0; - float sstot = 0; - for (uint32_t h = 0; h < m; h++) { - float err = y[h] - outB[0]; - float term = 1; - for (uint32_t i = 1; i < n; i++) { - term *= x[h]; - err -= term * outB[i]; - } - sserr += err * err; - float var = y[h] - ymean; - sstot += var * var; - } - *outDet = sstot > 0.000001f ? 1.0f - (sserr / sstot) : 1; -#if DEBUG_LEAST_SQUARES - ALOGD(" - sserr=%f", sserr); - ALOGD(" - sstot=%f", sstot); - ALOGD(" - det=%f", *outDet); -#endif - return true; -} - -bool VelocityTracker::getVelocity(uint32_t id, float* outVx, float* outVy) const { - Estimator estimator; - if (getEstimator(id, DEFAULT_DEGREE, DEFAULT_HORIZON, &estimator)) { - if (estimator.degree >= 1) { - *outVx = estimator.xCoeff[1]; - *outVy = estimator.yCoeff[1]; - return true; - } - } - *outVx = 0; - *outVy = 0; - return false; -} - -bool VelocityTracker::getEstimator(uint32_t id, uint32_t degree, nsecs_t horizon, - Estimator* outEstimator) const { - outEstimator->clear(); - - // Iterate over movement samples in reverse time order and collect samples. - float x[HISTORY_SIZE]; - float y[HISTORY_SIZE]; - float time[HISTORY_SIZE]; - uint32_t m = 0; - uint32_t index = mIndex; - const Movement& newestMovement = mMovements[mIndex]; - do { - const Movement& movement = mMovements[index]; - if (!movement.idBits.hasBit(id)) { - break; - } - - nsecs_t age = newestMovement.eventTime - movement.eventTime; - if (age > horizon) { - break; - } - - const Position& position = movement.getPosition(id); - x[m] = position.x; - y[m] = position.y; - time[m] = -age * 0.000000001f; - index = (index == 0 ? HISTORY_SIZE : index) - 1; - } while (++m < HISTORY_SIZE); - - if (m == 0) { - return false; // no data - } - - // Calculate a least squares polynomial fit. - if (degree > Estimator::MAX_DEGREE) { - degree = Estimator::MAX_DEGREE; - } - if (degree > m - 1) { - degree = m - 1; - } - if (degree >= 1) { - float xdet, ydet; - uint32_t n = degree + 1; - if (solveLeastSquares(time, x, m, n, outEstimator->xCoeff, &xdet) - && solveLeastSquares(time, y, m, n, outEstimator->yCoeff, &ydet)) { - outEstimator->degree = degree; - outEstimator->confidence = xdet * ydet; -#if DEBUG_LEAST_SQUARES - ALOGD("estimate: degree=%d, xCoeff=%s, yCoeff=%s, confidence=%f", - int(outEstimator->degree), - vectorToString(outEstimator->xCoeff, n).string(), - vectorToString(outEstimator->yCoeff, n).string(), - outEstimator->confidence); -#endif - return true; - } - } - - // No velocity data available for this pointer, but we do have its current position. - outEstimator->xCoeff[0] = x[0]; - outEstimator->yCoeff[0] = y[0]; - outEstimator->degree = 0; - outEstimator->confidence = 1; - return true; -} - - -// --- VelocityControl --- - -const nsecs_t VelocityControl::STOP_TIME; - -VelocityControl::VelocityControl() { - reset(); -} - -void VelocityControl::setParameters(const VelocityControlParameters& parameters) { - mParameters = parameters; - reset(); -} - -void VelocityControl::reset() { - mLastMovementTime = LLONG_MIN; - mRawPosition.x = 0; - mRawPosition.y = 0; - mVelocityTracker.clear(); -} - -void VelocityControl::move(nsecs_t eventTime, float* deltaX, float* deltaY) { - if ((deltaX && *deltaX) || (deltaY && *deltaY)) { - if (eventTime >= mLastMovementTime + STOP_TIME) { -#if DEBUG_ACCELERATION - ALOGD("VelocityControl: stopped, last movement was %0.3fms ago", - (eventTime - mLastMovementTime) * 0.000001f); -#endif - reset(); - } - - mLastMovementTime = eventTime; - if (deltaX) { - mRawPosition.x += *deltaX; - } - if (deltaY) { - mRawPosition.y += *deltaY; - } - mVelocityTracker.addMovement(eventTime, BitSet32(BitSet32::valueForBit(0)), &mRawPosition); - - float vx, vy; - float scale = mParameters.scale; - if (mVelocityTracker.getVelocity(0, &vx, &vy)) { - float speed = hypotf(vx, vy) * scale; - if (speed >= mParameters.highThreshold) { - // Apply full acceleration above the high speed threshold. - scale *= mParameters.acceleration; - } else if (speed > mParameters.lowThreshold) { - // Linearly interpolate the acceleration to apply between the low and high - // speed thresholds. - scale *= 1 + (speed - mParameters.lowThreshold) - / (mParameters.highThreshold - mParameters.lowThreshold) - * (mParameters.acceleration - 1); - } - -#if DEBUG_ACCELERATION - ALOGD("VelocityControl(%0.3f, %0.3f, %0.3f, %0.3f): " - "vx=%0.3f, vy=%0.3f, speed=%0.3f, accel=%0.3f", - mParameters.scale, mParameters.lowThreshold, mParameters.highThreshold, - mParameters.acceleration, - vx, vy, speed, scale / mParameters.scale); -#endif - } else { -#if DEBUG_ACCELERATION - ALOGD("VelocityControl(%0.3f, %0.3f, %0.3f, %0.3f): unknown velocity", - mParameters.scale, mParameters.lowThreshold, mParameters.highThreshold, - mParameters.acceleration); -#endif - } - - if (deltaX) { - *deltaX *= scale; - } - if (deltaY) { - *deltaY *= scale; - } - } -} - - -// --- InputDeviceInfo --- - -InputDeviceInfo::InputDeviceInfo() { - initialize(-1, String8("uninitialized device info")); -} - -InputDeviceInfo::InputDeviceInfo(const InputDeviceInfo& other) : - mId(other.mId), mName(other.mName), mSources(other.mSources), - mKeyboardType(other.mKeyboardType), - mMotionRanges(other.mMotionRanges) { -} - -InputDeviceInfo::~InputDeviceInfo() { -} - -void InputDeviceInfo::initialize(int32_t id, const String8& name) { - mId = id; - mName = name; - mSources = 0; - mKeyboardType = AINPUT_KEYBOARD_TYPE_NONE; - mMotionRanges.clear(); -} - -const InputDeviceInfo::MotionRange* InputDeviceInfo::getMotionRange( - int32_t axis, uint32_t source) const { - size_t numRanges = mMotionRanges.size(); - for (size_t i = 0; i < numRanges; i++) { - const MotionRange& range = mMotionRanges.itemAt(i); - if (range.axis == axis && range.source == source) { - return ⦥ - } - } - return NULL; -} - -void InputDeviceInfo::addSource(uint32_t source) { - mSources |= source; -} - -void InputDeviceInfo::addMotionRange(int32_t axis, uint32_t source, float min, float max, - float flat, float fuzz) { - MotionRange range = { axis, source, min, max, flat, fuzz }; - mMotionRanges.add(range); -} - -void InputDeviceInfo::addMotionRange(const MotionRange& range) { - mMotionRanges.add(range); -} - -} // namespace android diff --git a/libs/ui/InputTransport.cpp b/libs/ui/InputTransport.cpp deleted file mode 100644 index ecb3fb5c98..0000000000 --- a/libs/ui/InputTransport.cpp +++ /dev/null @@ -1,611 +0,0 @@ -// -// Copyright 2010 The Android Open Source Project -// -// Provides a shared memory transport for input events. -// -#define LOG_TAG "InputTransport" - -//#define LOG_NDEBUG 0 - -// Log debug messages about channel messages (send message, receive message) -#define DEBUG_CHANNEL_MESSAGES 0 - -// Log debug messages whenever InputChannel objects are created/destroyed -#define DEBUG_CHANNEL_LIFECYCLE 0 - -// Log debug messages about transport actions -#define DEBUG_TRANSPORT_ACTIONS 0 - - -#include <cutils/log.h> -#include <errno.h> -#include <fcntl.h> -#include <ui/InputTransport.h> -#include <unistd.h> -#include <sys/types.h> -#include <sys/socket.h> - - -namespace android { - -// Socket buffer size. The default is typically about 128KB, which is much larger than -// we really need. So we make it smaller. It just needs to be big enough to hold -// a few dozen large multi-finger motion events in the case where an application gets -// behind processing touches. -static const size_t SOCKET_BUFFER_SIZE = 32 * 1024; - - -// --- InputMessage --- - -bool InputMessage::isValid(size_t actualSize) const { - if (size() == actualSize) { - switch (header.type) { - case TYPE_KEY: - return true; - case TYPE_MOTION: - return body.motion.pointerCount > 0 - && body.motion.pointerCount <= MAX_POINTERS; - case TYPE_FINISHED: - return true; - } - } - return false; -} - -size_t InputMessage::size() const { - switch (header.type) { - case TYPE_KEY: - return sizeof(Header) + body.key.size(); - case TYPE_MOTION: - return sizeof(Header) + body.motion.size(); - case TYPE_FINISHED: - return sizeof(Header) + body.finished.size(); - } - return sizeof(Header); -} - - -// --- InputChannel --- - -InputChannel::InputChannel(const String8& name, int fd) : - mName(name), mFd(fd) { -#if DEBUG_CHANNEL_LIFECYCLE - ALOGD("Input channel constructed: name='%s', fd=%d", - mName.string(), fd); -#endif - - int result = fcntl(mFd, F_SETFL, O_NONBLOCK); - LOG_ALWAYS_FATAL_IF(result != 0, "channel '%s' ~ Could not make socket " - "non-blocking. errno=%d", mName.string(), errno); -} - -InputChannel::~InputChannel() { -#if DEBUG_CHANNEL_LIFECYCLE - ALOGD("Input channel destroyed: name='%s', fd=%d", - mName.string(), mFd); -#endif - - ::close(mFd); -} - -status_t InputChannel::openInputChannelPair(const String8& name, - sp<InputChannel>& outServerChannel, sp<InputChannel>& outClientChannel) { - int sockets[2]; - if (socketpair(AF_UNIX, SOCK_SEQPACKET, 0, sockets)) { - status_t result = -errno; - ALOGE("channel '%s' ~ Could not create socket pair. errno=%d", - name.string(), errno); - outServerChannel.clear(); - outClientChannel.clear(); - return result; - } - - int bufferSize = SOCKET_BUFFER_SIZE; - setsockopt(sockets[0], SOL_SOCKET, SO_SNDBUF, &bufferSize, sizeof(bufferSize)); - setsockopt(sockets[0], SOL_SOCKET, SO_RCVBUF, &bufferSize, sizeof(bufferSize)); - setsockopt(sockets[1], SOL_SOCKET, SO_SNDBUF, &bufferSize, sizeof(bufferSize)); - setsockopt(sockets[1], SOL_SOCKET, SO_RCVBUF, &bufferSize, sizeof(bufferSize)); - - String8 serverChannelName = name; - serverChannelName.append(" (server)"); - outServerChannel = new InputChannel(serverChannelName, sockets[0]); - - String8 clientChannelName = name; - clientChannelName.append(" (client)"); - outClientChannel = new InputChannel(clientChannelName, sockets[1]); - return OK; -} - -status_t InputChannel::sendMessage(const InputMessage* msg) { - size_t msgLength = msg->size(); - ssize_t nWrite; - do { - nWrite = ::send(mFd, msg, msgLength, MSG_DONTWAIT | MSG_NOSIGNAL); - } while (nWrite == -1 && errno == EINTR); - - if (nWrite < 0) { - int error = errno; -#if DEBUG_CHANNEL_MESSAGES - ALOGD("channel '%s' ~ error sending message of type %d, errno=%d", mName.string(), - msg->header.type, error); -#endif - if (error == EAGAIN || error == EWOULDBLOCK) { - return WOULD_BLOCK; - } - if (error == EPIPE || error == ENOTCONN) { - return DEAD_OBJECT; - } - return -error; - } - - if (size_t(nWrite) != msgLength) { -#if DEBUG_CHANNEL_MESSAGES - ALOGD("channel '%s' ~ error sending message type %d, send was incomplete", - mName.string(), msg->header.type); -#endif - return DEAD_OBJECT; - } - -#if DEBUG_CHANNEL_MESSAGES - ALOGD("channel '%s' ~ sent message of type %d", mName.string(), msg->header.type); -#endif - return OK; -} - -status_t InputChannel::receiveMessage(InputMessage* msg) { - ssize_t nRead; - do { - nRead = ::recv(mFd, msg, sizeof(InputMessage), MSG_DONTWAIT); - } while (nRead == -1 && errno == EINTR); - - if (nRead < 0) { - int error = errno; -#if DEBUG_CHANNEL_MESSAGES - ALOGD("channel '%s' ~ receive message failed, errno=%d", mName.string(), errno); -#endif - if (error == EAGAIN || error == EWOULDBLOCK) { - return WOULD_BLOCK; - } - if (error == EPIPE || error == ENOTCONN) { - return DEAD_OBJECT; - } - return -error; - } - - if (nRead == 0) { // check for EOF -#if DEBUG_CHANNEL_MESSAGES - ALOGD("channel '%s' ~ receive message failed because peer was closed", mName.string()); -#endif - return DEAD_OBJECT; - } - - if (!msg->isValid(nRead)) { -#if DEBUG_CHANNEL_MESSAGES - ALOGD("channel '%s' ~ received invalid message", mName.string()); -#endif - return BAD_VALUE; - } - -#if DEBUG_CHANNEL_MESSAGES - ALOGD("channel '%s' ~ received message of type %d", mName.string(), msg->header.type); -#endif - return OK; -} - - -// --- InputPublisher --- - -InputPublisher::InputPublisher(const sp<InputChannel>& channel) : - mChannel(channel) { -} - -InputPublisher::~InputPublisher() { -} - -status_t InputPublisher::publishKeyEvent( - uint32_t seq, - int32_t deviceId, - int32_t source, - int32_t action, - int32_t flags, - int32_t keyCode, - int32_t scanCode, - int32_t metaState, - int32_t repeatCount, - nsecs_t downTime, - nsecs_t eventTime) { -#if DEBUG_TRANSPORT_ACTIONS - ALOGD("channel '%s' publisher ~ publishKeyEvent: seq=%u, deviceId=%d, source=0x%x, " - "action=0x%x, flags=0x%x, keyCode=%d, scanCode=%d, metaState=0x%x, repeatCount=%d," - "downTime=%lld, eventTime=%lld", - mChannel->getName().string(), seq, - deviceId, source, action, flags, keyCode, scanCode, metaState, repeatCount, - downTime, eventTime); -#endif - - if (!seq) { - ALOGE("Attempted to publish a key event with sequence number 0."); - return BAD_VALUE; - } - - InputMessage msg; - msg.header.type = InputMessage::TYPE_KEY; - msg.body.key.seq = seq; - msg.body.key.deviceId = deviceId; - msg.body.key.source = source; - msg.body.key.action = action; - msg.body.key.flags = flags; - msg.body.key.keyCode = keyCode; - msg.body.key.scanCode = scanCode; - msg.body.key.metaState = metaState; - msg.body.key.repeatCount = repeatCount; - msg.body.key.downTime = downTime; - msg.body.key.eventTime = eventTime; - return mChannel->sendMessage(&msg); -} - -status_t InputPublisher::publishMotionEvent( - uint32_t seq, - int32_t deviceId, - int32_t source, - int32_t action, - int32_t flags, - int32_t edgeFlags, - int32_t metaState, - int32_t buttonState, - float xOffset, - float yOffset, - float xPrecision, - float yPrecision, - nsecs_t downTime, - nsecs_t eventTime, - size_t pointerCount, - const PointerProperties* pointerProperties, - const PointerCoords* pointerCoords) { -#if DEBUG_TRANSPORT_ACTIONS - ALOGD("channel '%s' publisher ~ publishMotionEvent: seq=%u, deviceId=%d, source=0x%x, " - "action=0x%x, flags=0x%x, edgeFlags=0x%x, metaState=0x%x, buttonState=0x%x, " - "xOffset=%f, yOffset=%f, " - "xPrecision=%f, yPrecision=%f, downTime=%lld, eventTime=%lld, " - "pointerCount=%d", - mChannel->getName().string(), seq, - deviceId, source, action, flags, edgeFlags, metaState, buttonState, - xOffset, yOffset, xPrecision, yPrecision, downTime, eventTime, pointerCount); -#endif - - if (!seq) { - ALOGE("Attempted to publish a motion event with sequence number 0."); - return BAD_VALUE; - } - - if (pointerCount > MAX_POINTERS || pointerCount < 1) { - ALOGE("channel '%s' publisher ~ Invalid number of pointers provided: %d.", - mChannel->getName().string(), pointerCount); - return BAD_VALUE; - } - - InputMessage msg; - msg.header.type = InputMessage::TYPE_MOTION; - msg.body.motion.seq = seq; - msg.body.motion.deviceId = deviceId; - msg.body.motion.source = source; - msg.body.motion.action = action; - msg.body.motion.flags = flags; - msg.body.motion.edgeFlags = edgeFlags; - msg.body.motion.metaState = metaState; - msg.body.motion.buttonState = buttonState; - msg.body.motion.xOffset = xOffset; - msg.body.motion.yOffset = yOffset; - msg.body.motion.xPrecision = xPrecision; - msg.body.motion.yPrecision = yPrecision; - msg.body.motion.downTime = downTime; - msg.body.motion.eventTime = eventTime; - msg.body.motion.pointerCount = pointerCount; - for (size_t i = 0; i < pointerCount; i++) { - msg.body.motion.pointers[i].properties.copyFrom(pointerProperties[i]); - msg.body.motion.pointers[i].coords.copyFrom(pointerCoords[i]); - } - return mChannel->sendMessage(&msg); -} - -status_t InputPublisher::receiveFinishedSignal(uint32_t* outSeq, bool* outHandled) { -#if DEBUG_TRANSPORT_ACTIONS - ALOGD("channel '%s' publisher ~ receiveFinishedSignal", - mChannel->getName().string()); -#endif - - InputMessage msg; - status_t result = mChannel->receiveMessage(&msg); - if (result) { - *outSeq = 0; - *outHandled = false; - return result; - } - if (msg.header.type != InputMessage::TYPE_FINISHED) { - ALOGE("channel '%s' publisher ~ Received unexpected message of type %d from consumer", - mChannel->getName().string(), msg.header.type); - return UNKNOWN_ERROR; - } - *outSeq = msg.body.finished.seq; - *outHandled = msg.body.finished.handled; - return OK; -} - -// --- InputConsumer --- - -InputConsumer::InputConsumer(const sp<InputChannel>& channel) : - mChannel(channel), mMsgDeferred(false) { -} - -InputConsumer::~InputConsumer() { -} - -status_t InputConsumer::consume(InputEventFactoryInterface* factory, - bool consumeBatches, uint32_t* outSeq, InputEvent** outEvent) { -#if DEBUG_TRANSPORT_ACTIONS - ALOGD("channel '%s' consumer ~ consume: consumeBatches=%s", - mChannel->getName().string(), consumeBatches ? "true" : "false"); -#endif - - *outSeq = 0; - *outEvent = NULL; - - // Fetch the next input message. - // Loop until an event can be returned or no additional events are received. - while (!*outEvent) { - if (mMsgDeferred) { - // mMsg contains a valid input message from the previous call to consume - // that has not yet been processed. - mMsgDeferred = false; - } else { - // Receive a fresh message. - status_t result = mChannel->receiveMessage(&mMsg); - if (result) { - // Consume the next batched event unless batches are being held for later. - if (!mBatches.isEmpty() && (consumeBatches || result != WOULD_BLOCK)) { - MotionEvent* motionEvent = factory->createMotionEvent(); - if (! motionEvent) return NO_MEMORY; - - const Batch& batch = mBatches.top(); - motionEvent->copyFrom(&batch.event, true /*keepHistory*/); - *outSeq = batch.seq; - *outEvent = motionEvent; - mBatches.pop(); -#if DEBUG_TRANSPORT_ACTIONS - ALOGD("channel '%s' consumer ~ consumed batch event, seq=%u", - mChannel->getName().string(), *outSeq); -#endif - break; - } - return result; - } - } - - switch (mMsg.header.type) { - case InputMessage::TYPE_KEY: { - KeyEvent* keyEvent = factory->createKeyEvent(); - if (!keyEvent) return NO_MEMORY; - - initializeKeyEvent(keyEvent, &mMsg); - *outSeq = mMsg.body.key.seq; - *outEvent = keyEvent; -#if DEBUG_TRANSPORT_ACTIONS - ALOGD("channel '%s' consumer ~ consumed key event, seq=%u", - mChannel->getName().string(), *outSeq); -#endif - break; - } - - case AINPUT_EVENT_TYPE_MOTION: { - ssize_t batchIndex = findBatch(mMsg.body.motion.deviceId, mMsg.body.motion.source); - if (batchIndex >= 0) { - Batch& batch = mBatches.editItemAt(batchIndex); - if (canAppendSamples(&batch.event, &mMsg)) { - // Append to the batch and save the new sequence number for the tail end. - uint32_t chain = batch.seq; - appendSamples(&batch.event, &mMsg); - batch.seq = mMsg.body.motion.seq; - - // Update the sequence number chain. - SeqChain seqChain; - seqChain.seq = batch.seq; - seqChain.chain = chain; - mSeqChains.push(seqChain); -#if DEBUG_TRANSPORT_ACTIONS - ALOGD("channel '%s' consumer ~ appended to batch event", - mChannel->getName().string()); -#endif - break; - } else { - MotionEvent* motionEvent = factory->createMotionEvent(); - if (! motionEvent) return NO_MEMORY; - - // We cannot append to the batch in progress, so we need to consume - // the previous batch right now and defer the new message until later. - mMsgDeferred = true; - - // Return the end of the previous batch. - motionEvent->copyFrom(&batch.event, true /*keepHistory*/); - *outSeq = batch.seq; - *outEvent = motionEvent; - mBatches.removeAt(batchIndex); -#if DEBUG_TRANSPORT_ACTIONS - ALOGD("channel '%s' consumer ~ consumed batch event and " - "deferred current event, seq=%u", - mChannel->getName().string(), *outSeq); -#endif - break; - } - } - - // Start a new batch if needed. - if (mMsg.body.motion.action == AMOTION_EVENT_ACTION_MOVE - || mMsg.body.motion.action == AMOTION_EVENT_ACTION_HOVER_MOVE) { - mBatches.push(); - Batch& batch = mBatches.editTop(); - batch.seq = mMsg.body.motion.seq; - initializeMotionEvent(&batch.event, &mMsg); -#if DEBUG_TRANSPORT_ACTIONS - ALOGD("channel '%s' consumer ~ started batch event", - mChannel->getName().string()); -#endif - break; - } - - MotionEvent* motionEvent = factory->createMotionEvent(); - if (! motionEvent) return NO_MEMORY; - - initializeMotionEvent(motionEvent, &mMsg); - *outSeq = mMsg.body.motion.seq; - *outEvent = motionEvent; -#if DEBUG_TRANSPORT_ACTIONS - ALOGD("channel '%s' consumer ~ consumed motion event, seq=%u", - mChannel->getName().string(), *outSeq); -#endif - break; - } - - default: - ALOGE("channel '%s' consumer ~ Received unexpected message of type %d", - mChannel->getName().string(), mMsg.header.type); - return UNKNOWN_ERROR; - } - } - return OK; -} - -status_t InputConsumer::sendFinishedSignal(uint32_t seq, bool handled) { -#if DEBUG_TRANSPORT_ACTIONS - ALOGD("channel '%s' consumer ~ sendFinishedSignal: seq=%u, handled=%s", - mChannel->getName().string(), seq, handled ? "true" : "false"); -#endif - - if (!seq) { - ALOGE("Attempted to send a finished signal with sequence number 0."); - return BAD_VALUE; - } - - // Send finished signals for the batch sequence chain first. - size_t seqChainCount = mSeqChains.size(); - if (seqChainCount) { - uint32_t currentSeq = seq; - uint32_t chainSeqs[seqChainCount]; - size_t chainIndex = 0; - for (size_t i = seqChainCount; i-- > 0; ) { - const SeqChain& seqChain = mSeqChains.itemAt(i); - if (seqChain.seq == currentSeq) { - currentSeq = seqChain.chain; - chainSeqs[chainIndex++] = currentSeq; - mSeqChains.removeAt(i); - } - } - status_t status = OK; - while (!status && chainIndex-- > 0) { - status = sendUnchainedFinishedSignal(chainSeqs[chainIndex], handled); - } - if (status) { - // An error occurred so at least one signal was not sent, reconstruct the chain. - do { - SeqChain seqChain; - seqChain.seq = chainIndex != 0 ? chainSeqs[chainIndex - 1] : seq; - seqChain.chain = chainSeqs[chainIndex]; - mSeqChains.push(seqChain); - } while (chainIndex-- > 0); - return status; - } - } - - // Send finished signal for the last message in the batch. - return sendUnchainedFinishedSignal(seq, handled); -} - -status_t InputConsumer::sendUnchainedFinishedSignal(uint32_t seq, bool handled) { - InputMessage msg; - msg.header.type = InputMessage::TYPE_FINISHED; - msg.body.finished.seq = seq; - msg.body.finished.handled = handled; - return mChannel->sendMessage(&msg); -} - -bool InputConsumer::hasPendingBatch() const { - return !mBatches.isEmpty(); -} - -ssize_t InputConsumer::findBatch(int32_t deviceId, int32_t source) const { - for (size_t i = 0; i < mBatches.size(); i++) { - const Batch& batch = mBatches.itemAt(i); - if (batch.event.getDeviceId() == deviceId && batch.event.getSource() == source) { - return i; - } - } - return -1; -} - -void InputConsumer::initializeKeyEvent(KeyEvent* event, const InputMessage* msg) { - event->initialize( - msg->body.key.deviceId, - msg->body.key.source, - msg->body.key.action, - msg->body.key.flags, - msg->body.key.keyCode, - msg->body.key.scanCode, - msg->body.key.metaState, - msg->body.key.repeatCount, - msg->body.key.downTime, - msg->body.key.eventTime); -} - -void InputConsumer::initializeMotionEvent(MotionEvent* event, const InputMessage* msg) { - size_t pointerCount = msg->body.motion.pointerCount; - PointerProperties pointerProperties[pointerCount]; - PointerCoords pointerCoords[pointerCount]; - for (size_t i = 0; i < pointerCount; i++) { - pointerProperties[i].copyFrom(msg->body.motion.pointers[i].properties); - pointerCoords[i].copyFrom(msg->body.motion.pointers[i].coords); - } - - event->initialize( - msg->body.motion.deviceId, - msg->body.motion.source, - msg->body.motion.action, - msg->body.motion.flags, - msg->body.motion.edgeFlags, - msg->body.motion.metaState, - msg->body.motion.buttonState, - msg->body.motion.xOffset, - msg->body.motion.yOffset, - msg->body.motion.xPrecision, - msg->body.motion.yPrecision, - msg->body.motion.downTime, - msg->body.motion.eventTime, - pointerCount, - pointerProperties, - pointerCoords); -} - -bool InputConsumer::canAppendSamples(const MotionEvent* event, const InputMessage *msg) { - size_t pointerCount = msg->body.motion.pointerCount; - if (event->getPointerCount() != pointerCount - || event->getAction() != msg->body.motion.action) { - return false; - } - for (size_t i = 0; i < pointerCount; i++) { - if (*event->getPointerProperties(i) != msg->body.motion.pointers[i].properties) { - return false; - } - } - return true; -} - -void InputConsumer::appendSamples(MotionEvent* event, const InputMessage* msg) { - size_t pointerCount = msg->body.motion.pointerCount; - PointerCoords pointerCoords[pointerCount]; - for (size_t i = 0; i < pointerCount; i++) { - pointerCoords[i].copyFrom(msg->body.motion.pointers[i].coords); - } - - event->setMetaState(event->getMetaState() | msg->body.motion.metaState); - event->addSample(msg->body.motion.eventTime, pointerCoords); -} - -} // namespace android diff --git a/libs/ui/KeyCharacterMap.cpp b/libs/ui/KeyCharacterMap.cpp deleted file mode 100644 index 485234c2ab..0000000000 --- a/libs/ui/KeyCharacterMap.cpp +++ /dev/null @@ -1,838 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#define LOG_TAG "KeyCharacterMap" - -#include <stdlib.h> -#include <string.h> -#include <android/keycodes.h> -#include <ui/Keyboard.h> -#include <ui/KeyCharacterMap.h> -#include <utils/Log.h> -#include <utils/Errors.h> -#include <utils/Tokenizer.h> -#include <utils/Timers.h> - -// Enables debug output for the parser. -#define DEBUG_PARSER 0 - -// Enables debug output for parser performance. -#define DEBUG_PARSER_PERFORMANCE 0 - -// Enables debug output for mapping. -#define DEBUG_MAPPING 0 - - -namespace android { - -static const char* WHITESPACE = " \t\r"; -static const char* WHITESPACE_OR_PROPERTY_DELIMITER = " \t\r,:"; - -struct Modifier { - const char* label; - int32_t metaState; -}; -static const Modifier modifiers[] = { - { "shift", AMETA_SHIFT_ON }, - { "lshift", AMETA_SHIFT_LEFT_ON }, - { "rshift", AMETA_SHIFT_RIGHT_ON }, - { "alt", AMETA_ALT_ON }, - { "lalt", AMETA_ALT_LEFT_ON }, - { "ralt", AMETA_ALT_RIGHT_ON }, - { "ctrl", AMETA_CTRL_ON }, - { "lctrl", AMETA_CTRL_LEFT_ON }, - { "rctrl", AMETA_CTRL_RIGHT_ON }, - { "meta", AMETA_META_ON }, - { "lmeta", AMETA_META_LEFT_ON }, - { "rmeta", AMETA_META_RIGHT_ON }, - { "sym", AMETA_SYM_ON }, - { "fn", AMETA_FUNCTION_ON }, - { "capslock", AMETA_CAPS_LOCK_ON }, - { "numlock", AMETA_NUM_LOCK_ON }, - { "scrolllock", AMETA_SCROLL_LOCK_ON }, -}; - -#if DEBUG_MAPPING -static String8 toString(const char16_t* chars, size_t numChars) { - String8 result; - for (size_t i = 0; i < numChars; i++) { - result.appendFormat(i == 0 ? "%d" : ", %d", chars[i]); - } - return result; -} -#endif - - -// --- KeyCharacterMap --- - -KeyCharacterMap::KeyCharacterMap() : - mType(KEYBOARD_TYPE_UNKNOWN) { -} - -KeyCharacterMap::~KeyCharacterMap() { - for (size_t i = 0; i < mKeys.size(); i++) { - Key* key = mKeys.editValueAt(i); - delete key; - } -} - -status_t KeyCharacterMap::load(const String8& filename, KeyCharacterMap** outMap) { - *outMap = NULL; - - Tokenizer* tokenizer; - status_t status = Tokenizer::open(filename, &tokenizer); - if (status) { - ALOGE("Error %d opening key character map file %s.", status, filename.string()); - } else { - KeyCharacterMap* map = new KeyCharacterMap(); - if (!map) { - ALOGE("Error allocating key character map."); - status = NO_MEMORY; - } else { -#if DEBUG_PARSER_PERFORMANCE - nsecs_t startTime = systemTime(SYSTEM_TIME_MONOTONIC); -#endif - Parser parser(map, tokenizer); - status = parser.parse(); -#if DEBUG_PARSER_PERFORMANCE - nsecs_t elapsedTime = systemTime(SYSTEM_TIME_MONOTONIC) - startTime; - ALOGD("Parsed key character map file '%s' %d lines in %0.3fms.", - tokenizer->getFilename().string(), tokenizer->getLineNumber(), - elapsedTime / 1000000.0); -#endif - if (status) { - delete map; - } else { - *outMap = map; - } - } - delete tokenizer; - } - return status; -} - -int32_t KeyCharacterMap::getKeyboardType() const { - return mType; -} - -char16_t KeyCharacterMap::getDisplayLabel(int32_t keyCode) const { - char16_t result = 0; - const Key* key; - if (getKey(keyCode, &key)) { - result = key->label; - } -#if DEBUG_MAPPING - ALOGD("getDisplayLabel: keyCode=%d ~ Result %d.", keyCode, result); -#endif - return result; -} - -char16_t KeyCharacterMap::getNumber(int32_t keyCode) const { - char16_t result = 0; - const Key* key; - if (getKey(keyCode, &key)) { - result = key->number; - } -#if DEBUG_MAPPING - ALOGD("getNumber: keyCode=%d ~ Result %d.", keyCode, result); -#endif - return result; -} - -char16_t KeyCharacterMap::getCharacter(int32_t keyCode, int32_t metaState) const { - char16_t result = 0; - const Key* key; - const Behavior* behavior; - if (getKeyBehavior(keyCode, metaState, &key, &behavior)) { - result = behavior->character; - } -#if DEBUG_MAPPING - ALOGD("getCharacter: keyCode=%d, metaState=0x%08x ~ Result %d.", keyCode, metaState, result); -#endif - return result; -} - -bool KeyCharacterMap::getFallbackAction(int32_t keyCode, int32_t metaState, - FallbackAction* outFallbackAction) const { - outFallbackAction->keyCode = 0; - outFallbackAction->metaState = 0; - - bool result = false; - const Key* key; - const Behavior* behavior; - if (getKeyBehavior(keyCode, metaState, &key, &behavior)) { - if (behavior->fallbackKeyCode) { - outFallbackAction->keyCode = behavior->fallbackKeyCode; - outFallbackAction->metaState = metaState & ~behavior->metaState; - result = true; - } - } -#if DEBUG_MAPPING - ALOGD("getFallbackKeyCode: keyCode=%d, metaState=0x%08x ~ Result %s, " - "fallback keyCode=%d, fallback metaState=0x%08x.", - keyCode, metaState, result ? "true" : "false", - outFallbackAction->keyCode, outFallbackAction->metaState); -#endif - return result; -} - -char16_t KeyCharacterMap::getMatch(int32_t keyCode, const char16_t* chars, size_t numChars, - int32_t metaState) const { - char16_t result = 0; - const Key* key; - if (getKey(keyCode, &key)) { - // Try to find the most general behavior that maps to this character. - // For example, the base key behavior will usually be last in the list. - // However, if we find a perfect meta state match for one behavior then use that one. - for (const Behavior* behavior = key->firstBehavior; behavior; behavior = behavior->next) { - if (behavior->character) { - for (size_t i = 0; i < numChars; i++) { - if (behavior->character == chars[i]) { - result = behavior->character; - if ((behavior->metaState & metaState) == behavior->metaState) { - goto ExactMatch; - } - break; - } - } - } - } - ExactMatch: ; - } -#if DEBUG_MAPPING - ALOGD("getMatch: keyCode=%d, chars=[%s], metaState=0x%08x ~ Result %d.", - keyCode, toString(chars, numChars).string(), metaState, result); -#endif - return result; -} - -bool KeyCharacterMap::getEvents(int32_t deviceId, const char16_t* chars, size_t numChars, - Vector<KeyEvent>& outEvents) const { - nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC); - - for (size_t i = 0; i < numChars; i++) { - int32_t keyCode, metaState; - char16_t ch = chars[i]; - if (!findKey(ch, &keyCode, &metaState)) { -#if DEBUG_MAPPING - ALOGD("getEvents: deviceId=%d, chars=[%s] ~ Failed to find mapping for character %d.", - deviceId, toString(chars, numChars).string(), ch); -#endif - return false; - } - - int32_t currentMetaState = 0; - addMetaKeys(outEvents, deviceId, metaState, true, now, ¤tMetaState); - addKey(outEvents, deviceId, keyCode, currentMetaState, true, now); - addKey(outEvents, deviceId, keyCode, currentMetaState, false, now); - addMetaKeys(outEvents, deviceId, metaState, false, now, ¤tMetaState); - } -#if DEBUG_MAPPING - ALOGD("getEvents: deviceId=%d, chars=[%s] ~ Generated %d events.", - deviceId, toString(chars, numChars).string(), int32_t(outEvents.size())); - for (size_t i = 0; i < outEvents.size(); i++) { - ALOGD(" Key: keyCode=%d, metaState=0x%08x, %s.", - outEvents[i].getKeyCode(), outEvents[i].getMetaState(), - outEvents[i].getAction() == AKEY_EVENT_ACTION_DOWN ? "down" : "up"); - } -#endif - return true; -} - -bool KeyCharacterMap::getKey(int32_t keyCode, const Key** outKey) const { - ssize_t index = mKeys.indexOfKey(keyCode); - if (index >= 0) { - *outKey = mKeys.valueAt(index); - return true; - } - return false; -} - -bool KeyCharacterMap::getKeyBehavior(int32_t keyCode, int32_t metaState, - const Key** outKey, const Behavior** outBehavior) const { - const Key* key; - if (getKey(keyCode, &key)) { - const Behavior* behavior = key->firstBehavior; - while (behavior) { - if ((behavior->metaState & metaState) == behavior->metaState) { - *outKey = key; - *outBehavior = behavior; - return true; - } - behavior = behavior->next; - } - } - return false; -} - -bool KeyCharacterMap::findKey(char16_t ch, int32_t* outKeyCode, int32_t* outMetaState) const { - if (!ch) { - return false; - } - - for (size_t i = 0; i < mKeys.size(); i++) { - const Key* key = mKeys.valueAt(i); - - // Try to find the most general behavior that maps to this character. - // For example, the base key behavior will usually be last in the list. - const Behavior* found = NULL; - for (const Behavior* behavior = key->firstBehavior; behavior; behavior = behavior->next) { - if (behavior->character == ch) { - found = behavior; - } - } - if (found) { - *outKeyCode = mKeys.keyAt(i); - *outMetaState = found->metaState; - return true; - } - } - return false; -} - -void KeyCharacterMap::addKey(Vector<KeyEvent>& outEvents, - int32_t deviceId, int32_t keyCode, int32_t metaState, bool down, nsecs_t time) { - outEvents.push(); - KeyEvent& event = outEvents.editTop(); - event.initialize(deviceId, AINPUT_SOURCE_KEYBOARD, - down ? AKEY_EVENT_ACTION_DOWN : AKEY_EVENT_ACTION_UP, - 0, keyCode, 0, metaState, 0, time, time); -} - -void KeyCharacterMap::addMetaKeys(Vector<KeyEvent>& outEvents, - int32_t deviceId, int32_t metaState, bool down, nsecs_t time, - int32_t* currentMetaState) { - // Add and remove meta keys symmetrically. - if (down) { - addLockedMetaKey(outEvents, deviceId, metaState, time, - AKEYCODE_CAPS_LOCK, AMETA_CAPS_LOCK_ON, currentMetaState); - addLockedMetaKey(outEvents, deviceId, metaState, time, - AKEYCODE_NUM_LOCK, AMETA_NUM_LOCK_ON, currentMetaState); - addLockedMetaKey(outEvents, deviceId, metaState, time, - AKEYCODE_SCROLL_LOCK, AMETA_SCROLL_LOCK_ON, currentMetaState); - - addDoubleEphemeralMetaKey(outEvents, deviceId, metaState, true, time, - AKEYCODE_SHIFT_LEFT, AMETA_SHIFT_LEFT_ON, - AKEYCODE_SHIFT_RIGHT, AMETA_SHIFT_RIGHT_ON, - AMETA_SHIFT_ON, currentMetaState); - addDoubleEphemeralMetaKey(outEvents, deviceId, metaState, true, time, - AKEYCODE_ALT_LEFT, AMETA_ALT_LEFT_ON, - AKEYCODE_ALT_RIGHT, AMETA_ALT_RIGHT_ON, - AMETA_ALT_ON, currentMetaState); - addDoubleEphemeralMetaKey(outEvents, deviceId, metaState, true, time, - AKEYCODE_CTRL_LEFT, AMETA_CTRL_LEFT_ON, - AKEYCODE_CTRL_RIGHT, AMETA_CTRL_RIGHT_ON, - AMETA_CTRL_ON, currentMetaState); - addDoubleEphemeralMetaKey(outEvents, deviceId, metaState, true, time, - AKEYCODE_META_LEFT, AMETA_META_LEFT_ON, - AKEYCODE_META_RIGHT, AMETA_META_RIGHT_ON, - AMETA_META_ON, currentMetaState); - - addSingleEphemeralMetaKey(outEvents, deviceId, metaState, true, time, - AKEYCODE_SYM, AMETA_SYM_ON, currentMetaState); - addSingleEphemeralMetaKey(outEvents, deviceId, metaState, true, time, - AKEYCODE_FUNCTION, AMETA_FUNCTION_ON, currentMetaState); - } else { - addSingleEphemeralMetaKey(outEvents, deviceId, metaState, false, time, - AKEYCODE_FUNCTION, AMETA_FUNCTION_ON, currentMetaState); - addSingleEphemeralMetaKey(outEvents, deviceId, metaState, false, time, - AKEYCODE_SYM, AMETA_SYM_ON, currentMetaState); - - addDoubleEphemeralMetaKey(outEvents, deviceId, metaState, false, time, - AKEYCODE_META_LEFT, AMETA_META_LEFT_ON, - AKEYCODE_META_RIGHT, AMETA_META_RIGHT_ON, - AMETA_META_ON, currentMetaState); - addDoubleEphemeralMetaKey(outEvents, deviceId, metaState, false, time, - AKEYCODE_CTRL_LEFT, AMETA_CTRL_LEFT_ON, - AKEYCODE_CTRL_RIGHT, AMETA_CTRL_RIGHT_ON, - AMETA_CTRL_ON, currentMetaState); - addDoubleEphemeralMetaKey(outEvents, deviceId, metaState, false, time, - AKEYCODE_ALT_LEFT, AMETA_ALT_LEFT_ON, - AKEYCODE_ALT_RIGHT, AMETA_ALT_RIGHT_ON, - AMETA_ALT_ON, currentMetaState); - addDoubleEphemeralMetaKey(outEvents, deviceId, metaState, false, time, - AKEYCODE_SHIFT_LEFT, AMETA_SHIFT_LEFT_ON, - AKEYCODE_SHIFT_RIGHT, AMETA_SHIFT_RIGHT_ON, - AMETA_SHIFT_ON, currentMetaState); - - addLockedMetaKey(outEvents, deviceId, metaState, time, - AKEYCODE_SCROLL_LOCK, AMETA_SCROLL_LOCK_ON, currentMetaState); - addLockedMetaKey(outEvents, deviceId, metaState, time, - AKEYCODE_NUM_LOCK, AMETA_NUM_LOCK_ON, currentMetaState); - addLockedMetaKey(outEvents, deviceId, metaState, time, - AKEYCODE_CAPS_LOCK, AMETA_CAPS_LOCK_ON, currentMetaState); - } -} - -bool KeyCharacterMap::addSingleEphemeralMetaKey(Vector<KeyEvent>& outEvents, - int32_t deviceId, int32_t metaState, bool down, nsecs_t time, - int32_t keyCode, int32_t keyMetaState, - int32_t* currentMetaState) { - if ((metaState & keyMetaState) == keyMetaState) { - *currentMetaState = updateMetaState(keyCode, down, *currentMetaState); - addKey(outEvents, deviceId, keyCode, *currentMetaState, down, time); - return true; - } - return false; -} - -void KeyCharacterMap::addDoubleEphemeralMetaKey(Vector<KeyEvent>& outEvents, - int32_t deviceId, int32_t metaState, bool down, nsecs_t time, - int32_t leftKeyCode, int32_t leftKeyMetaState, - int32_t rightKeyCode, int32_t rightKeyMetaState, - int32_t eitherKeyMetaState, - int32_t* currentMetaState) { - bool specific = false; - specific |= addSingleEphemeralMetaKey(outEvents, deviceId, metaState, down, time, - leftKeyCode, leftKeyMetaState, currentMetaState); - specific |= addSingleEphemeralMetaKey(outEvents, deviceId, metaState, down, time, - rightKeyCode, rightKeyMetaState, currentMetaState); - - if (!specific) { - addSingleEphemeralMetaKey(outEvents, deviceId, metaState, down, time, - leftKeyCode, eitherKeyMetaState, currentMetaState); - } -} - -void KeyCharacterMap::addLockedMetaKey(Vector<KeyEvent>& outEvents, - int32_t deviceId, int32_t metaState, nsecs_t time, - int32_t keyCode, int32_t keyMetaState, - int32_t* currentMetaState) { - if ((metaState & keyMetaState) == keyMetaState) { - *currentMetaState = updateMetaState(keyCode, true, *currentMetaState); - addKey(outEvents, deviceId, keyCode, *currentMetaState, true, time); - *currentMetaState = updateMetaState(keyCode, false, *currentMetaState); - addKey(outEvents, deviceId, keyCode, *currentMetaState, false, time); - } -} - - -// --- KeyCharacterMap::Key --- - -KeyCharacterMap::Key::Key() : - label(0), number(0), firstBehavior(NULL) { -} - -KeyCharacterMap::Key::~Key() { - Behavior* behavior = firstBehavior; - while (behavior) { - Behavior* next = behavior->next; - delete behavior; - behavior = next; - } -} - - -// --- KeyCharacterMap::Behavior --- - -KeyCharacterMap::Behavior::Behavior() : - next(NULL), metaState(0), character(0), fallbackKeyCode(0) { -} - - -// --- KeyCharacterMap::Parser --- - -KeyCharacterMap::Parser::Parser(KeyCharacterMap* map, Tokenizer* tokenizer) : - mMap(map), mTokenizer(tokenizer), mState(STATE_TOP) { -} - -KeyCharacterMap::Parser::~Parser() { -} - -status_t KeyCharacterMap::Parser::parse() { - while (!mTokenizer->isEof()) { -#if DEBUG_PARSER - ALOGD("Parsing %s: '%s'.", mTokenizer->getLocation().string(), - mTokenizer->peekRemainderOfLine().string()); -#endif - - mTokenizer->skipDelimiters(WHITESPACE); - - if (!mTokenizer->isEol() && mTokenizer->peekChar() != '#') { - switch (mState) { - case STATE_TOP: { - String8 keywordToken = mTokenizer->nextToken(WHITESPACE); - if (keywordToken == "type") { - mTokenizer->skipDelimiters(WHITESPACE); - status_t status = parseType(); - if (status) return status; - } else if (keywordToken == "key") { - mTokenizer->skipDelimiters(WHITESPACE); - status_t status = parseKey(); - if (status) return status; - } else { - ALOGE("%s: Expected keyword, got '%s'.", mTokenizer->getLocation().string(), - keywordToken.string()); - return BAD_VALUE; - } - break; - } - - case STATE_KEY: { - status_t status = parseKeyProperty(); - if (status) return status; - break; - } - } - - mTokenizer->skipDelimiters(WHITESPACE); - if (!mTokenizer->isEol()) { - ALOGE("%s: Expected end of line, got '%s'.", - mTokenizer->getLocation().string(), - mTokenizer->peekRemainderOfLine().string()); - return BAD_VALUE; - } - } - - mTokenizer->nextLine(); - } - - if (mState != STATE_TOP) { - ALOGE("%s: Unterminated key description at end of file.", - mTokenizer->getLocation().string()); - return BAD_VALUE; - } - - if (mMap->mType == KEYBOARD_TYPE_UNKNOWN) { - ALOGE("%s: Missing required keyboard 'type' declaration.", - mTokenizer->getLocation().string()); - return BAD_VALUE; - } - - return NO_ERROR; -} - -status_t KeyCharacterMap::Parser::parseType() { - if (mMap->mType != KEYBOARD_TYPE_UNKNOWN) { - ALOGE("%s: Duplicate keyboard 'type' declaration.", - mTokenizer->getLocation().string()); - return BAD_VALUE; - } - - KeyboardType type; - String8 typeToken = mTokenizer->nextToken(WHITESPACE); - if (typeToken == "NUMERIC") { - type = KEYBOARD_TYPE_NUMERIC; - } else if (typeToken == "PREDICTIVE") { - type = KEYBOARD_TYPE_PREDICTIVE; - } else if (typeToken == "ALPHA") { - type = KEYBOARD_TYPE_ALPHA; - } else if (typeToken == "FULL") { - type = KEYBOARD_TYPE_FULL; - } else if (typeToken == "SPECIAL_FUNCTION") { - type = KEYBOARD_TYPE_SPECIAL_FUNCTION; - } else { - ALOGE("%s: Expected keyboard type label, got '%s'.", mTokenizer->getLocation().string(), - typeToken.string()); - return BAD_VALUE; - } - -#if DEBUG_PARSER - ALOGD("Parsed type: type=%d.", type); -#endif - mMap->mType = type; - return NO_ERROR; -} - -status_t KeyCharacterMap::Parser::parseKey() { - String8 keyCodeToken = mTokenizer->nextToken(WHITESPACE); - int32_t keyCode = getKeyCodeByLabel(keyCodeToken.string()); - if (!keyCode) { - ALOGE("%s: Expected key code label, got '%s'.", mTokenizer->getLocation().string(), - keyCodeToken.string()); - return BAD_VALUE; - } - if (mMap->mKeys.indexOfKey(keyCode) >= 0) { - ALOGE("%s: Duplicate entry for key code '%s'.", mTokenizer->getLocation().string(), - keyCodeToken.string()); - return BAD_VALUE; - } - - mTokenizer->skipDelimiters(WHITESPACE); - String8 openBraceToken = mTokenizer->nextToken(WHITESPACE); - if (openBraceToken != "{") { - ALOGE("%s: Expected '{' after key code label, got '%s'.", - mTokenizer->getLocation().string(), openBraceToken.string()); - return BAD_VALUE; - } - -#if DEBUG_PARSER - ALOGD("Parsed beginning of key: keyCode=%d.", keyCode); -#endif - mKeyCode = keyCode; - mMap->mKeys.add(keyCode, new Key()); - mState = STATE_KEY; - return NO_ERROR; -} - -status_t KeyCharacterMap::Parser::parseKeyProperty() { - String8 token = mTokenizer->nextToken(WHITESPACE_OR_PROPERTY_DELIMITER); - if (token == "}") { - mState = STATE_TOP; - return NO_ERROR; - } - - Vector<Property> properties; - - // Parse all comma-delimited property names up to the first colon. - for (;;) { - if (token == "label") { - properties.add(Property(PROPERTY_LABEL)); - } else if (token == "number") { - properties.add(Property(PROPERTY_NUMBER)); - } else { - int32_t metaState; - status_t status = parseModifier(token, &metaState); - if (status) { - ALOGE("%s: Expected a property name or modifier, got '%s'.", - mTokenizer->getLocation().string(), token.string()); - return status; - } - properties.add(Property(PROPERTY_META, metaState)); - } - - mTokenizer->skipDelimiters(WHITESPACE); - if (!mTokenizer->isEol()) { - char ch = mTokenizer->nextChar(); - if (ch == ':') { - break; - } else if (ch == ',') { - mTokenizer->skipDelimiters(WHITESPACE); - token = mTokenizer->nextToken(WHITESPACE_OR_PROPERTY_DELIMITER); - continue; - } - } - - ALOGE("%s: Expected ',' or ':' after property name.", - mTokenizer->getLocation().string()); - return BAD_VALUE; - } - - // Parse behavior after the colon. - mTokenizer->skipDelimiters(WHITESPACE); - - Behavior behavior; - bool haveCharacter = false; - bool haveFallback = false; - - do { - char ch = mTokenizer->peekChar(); - if (ch == '\'') { - char16_t character; - status_t status = parseCharacterLiteral(&character); - if (status || !character) { - ALOGE("%s: Invalid character literal for key.", - mTokenizer->getLocation().string()); - return BAD_VALUE; - } - if (haveCharacter) { - ALOGE("%s: Cannot combine multiple character literals or 'none'.", - mTokenizer->getLocation().string()); - return BAD_VALUE; - } - behavior.character = character; - haveCharacter = true; - } else { - token = mTokenizer->nextToken(WHITESPACE); - if (token == "none") { - if (haveCharacter) { - ALOGE("%s: Cannot combine multiple character literals or 'none'.", - mTokenizer->getLocation().string()); - return BAD_VALUE; - } - haveCharacter = true; - } else if (token == "fallback") { - mTokenizer->skipDelimiters(WHITESPACE); - token = mTokenizer->nextToken(WHITESPACE); - int32_t keyCode = getKeyCodeByLabel(token.string()); - if (!keyCode) { - ALOGE("%s: Invalid key code label for fallback behavior, got '%s'.", - mTokenizer->getLocation().string(), - token.string()); - return BAD_VALUE; - } - if (haveFallback) { - ALOGE("%s: Cannot combine multiple fallback key codes.", - mTokenizer->getLocation().string()); - return BAD_VALUE; - } - behavior.fallbackKeyCode = keyCode; - haveFallback = true; - } else { - ALOGE("%s: Expected a key behavior after ':'.", - mTokenizer->getLocation().string()); - return BAD_VALUE; - } - } - - mTokenizer->skipDelimiters(WHITESPACE); - } while (!mTokenizer->isEol()); - - // Add the behavior. - Key* key = mMap->mKeys.valueFor(mKeyCode); - for (size_t i = 0; i < properties.size(); i++) { - const Property& property = properties.itemAt(i); - switch (property.property) { - case PROPERTY_LABEL: - if (key->label) { - ALOGE("%s: Duplicate label for key.", - mTokenizer->getLocation().string()); - return BAD_VALUE; - } - key->label = behavior.character; -#if DEBUG_PARSER - ALOGD("Parsed key label: keyCode=%d, label=%d.", mKeyCode, key->label); -#endif - break; - case PROPERTY_NUMBER: - if (key->number) { - ALOGE("%s: Duplicate number for key.", - mTokenizer->getLocation().string()); - return BAD_VALUE; - } - key->number = behavior.character; -#if DEBUG_PARSER - ALOGD("Parsed key number: keyCode=%d, number=%d.", mKeyCode, key->number); -#endif - break; - case PROPERTY_META: { - for (Behavior* b = key->firstBehavior; b; b = b->next) { - if (b->metaState == property.metaState) { - ALOGE("%s: Duplicate key behavior for modifier.", - mTokenizer->getLocation().string()); - return BAD_VALUE; - } - } - Behavior* newBehavior = new Behavior(behavior); - newBehavior->metaState = property.metaState; - newBehavior->next = key->firstBehavior; - key->firstBehavior = newBehavior; -#if DEBUG_PARSER - ALOGD("Parsed key meta: keyCode=%d, meta=0x%x, char=%d, fallback=%d.", mKeyCode, - newBehavior->metaState, newBehavior->character, newBehavior->fallbackKeyCode); -#endif - break; - } - } - } - return NO_ERROR; -} - -status_t KeyCharacterMap::Parser::parseModifier(const String8& token, int32_t* outMetaState) { - if (token == "base") { - *outMetaState = 0; - return NO_ERROR; - } - - int32_t combinedMeta = 0; - - const char* str = token.string(); - const char* start = str; - for (const char* cur = str; ; cur++) { - char ch = *cur; - if (ch == '+' || ch == '\0') { - size_t len = cur - start; - int32_t metaState = 0; - for (size_t i = 0; i < sizeof(modifiers) / sizeof(Modifier); i++) { - if (strlen(modifiers[i].label) == len - && strncmp(modifiers[i].label, start, len) == 0) { - metaState = modifiers[i].metaState; - break; - } - } - if (!metaState) { - return BAD_VALUE; - } - if (combinedMeta & metaState) { - ALOGE("%s: Duplicate modifier combination '%s'.", - mTokenizer->getLocation().string(), token.string()); - return BAD_VALUE; - } - - combinedMeta |= metaState; - start = cur + 1; - - if (ch == '\0') { - break; - } - } - } - *outMetaState = combinedMeta; - return NO_ERROR; -} - -status_t KeyCharacterMap::Parser::parseCharacterLiteral(char16_t* outCharacter) { - char ch = mTokenizer->nextChar(); - if (ch != '\'') { - goto Error; - } - - ch = mTokenizer->nextChar(); - if (ch == '\\') { - // Escape sequence. - ch = mTokenizer->nextChar(); - if (ch == 'n') { - *outCharacter = '\n'; - } else if (ch == 't') { - *outCharacter = '\t'; - } else if (ch == '\\') { - *outCharacter = '\\'; - } else if (ch == '\'') { - *outCharacter = '\''; - } else if (ch == '"') { - *outCharacter = '"'; - } else if (ch == 'u') { - *outCharacter = 0; - for (int i = 0; i < 4; i++) { - ch = mTokenizer->nextChar(); - int digit; - if (ch >= '0' && ch <= '9') { - digit = ch - '0'; - } else if (ch >= 'A' && ch <= 'F') { - digit = ch - 'A' + 10; - } else if (ch >= 'a' && ch <= 'f') { - digit = ch - 'a' + 10; - } else { - goto Error; - } - *outCharacter = (*outCharacter << 4) | digit; - } - } else { - goto Error; - } - } else if (ch >= 32 && ch <= 126 && ch != '\'') { - // ASCII literal character. - *outCharacter = ch; - } else { - goto Error; - } - - ch = mTokenizer->nextChar(); - if (ch != '\'') { - goto Error; - } - - // Ensure that we consumed the entire token. - if (mTokenizer->nextToken(WHITESPACE).isEmpty()) { - return NO_ERROR; - } - -Error: - ALOGE("%s: Malformed character literal.", mTokenizer->getLocation().string()); - return BAD_VALUE; -} - -} // namespace android diff --git a/libs/ui/KeyLayoutMap.cpp b/libs/ui/KeyLayoutMap.cpp deleted file mode 100644 index 44a94207c1..0000000000 --- a/libs/ui/KeyLayoutMap.cpp +++ /dev/null @@ -1,341 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#define LOG_TAG "KeyLayoutMap" - -#include <stdlib.h> -#include <android/keycodes.h> -#include <ui/Keyboard.h> -#include <ui/KeyLayoutMap.h> -#include <utils/Log.h> -#include <utils/Errors.h> -#include <utils/Tokenizer.h> -#include <utils/Timers.h> - -// Enables debug output for the parser. -#define DEBUG_PARSER 0 - -// Enables debug output for parser performance. -#define DEBUG_PARSER_PERFORMANCE 0 - -// Enables debug output for mapping. -#define DEBUG_MAPPING 0 - - -namespace android { - -static const char* WHITESPACE = " \t\r"; - -// --- KeyLayoutMap --- - -KeyLayoutMap::KeyLayoutMap() { -} - -KeyLayoutMap::~KeyLayoutMap() { -} - -status_t KeyLayoutMap::load(const String8& filename, KeyLayoutMap** outMap) { - *outMap = NULL; - - Tokenizer* tokenizer; - status_t status = Tokenizer::open(filename, &tokenizer); - if (status) { - ALOGE("Error %d opening key layout map file %s.", status, filename.string()); - } else { - KeyLayoutMap* map = new KeyLayoutMap(); - if (!map) { - ALOGE("Error allocating key layout map."); - status = NO_MEMORY; - } else { -#if DEBUG_PARSER_PERFORMANCE - nsecs_t startTime = systemTime(SYSTEM_TIME_MONOTONIC); -#endif - Parser parser(map, tokenizer); - status = parser.parse(); -#if DEBUG_PARSER_PERFORMANCE - nsecs_t elapsedTime = systemTime(SYSTEM_TIME_MONOTONIC) - startTime; - ALOGD("Parsed key layout map file '%s' %d lines in %0.3fms.", - tokenizer->getFilename().string(), tokenizer->getLineNumber(), - elapsedTime / 1000000.0); -#endif - if (status) { - delete map; - } else { - *outMap = map; - } - } - delete tokenizer; - } - return status; -} - -status_t KeyLayoutMap::mapKey(int32_t scanCode, int32_t* keyCode, uint32_t* flags) const { - ssize_t index = mKeys.indexOfKey(scanCode); - if (index < 0) { -#if DEBUG_MAPPING - ALOGD("mapKey: scanCode=%d ~ Failed.", scanCode); -#endif - *keyCode = AKEYCODE_UNKNOWN; - *flags = 0; - return NAME_NOT_FOUND; - } - - const Key& k = mKeys.valueAt(index); - *keyCode = k.keyCode; - *flags = k.flags; - -#if DEBUG_MAPPING - ALOGD("mapKey: scanCode=%d ~ Result keyCode=%d, flags=0x%08x.", scanCode, *keyCode, *flags); -#endif - return NO_ERROR; -} - -status_t KeyLayoutMap::findScanCodesForKey(int32_t keyCode, Vector<int32_t>* outScanCodes) const { - const size_t N = mKeys.size(); - for (size_t i=0; i<N; i++) { - if (mKeys.valueAt(i).keyCode == keyCode) { - outScanCodes->add(mKeys.keyAt(i)); - } - } - return NO_ERROR; -} - -status_t KeyLayoutMap::mapAxis(int32_t scanCode, AxisInfo* outAxisInfo) const { - ssize_t index = mAxes.indexOfKey(scanCode); - if (index < 0) { -#if DEBUG_MAPPING - ALOGD("mapAxis: scanCode=%d ~ Failed.", scanCode); -#endif - return NAME_NOT_FOUND; - } - - *outAxisInfo = mAxes.valueAt(index); - -#if DEBUG_MAPPING - ALOGD("mapAxis: scanCode=%d ~ Result mode=%d, axis=%d, highAxis=%d, " - "splitValue=%d, flatOverride=%d.", - scanCode, - outAxisInfo->mode, outAxisInfo->axis, outAxisInfo->highAxis, - outAxisInfo->splitValue, outAxisInfo->flatOverride); -#endif - return NO_ERROR; -} - - -// --- KeyLayoutMap::Parser --- - -KeyLayoutMap::Parser::Parser(KeyLayoutMap* map, Tokenizer* tokenizer) : - mMap(map), mTokenizer(tokenizer) { -} - -KeyLayoutMap::Parser::~Parser() { -} - -status_t KeyLayoutMap::Parser::parse() { - while (!mTokenizer->isEof()) { -#if DEBUG_PARSER - ALOGD("Parsing %s: '%s'.", mTokenizer->getLocation().string(), - mTokenizer->peekRemainderOfLine().string()); -#endif - - mTokenizer->skipDelimiters(WHITESPACE); - - if (!mTokenizer->isEol() && mTokenizer->peekChar() != '#') { - String8 keywordToken = mTokenizer->nextToken(WHITESPACE); - if (keywordToken == "key") { - mTokenizer->skipDelimiters(WHITESPACE); - status_t status = parseKey(); - if (status) return status; - } else if (keywordToken == "axis") { - mTokenizer->skipDelimiters(WHITESPACE); - status_t status = parseAxis(); - if (status) return status; - } else { - ALOGE("%s: Expected keyword, got '%s'.", mTokenizer->getLocation().string(), - keywordToken.string()); - return BAD_VALUE; - } - - mTokenizer->skipDelimiters(WHITESPACE); - if (!mTokenizer->isEol()) { - ALOGE("%s: Expected end of line, got '%s'.", - mTokenizer->getLocation().string(), - mTokenizer->peekRemainderOfLine().string()); - return BAD_VALUE; - } - } - - mTokenizer->nextLine(); - } - return NO_ERROR; -} - -status_t KeyLayoutMap::Parser::parseKey() { - String8 scanCodeToken = mTokenizer->nextToken(WHITESPACE); - char* end; - int32_t scanCode = int32_t(strtol(scanCodeToken.string(), &end, 0)); - if (*end) { - ALOGE("%s: Expected key scan code number, got '%s'.", mTokenizer->getLocation().string(), - scanCodeToken.string()); - return BAD_VALUE; - } - if (mMap->mKeys.indexOfKey(scanCode) >= 0) { - ALOGE("%s: Duplicate entry for key scan code '%s'.", mTokenizer->getLocation().string(), - scanCodeToken.string()); - return BAD_VALUE; - } - - mTokenizer->skipDelimiters(WHITESPACE); - String8 keyCodeToken = mTokenizer->nextToken(WHITESPACE); - int32_t keyCode = getKeyCodeByLabel(keyCodeToken.string()); - if (!keyCode) { - ALOGE("%s: Expected key code label, got '%s'.", mTokenizer->getLocation().string(), - keyCodeToken.string()); - return BAD_VALUE; - } - - uint32_t flags = 0; - for (;;) { - mTokenizer->skipDelimiters(WHITESPACE); - if (mTokenizer->isEol()) break; - - String8 flagToken = mTokenizer->nextToken(WHITESPACE); - uint32_t flag = getKeyFlagByLabel(flagToken.string()); - if (!flag) { - ALOGE("%s: Expected key flag label, got '%s'.", mTokenizer->getLocation().string(), - flagToken.string()); - return BAD_VALUE; - } - if (flags & flag) { - ALOGE("%s: Duplicate key flag '%s'.", mTokenizer->getLocation().string(), - flagToken.string()); - return BAD_VALUE; - } - flags |= flag; - } - -#if DEBUG_PARSER - ALOGD("Parsed key: scanCode=%d, keyCode=%d, flags=0x%08x.", scanCode, keyCode, flags); -#endif - Key key; - key.keyCode = keyCode; - key.flags = flags; - mMap->mKeys.add(scanCode, key); - return NO_ERROR; -} - -status_t KeyLayoutMap::Parser::parseAxis() { - String8 scanCodeToken = mTokenizer->nextToken(WHITESPACE); - char* end; - int32_t scanCode = int32_t(strtol(scanCodeToken.string(), &end, 0)); - if (*end) { - ALOGE("%s: Expected axis scan code number, got '%s'.", mTokenizer->getLocation().string(), - scanCodeToken.string()); - return BAD_VALUE; - } - if (mMap->mAxes.indexOfKey(scanCode) >= 0) { - ALOGE("%s: Duplicate entry for axis scan code '%s'.", mTokenizer->getLocation().string(), - scanCodeToken.string()); - return BAD_VALUE; - } - - AxisInfo axisInfo; - - mTokenizer->skipDelimiters(WHITESPACE); - String8 token = mTokenizer->nextToken(WHITESPACE); - if (token == "invert") { - axisInfo.mode = AxisInfo::MODE_INVERT; - - mTokenizer->skipDelimiters(WHITESPACE); - String8 axisToken = mTokenizer->nextToken(WHITESPACE); - axisInfo.axis = getAxisByLabel(axisToken.string()); - if (axisInfo.axis < 0) { - ALOGE("%s: Expected inverted axis label, got '%s'.", - mTokenizer->getLocation().string(), axisToken.string()); - return BAD_VALUE; - } - } else if (token == "split") { - axisInfo.mode = AxisInfo::MODE_SPLIT; - - mTokenizer->skipDelimiters(WHITESPACE); - String8 splitToken = mTokenizer->nextToken(WHITESPACE); - axisInfo.splitValue = int32_t(strtol(splitToken.string(), &end, 0)); - if (*end) { - ALOGE("%s: Expected split value, got '%s'.", - mTokenizer->getLocation().string(), splitToken.string()); - return BAD_VALUE; - } - - mTokenizer->skipDelimiters(WHITESPACE); - String8 lowAxisToken = mTokenizer->nextToken(WHITESPACE); - axisInfo.axis = getAxisByLabel(lowAxisToken.string()); - if (axisInfo.axis < 0) { - ALOGE("%s: Expected low axis label, got '%s'.", - mTokenizer->getLocation().string(), lowAxisToken.string()); - return BAD_VALUE; - } - - mTokenizer->skipDelimiters(WHITESPACE); - String8 highAxisToken = mTokenizer->nextToken(WHITESPACE); - axisInfo.highAxis = getAxisByLabel(highAxisToken.string()); - if (axisInfo.highAxis < 0) { - ALOGE("%s: Expected high axis label, got '%s'.", - mTokenizer->getLocation().string(), highAxisToken.string()); - return BAD_VALUE; - } - } else { - axisInfo.axis = getAxisByLabel(token.string()); - if (axisInfo.axis < 0) { - ALOGE("%s: Expected axis label, 'split' or 'invert', got '%s'.", - mTokenizer->getLocation().string(), token.string()); - return BAD_VALUE; - } - } - - for (;;) { - mTokenizer->skipDelimiters(WHITESPACE); - if (mTokenizer->isEol()) { - break; - } - String8 keywordToken = mTokenizer->nextToken(WHITESPACE); - if (keywordToken == "flat") { - mTokenizer->skipDelimiters(WHITESPACE); - String8 flatToken = mTokenizer->nextToken(WHITESPACE); - axisInfo.flatOverride = int32_t(strtol(flatToken.string(), &end, 0)); - if (*end) { - ALOGE("%s: Expected flat value, got '%s'.", - mTokenizer->getLocation().string(), flatToken.string()); - return BAD_VALUE; - } - } else { - ALOGE("%s: Expected keyword 'flat', got '%s'.", - mTokenizer->getLocation().string(), keywordToken.string()); - return BAD_VALUE; - } - } - -#if DEBUG_PARSER - ALOGD("Parsed axis: scanCode=%d, mode=%d, axis=%d, highAxis=%d, " - "splitValue=%d, flatOverride=%d.", - scanCode, - axisInfo.mode, axisInfo.axis, axisInfo.highAxis, - axisInfo.splitValue, axisInfo.flatOverride); -#endif - mMap->mAxes.add(scanCode, axisInfo); - return NO_ERROR; -} - -}; diff --git a/libs/ui/Keyboard.cpp b/libs/ui/Keyboard.cpp deleted file mode 100644 index e4611f71cb..0000000000 --- a/libs/ui/Keyboard.cpp +++ /dev/null @@ -1,303 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#define LOG_TAG "Keyboard" - -#include <stdlib.h> -#include <unistd.h> -#include <limits.h> - -#include <ui/Keyboard.h> -#include <ui/KeycodeLabels.h> -#include <ui/KeyLayoutMap.h> -#include <ui/KeyCharacterMap.h> -#include <utils/Errors.h> -#include <utils/Log.h> -#include <cutils/properties.h> - -namespace android { - -// --- KeyMap --- - -KeyMap::KeyMap() : - keyLayoutMap(NULL), keyCharacterMap(NULL) { -} - -KeyMap::~KeyMap() { - delete keyLayoutMap; - delete keyCharacterMap; -} - -status_t KeyMap::load(const InputDeviceIdentifier& deviceIdenfifier, - const PropertyMap* deviceConfiguration) { - // Use the configured key layout if available. - if (deviceConfiguration) { - String8 keyLayoutName; - if (deviceConfiguration->tryGetProperty(String8("keyboard.layout"), - keyLayoutName)) { - status_t status = loadKeyLayout(deviceIdenfifier, keyLayoutName); - if (status == NAME_NOT_FOUND) { - ALOGE("Configuration for keyboard device '%s' requested keyboard layout '%s' but " - "it was not found.", - deviceIdenfifier.name.string(), keyLayoutName.string()); - } - } - - String8 keyCharacterMapName; - if (deviceConfiguration->tryGetProperty(String8("keyboard.characterMap"), - keyCharacterMapName)) { - status_t status = loadKeyCharacterMap(deviceIdenfifier, keyCharacterMapName); - if (status == NAME_NOT_FOUND) { - ALOGE("Configuration for keyboard device '%s' requested keyboard character " - "map '%s' but it was not found.", - deviceIdenfifier.name.string(), keyLayoutName.string()); - } - } - - if (isComplete()) { - return OK; - } - } - - // Try searching by device identifier. - if (probeKeyMap(deviceIdenfifier, String8::empty())) { - return OK; - } - - // Fall back on the Generic key map. - // TODO Apply some additional heuristics here to figure out what kind of - // generic key map to use (US English, etc.) for typical external keyboards. - if (probeKeyMap(deviceIdenfifier, String8("Generic"))) { - return OK; - } - - // Try the Virtual key map as a last resort. - if (probeKeyMap(deviceIdenfifier, String8("Virtual"))) { - return OK; - } - - // Give up! - ALOGE("Could not determine key map for device '%s' and no default key maps were found!", - deviceIdenfifier.name.string()); - return NAME_NOT_FOUND; -} - -bool KeyMap::probeKeyMap(const InputDeviceIdentifier& deviceIdentifier, - const String8& keyMapName) { - if (!haveKeyLayout()) { - loadKeyLayout(deviceIdentifier, keyMapName); - } - if (!haveKeyCharacterMap()) { - loadKeyCharacterMap(deviceIdentifier, keyMapName); - } - return isComplete(); -} - -status_t KeyMap::loadKeyLayout(const InputDeviceIdentifier& deviceIdentifier, - const String8& name) { - String8 path(getPath(deviceIdentifier, name, - INPUT_DEVICE_CONFIGURATION_FILE_TYPE_KEY_LAYOUT)); - if (path.isEmpty()) { - return NAME_NOT_FOUND; - } - - KeyLayoutMap* map; - status_t status = KeyLayoutMap::load(path, &map); - if (status) { - return status; - } - - keyLayoutFile.setTo(path); - keyLayoutMap = map; - return OK; -} - -status_t KeyMap::loadKeyCharacterMap(const InputDeviceIdentifier& deviceIdentifier, - const String8& name) { - String8 path(getPath(deviceIdentifier, name, - INPUT_DEVICE_CONFIGURATION_FILE_TYPE_KEY_CHARACTER_MAP)); - if (path.isEmpty()) { - return NAME_NOT_FOUND; - } - - KeyCharacterMap* map; - status_t status = KeyCharacterMap::load(path, &map); - if (status) { - return status; - } - - keyCharacterMapFile.setTo(path); - keyCharacterMap = map; - return OK; -} - -String8 KeyMap::getPath(const InputDeviceIdentifier& deviceIdentifier, - const String8& name, InputDeviceConfigurationFileType type) { - return name.isEmpty() - ? getInputDeviceConfigurationFilePathByDeviceIdentifier(deviceIdentifier, type) - : getInputDeviceConfigurationFilePathByName(name, type); -} - - -// --- Global functions --- - -bool isEligibleBuiltInKeyboard(const InputDeviceIdentifier& deviceIdentifier, - const PropertyMap* deviceConfiguration, const KeyMap* keyMap) { - if (!keyMap->haveKeyCharacterMap() - || keyMap->keyCharacterMap->getKeyboardType() - == KeyCharacterMap::KEYBOARD_TYPE_SPECIAL_FUNCTION) { - return false; - } - - if (deviceConfiguration) { - bool builtIn = false; - if (deviceConfiguration->tryGetProperty(String8("keyboard.builtIn"), builtIn) - && builtIn) { - return true; - } - } - - return strstr(deviceIdentifier.name.string(), "-keypad"); -} - -static int lookupValueByLabel(const char* literal, const KeycodeLabel *list) { - while (list->literal) { - if (strcmp(literal, list->literal) == 0) { - return list->value; - } - list++; - } - return list->value; -} - -static const char* lookupLabelByValue(int value, const KeycodeLabel *list) { - while (list->literal) { - if (list->value == value) { - return list->literal; - } - list++; - } - return NULL; -} - -int32_t getKeyCodeByLabel(const char* label) { - return int32_t(lookupValueByLabel(label, KEYCODES)); -} - -uint32_t getKeyFlagByLabel(const char* label) { - return uint32_t(lookupValueByLabel(label, FLAGS)); -} - -int32_t getAxisByLabel(const char* label) { - return int32_t(lookupValueByLabel(label, AXES)); -} - -const char* getAxisLabel(int32_t axisId) { - return lookupLabelByValue(axisId, AXES); -} - -static int32_t setEphemeralMetaState(int32_t mask, bool down, int32_t oldMetaState) { - int32_t newMetaState; - if (down) { - newMetaState = oldMetaState | mask; - } else { - newMetaState = oldMetaState & - ~(mask | AMETA_ALT_ON | AMETA_SHIFT_ON | AMETA_CTRL_ON | AMETA_META_ON); - } - - if (newMetaState & (AMETA_ALT_LEFT_ON | AMETA_ALT_RIGHT_ON)) { - newMetaState |= AMETA_ALT_ON; - } - - if (newMetaState & (AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_RIGHT_ON)) { - newMetaState |= AMETA_SHIFT_ON; - } - - if (newMetaState & (AMETA_CTRL_LEFT_ON | AMETA_CTRL_RIGHT_ON)) { - newMetaState |= AMETA_CTRL_ON; - } - - if (newMetaState & (AMETA_META_LEFT_ON | AMETA_META_RIGHT_ON)) { - newMetaState |= AMETA_META_ON; - } - return newMetaState; -} - -static int32_t toggleLockedMetaState(int32_t mask, bool down, int32_t oldMetaState) { - if (down) { - return oldMetaState; - } else { - return oldMetaState ^ mask; - } -} - -int32_t updateMetaState(int32_t keyCode, bool down, int32_t oldMetaState) { - int32_t mask; - switch (keyCode) { - case AKEYCODE_ALT_LEFT: - return setEphemeralMetaState(AMETA_ALT_LEFT_ON, down, oldMetaState); - case AKEYCODE_ALT_RIGHT: - return setEphemeralMetaState(AMETA_ALT_RIGHT_ON, down, oldMetaState); - case AKEYCODE_SHIFT_LEFT: - return setEphemeralMetaState(AMETA_SHIFT_LEFT_ON, down, oldMetaState); - case AKEYCODE_SHIFT_RIGHT: - return setEphemeralMetaState(AMETA_SHIFT_RIGHT_ON, down, oldMetaState); - case AKEYCODE_SYM: - return setEphemeralMetaState(AMETA_SYM_ON, down, oldMetaState); - case AKEYCODE_FUNCTION: - return setEphemeralMetaState(AMETA_FUNCTION_ON, down, oldMetaState); - case AKEYCODE_CTRL_LEFT: - return setEphemeralMetaState(AMETA_CTRL_LEFT_ON, down, oldMetaState); - case AKEYCODE_CTRL_RIGHT: - return setEphemeralMetaState(AMETA_CTRL_RIGHT_ON, down, oldMetaState); - case AKEYCODE_META_LEFT: - return setEphemeralMetaState(AMETA_META_LEFT_ON, down, oldMetaState); - case AKEYCODE_META_RIGHT: - return setEphemeralMetaState(AMETA_META_RIGHT_ON, down, oldMetaState); - case AKEYCODE_CAPS_LOCK: - return toggleLockedMetaState(AMETA_CAPS_LOCK_ON, down, oldMetaState); - case AKEYCODE_NUM_LOCK: - return toggleLockedMetaState(AMETA_NUM_LOCK_ON, down, oldMetaState); - case AKEYCODE_SCROLL_LOCK: - return toggleLockedMetaState(AMETA_SCROLL_LOCK_ON, down, oldMetaState); - default: - return oldMetaState; - } -} - -bool isMetaKey(int32_t keyCode) { - switch (keyCode) { - case AKEYCODE_ALT_LEFT: - case AKEYCODE_ALT_RIGHT: - case AKEYCODE_SHIFT_LEFT: - case AKEYCODE_SHIFT_RIGHT: - case AKEYCODE_SYM: - case AKEYCODE_FUNCTION: - case AKEYCODE_CTRL_LEFT: - case AKEYCODE_CTRL_RIGHT: - case AKEYCODE_META_LEFT: - case AKEYCODE_META_RIGHT: - case AKEYCODE_CAPS_LOCK: - case AKEYCODE_NUM_LOCK: - case AKEYCODE_SCROLL_LOCK: - return true; - default: - return false; - } -} - - -} // namespace android diff --git a/libs/ui/PixelFormat.cpp b/libs/ui/PixelFormat.cpp index ee186c84de..fc1d3c29db 100644 --- a/libs/ui/PixelFormat.cpp +++ b/libs/ui/PixelFormat.cpp @@ -15,13 +15,54 @@ */ #include <ui/PixelFormat.h> -#include <pixelflinger/format.h> #include <hardware/hardware.h> +// ---------------------------------------------------------------------------- namespace android { +// ---------------------------------------------------------------------------- static const int COMPONENT_YUV = 0xFF; +struct Info { + size_t size; + size_t bitsPerPixel; + struct { + uint8_t ah; + uint8_t al; + uint8_t rh; + uint8_t rl; + uint8_t gh; + uint8_t gl; + uint8_t bh; + uint8_t bl; + }; + uint8_t components; +}; + +static Info const sPixelFormatInfos[] = { + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 4, 32, {32,24, 8, 0, 16, 8, 24,16 }, PixelFormatInfo::RGBA }, + { 4, 24, { 0, 0, 8, 0, 16, 8, 24,16 }, PixelFormatInfo::RGB }, + { 3, 24, { 0, 0, 8, 0, 16, 8, 24,16 }, PixelFormatInfo::RGB }, + { 2, 16, { 0, 0, 16,11, 11, 5, 5, 0 }, PixelFormatInfo::RGB }, + { 4, 32, {32,24, 24,16, 16, 8, 8, 0 }, PixelFormatInfo::RGBA }, + { 2, 16, { 1, 0, 16,11, 11, 6, 6, 1 }, PixelFormatInfo::RGBA }, + { 2, 16, { 4, 0, 16,12, 12, 8, 8, 4 }, PixelFormatInfo::RGBA }, + { 1, 8, { 8, 0, 0, 0, 0, 0, 0, 0 }, PixelFormatInfo::ALPHA}, + { 1, 8, { 0, 0, 8, 0, 8, 0, 8, 0 }, PixelFormatInfo::L }, + { 2, 16, {16, 8, 8, 0, 8, 0, 8, 0 }, PixelFormatInfo::LA }, + { 1, 8, { 0, 0, 8, 5, 5, 2, 2, 0 }, PixelFormatInfo::RGB }, +}; + +static const Info* gGetPixelFormatTable(size_t* numEntries) { + if (numEntries) { + *numEntries = sizeof(sPixelFormatInfos)/sizeof(Info); + } + return sPixelFormatInfos; +} + +// ---------------------------------------------------------------------------- + size_t PixelFormatInfo::getScanlineSize(unsigned int width) const { size_t size; @@ -77,27 +118,12 @@ status_t getPixelFormatInfo(PixelFormat format, PixelFormatInfo* info) } size_t numEntries; - const GGLFormat *i = gglGetPixelFormatTable(&numEntries) + format; + const Info *i = gGetPixelFormatTable(&numEntries) + format; bool valid = uint32_t(format) < numEntries; if (!valid) { return BAD_INDEX; } - #define COMPONENT(name) \ - case GGL_##name: info->components = PixelFormatInfo::name; break; - - switch (i->components) { - COMPONENT(ALPHA) - COMPONENT(RGB) - COMPONENT(RGBA) - COMPONENT(LUMINANCE) - COMPONENT(LUMINANCE_ALPHA) - default: - return BAD_INDEX; - } - - #undef COMPONENT - info->format = format; info->bytesPerPixel = i->size; info->bitsPerPixel = i->bitsPerPixel; @@ -109,9 +135,12 @@ status_t getPixelFormatInfo(PixelFormat format, PixelFormatInfo* info) info->l_green = i->gl; info->h_blue = i->bh; info->l_blue = i->bl; + info->components = i->components; return NO_ERROR; } +// ---------------------------------------------------------------------------- }; // namespace android +// ---------------------------------------------------------------------------- diff --git a/libs/ui/VirtualKeyMap.cpp b/libs/ui/VirtualKeyMap.cpp deleted file mode 100644 index 62d5b593b2..0000000000 --- a/libs/ui/VirtualKeyMap.cpp +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#define LOG_TAG "VirtualKeyMap" - -#include <stdlib.h> -#include <string.h> -#include <ui/VirtualKeyMap.h> -#include <utils/Log.h> -#include <utils/Errors.h> -#include <utils/Tokenizer.h> -#include <utils/Timers.h> - -// Enables debug output for the parser. -#define DEBUG_PARSER 0 - -// Enables debug output for parser performance. -#define DEBUG_PARSER_PERFORMANCE 0 - - -namespace android { - -static const char* WHITESPACE = " \t\r"; -static const char* WHITESPACE_OR_FIELD_DELIMITER = " \t\r:"; - - -// --- VirtualKeyMap --- - -VirtualKeyMap::VirtualKeyMap() { -} - -VirtualKeyMap::~VirtualKeyMap() { -} - -status_t VirtualKeyMap::load(const String8& filename, VirtualKeyMap** outMap) { - *outMap = NULL; - - Tokenizer* tokenizer; - status_t status = Tokenizer::open(filename, &tokenizer); - if (status) { - ALOGE("Error %d opening virtual key map file %s.", status, filename.string()); - } else { - VirtualKeyMap* map = new VirtualKeyMap(); - if (!map) { - ALOGE("Error allocating virtual key map."); - status = NO_MEMORY; - } else { -#if DEBUG_PARSER_PERFORMANCE - nsecs_t startTime = systemTime(SYSTEM_TIME_MONOTONIC); -#endif - Parser parser(map, tokenizer); - status = parser.parse(); -#if DEBUG_PARSER_PERFORMANCE - nsecs_t elapsedTime = systemTime(SYSTEM_TIME_MONOTONIC) - startTime; - ALOGD("Parsed key character map file '%s' %d lines in %0.3fms.", - tokenizer->getFilename().string(), tokenizer->getLineNumber(), - elapsedTime / 1000000.0); -#endif - if (status) { - delete map; - } else { - *outMap = map; - } - } - delete tokenizer; - } - return status; -} - - -// --- VirtualKeyMap::Parser --- - -VirtualKeyMap::Parser::Parser(VirtualKeyMap* map, Tokenizer* tokenizer) : - mMap(map), mTokenizer(tokenizer) { -} - -VirtualKeyMap::Parser::~Parser() { -} - -status_t VirtualKeyMap::Parser::parse() { - while (!mTokenizer->isEof()) { -#if DEBUG_PARSER - ALOGD("Parsing %s: '%s'.", mTokenizer->getLocation().string(), - mTokenizer->peekRemainderOfLine().string()); -#endif - - mTokenizer->skipDelimiters(WHITESPACE); - - if (!mTokenizer->isEol() && mTokenizer->peekChar() != '#') { - // Multiple keys can appear on one line or they can be broken up across multiple lines. - do { - String8 token = mTokenizer->nextToken(WHITESPACE_OR_FIELD_DELIMITER); - if (token != "0x01") { - ALOGE("%s: Unknown virtual key type, expected 0x01.", - mTokenizer->getLocation().string()); - return BAD_VALUE; - } - - VirtualKeyDefinition defn; - bool success = parseNextIntField(&defn.scanCode) - && parseNextIntField(&defn.centerX) - && parseNextIntField(&defn.centerY) - && parseNextIntField(&defn.width) - && parseNextIntField(&defn.height); - if (!success) { - ALOGE("%s: Expected 5 colon-delimited integers in virtual key definition.", - mTokenizer->getLocation().string()); - return BAD_VALUE; - } - -#if DEBUG_PARSER - ALOGD("Parsed virtual key: scanCode=%d, centerX=%d, centerY=%d, " - "width=%d, height=%d", - defn.scanCode, defn.centerX, defn.centerY, defn.width, defn.height); -#endif - mMap->mVirtualKeys.push(defn); - } while (consumeFieldDelimiterAndSkipWhitespace()); - - if (!mTokenizer->isEol()) { - ALOGE("%s: Expected end of line, got '%s'.", - mTokenizer->getLocation().string(), - mTokenizer->peekRemainderOfLine().string()); - return BAD_VALUE; - } - } - - mTokenizer->nextLine(); - } - - return NO_ERROR; -} - -bool VirtualKeyMap::Parser::consumeFieldDelimiterAndSkipWhitespace() { - mTokenizer->skipDelimiters(WHITESPACE); - if (mTokenizer->peekChar() == ':') { - mTokenizer->nextChar(); - mTokenizer->skipDelimiters(WHITESPACE); - return true; - } - return false; -} - -bool VirtualKeyMap::Parser::parseNextIntField(int32_t* outValue) { - if (!consumeFieldDelimiterAndSkipWhitespace()) { - return false; - } - - String8 token = mTokenizer->nextToken(WHITESPACE_OR_FIELD_DELIMITER); - char* end; - *outValue = strtol(token.string(), &end, 0); - if (token.isEmpty() || *end != '\0') { - ALOGE("Expected an integer, got '%s'.", token.string()); - return false; - } - return true; -} - -} // namespace android diff --git a/libs/ui/tests/Android.mk b/libs/ui/tests/Android.mk index 700b60479a..50cad36930 100644 --- a/libs/ui/tests/Android.mk +++ b/libs/ui/tests/Android.mk @@ -2,47 +2,5 @@ LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) -# Build the unit tests. -test_src_files := \ - InputChannel_test.cpp \ - InputEvent_test.cpp \ - InputPublisherAndConsumer_test.cpp - -shared_libraries := \ - libcutils \ - libutils \ - libEGL \ - libbinder \ - libpixelflinger \ - libhardware \ - libhardware_legacy \ - libui \ - libstlport \ - libskia - -static_libraries := \ - libgtest \ - libgtest_main - -c_includes := \ - bionic \ - bionic/libstdc++/include \ - external/gtest/include \ - external/stlport/stlport \ - external/skia/include/core - -module_tags := eng tests - -$(foreach file,$(test_src_files), \ - $(eval include $(CLEAR_VARS)) \ - $(eval LOCAL_SHARED_LIBRARIES := $(shared_libraries)) \ - $(eval LOCAL_STATIC_LIBRARIES := $(static_libraries)) \ - $(eval LOCAL_C_INCLUDES := $(c_includes)) \ - $(eval LOCAL_SRC_FILES := $(file)) \ - $(eval LOCAL_MODULE := $(notdir $(file:%.cpp=%))) \ - $(eval LOCAL_MODULE_TAGS := $(module_tags)) \ - $(eval include $(BUILD_EXECUTABLE)) \ -) - # Build the manual test programs. include $(call all-makefiles-under, $(LOCAL_PATH)) diff --git a/libs/ui/tests/InputChannel_test.cpp b/libs/ui/tests/InputChannel_test.cpp deleted file mode 100644 index ee422fe7d8..0000000000 --- a/libs/ui/tests/InputChannel_test.cpp +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include <ui/InputTransport.h> -#include <utils/Timers.h> -#include <utils/StopWatch.h> -#include <gtest/gtest.h> -#include <unistd.h> -#include <time.h> -#include <errno.h> - -#include "../../utils/tests/TestHelpers.h" - -namespace android { - -class InputChannelTest : public testing::Test { -protected: - virtual void SetUp() { } - virtual void TearDown() { } -}; - - -TEST_F(InputChannelTest, ConstructorAndDestructor_TakesOwnershipOfFileDescriptors) { - // Our purpose here is to verify that the input channel destructor closes the - // file descriptor provided to it. One easy way is to provide it with one end - // of a pipe and to check for EPIPE on the other end after the channel is destroyed. - Pipe pipe; - - sp<InputChannel> inputChannel = new InputChannel(String8("channel name"), pipe.sendFd); - - EXPECT_STREQ("channel name", inputChannel->getName().string()) - << "channel should have provided name"; - EXPECT_EQ(pipe.sendFd, inputChannel->getFd()) - << "channel should have provided fd"; - - inputChannel.clear(); // destroys input channel - - EXPECT_EQ(-EPIPE, pipe.readSignal()) - << "channel should have closed fd when destroyed"; - - // clean up fds of Pipe endpoints that were closed so we don't try to close them again - pipe.sendFd = -1; -} - -TEST_F(InputChannelTest, OpenInputChannelPair_ReturnsAPairOfConnectedChannels) { - sp<InputChannel> serverChannel, clientChannel; - - status_t result = InputChannel::openInputChannelPair(String8("channel name"), - serverChannel, clientChannel); - - ASSERT_EQ(OK, result) - << "should have successfully opened a channel pair"; - - // Name - EXPECT_STREQ("channel name (server)", serverChannel->getName().string()) - << "server channel should have suffixed name"; - EXPECT_STREQ("channel name (client)", clientChannel->getName().string()) - << "client channel should have suffixed name"; - - // Server->Client communication - InputMessage serverMsg; - memset(&serverMsg, 0, sizeof(InputMessage)); - serverMsg.header.type = InputMessage::TYPE_KEY; - serverMsg.body.key.action = AKEY_EVENT_ACTION_DOWN; - EXPECT_EQ(OK, serverChannel->sendMessage(&serverMsg)) - << "server channel should be able to send message to client channel"; - - InputMessage clientMsg; - EXPECT_EQ(OK, clientChannel->receiveMessage(&clientMsg)) - << "client channel should be able to receive message from server channel"; - EXPECT_EQ(serverMsg.header.type, clientMsg.header.type) - << "client channel should receive the correct message from server channel"; - EXPECT_EQ(serverMsg.body.key.action, clientMsg.body.key.action) - << "client channel should receive the correct message from server channel"; - - // Client->Server communication - InputMessage clientReply; - memset(&clientReply, 0, sizeof(InputMessage)); - clientReply.header.type = InputMessage::TYPE_FINISHED; - clientReply.body.finished.seq = 0x11223344; - clientReply.body.finished.handled = true; - EXPECT_EQ(OK, clientChannel->sendMessage(&clientReply)) - << "client channel should be able to send message to server channel"; - - InputMessage serverReply; - EXPECT_EQ(OK, serverChannel->receiveMessage(&serverReply)) - << "server channel should be able to receive message from client channel"; - EXPECT_EQ(clientReply.header.type, serverReply.header.type) - << "server channel should receive the correct message from client channel"; - EXPECT_EQ(clientReply.body.finished.seq, serverReply.body.finished.seq) - << "server channel should receive the correct message from client channel"; - EXPECT_EQ(clientReply.body.finished.handled, serverReply.body.finished.handled) - << "server channel should receive the correct message from client channel"; -} - -TEST_F(InputChannelTest, ReceiveSignal_WhenNoSignalPresent_ReturnsAnError) { - sp<InputChannel> serverChannel, clientChannel; - - status_t result = InputChannel::openInputChannelPair(String8("channel name"), - serverChannel, clientChannel); - - ASSERT_EQ(OK, result) - << "should have successfully opened a channel pair"; - - InputMessage msg; - EXPECT_EQ(WOULD_BLOCK, clientChannel->receiveMessage(&msg)) - << "receiveMessage should have returned WOULD_BLOCK"; -} - -TEST_F(InputChannelTest, ReceiveSignal_WhenPeerClosed_ReturnsAnError) { - sp<InputChannel> serverChannel, clientChannel; - - status_t result = InputChannel::openInputChannelPair(String8("channel name"), - serverChannel, clientChannel); - - ASSERT_EQ(OK, result) - << "should have successfully opened a channel pair"; - - serverChannel.clear(); // close server channel - - InputMessage msg; - EXPECT_EQ(DEAD_OBJECT, clientChannel->receiveMessage(&msg)) - << "receiveMessage should have returned DEAD_OBJECT"; -} - -TEST_F(InputChannelTest, SendSignal_WhenPeerClosed_ReturnsAnError) { - sp<InputChannel> serverChannel, clientChannel; - - status_t result = InputChannel::openInputChannelPair(String8("channel name"), - serverChannel, clientChannel); - - ASSERT_EQ(OK, result) - << "should have successfully opened a channel pair"; - - serverChannel.clear(); // close server channel - - InputMessage msg; - msg.header.type = InputMessage::TYPE_KEY; - EXPECT_EQ(DEAD_OBJECT, clientChannel->sendMessage(&msg)) - << "sendMessage should have returned DEAD_OBJECT"; -} - - -} // namespace android diff --git a/libs/ui/tests/InputEvent_test.cpp b/libs/ui/tests/InputEvent_test.cpp deleted file mode 100644 index e21c464a19..0000000000 --- a/libs/ui/tests/InputEvent_test.cpp +++ /dev/null @@ -1,581 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include <ui/Input.h> -#include <gtest/gtest.h> -#include <binder/Parcel.h> - -#include <math.h> -#include <SkMatrix.h> - -namespace android { - -class BaseTest : public testing::Test { -protected: - virtual void SetUp() { } - virtual void TearDown() { } -}; - -// --- PointerCoordsTest --- - -class PointerCoordsTest : public BaseTest { -}; - -TEST_F(PointerCoordsTest, ClearSetsBitsToZero) { - PointerCoords coords; - coords.clear(); - - ASSERT_EQ(0ULL, coords.bits); -} - -TEST_F(PointerCoordsTest, AxisValues) { - float* valuePtr; - PointerCoords coords; - coords.clear(); - - // Check invariants when no axes are present. - ASSERT_EQ(0, coords.getAxisValue(0)) - << "getAxisValue should return zero because axis is not present"; - ASSERT_EQ(0, coords.getAxisValue(1)) - << "getAxisValue should return zero because axis is not present"; - - // Set first axis. - ASSERT_EQ(OK, coords.setAxisValue(1, 5)); - ASSERT_EQ(0x00000002ULL, coords.bits); - ASSERT_EQ(5, coords.values[0]); - - ASSERT_EQ(0, coords.getAxisValue(0)) - << "getAxisValue should return zero because axis is not present"; - ASSERT_EQ(5, coords.getAxisValue(1)) - << "getAxisValue should return value of axis"; - - // Set an axis with a higher id than all others. (appending value at the end) - ASSERT_EQ(OK, coords.setAxisValue(3, 2)); - ASSERT_EQ(0x0000000aULL, coords.bits); - ASSERT_EQ(5, coords.values[0]); - ASSERT_EQ(2, coords.values[1]); - - ASSERT_EQ(0, coords.getAxisValue(0)) - << "getAxisValue should return zero because axis is not present"; - ASSERT_EQ(5, coords.getAxisValue(1)) - << "getAxisValue should return value of axis"; - ASSERT_EQ(0, coords.getAxisValue(2)) - << "getAxisValue should return zero because axis is not present"; - ASSERT_EQ(2, coords.getAxisValue(3)) - << "getAxisValue should return value of axis"; - - // Set an axis with an id lower than all others. (prepending value at beginning) - ASSERT_EQ(OK, coords.setAxisValue(0, 4)); - ASSERT_EQ(0x0000000bULL, coords.bits); - ASSERT_EQ(4, coords.values[0]); - ASSERT_EQ(5, coords.values[1]); - ASSERT_EQ(2, coords.values[2]); - - ASSERT_EQ(4, coords.getAxisValue(0)) - << "getAxisValue should return value of axis"; - ASSERT_EQ(5, coords.getAxisValue(1)) - << "getAxisValue should return value of axis"; - ASSERT_EQ(0, coords.getAxisValue(2)) - << "getAxisValue should return zero because axis is not present"; - ASSERT_EQ(2, coords.getAxisValue(3)) - << "getAxisValue should return value of axis"; - - // Set an axis with an id between the others. (inserting value in the middle) - ASSERT_EQ(OK, coords.setAxisValue(2, 1)); - ASSERT_EQ(0x0000000fULL, coords.bits); - ASSERT_EQ(4, coords.values[0]); - ASSERT_EQ(5, coords.values[1]); - ASSERT_EQ(1, coords.values[2]); - ASSERT_EQ(2, coords.values[3]); - - ASSERT_EQ(4, coords.getAxisValue(0)) - << "getAxisValue should return value of axis"; - ASSERT_EQ(5, coords.getAxisValue(1)) - << "getAxisValue should return value of axis"; - ASSERT_EQ(1, coords.getAxisValue(2)) - << "getAxisValue should return value of axis"; - ASSERT_EQ(2, coords.getAxisValue(3)) - << "getAxisValue should return value of axis"; - - // Set an existing axis value in place. - ASSERT_EQ(OK, coords.setAxisValue(1, 6)); - ASSERT_EQ(0x0000000fULL, coords.bits); - ASSERT_EQ(4, coords.values[0]); - ASSERT_EQ(6, coords.values[1]); - ASSERT_EQ(1, coords.values[2]); - ASSERT_EQ(2, coords.values[3]); - - ASSERT_EQ(4, coords.getAxisValue(0)) - << "getAxisValue should return value of axis"; - ASSERT_EQ(6, coords.getAxisValue(1)) - << "getAxisValue should return value of axis"; - ASSERT_EQ(1, coords.getAxisValue(2)) - << "getAxisValue should return value of axis"; - ASSERT_EQ(2, coords.getAxisValue(3)) - << "getAxisValue should return value of axis"; - - // Set maximum number of axes. - for (size_t axis = 4; axis < PointerCoords::MAX_AXES; axis++) { - ASSERT_EQ(OK, coords.setAxisValue(axis, axis)); - } - ASSERT_EQ(PointerCoords::MAX_AXES, __builtin_popcountll(coords.bits)); - - // Try to set one more axis beyond maximum number. - // Ensure bits are unchanged. - ASSERT_EQ(NO_MEMORY, coords.setAxisValue(PointerCoords::MAX_AXES, 100)); - ASSERT_EQ(PointerCoords::MAX_AXES, __builtin_popcountll(coords.bits)); -} - -TEST_F(PointerCoordsTest, Parcel) { - Parcel parcel; - - PointerCoords inCoords; - inCoords.clear(); - PointerCoords outCoords; - - // Round trip with empty coords. - inCoords.writeToParcel(&parcel); - parcel.setDataPosition(0); - outCoords.readFromParcel(&parcel); - - ASSERT_EQ(0ULL, outCoords.bits); - - // Round trip with some values. - parcel.freeData(); - inCoords.setAxisValue(2, 5); - inCoords.setAxisValue(5, 8); - - inCoords.writeToParcel(&parcel); - parcel.setDataPosition(0); - outCoords.readFromParcel(&parcel); - - ASSERT_EQ(outCoords.bits, inCoords.bits); - ASSERT_EQ(outCoords.values[0], inCoords.values[0]); - ASSERT_EQ(outCoords.values[1], inCoords.values[1]); -} - - -// --- KeyEventTest --- - -class KeyEventTest : public BaseTest { -}; - -TEST_F(KeyEventTest, Properties) { - KeyEvent event; - - // Initialize and get properties. - const nsecs_t ARBITRARY_DOWN_TIME = 1; - const nsecs_t ARBITRARY_EVENT_TIME = 2; - event.initialize(2, AINPUT_SOURCE_GAMEPAD, AKEY_EVENT_ACTION_DOWN, - AKEY_EVENT_FLAG_FROM_SYSTEM, AKEYCODE_BUTTON_X, 121, - AMETA_ALT_ON, 1, ARBITRARY_DOWN_TIME, ARBITRARY_EVENT_TIME); - - ASSERT_EQ(AINPUT_EVENT_TYPE_KEY, event.getType()); - ASSERT_EQ(2, event.getDeviceId()); - ASSERT_EQ(AINPUT_SOURCE_GAMEPAD, event.getSource()); - ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, event.getAction()); - ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, event.getFlags()); - ASSERT_EQ(AKEYCODE_BUTTON_X, event.getKeyCode()); - ASSERT_EQ(121, event.getScanCode()); - ASSERT_EQ(AMETA_ALT_ON, event.getMetaState()); - ASSERT_EQ(1, event.getRepeatCount()); - ASSERT_EQ(ARBITRARY_DOWN_TIME, event.getDownTime()); - ASSERT_EQ(ARBITRARY_EVENT_TIME, event.getEventTime()); - - // Set source. - event.setSource(AINPUT_SOURCE_JOYSTICK); - ASSERT_EQ(AINPUT_SOURCE_JOYSTICK, event.getSource()); -} - - -// --- MotionEventTest --- - -class MotionEventTest : public BaseTest { -protected: - static const nsecs_t ARBITRARY_DOWN_TIME; - static const nsecs_t ARBITRARY_EVENT_TIME; - static const float X_OFFSET; - static const float Y_OFFSET; - - void initializeEventWithHistory(MotionEvent* event); - void assertEqualsEventWithHistory(const MotionEvent* event); -}; - -const nsecs_t MotionEventTest::ARBITRARY_DOWN_TIME = 1; -const nsecs_t MotionEventTest::ARBITRARY_EVENT_TIME = 2; -const float MotionEventTest::X_OFFSET = 1.0f; -const float MotionEventTest::Y_OFFSET = 1.1f; - -void MotionEventTest::initializeEventWithHistory(MotionEvent* event) { - PointerProperties pointerProperties[2]; - pointerProperties[0].clear(); - pointerProperties[0].id = 1; - pointerProperties[0].toolType = AMOTION_EVENT_TOOL_TYPE_FINGER; - pointerProperties[1].clear(); - pointerProperties[1].id = 2; - pointerProperties[1].toolType = AMOTION_EVENT_TOOL_TYPE_STYLUS; - - PointerCoords pointerCoords[2]; - pointerCoords[0].clear(); - pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_X, 10); - pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_Y, 11); - pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_PRESSURE, 12); - pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_SIZE, 13); - pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR, 14); - pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR, 15); - pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR, 16); - pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR, 17); - pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_ORIENTATION, 18); - pointerCoords[1].clear(); - pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_X, 20); - pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_Y, 21); - pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_PRESSURE, 22); - pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_SIZE, 23); - pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR, 24); - pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR, 25); - pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR, 26); - pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR, 27); - pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_ORIENTATION, 28); - event->initialize(2, AINPUT_SOURCE_TOUCHSCREEN, AMOTION_EVENT_ACTION_MOVE, - AMOTION_EVENT_FLAG_WINDOW_IS_OBSCURED, - AMOTION_EVENT_EDGE_FLAG_TOP, AMETA_ALT_ON, AMOTION_EVENT_BUTTON_PRIMARY, - X_OFFSET, Y_OFFSET, 2.0f, 2.1f, - ARBITRARY_DOWN_TIME, ARBITRARY_EVENT_TIME, - 2, pointerProperties, pointerCoords); - - pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_X, 110); - pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_Y, 111); - pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_PRESSURE, 112); - pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_SIZE, 113); - pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR, 114); - pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR, 115); - pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR, 116); - pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR, 117); - pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_ORIENTATION, 118); - pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_X, 120); - pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_Y, 121); - pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_PRESSURE, 122); - pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_SIZE, 123); - pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR, 124); - pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR, 125); - pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR, 126); - pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR, 127); - pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_ORIENTATION, 128); - event->addSample(ARBITRARY_EVENT_TIME + 1, pointerCoords); - - pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_X, 210); - pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_Y, 211); - pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_PRESSURE, 212); - pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_SIZE, 213); - pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR, 214); - pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR, 215); - pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR, 216); - pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR, 217); - pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_ORIENTATION, 218); - pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_X, 220); - pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_Y, 221); - pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_PRESSURE, 222); - pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_SIZE, 223); - pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR, 224); - pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR, 225); - pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR, 226); - pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR, 227); - pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_ORIENTATION, 228); - event->addSample(ARBITRARY_EVENT_TIME + 2, pointerCoords); -} - -void MotionEventTest::assertEqualsEventWithHistory(const MotionEvent* event) { - // Check properties. - ASSERT_EQ(AINPUT_EVENT_TYPE_MOTION, event->getType()); - ASSERT_EQ(2, event->getDeviceId()); - ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, event->getSource()); - ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, event->getAction()); - ASSERT_EQ(AMOTION_EVENT_FLAG_WINDOW_IS_OBSCURED, event->getFlags()); - ASSERT_EQ(AMOTION_EVENT_EDGE_FLAG_TOP, event->getEdgeFlags()); - ASSERT_EQ(AMETA_ALT_ON, event->getMetaState()); - ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, event->getButtonState()); - ASSERT_EQ(X_OFFSET, event->getXOffset()); - ASSERT_EQ(Y_OFFSET, event->getYOffset()); - ASSERT_EQ(2.0f, event->getXPrecision()); - ASSERT_EQ(2.1f, event->getYPrecision()); - ASSERT_EQ(ARBITRARY_DOWN_TIME, event->getDownTime()); - - ASSERT_EQ(2U, event->getPointerCount()); - ASSERT_EQ(1, event->getPointerId(0)); - ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, event->getToolType(0)); - ASSERT_EQ(2, event->getPointerId(1)); - ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, event->getToolType(1)); - - ASSERT_EQ(2U, event->getHistorySize()); - - // Check data. - ASSERT_EQ(ARBITRARY_EVENT_TIME, event->getHistoricalEventTime(0)); - ASSERT_EQ(ARBITRARY_EVENT_TIME + 1, event->getHistoricalEventTime(1)); - ASSERT_EQ(ARBITRARY_EVENT_TIME + 2, event->getEventTime()); - - ASSERT_EQ(11, event->getHistoricalRawPointerCoords(0, 0)-> - getAxisValue(AMOTION_EVENT_AXIS_Y)); - ASSERT_EQ(21, event->getHistoricalRawPointerCoords(1, 0)-> - getAxisValue(AMOTION_EVENT_AXIS_Y)); - ASSERT_EQ(111, event->getHistoricalRawPointerCoords(0, 1)-> - getAxisValue(AMOTION_EVENT_AXIS_Y)); - ASSERT_EQ(121, event->getHistoricalRawPointerCoords(1, 1)-> - getAxisValue(AMOTION_EVENT_AXIS_Y)); - ASSERT_EQ(211, event->getRawPointerCoords(0)-> - getAxisValue(AMOTION_EVENT_AXIS_Y)); - ASSERT_EQ(221, event->getRawPointerCoords(1)-> - getAxisValue(AMOTION_EVENT_AXIS_Y)); - - ASSERT_EQ(11, event->getHistoricalRawAxisValue(AMOTION_EVENT_AXIS_Y, 0, 0)); - ASSERT_EQ(21, event->getHistoricalRawAxisValue(AMOTION_EVENT_AXIS_Y, 1, 0)); - ASSERT_EQ(111, event->getHistoricalRawAxisValue(AMOTION_EVENT_AXIS_Y, 0, 1)); - ASSERT_EQ(121, event->getHistoricalRawAxisValue(AMOTION_EVENT_AXIS_Y, 1, 1)); - ASSERT_EQ(211, event->getRawAxisValue(AMOTION_EVENT_AXIS_Y, 0)); - ASSERT_EQ(221, event->getRawAxisValue(AMOTION_EVENT_AXIS_Y, 1)); - - ASSERT_EQ(10, event->getHistoricalRawX(0, 0)); - ASSERT_EQ(20, event->getHistoricalRawX(1, 0)); - ASSERT_EQ(110, event->getHistoricalRawX(0, 1)); - ASSERT_EQ(120, event->getHistoricalRawX(1, 1)); - ASSERT_EQ(210, event->getRawX(0)); - ASSERT_EQ(220, event->getRawX(1)); - - ASSERT_EQ(11, event->getHistoricalRawY(0, 0)); - ASSERT_EQ(21, event->getHistoricalRawY(1, 0)); - ASSERT_EQ(111, event->getHistoricalRawY(0, 1)); - ASSERT_EQ(121, event->getHistoricalRawY(1, 1)); - ASSERT_EQ(211, event->getRawY(0)); - ASSERT_EQ(221, event->getRawY(1)); - - ASSERT_EQ(X_OFFSET + 10, event->getHistoricalX(0, 0)); - ASSERT_EQ(X_OFFSET + 20, event->getHistoricalX(1, 0)); - ASSERT_EQ(X_OFFSET + 110, event->getHistoricalX(0, 1)); - ASSERT_EQ(X_OFFSET + 120, event->getHistoricalX(1, 1)); - ASSERT_EQ(X_OFFSET + 210, event->getX(0)); - ASSERT_EQ(X_OFFSET + 220, event->getX(1)); - - ASSERT_EQ(Y_OFFSET + 11, event->getHistoricalY(0, 0)); - ASSERT_EQ(Y_OFFSET + 21, event->getHistoricalY(1, 0)); - ASSERT_EQ(Y_OFFSET + 111, event->getHistoricalY(0, 1)); - ASSERT_EQ(Y_OFFSET + 121, event->getHistoricalY(1, 1)); - ASSERT_EQ(Y_OFFSET + 211, event->getY(0)); - ASSERT_EQ(Y_OFFSET + 221, event->getY(1)); - - ASSERT_EQ(12, event->getHistoricalPressure(0, 0)); - ASSERT_EQ(22, event->getHistoricalPressure(1, 0)); - ASSERT_EQ(112, event->getHistoricalPressure(0, 1)); - ASSERT_EQ(122, event->getHistoricalPressure(1, 1)); - ASSERT_EQ(212, event->getPressure(0)); - ASSERT_EQ(222, event->getPressure(1)); - - ASSERT_EQ(13, event->getHistoricalSize(0, 0)); - ASSERT_EQ(23, event->getHistoricalSize(1, 0)); - ASSERT_EQ(113, event->getHistoricalSize(0, 1)); - ASSERT_EQ(123, event->getHistoricalSize(1, 1)); - ASSERT_EQ(213, event->getSize(0)); - ASSERT_EQ(223, event->getSize(1)); - - ASSERT_EQ(14, event->getHistoricalTouchMajor(0, 0)); - ASSERT_EQ(24, event->getHistoricalTouchMajor(1, 0)); - ASSERT_EQ(114, event->getHistoricalTouchMajor(0, 1)); - ASSERT_EQ(124, event->getHistoricalTouchMajor(1, 1)); - ASSERT_EQ(214, event->getTouchMajor(0)); - ASSERT_EQ(224, event->getTouchMajor(1)); - - ASSERT_EQ(15, event->getHistoricalTouchMinor(0, 0)); - ASSERT_EQ(25, event->getHistoricalTouchMinor(1, 0)); - ASSERT_EQ(115, event->getHistoricalTouchMinor(0, 1)); - ASSERT_EQ(125, event->getHistoricalTouchMinor(1, 1)); - ASSERT_EQ(215, event->getTouchMinor(0)); - ASSERT_EQ(225, event->getTouchMinor(1)); - - ASSERT_EQ(16, event->getHistoricalToolMajor(0, 0)); - ASSERT_EQ(26, event->getHistoricalToolMajor(1, 0)); - ASSERT_EQ(116, event->getHistoricalToolMajor(0, 1)); - ASSERT_EQ(126, event->getHistoricalToolMajor(1, 1)); - ASSERT_EQ(216, event->getToolMajor(0)); - ASSERT_EQ(226, event->getToolMajor(1)); - - ASSERT_EQ(17, event->getHistoricalToolMinor(0, 0)); - ASSERT_EQ(27, event->getHistoricalToolMinor(1, 0)); - ASSERT_EQ(117, event->getHistoricalToolMinor(0, 1)); - ASSERT_EQ(127, event->getHistoricalToolMinor(1, 1)); - ASSERT_EQ(217, event->getToolMinor(0)); - ASSERT_EQ(227, event->getToolMinor(1)); - - ASSERT_EQ(18, event->getHistoricalOrientation(0, 0)); - ASSERT_EQ(28, event->getHistoricalOrientation(1, 0)); - ASSERT_EQ(118, event->getHistoricalOrientation(0, 1)); - ASSERT_EQ(128, event->getHistoricalOrientation(1, 1)); - ASSERT_EQ(218, event->getOrientation(0)); - ASSERT_EQ(228, event->getOrientation(1)); -} - -TEST_F(MotionEventTest, Properties) { - MotionEvent event; - - // Initialize, add samples and check properties. - initializeEventWithHistory(&event); - ASSERT_NO_FATAL_FAILURE(assertEqualsEventWithHistory(&event)); - - // Set source. - event.setSource(AINPUT_SOURCE_JOYSTICK); - ASSERT_EQ(AINPUT_SOURCE_JOYSTICK, event.getSource()); - - // Set action. - event.setAction(AMOTION_EVENT_ACTION_CANCEL); - ASSERT_EQ(AMOTION_EVENT_ACTION_CANCEL, event.getAction()); - - // Set meta state. - event.setMetaState(AMETA_CTRL_ON); - ASSERT_EQ(AMETA_CTRL_ON, event.getMetaState()); -} - -TEST_F(MotionEventTest, CopyFrom_KeepHistory) { - MotionEvent event; - initializeEventWithHistory(&event); - - MotionEvent copy; - copy.copyFrom(&event, true /*keepHistory*/); - - ASSERT_NO_FATAL_FAILURE(assertEqualsEventWithHistory(&event)); -} - -TEST_F(MotionEventTest, CopyFrom_DoNotKeepHistory) { - MotionEvent event; - initializeEventWithHistory(&event); - - MotionEvent copy; - copy.copyFrom(&event, false /*keepHistory*/); - - ASSERT_EQ(event.getPointerCount(), copy.getPointerCount()); - ASSERT_EQ(0U, copy.getHistorySize()); - - ASSERT_EQ(event.getPointerId(0), copy.getPointerId(0)); - ASSERT_EQ(event.getPointerId(1), copy.getPointerId(1)); - - ASSERT_EQ(event.getEventTime(), copy.getEventTime()); - - ASSERT_EQ(event.getX(0), copy.getX(0)); -} - -TEST_F(MotionEventTest, OffsetLocation) { - MotionEvent event; - initializeEventWithHistory(&event); - - event.offsetLocation(5.0f, -2.0f); - - ASSERT_EQ(X_OFFSET + 5.0f, event.getXOffset()); - ASSERT_EQ(Y_OFFSET - 2.0f, event.getYOffset()); -} - -TEST_F(MotionEventTest, Scale) { - MotionEvent event; - initializeEventWithHistory(&event); - - event.scale(2.0f); - - ASSERT_EQ(X_OFFSET * 2, event.getXOffset()); - ASSERT_EQ(Y_OFFSET * 2, event.getYOffset()); - - ASSERT_EQ(210 * 2, event.getRawX(0)); - ASSERT_EQ(211 * 2, event.getRawY(0)); - ASSERT_EQ((X_OFFSET + 210) * 2, event.getX(0)); - ASSERT_EQ((Y_OFFSET + 211) * 2, event.getY(0)); - ASSERT_EQ(212, event.getPressure(0)); - ASSERT_EQ(213, event.getSize(0)); - ASSERT_EQ(214 * 2, event.getTouchMajor(0)); - ASSERT_EQ(215 * 2, event.getTouchMinor(0)); - ASSERT_EQ(216 * 2, event.getToolMajor(0)); - ASSERT_EQ(217 * 2, event.getToolMinor(0)); - ASSERT_EQ(218, event.getOrientation(0)); -} - -TEST_F(MotionEventTest, Parcel) { - Parcel parcel; - - MotionEvent inEvent; - initializeEventWithHistory(&inEvent); - MotionEvent outEvent; - - // Round trip. - inEvent.writeToParcel(&parcel); - parcel.setDataPosition(0); - outEvent.readFromParcel(&parcel); - - ASSERT_NO_FATAL_FAILURE(assertEqualsEventWithHistory(&outEvent)); -} - -TEST_F(MotionEventTest, Transform) { - // Generate some points on a circle. - // Each point 'i' is a point on a circle of radius ROTATION centered at (3,2) at an angle - // of ARC * i degrees clockwise relative to the Y axis. - // The geometrical representation is irrelevant to the test, it's just easy to generate - // and check rotation. We set the orientation to the same angle. - // Coordinate system: down is increasing Y, right is increasing X. - const float PI_180 = float(M_PI / 180); - const float RADIUS = 10; - const float ARC = 36; - const float ROTATION = ARC * 2; - - const size_t pointerCount = 11; - PointerProperties pointerProperties[pointerCount]; - PointerCoords pointerCoords[pointerCount]; - for (size_t i = 0; i < pointerCount; i++) { - float angle = float(i * ARC * PI_180); - pointerProperties[i].clear(); - pointerProperties[i].id = i; - pointerCoords[i].clear(); - pointerCoords[i].setAxisValue(AMOTION_EVENT_AXIS_X, sinf(angle) * RADIUS + 3); - pointerCoords[i].setAxisValue(AMOTION_EVENT_AXIS_Y, -cosf(angle) * RADIUS + 2); - pointerCoords[i].setAxisValue(AMOTION_EVENT_AXIS_ORIENTATION, angle); - } - MotionEvent event; - event.initialize(0, 0, AMOTION_EVENT_ACTION_MOVE, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, pointerCount, pointerProperties, pointerCoords); - float originalRawX = 0 + 3; - float originalRawY = -RADIUS + 2; - - // Check original raw X and Y assumption. - ASSERT_NEAR(originalRawX, event.getRawX(0), 0.001); - ASSERT_NEAR(originalRawY, event.getRawY(0), 0.001); - - // Now translate the motion event so the circle's origin is at (0,0). - event.offsetLocation(-3, -2); - - // Offsetting the location should preserve the raw X and Y of the first point. - ASSERT_NEAR(originalRawX, event.getRawX(0), 0.001); - ASSERT_NEAR(originalRawY, event.getRawY(0), 0.001); - - // Apply a rotation about the origin by ROTATION degrees clockwise. - SkMatrix matrix; - matrix.setRotate(ROTATION); - event.transform(&matrix); - - // Check the points. - for (size_t i = 0; i < pointerCount; i++) { - float angle = float((i * ARC + ROTATION) * PI_180); - ASSERT_NEAR(sinf(angle) * RADIUS, event.getX(i), 0.001); - ASSERT_NEAR(-cosf(angle) * RADIUS, event.getY(i), 0.001); - ASSERT_NEAR(tanf(angle), tanf(event.getOrientation(i)), 0.1); - } - - // Applying the transformation should preserve the raw X and Y of the first point. - ASSERT_NEAR(originalRawX, event.getRawX(0), 0.001); - ASSERT_NEAR(originalRawY, event.getRawY(0), 0.001); -} - -} // namespace android diff --git a/libs/ui/tests/InputPublisherAndConsumer_test.cpp b/libs/ui/tests/InputPublisherAndConsumer_test.cpp deleted file mode 100644 index 3303053132..0000000000 --- a/libs/ui/tests/InputPublisherAndConsumer_test.cpp +++ /dev/null @@ -1,287 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include <ui/InputTransport.h> -#include <utils/Timers.h> -#include <utils/StopWatch.h> -#include <gtest/gtest.h> -#include <unistd.h> -#include <time.h> -#include <sys/mman.h> -#include <cutils/ashmem.h> - -#include "../../utils/tests/TestHelpers.h" - -namespace android { - -class InputPublisherAndConsumerTest : public testing::Test { -protected: - sp<InputChannel> serverChannel, clientChannel; - InputPublisher* mPublisher; - InputConsumer* mConsumer; - PreallocatedInputEventFactory mEventFactory; - - virtual void SetUp() { - status_t result = InputChannel::openInputChannelPair(String8("channel name"), - serverChannel, clientChannel); - - mPublisher = new InputPublisher(serverChannel); - mConsumer = new InputConsumer(clientChannel); - } - - virtual void TearDown() { - if (mPublisher) { - delete mPublisher; - mPublisher = NULL; - } - - if (mConsumer) { - delete mConsumer; - mConsumer = NULL; - } - - serverChannel.clear(); - clientChannel.clear(); - } - - void PublishAndConsumeKeyEvent(); - void PublishAndConsumeMotionEvent(); -}; - -TEST_F(InputPublisherAndConsumerTest, GetChannel_ReturnsTheChannel) { - EXPECT_EQ(serverChannel.get(), mPublisher->getChannel().get()); - EXPECT_EQ(clientChannel.get(), mConsumer->getChannel().get()); -} - -void InputPublisherAndConsumerTest::PublishAndConsumeKeyEvent() { - status_t status; - - const uint32_t seq = 15; - const int32_t deviceId = 1; - const int32_t source = AINPUT_SOURCE_KEYBOARD; - const int32_t action = AKEY_EVENT_ACTION_DOWN; - const int32_t flags = AKEY_EVENT_FLAG_FROM_SYSTEM; - const int32_t keyCode = AKEYCODE_ENTER; - const int32_t scanCode = 13; - const int32_t metaState = AMETA_ALT_LEFT_ON | AMETA_ALT_ON; - const int32_t repeatCount = 1; - const nsecs_t downTime = 3; - const nsecs_t eventTime = 4; - - status = mPublisher->publishKeyEvent(seq, deviceId, source, action, flags, - keyCode, scanCode, metaState, repeatCount, downTime, eventTime); - ASSERT_EQ(OK, status) - << "publisher publishKeyEvent should return OK"; - - uint32_t consumeSeq; - InputEvent* event; - status = mConsumer->consume(&mEventFactory, true /*consumeBatches*/, &consumeSeq, &event); - ASSERT_EQ(OK, status) - << "consumer consume should return OK"; - - ASSERT_TRUE(event != NULL) - << "consumer should have returned non-NULL event"; - ASSERT_EQ(AINPUT_EVENT_TYPE_KEY, event->getType()) - << "consumer should have returned a key event"; - - KeyEvent* keyEvent = static_cast<KeyEvent*>(event); - EXPECT_EQ(seq, consumeSeq); - EXPECT_EQ(deviceId, keyEvent->getDeviceId()); - EXPECT_EQ(source, keyEvent->getSource()); - EXPECT_EQ(action, keyEvent->getAction()); - EXPECT_EQ(flags, keyEvent->getFlags()); - EXPECT_EQ(keyCode, keyEvent->getKeyCode()); - EXPECT_EQ(scanCode, keyEvent->getScanCode()); - EXPECT_EQ(metaState, keyEvent->getMetaState()); - EXPECT_EQ(repeatCount, keyEvent->getRepeatCount()); - EXPECT_EQ(downTime, keyEvent->getDownTime()); - EXPECT_EQ(eventTime, keyEvent->getEventTime()); - - status = mConsumer->sendFinishedSignal(seq, true); - ASSERT_EQ(OK, status) - << "consumer sendFinishedSignal should return OK"; - - uint32_t finishedSeq = 0; - bool handled = false; - status = mPublisher->receiveFinishedSignal(&finishedSeq, &handled); - ASSERT_EQ(OK, status) - << "publisher receiveFinishedSignal should return OK"; - ASSERT_EQ(seq, finishedSeq) - << "publisher receiveFinishedSignal should have returned the original sequence number"; - ASSERT_TRUE(handled) - << "publisher receiveFinishedSignal should have set handled to consumer's reply"; -} - -void InputPublisherAndConsumerTest::PublishAndConsumeMotionEvent() { - status_t status; - - const uint32_t seq = 15; - const int32_t deviceId = 1; - const int32_t source = AINPUT_SOURCE_TOUCHSCREEN; - const int32_t action = AMOTION_EVENT_ACTION_MOVE; - const int32_t flags = AMOTION_EVENT_FLAG_WINDOW_IS_OBSCURED; - const int32_t edgeFlags = AMOTION_EVENT_EDGE_FLAG_TOP; - const int32_t metaState = AMETA_ALT_LEFT_ON | AMETA_ALT_ON; - const int32_t buttonState = AMOTION_EVENT_BUTTON_PRIMARY; - const float xOffset = -10; - const float yOffset = -20; - const float xPrecision = 0.25; - const float yPrecision = 0.5; - const nsecs_t downTime = 3; - const size_t pointerCount = 3; - const nsecs_t eventTime = 4; - PointerProperties pointerProperties[pointerCount]; - PointerCoords pointerCoords[pointerCount]; - for (size_t i = 0; i < pointerCount; i++) { - pointerProperties[i].clear(); - pointerProperties[i].id = (i + 2) % pointerCount; - pointerProperties[i].toolType = AMOTION_EVENT_TOOL_TYPE_FINGER; - - pointerCoords[i].clear(); - pointerCoords[i].setAxisValue(AMOTION_EVENT_AXIS_X, 100 * i); - pointerCoords[i].setAxisValue(AMOTION_EVENT_AXIS_Y, 200 * i); - pointerCoords[i].setAxisValue(AMOTION_EVENT_AXIS_PRESSURE, 0.5 * i); - pointerCoords[i].setAxisValue(AMOTION_EVENT_AXIS_SIZE, 0.7 * i); - pointerCoords[i].setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR, 1.5 * i); - pointerCoords[i].setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR, 1.7 * i); - pointerCoords[i].setAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR, 2.5 * i); - pointerCoords[i].setAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR, 2.7 * i); - pointerCoords[i].setAxisValue(AMOTION_EVENT_AXIS_ORIENTATION, 3.5 * i); - } - - status = mPublisher->publishMotionEvent(seq, deviceId, source, action, flags, edgeFlags, - metaState, buttonState, xOffset, yOffset, xPrecision, yPrecision, - downTime, eventTime, pointerCount, - pointerProperties, pointerCoords); - ASSERT_EQ(OK, status) - << "publisher publishMotionEvent should return OK"; - - uint32_t consumeSeq; - InputEvent* event; - status = mConsumer->consume(&mEventFactory, true /*consumeBatches*/, &consumeSeq, &event); - ASSERT_EQ(OK, status) - << "consumer consume should return OK"; - - ASSERT_TRUE(event != NULL) - << "consumer should have returned non-NULL event"; - ASSERT_EQ(AINPUT_EVENT_TYPE_MOTION, event->getType()) - << "consumer should have returned a motion event"; - - MotionEvent* motionEvent = static_cast<MotionEvent*>(event); - EXPECT_EQ(seq, consumeSeq); - EXPECT_EQ(deviceId, motionEvent->getDeviceId()); - EXPECT_EQ(source, motionEvent->getSource()); - EXPECT_EQ(action, motionEvent->getAction()); - EXPECT_EQ(flags, motionEvent->getFlags()); - EXPECT_EQ(edgeFlags, motionEvent->getEdgeFlags()); - EXPECT_EQ(metaState, motionEvent->getMetaState()); - EXPECT_EQ(buttonState, motionEvent->getButtonState()); - EXPECT_EQ(xPrecision, motionEvent->getXPrecision()); - EXPECT_EQ(yPrecision, motionEvent->getYPrecision()); - EXPECT_EQ(downTime, motionEvent->getDownTime()); - EXPECT_EQ(eventTime, motionEvent->getEventTime()); - EXPECT_EQ(pointerCount, motionEvent->getPointerCount()); - EXPECT_EQ(0U, motionEvent->getHistorySize()); - - for (size_t i = 0; i < pointerCount; i++) { - SCOPED_TRACE(i); - EXPECT_EQ(pointerProperties[i].id, motionEvent->getPointerId(i)); - EXPECT_EQ(pointerProperties[i].toolType, motionEvent->getToolType(i)); - - EXPECT_EQ(pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_X), - motionEvent->getRawX(i)); - EXPECT_EQ(pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_Y), - motionEvent->getRawY(i)); - EXPECT_EQ(pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_X) + xOffset, - motionEvent->getX(i)); - EXPECT_EQ(pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_Y) + yOffset, - motionEvent->getY(i)); - EXPECT_EQ(pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_PRESSURE), - motionEvent->getPressure(i)); - EXPECT_EQ(pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_SIZE), - motionEvent->getSize(i)); - EXPECT_EQ(pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR), - motionEvent->getTouchMajor(i)); - EXPECT_EQ(pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR), - motionEvent->getTouchMinor(i)); - EXPECT_EQ(pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR), - motionEvent->getToolMajor(i)); - EXPECT_EQ(pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR), - motionEvent->getToolMinor(i)); - EXPECT_EQ(pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_ORIENTATION), - motionEvent->getOrientation(i)); - } - - status = mConsumer->sendFinishedSignal(seq, false); - ASSERT_EQ(OK, status) - << "consumer sendFinishedSignal should return OK"; - - uint32_t finishedSeq = 0; - bool handled = true; - status = mPublisher->receiveFinishedSignal(&finishedSeq, &handled); - ASSERT_EQ(OK, status) - << "publisher receiveFinishedSignal should return OK"; - ASSERT_EQ(seq, finishedSeq) - << "publisher receiveFinishedSignal should have returned the original sequence number"; - ASSERT_FALSE(handled) - << "publisher receiveFinishedSignal should have set handled to consumer's reply"; -} - -TEST_F(InputPublisherAndConsumerTest, PublishKeyEvent_EndToEnd) { - ASSERT_NO_FATAL_FAILURE(PublishAndConsumeKeyEvent()); -} - -TEST_F(InputPublisherAndConsumerTest, PublishMotionEvent_EndToEnd) { - ASSERT_NO_FATAL_FAILURE(PublishAndConsumeMotionEvent()); -} - -TEST_F(InputPublisherAndConsumerTest, PublishMotionEvent_WhenPointerCountLessThan1_ReturnsError) { - status_t status; - const size_t pointerCount = 0; - PointerProperties pointerProperties[pointerCount]; - PointerCoords pointerCoords[pointerCount]; - - status = mPublisher->publishMotionEvent(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - pointerCount, pointerProperties, pointerCoords); - ASSERT_EQ(BAD_VALUE, status) - << "publisher publishMotionEvent should return BAD_VALUE"; -} - -TEST_F(InputPublisherAndConsumerTest, PublishMotionEvent_WhenPointerCountGreaterThanMax_ReturnsError) { - status_t status; - const size_t pointerCount = MAX_POINTERS + 1; - PointerProperties pointerProperties[pointerCount]; - PointerCoords pointerCoords[pointerCount]; - for (size_t i = 0; i < pointerCount; i++) { - pointerProperties[i].clear(); - pointerCoords[i].clear(); - } - - status = mPublisher->publishMotionEvent(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - pointerCount, pointerProperties, pointerCoords); - ASSERT_EQ(BAD_VALUE, status) - << "publisher publishMotionEvent should return BAD_VALUE"; -} - -TEST_F(InputPublisherAndConsumerTest, PublishMultipleEvents_EndToEnd) { - ASSERT_NO_FATAL_FAILURE(PublishAndConsumeMotionEvent()); - ASSERT_NO_FATAL_FAILURE(PublishAndConsumeKeyEvent()); - ASSERT_NO_FATAL_FAILURE(PublishAndConsumeMotionEvent()); - ASSERT_NO_FATAL_FAILURE(PublishAndConsumeMotionEvent()); - ASSERT_NO_FATAL_FAILURE(PublishAndConsumeKeyEvent()); -} - -} // namespace android diff --git a/libs/utils/Android.mk b/libs/utils/Android.mk index 24cf5048fa..a96c8e604d 100644 --- a/libs/utils/Android.mk +++ b/libs/utils/Android.mk @@ -18,9 +18,6 @@ LOCAL_PATH:= $(call my-dir) # and once for the device. commonSources:= \ - Asset.cpp \ - AssetDir.cpp \ - AssetManager.cpp \ BasicHashtable.cpp \ BlobCache.cpp \ BufferedTextOutput.cpp \ @@ -29,14 +26,11 @@ commonSources:= \ FileMap.cpp \ Flattenable.cpp \ LinearTransform.cpp \ - ObbFile.cpp \ PropertyMap.cpp \ RefBase.cpp \ - ResourceTypes.cpp \ SharedBuffer.cpp \ Static.cpp \ StopWatch.cpp \ - StreamingZipInflater.cpp \ String8.cpp \ String16.cpp \ StringArray.cpp \ @@ -47,9 +41,6 @@ commonSources:= \ Tokenizer.cpp \ Unicode.cpp \ VectorImpl.cpp \ - ZipFileCRO.cpp \ - ZipFileRO.cpp \ - ZipUtils.cpp \ misc.cpp @@ -63,7 +54,6 @@ LOCAL_SRC_FILES:= $(commonSources) LOCAL_MODULE:= libutils LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS) -LOCAL_C_INCLUDES += external/zlib ifeq ($(HOST_OS),windows) ifeq ($(strip $(USE_CYGWIN),),) @@ -79,7 +69,6 @@ endif include $(BUILD_HOST_STATIC_LIBRARY) - # For the device # ===================================================== include $(CLEAR_VARS) @@ -88,8 +77,6 @@ include $(CLEAR_VARS) # we have the common sources, plus some device-specific stuff LOCAL_SRC_FILES:= \ $(commonSources) \ - BackupData.cpp \ - BackupHelpers.cpp \ Looper.cpp ifeq ($(TARGET_OS),linux) @@ -97,14 +84,11 @@ LOCAL_LDLIBS += -lrt -ldl endif LOCAL_C_INCLUDES += \ - external/zlib \ - external/icu4c/common \ bionic/libc/private LOCAL_LDLIBS += -lpthread LOCAL_SHARED_LIBRARIES := \ - libz \ liblog \ libcutils \ libdl \ @@ -113,19 +97,6 @@ LOCAL_SHARED_LIBRARIES := \ LOCAL_MODULE:= libutils include $(BUILD_SHARED_LIBRARY) -ifeq ($(TARGET_OS),linux) -include $(CLEAR_VARS) -LOCAL_C_INCLUDES += \ - external/zlib \ - external/icu4c/common \ - bionic/libc/private -LOCAL_LDLIBS := -lrt -ldl -lpthread -LOCAL_MODULE := libutils -LOCAL_SRC_FILES := $(commonSources) BackupData.cpp BackupHelpers.cpp -include $(BUILD_STATIC_LIBRARY) -endif - - # Include subdirectory makefiles # ============================================================ diff --git a/libs/utils/Asset.cpp b/libs/utils/Asset.cpp deleted file mode 100644 index 50e701aa8d..0000000000 --- a/libs/utils/Asset.cpp +++ /dev/null @@ -1,897 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// -// Provide access to a read-only asset. -// - -#define LOG_TAG "asset" -//#define NDEBUG 0 - -#include <utils/Asset.h> -#include <utils/Atomic.h> -#include <utils/FileMap.h> -#include <utils/StreamingZipInflater.h> -#include <utils/ZipUtils.h> -#include <utils/ZipFileRO.h> -#include <utils/Log.h> -#include <utils/threads.h> - -#include <string.h> -#include <memory.h> -#include <fcntl.h> -#include <errno.h> -#include <assert.h> -#include <unistd.h> -#include <sys/stat.h> -#include <sys/types.h> - -using namespace android; - -#ifndef O_BINARY -# define O_BINARY 0 -#endif - -static Mutex gAssetLock; -static int32_t gCount = 0; -static Asset* gHead = NULL; -static Asset* gTail = NULL; - -int32_t Asset::getGlobalCount() -{ - AutoMutex _l(gAssetLock); - return gCount; -} - -String8 Asset::getAssetAllocations() -{ - AutoMutex _l(gAssetLock); - String8 res; - Asset* cur = gHead; - while (cur != NULL) { - if (cur->isAllocated()) { - res.append(" "); - res.append(cur->getAssetSource()); - off64_t size = (cur->getLength()+512)/1024; - char buf[64]; - sprintf(buf, ": %dK\n", (int)size); - res.append(buf); - } - cur = cur->mNext; - } - - return res; -} - -Asset::Asset(void) - : mAccessMode(ACCESS_UNKNOWN) -{ - AutoMutex _l(gAssetLock); - gCount++; - mNext = mPrev = NULL; - if (gTail == NULL) { - gHead = gTail = this; - } else { - mPrev = gTail; - gTail->mNext = this; - gTail = this; - } - //ALOGI("Creating Asset %p #%d\n", this, gCount); -} - -Asset::~Asset(void) -{ - AutoMutex _l(gAssetLock); - gCount--; - if (gHead == this) { - gHead = mNext; - } - if (gTail == this) { - gTail = mPrev; - } - if (mNext != NULL) { - mNext->mPrev = mPrev; - } - if (mPrev != NULL) { - mPrev->mNext = mNext; - } - mNext = mPrev = NULL; - //ALOGI("Destroying Asset in %p #%d\n", this, gCount); -} - -/* - * Create a new Asset from a file on disk. There is a fair chance that - * the file doesn't actually exist. - * - * We can use "mode" to decide how we want to go about it. - */ -/*static*/ Asset* Asset::createFromFile(const char* fileName, AccessMode mode) -{ - _FileAsset* pAsset; - status_t result; - off64_t length; - int fd; - - fd = open(fileName, O_RDONLY | O_BINARY); - if (fd < 0) - return NULL; - - /* - * Under Linux, the lseek fails if we actually opened a directory. To - * be correct we should test the file type explicitly, but since we - * always open things read-only it doesn't really matter, so there's - * no value in incurring the extra overhead of an fstat() call. - */ - // TODO(kroot): replace this with fstat despite the plea above. -#if 1 - length = lseek64(fd, 0, SEEK_END); - if (length < 0) { - ::close(fd); - return NULL; - } - (void) lseek64(fd, 0, SEEK_SET); -#else - struct stat st; - if (fstat(fd, &st) < 0) { - ::close(fd); - return NULL; - } - - if (!S_ISREG(st.st_mode)) { - ::close(fd); - return NULL; - } -#endif - - pAsset = new _FileAsset; - result = pAsset->openChunk(fileName, fd, 0, length); - if (result != NO_ERROR) { - delete pAsset; - return NULL; - } - - pAsset->mAccessMode = mode; - return pAsset; -} - - -/* - * Create a new Asset from a compressed file on disk. There is a fair chance - * that the file doesn't actually exist. - * - * We currently support gzip files. We might want to handle .bz2 someday. - */ -/*static*/ Asset* Asset::createFromCompressedFile(const char* fileName, - AccessMode mode) -{ - _CompressedAsset* pAsset; - status_t result; - off64_t fileLen; - bool scanResult; - long offset; - int method; - long uncompressedLen, compressedLen; - int fd; - - fd = open(fileName, O_RDONLY | O_BINARY); - if (fd < 0) - return NULL; - - fileLen = lseek(fd, 0, SEEK_END); - if (fileLen < 0) { - ::close(fd); - return NULL; - } - (void) lseek(fd, 0, SEEK_SET); - - /* want buffered I/O for the file scan; must dup so fclose() is safe */ - FILE* fp = fdopen(dup(fd), "rb"); - if (fp == NULL) { - ::close(fd); - return NULL; - } - - unsigned long crc32; - scanResult = ZipUtils::examineGzip(fp, &method, &uncompressedLen, - &compressedLen, &crc32); - offset = ftell(fp); - fclose(fp); - if (!scanResult) { - ALOGD("File '%s' is not in gzip format\n", fileName); - ::close(fd); - return NULL; - } - - pAsset = new _CompressedAsset; - result = pAsset->openChunk(fd, offset, method, uncompressedLen, - compressedLen); - if (result != NO_ERROR) { - delete pAsset; - return NULL; - } - - pAsset->mAccessMode = mode; - return pAsset; -} - - -#if 0 -/* - * Create a new Asset from part of an open file. - */ -/*static*/ Asset* Asset::createFromFileSegment(int fd, off64_t offset, - size_t length, AccessMode mode) -{ - _FileAsset* pAsset; - status_t result; - - pAsset = new _FileAsset; - result = pAsset->openChunk(NULL, fd, offset, length); - if (result != NO_ERROR) - return NULL; - - pAsset->mAccessMode = mode; - return pAsset; -} - -/* - * Create a new Asset from compressed data in an open file. - */ -/*static*/ Asset* Asset::createFromCompressedData(int fd, off64_t offset, - int compressionMethod, size_t uncompressedLen, size_t compressedLen, - AccessMode mode) -{ - _CompressedAsset* pAsset; - status_t result; - - pAsset = new _CompressedAsset; - result = pAsset->openChunk(fd, offset, compressionMethod, - uncompressedLen, compressedLen); - if (result != NO_ERROR) - return NULL; - - pAsset->mAccessMode = mode; - return pAsset; -} -#endif - -/* - * Create a new Asset from a memory mapping. - */ -/*static*/ Asset* Asset::createFromUncompressedMap(FileMap* dataMap, - AccessMode mode) -{ - _FileAsset* pAsset; - status_t result; - - pAsset = new _FileAsset; - result = pAsset->openChunk(dataMap); - if (result != NO_ERROR) - return NULL; - - pAsset->mAccessMode = mode; - return pAsset; -} - -/* - * Create a new Asset from compressed data in a memory mapping. - */ -/*static*/ Asset* Asset::createFromCompressedMap(FileMap* dataMap, - int method, size_t uncompressedLen, AccessMode mode) -{ - _CompressedAsset* pAsset; - status_t result; - - pAsset = new _CompressedAsset; - result = pAsset->openChunk(dataMap, method, uncompressedLen); - if (result != NO_ERROR) - return NULL; - - pAsset->mAccessMode = mode; - return pAsset; -} - - -/* - * Do generic seek() housekeeping. Pass in the offset/whence values from - * the seek request, along with the current chunk offset and the chunk - * length. - * - * Returns the new chunk offset, or -1 if the seek is illegal. - */ -off64_t Asset::handleSeek(off64_t offset, int whence, off64_t curPosn, off64_t maxPosn) -{ - off64_t newOffset; - - switch (whence) { - case SEEK_SET: - newOffset = offset; - break; - case SEEK_CUR: - newOffset = curPosn + offset; - break; - case SEEK_END: - newOffset = maxPosn + offset; - break; - default: - ALOGW("unexpected whence %d\n", whence); - // this was happening due to an off64_t size mismatch - assert(false); - return (off64_t) -1; - } - - if (newOffset < 0 || newOffset > maxPosn) { - ALOGW("seek out of range: want %ld, end=%ld\n", - (long) newOffset, (long) maxPosn); - return (off64_t) -1; - } - - return newOffset; -} - - -/* - * =========================================================================== - * _FileAsset - * =========================================================================== - */ - -/* - * Constructor. - */ -_FileAsset::_FileAsset(void) - : mStart(0), mLength(0), mOffset(0), mFp(NULL), mFileName(NULL), mMap(NULL), mBuf(NULL) -{ -} - -/* - * Destructor. Release resources. - */ -_FileAsset::~_FileAsset(void) -{ - close(); -} - -/* - * Operate on a chunk of an uncompressed file. - * - * Zero-length chunks are allowed. - */ -status_t _FileAsset::openChunk(const char* fileName, int fd, off64_t offset, size_t length) -{ - assert(mFp == NULL); // no reopen - assert(mMap == NULL); - assert(fd >= 0); - assert(offset >= 0); - - /* - * Seek to end to get file length. - */ - off64_t fileLength; - fileLength = lseek64(fd, 0, SEEK_END); - if (fileLength == (off64_t) -1) { - // probably a bad file descriptor - ALOGD("failed lseek (errno=%d)\n", errno); - return UNKNOWN_ERROR; - } - - if ((off64_t) (offset + length) > fileLength) { - ALOGD("start (%ld) + len (%ld) > end (%ld)\n", - (long) offset, (long) length, (long) fileLength); - return BAD_INDEX; - } - - /* after fdopen, the fd will be closed on fclose() */ - mFp = fdopen(fd, "rb"); - if (mFp == NULL) - return UNKNOWN_ERROR; - - mStart = offset; - mLength = length; - assert(mOffset == 0); - - /* seek the FILE* to the start of chunk */ - if (fseek(mFp, mStart, SEEK_SET) != 0) { - assert(false); - } - - mFileName = fileName != NULL ? strdup(fileName) : NULL; - - return NO_ERROR; -} - -/* - * Create the chunk from the map. - */ -status_t _FileAsset::openChunk(FileMap* dataMap) -{ - assert(mFp == NULL); // no reopen - assert(mMap == NULL); - assert(dataMap != NULL); - - mMap = dataMap; - mStart = -1; // not used - mLength = dataMap->getDataLength(); - assert(mOffset == 0); - - return NO_ERROR; -} - -/* - * Read a chunk of data. - */ -ssize_t _FileAsset::read(void* buf, size_t count) -{ - size_t maxLen; - size_t actual; - - assert(mOffset >= 0 && mOffset <= mLength); - - if (getAccessMode() == ACCESS_BUFFER) { - /* - * On first access, read or map the entire file. The caller has - * requested buffer access, either because they're going to be - * using the buffer or because what they're doing has appropriate - * performance needs and access patterns. - */ - if (mBuf == NULL) - getBuffer(false); - } - - /* adjust count if we're near EOF */ - maxLen = mLength - mOffset; - if (count > maxLen) - count = maxLen; - - if (!count) - return 0; - - if (mMap != NULL) { - /* copy from mapped area */ - //printf("map read\n"); - memcpy(buf, (char*)mMap->getDataPtr() + mOffset, count); - actual = count; - } else if (mBuf != NULL) { - /* copy from buffer */ - //printf("buf read\n"); - memcpy(buf, (char*)mBuf + mOffset, count); - actual = count; - } else { - /* read from the file */ - //printf("file read\n"); - if (ftell(mFp) != mStart + mOffset) { - ALOGE("Hosed: %ld != %ld+%ld\n", - ftell(mFp), (long) mStart, (long) mOffset); - assert(false); - } - - /* - * This returns 0 on error or eof. We need to use ferror() or feof() - * to tell the difference, but we don't currently have those on the - * device. However, we know how much data is *supposed* to be in the - * file, so if we don't read the full amount we know something is - * hosed. - */ - actual = fread(buf, 1, count, mFp); - if (actual == 0) // something failed -- I/O error? - return -1; - - assert(actual == count); - } - - mOffset += actual; - return actual; -} - -/* - * Seek to a new position. - */ -off64_t _FileAsset::seek(off64_t offset, int whence) -{ - off64_t newPosn; - off64_t actualOffset; - - // compute new position within chunk - newPosn = handleSeek(offset, whence, mOffset, mLength); - if (newPosn == (off64_t) -1) - return newPosn; - - actualOffset = mStart + newPosn; - - if (mFp != NULL) { - if (fseek(mFp, (long) actualOffset, SEEK_SET) != 0) - return (off64_t) -1; - } - - mOffset = actualOffset - mStart; - return mOffset; -} - -/* - * Close the asset. - */ -void _FileAsset::close(void) -{ - if (mMap != NULL) { - mMap->release(); - mMap = NULL; - } - if (mBuf != NULL) { - delete[] mBuf; - mBuf = NULL; - } - - if (mFileName != NULL) { - free(mFileName); - mFileName = NULL; - } - - if (mFp != NULL) { - // can only be NULL when called from destructor - // (otherwise we would never return this object) - fclose(mFp); - mFp = NULL; - } -} - -/* - * Return a read-only pointer to a buffer. - * - * We can either read the whole thing in or map the relevant piece of - * the source file. Ideally a map would be established at a higher - * level and we'd be using a different object, but we didn't, so we - * deal with it here. - */ -const void* _FileAsset::getBuffer(bool wordAligned) -{ - /* subsequent requests just use what we did previously */ - if (mBuf != NULL) - return mBuf; - if (mMap != NULL) { - if (!wordAligned) { - return mMap->getDataPtr(); - } - return ensureAlignment(mMap); - } - - assert(mFp != NULL); - - if (mLength < kReadVsMapThreshold) { - unsigned char* buf; - long allocLen; - - /* zero-length files are allowed; not sure about zero-len allocs */ - /* (works fine with gcc + x86linux) */ - allocLen = mLength; - if (mLength == 0) - allocLen = 1; - - buf = new unsigned char[allocLen]; - if (buf == NULL) { - ALOGE("alloc of %ld bytes failed\n", (long) allocLen); - return NULL; - } - - ALOGV("Asset %p allocating buffer size %d (smaller than threshold)", this, (int)allocLen); - if (mLength > 0) { - long oldPosn = ftell(mFp); - fseek(mFp, mStart, SEEK_SET); - if (fread(buf, 1, mLength, mFp) != (size_t) mLength) { - ALOGE("failed reading %ld bytes\n", (long) mLength); - delete[] buf; - return NULL; - } - fseek(mFp, oldPosn, SEEK_SET); - } - - ALOGV(" getBuffer: loaded into buffer\n"); - - mBuf = buf; - return mBuf; - } else { - FileMap* map; - - map = new FileMap; - if (!map->create(NULL, fileno(mFp), mStart, mLength, true)) { - map->release(); - return NULL; - } - - ALOGV(" getBuffer: mapped\n"); - - mMap = map; - if (!wordAligned) { - return mMap->getDataPtr(); - } - return ensureAlignment(mMap); - } -} - -int _FileAsset::openFileDescriptor(off64_t* outStart, off64_t* outLength) const -{ - if (mMap != NULL) { - const char* fname = mMap->getFileName(); - if (fname == NULL) { - fname = mFileName; - } - if (fname == NULL) { - return -1; - } - *outStart = mMap->getDataOffset(); - *outLength = mMap->getDataLength(); - return open(fname, O_RDONLY | O_BINARY); - } - if (mFileName == NULL) { - return -1; - } - *outStart = mStart; - *outLength = mLength; - return open(mFileName, O_RDONLY | O_BINARY); -} - -const void* _FileAsset::ensureAlignment(FileMap* map) -{ - void* data = map->getDataPtr(); - if ((((size_t)data)&0x3) == 0) { - // We can return this directly if it is aligned on a word - // boundary. - ALOGV("Returning aligned FileAsset %p (%s).", this, - getAssetSource()); - return data; - } - // If not aligned on a word boundary, then we need to copy it into - // our own buffer. - ALOGV("Copying FileAsset %p (%s) to buffer size %d to make it aligned.", this, - getAssetSource(), (int)mLength); - unsigned char* buf = new unsigned char[mLength]; - if (buf == NULL) { - ALOGE("alloc of %ld bytes failed\n", (long) mLength); - return NULL; - } - memcpy(buf, data, mLength); - mBuf = buf; - return buf; -} - -/* - * =========================================================================== - * _CompressedAsset - * =========================================================================== - */ - -/* - * Constructor. - */ -_CompressedAsset::_CompressedAsset(void) - : mStart(0), mCompressedLen(0), mUncompressedLen(0), mOffset(0), - mMap(NULL), mFd(-1), mZipInflater(NULL), mBuf(NULL) -{ -} - -/* - * Destructor. Release resources. - */ -_CompressedAsset::~_CompressedAsset(void) -{ - close(); -} - -/* - * Open a chunk of compressed data inside a file. - * - * This currently just sets up some values and returns. On the first - * read, we expand the entire file into a buffer and return data from it. - */ -status_t _CompressedAsset::openChunk(int fd, off64_t offset, - int compressionMethod, size_t uncompressedLen, size_t compressedLen) -{ - assert(mFd < 0); // no re-open - assert(mMap == NULL); - assert(fd >= 0); - assert(offset >= 0); - assert(compressedLen > 0); - - if (compressionMethod != ZipFileRO::kCompressDeflated) { - assert(false); - return UNKNOWN_ERROR; - } - - mStart = offset; - mCompressedLen = compressedLen; - mUncompressedLen = uncompressedLen; - assert(mOffset == 0); - mFd = fd; - assert(mBuf == NULL); - - if (uncompressedLen > StreamingZipInflater::OUTPUT_CHUNK_SIZE) { - mZipInflater = new StreamingZipInflater(mFd, offset, uncompressedLen, compressedLen); - } - - return NO_ERROR; -} - -/* - * Open a chunk of compressed data in a mapped region. - * - * Nothing is expanded until the first read call. - */ -status_t _CompressedAsset::openChunk(FileMap* dataMap, int compressionMethod, - size_t uncompressedLen) -{ - assert(mFd < 0); // no re-open - assert(mMap == NULL); - assert(dataMap != NULL); - - if (compressionMethod != ZipFileRO::kCompressDeflated) { - assert(false); - return UNKNOWN_ERROR; - } - - mMap = dataMap; - mStart = -1; // not used - mCompressedLen = dataMap->getDataLength(); - mUncompressedLen = uncompressedLen; - assert(mOffset == 0); - - if (uncompressedLen > StreamingZipInflater::OUTPUT_CHUNK_SIZE) { - mZipInflater = new StreamingZipInflater(dataMap, uncompressedLen); - } - return NO_ERROR; -} - -/* - * Read data from a chunk of compressed data. - * - * [For now, that's just copying data out of a buffer.] - */ -ssize_t _CompressedAsset::read(void* buf, size_t count) -{ - size_t maxLen; - size_t actual; - - assert(mOffset >= 0 && mOffset <= mUncompressedLen); - - /* If we're relying on a streaming inflater, go through that */ - if (mZipInflater) { - actual = mZipInflater->read(buf, count); - } else { - if (mBuf == NULL) { - if (getBuffer(false) == NULL) - return -1; - } - assert(mBuf != NULL); - - /* adjust count if we're near EOF */ - maxLen = mUncompressedLen - mOffset; - if (count > maxLen) - count = maxLen; - - if (!count) - return 0; - - /* copy from buffer */ - //printf("comp buf read\n"); - memcpy(buf, (char*)mBuf + mOffset, count); - actual = count; - } - - mOffset += actual; - return actual; -} - -/* - * Handle a seek request. - * - * If we're working in a streaming mode, this is going to be fairly - * expensive, because it requires plowing through a bunch of compressed - * data. - */ -off64_t _CompressedAsset::seek(off64_t offset, int whence) -{ - off64_t newPosn; - - // compute new position within chunk - newPosn = handleSeek(offset, whence, mOffset, mUncompressedLen); - if (newPosn == (off64_t) -1) - return newPosn; - - if (mZipInflater) { - mZipInflater->seekAbsolute(newPosn); - } - mOffset = newPosn; - return mOffset; -} - -/* - * Close the asset. - */ -void _CompressedAsset::close(void) -{ - if (mMap != NULL) { - mMap->release(); - mMap = NULL; - } - - delete[] mBuf; - mBuf = NULL; - - delete mZipInflater; - mZipInflater = NULL; - - if (mFd > 0) { - ::close(mFd); - mFd = -1; - } -} - -/* - * Get a pointer to a read-only buffer of data. - * - * The first time this is called, we expand the compressed data into a - * buffer. - */ -const void* _CompressedAsset::getBuffer(bool wordAligned) -{ - unsigned char* buf = NULL; - - if (mBuf != NULL) - return mBuf; - - /* - * Allocate a buffer and read the file into it. - */ - buf = new unsigned char[mUncompressedLen]; - if (buf == NULL) { - ALOGW("alloc %ld bytes failed\n", (long) mUncompressedLen); - goto bail; - } - - if (mMap != NULL) { - if (!ZipFileRO::inflateBuffer(buf, mMap->getDataPtr(), - mUncompressedLen, mCompressedLen)) - goto bail; - } else { - assert(mFd >= 0); - - /* - * Seek to the start of the compressed data. - */ - if (lseek(mFd, mStart, SEEK_SET) != mStart) - goto bail; - - /* - * Expand the data into it. - */ - if (!ZipUtils::inflateToBuffer(mFd, buf, mUncompressedLen, - mCompressedLen)) - goto bail; - } - - /* - * Success - now that we have the full asset in RAM we - * no longer need the streaming inflater - */ - delete mZipInflater; - mZipInflater = NULL; - - mBuf = buf; - buf = NULL; - -bail: - delete[] buf; - return mBuf; -} - diff --git a/libs/utils/AssetDir.cpp b/libs/utils/AssetDir.cpp deleted file mode 100644 index c5f664eccf..0000000000 --- a/libs/utils/AssetDir.cpp +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// -// Provide access to a virtual directory in "asset space". Most of the -// implementation is in the header file or in friend functions in -// AssetManager. -// -#include <utils/AssetDir.h> - -using namespace android; - - -/* - * Find a matching entry in a vector of FileInfo. Because it's sorted, we - * can use a binary search. - * - * Assumes the vector is sorted in ascending order. - */ -/*static*/ int AssetDir::FileInfo::findEntry(const SortedVector<FileInfo>* pVector, - const String8& fileName) -{ - FileInfo tmpInfo; - - tmpInfo.setFileName(fileName); - return pVector->indexOf(tmpInfo); - -#if 0 // don't need this after all (uses 1/2 compares of SortedVector though) - int lo, hi, cur; - - lo = 0; - hi = pVector->size() -1; - while (lo <= hi) { - int cmp; - - cur = (hi + lo) / 2; - cmp = strcmp(pVector->itemAt(cur).getFileName(), fileName); - if (cmp == 0) { - /* match, bail */ - return cur; - } else if (cmp < 0) { - /* too low */ - lo = cur + 1; - } else { - /* too high */ - hi = cur -1; - } - } - - return -1; -#endif -} - diff --git a/libs/utils/AssetManager.cpp b/libs/utils/AssetManager.cpp deleted file mode 100644 index 47a2b9953f..0000000000 --- a/libs/utils/AssetManager.cpp +++ /dev/null @@ -1,2001 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// -// Provide access to read-only assets. -// - -#define LOG_TAG "asset" -//#define LOG_NDEBUG 0 - -#include <utils/AssetManager.h> -#include <utils/AssetDir.h> -#include <utils/Asset.h> -#include <utils/Atomic.h> -#include <utils/String8.h> -#include <utils/ResourceTypes.h> -#include <utils/String8.h> -#include <utils/ZipFileRO.h> -#include <utils/Log.h> -#include <utils/Timers.h> -#include <utils/threads.h> - -#include <dirent.h> -#include <errno.h> -#include <assert.h> -#include <strings.h> -#include <fcntl.h> -#include <sys/stat.h> -#include <unistd.h> - -#ifndef TEMP_FAILURE_RETRY -/* Used to retry syscalls that can return EINTR. */ -#define TEMP_FAILURE_RETRY(exp) ({ \ - typeof (exp) _rc; \ - do { \ - _rc = (exp); \ - } while (_rc == -1 && errno == EINTR); \ - _rc; }) -#endif - -using namespace android; - -/* - * Names for default app, locale, and vendor. We might want to change - * these to be an actual locale, e.g. always use en-US as the default. - */ -static const char* kDefaultLocale = "default"; -static const char* kDefaultVendor = "default"; -static const char* kAssetsRoot = "assets"; -static const char* kAppZipName = NULL; //"classes.jar"; -static const char* kSystemAssets = "framework/framework-res.apk"; -static const char* kIdmapCacheDir = "resource-cache"; - -static const char* kExcludeExtension = ".EXCLUDE"; - -static Asset* const kExcludedAsset = (Asset*) 0xd000000d; - -static volatile int32_t gCount = 0; - -namespace { - // Transform string /a/b/c.apk to /data/resource-cache/a@b@c.apk@idmap - String8 idmapPathForPackagePath(const String8& pkgPath) - { - const char* root = getenv("ANDROID_DATA"); - LOG_ALWAYS_FATAL_IF(root == NULL, "ANDROID_DATA not set"); - String8 path(root); - path.appendPath(kIdmapCacheDir); - - char buf[256]; // 256 chars should be enough for anyone... - strncpy(buf, pkgPath.string(), 255); - buf[255] = '\0'; - char* filename = buf; - while (*filename && *filename == '/') { - ++filename; - } - char* p = filename; - while (*p) { - if (*p == '/') { - *p = '@'; - } - ++p; - } - path.appendPath(filename); - path.append("@idmap"); - - return path; - } -} - -/* - * =========================================================================== - * AssetManager - * =========================================================================== - */ - -int32_t AssetManager::getGlobalCount() -{ - return gCount; -} - -AssetManager::AssetManager(CacheMode cacheMode) - : mLocale(NULL), mVendor(NULL), - mResources(NULL), mConfig(new ResTable_config), - mCacheMode(cacheMode), mCacheValid(false) -{ - int count = android_atomic_inc(&gCount)+1; - //ALOGI("Creating AssetManager %p #%d\n", this, count); - memset(mConfig, 0, sizeof(ResTable_config)); -} - -AssetManager::~AssetManager(void) -{ - int count = android_atomic_dec(&gCount); - //ALOGI("Destroying AssetManager in %p #%d\n", this, count); - - delete mConfig; - delete mResources; - - // don't have a String class yet, so make sure we clean up - delete[] mLocale; - delete[] mVendor; -} - -bool AssetManager::addAssetPath(const String8& path, void** cookie) -{ - AutoMutex _l(mLock); - - asset_path ap; - - String8 realPath(path); - if (kAppZipName) { - realPath.appendPath(kAppZipName); - } - ap.type = ::getFileType(realPath.string()); - if (ap.type == kFileTypeRegular) { - ap.path = realPath; - } else { - ap.path = path; - ap.type = ::getFileType(path.string()); - if (ap.type != kFileTypeDirectory && ap.type != kFileTypeRegular) { - ALOGW("Asset path %s is neither a directory nor file (type=%d).", - path.string(), (int)ap.type); - return false; - } - } - - // Skip if we have it already. - for (size_t i=0; i<mAssetPaths.size(); i++) { - if (mAssetPaths[i].path == ap.path) { - if (cookie) { - *cookie = (void*)(i+1); - } - return true; - } - } - - ALOGV("In %p Asset %s path: %s", this, - ap.type == kFileTypeDirectory ? "dir" : "zip", ap.path.string()); - - mAssetPaths.add(ap); - - // new paths are always added at the end - if (cookie) { - *cookie = (void*)mAssetPaths.size(); - } - - // add overlay packages for /system/framework; apps are handled by the - // (Java) package manager - if (strncmp(path.string(), "/system/framework/", 18) == 0) { - // When there is an environment variable for /vendor, this - // should be changed to something similar to how ANDROID_ROOT - // and ANDROID_DATA are used in this file. - String8 overlayPath("/vendor/overlay/framework/"); - overlayPath.append(path.getPathLeaf()); - if (TEMP_FAILURE_RETRY(access(overlayPath.string(), R_OK)) == 0) { - asset_path oap; - oap.path = overlayPath; - oap.type = ::getFileType(overlayPath.string()); - bool addOverlay = (oap.type == kFileTypeRegular); // only .apks supported as overlay - if (addOverlay) { - oap.idmap = idmapPathForPackagePath(overlayPath); - - if (isIdmapStaleLocked(ap.path, oap.path, oap.idmap)) { - addOverlay = createIdmapFileLocked(ap.path, oap.path, oap.idmap); - } - } - if (addOverlay) { - mAssetPaths.add(oap); - } else { - ALOGW("failed to add overlay package %s\n", overlayPath.string()); - } - } - } - - return true; -} - -bool AssetManager::isIdmapStaleLocked(const String8& originalPath, const String8& overlayPath, - const String8& idmapPath) -{ - struct stat st; - if (TEMP_FAILURE_RETRY(stat(idmapPath.string(), &st)) == -1) { - if (errno == ENOENT) { - return true; // non-existing idmap is always stale - } else { - ALOGW("failed to stat file %s: %s\n", idmapPath.string(), strerror(errno)); - return false; - } - } - if (st.st_size < ResTable::IDMAP_HEADER_SIZE_BYTES) { - ALOGW("file %s has unexpectedly small size=%zd\n", idmapPath.string(), (size_t)st.st_size); - return false; - } - int fd = TEMP_FAILURE_RETRY(::open(idmapPath.string(), O_RDONLY)); - if (fd == -1) { - ALOGW("failed to open file %s: %s\n", idmapPath.string(), strerror(errno)); - return false; - } - char buf[ResTable::IDMAP_HEADER_SIZE_BYTES]; - ssize_t bytesLeft = ResTable::IDMAP_HEADER_SIZE_BYTES; - for (;;) { - ssize_t r = TEMP_FAILURE_RETRY(read(fd, buf + ResTable::IDMAP_HEADER_SIZE_BYTES - bytesLeft, - bytesLeft)); - if (r < 0) { - TEMP_FAILURE_RETRY(close(fd)); - return false; - } - bytesLeft -= r; - if (bytesLeft == 0) { - break; - } - } - TEMP_FAILURE_RETRY(close(fd)); - - uint32_t cachedOriginalCrc, cachedOverlayCrc; - if (!ResTable::getIdmapInfo(buf, ResTable::IDMAP_HEADER_SIZE_BYTES, - &cachedOriginalCrc, &cachedOverlayCrc)) { - return false; - } - - uint32_t actualOriginalCrc, actualOverlayCrc; - if (!getZipEntryCrcLocked(originalPath, "resources.arsc", &actualOriginalCrc)) { - return false; - } - if (!getZipEntryCrcLocked(overlayPath, "resources.arsc", &actualOverlayCrc)) { - return false; - } - return cachedOriginalCrc != actualOriginalCrc || cachedOverlayCrc != actualOverlayCrc; -} - -bool AssetManager::getZipEntryCrcLocked(const String8& zipPath, const char* entryFilename, - uint32_t* pCrc) -{ - asset_path ap; - ap.path = zipPath; - const ZipFileRO* zip = getZipFileLocked(ap); - if (zip == NULL) { - return false; - } - const ZipEntryRO entry = zip->findEntryByName(entryFilename); - if (entry == NULL) { - return false; - } - if (!zip->getEntryInfo(entry, NULL, NULL, NULL, NULL, NULL, (long*)pCrc)) { - return false; - } - return true; -} - -bool AssetManager::createIdmapFileLocked(const String8& originalPath, const String8& overlayPath, - const String8& idmapPath) -{ - ALOGD("%s: originalPath=%s overlayPath=%s idmapPath=%s\n", - __FUNCTION__, originalPath.string(), overlayPath.string(), idmapPath.string()); - ResTable tables[2]; - const String8* paths[2] = { &originalPath, &overlayPath }; - uint32_t originalCrc, overlayCrc; - bool retval = false; - ssize_t offset = 0; - int fd = 0; - uint32_t* data = NULL; - size_t size; - - for (int i = 0; i < 2; ++i) { - asset_path ap; - ap.type = kFileTypeRegular; - ap.path = *paths[i]; - Asset* ass = openNonAssetInPathLocked("resources.arsc", Asset::ACCESS_BUFFER, ap); - if (ass == NULL) { - ALOGW("failed to find resources.arsc in %s\n", ap.path.string()); - goto error; - } - tables[i].add(ass, (void*)1, false); - } - - if (!getZipEntryCrcLocked(originalPath, "resources.arsc", &originalCrc)) { - ALOGW("failed to retrieve crc for resources.arsc in %s\n", originalPath.string()); - goto error; - } - if (!getZipEntryCrcLocked(overlayPath, "resources.arsc", &overlayCrc)) { - ALOGW("failed to retrieve crc for resources.arsc in %s\n", overlayPath.string()); - goto error; - } - - if (tables[0].createIdmap(tables[1], originalCrc, overlayCrc, - (void**)&data, &size) != NO_ERROR) { - ALOGW("failed to generate idmap data for file %s\n", idmapPath.string()); - goto error; - } - - // This should be abstracted (eg replaced by a stand-alone - // application like dexopt, triggered by something equivalent to - // installd). - fd = TEMP_FAILURE_RETRY(::open(idmapPath.string(), O_WRONLY | O_CREAT | O_TRUNC, 0644)); - if (fd == -1) { - ALOGW("failed to write idmap file %s (open: %s)\n", idmapPath.string(), strerror(errno)); - goto error_free; - } - for (;;) { - ssize_t written = TEMP_FAILURE_RETRY(write(fd, data + offset, size)); - if (written < 0) { - ALOGW("failed to write idmap file %s (write: %s)\n", idmapPath.string(), - strerror(errno)); - goto error_close; - } - size -= (size_t)written; - offset += written; - if (size == 0) { - break; - } - } - - retval = true; -error_close: - TEMP_FAILURE_RETRY(close(fd)); -error_free: - free(data); -error: - return retval; -} - -bool AssetManager::addDefaultAssets() -{ - const char* root = getenv("ANDROID_ROOT"); - LOG_ALWAYS_FATAL_IF(root == NULL, "ANDROID_ROOT not set"); - - String8 path(root); - path.appendPath(kSystemAssets); - - return addAssetPath(path, NULL); -} - -void* AssetManager::nextAssetPath(void* cookie) const -{ - AutoMutex _l(mLock); - size_t next = ((size_t)cookie)+1; - return next > mAssetPaths.size() ? NULL : (void*)next; -} - -String8 AssetManager::getAssetPath(void* cookie) const -{ - AutoMutex _l(mLock); - const size_t which = ((size_t)cookie)-1; - if (which < mAssetPaths.size()) { - return mAssetPaths[which].path; - } - return String8(); -} - -/* - * Set the current locale. Use NULL to indicate no locale. - * - * Close and reopen Zip archives as appropriate, and reset cached - * information in the locale-specific sections of the tree. - */ -void AssetManager::setLocale(const char* locale) -{ - AutoMutex _l(mLock); - setLocaleLocked(locale); -} - -void AssetManager::setLocaleLocked(const char* locale) -{ - if (mLocale != NULL) { - /* previously set, purge cached data */ - purgeFileNameCacheLocked(); - //mZipSet.purgeLocale(); - delete[] mLocale; - } - mLocale = strdupNew(locale); - - updateResourceParamsLocked(); -} - -/* - * Set the current vendor. Use NULL to indicate no vendor. - * - * Close and reopen Zip archives as appropriate, and reset cached - * information in the vendor-specific sections of the tree. - */ -void AssetManager::setVendor(const char* vendor) -{ - AutoMutex _l(mLock); - - if (mVendor != NULL) { - /* previously set, purge cached data */ - purgeFileNameCacheLocked(); - //mZipSet.purgeVendor(); - delete[] mVendor; - } - mVendor = strdupNew(vendor); -} - -void AssetManager::setConfiguration(const ResTable_config& config, const char* locale) -{ - AutoMutex _l(mLock); - *mConfig = config; - if (locale) { - setLocaleLocked(locale); - } else if (config.language[0] != 0) { - char spec[9]; - spec[0] = config.language[0]; - spec[1] = config.language[1]; - if (config.country[0] != 0) { - spec[2] = '_'; - spec[3] = config.country[0]; - spec[4] = config.country[1]; - spec[5] = 0; - } else { - spec[3] = 0; - } - setLocaleLocked(spec); - } else { - updateResourceParamsLocked(); - } -} - -void AssetManager::getConfiguration(ResTable_config* outConfig) const -{ - AutoMutex _l(mLock); - *outConfig = *mConfig; -} - -/* - * Open an asset. - * - * The data could be; - * - In a file on disk (assetBase + fileName). - * - In a compressed file on disk (assetBase + fileName.gz). - * - In a Zip archive, uncompressed or compressed. - * - * It can be in a number of different directories and Zip archives. - * The search order is: - * - [appname] - * - locale + vendor - * - "default" + vendor - * - locale + "default" - * - "default + "default" - * - "common" - * - (same as above) - * - * To find a particular file, we have to try up to eight paths with - * all three forms of data. - * - * We should probably reject requests for "illegal" filenames, e.g. those - * with illegal characters or "../" backward relative paths. - */ -Asset* AssetManager::open(const char* fileName, AccessMode mode) -{ - AutoMutex _l(mLock); - - LOG_FATAL_IF(mAssetPaths.size() == 0, "No assets added to AssetManager"); - - - if (mCacheMode != CACHE_OFF && !mCacheValid) - loadFileNameCacheLocked(); - - String8 assetName(kAssetsRoot); - assetName.appendPath(fileName); - - /* - * For each top-level asset path, search for the asset. - */ - - size_t i = mAssetPaths.size(); - while (i > 0) { - i--; - ALOGV("Looking for asset '%s' in '%s'\n", - assetName.string(), mAssetPaths.itemAt(i).path.string()); - Asset* pAsset = openNonAssetInPathLocked(assetName.string(), mode, mAssetPaths.itemAt(i)); - if (pAsset != NULL) { - return pAsset != kExcludedAsset ? pAsset : NULL; - } - } - - return NULL; -} - -/* - * Open a non-asset file as if it were an asset. - * - * The "fileName" is the partial path starting from the application - * name. - */ -Asset* AssetManager::openNonAsset(const char* fileName, AccessMode mode) -{ - AutoMutex _l(mLock); - - LOG_FATAL_IF(mAssetPaths.size() == 0, "No assets added to AssetManager"); - - - if (mCacheMode != CACHE_OFF && !mCacheValid) - loadFileNameCacheLocked(); - - /* - * For each top-level asset path, search for the asset. - */ - - size_t i = mAssetPaths.size(); - while (i > 0) { - i--; - ALOGV("Looking for non-asset '%s' in '%s'\n", fileName, mAssetPaths.itemAt(i).path.string()); - Asset* pAsset = openNonAssetInPathLocked( - fileName, mode, mAssetPaths.itemAt(i)); - if (pAsset != NULL) { - return pAsset != kExcludedAsset ? pAsset : NULL; - } - } - - return NULL; -} - -Asset* AssetManager::openNonAsset(void* cookie, const char* fileName, AccessMode mode) -{ - const size_t which = ((size_t)cookie)-1; - - AutoMutex _l(mLock); - - LOG_FATAL_IF(mAssetPaths.size() == 0, "No assets added to AssetManager"); - - - if (mCacheMode != CACHE_OFF && !mCacheValid) - loadFileNameCacheLocked(); - - if (which < mAssetPaths.size()) { - ALOGV("Looking for non-asset '%s' in '%s'\n", fileName, - mAssetPaths.itemAt(which).path.string()); - Asset* pAsset = openNonAssetInPathLocked( - fileName, mode, mAssetPaths.itemAt(which)); - if (pAsset != NULL) { - return pAsset != kExcludedAsset ? pAsset : NULL; - } - } - - return NULL; -} - -/* - * Get the type of a file in the asset namespace. - * - * This currently only works for regular files. All others (including - * directories) will return kFileTypeNonexistent. - */ -FileType AssetManager::getFileType(const char* fileName) -{ - Asset* pAsset = NULL; - - /* - * Open the asset. This is less efficient than simply finding the - * file, but it's not too bad (we don't uncompress or mmap data until - * the first read() call). - */ - pAsset = open(fileName, Asset::ACCESS_STREAMING); - delete pAsset; - - if (pAsset == NULL) - return kFileTypeNonexistent; - else - return kFileTypeRegular; -} - -const ResTable* AssetManager::getResTable(bool required) const -{ - ResTable* rt = mResources; - if (rt) { - return rt; - } - - // Iterate through all asset packages, collecting resources from each. - - AutoMutex _l(mLock); - - if (mResources != NULL) { - return mResources; - } - - if (required) { - LOG_FATAL_IF(mAssetPaths.size() == 0, "No assets added to AssetManager"); - } - - if (mCacheMode != CACHE_OFF && !mCacheValid) - const_cast<AssetManager*>(this)->loadFileNameCacheLocked(); - - const size_t N = mAssetPaths.size(); - for (size_t i=0; i<N; i++) { - Asset* ass = NULL; - ResTable* sharedRes = NULL; - bool shared = true; - const asset_path& ap = mAssetPaths.itemAt(i); - Asset* idmap = openIdmapLocked(ap); - ALOGV("Looking for resource asset in '%s'\n", ap.path.string()); - if (ap.type != kFileTypeDirectory) { - if (i == 0) { - // The first item is typically the framework resources, - // which we want to avoid parsing every time. - sharedRes = const_cast<AssetManager*>(this)-> - mZipSet.getZipResourceTable(ap.path); - } - if (sharedRes == NULL) { - ass = const_cast<AssetManager*>(this)-> - mZipSet.getZipResourceTableAsset(ap.path); - if (ass == NULL) { - ALOGV("loading resource table %s\n", ap.path.string()); - ass = const_cast<AssetManager*>(this)-> - openNonAssetInPathLocked("resources.arsc", - Asset::ACCESS_BUFFER, - ap); - if (ass != NULL && ass != kExcludedAsset) { - ass = const_cast<AssetManager*>(this)-> - mZipSet.setZipResourceTableAsset(ap.path, ass); - } - } - - if (i == 0 && ass != NULL) { - // If this is the first resource table in the asset - // manager, then we are going to cache it so that we - // can quickly copy it out for others. - ALOGV("Creating shared resources for %s", ap.path.string()); - sharedRes = new ResTable(); - sharedRes->add(ass, (void*)(i+1), false, idmap); - sharedRes = const_cast<AssetManager*>(this)-> - mZipSet.setZipResourceTable(ap.path, sharedRes); - } - } - } else { - ALOGV("loading resource table %s\n", ap.path.string()); - Asset* ass = const_cast<AssetManager*>(this)-> - openNonAssetInPathLocked("resources.arsc", - Asset::ACCESS_BUFFER, - ap); - shared = false; - } - if ((ass != NULL || sharedRes != NULL) && ass != kExcludedAsset) { - if (rt == NULL) { - mResources = rt = new ResTable(); - updateResourceParamsLocked(); - } - ALOGV("Installing resource asset %p in to table %p\n", ass, mResources); - if (sharedRes != NULL) { - ALOGV("Copying existing resources for %s", ap.path.string()); - rt->add(sharedRes); - } else { - ALOGV("Parsing resources for %s", ap.path.string()); - rt->add(ass, (void*)(i+1), !shared, idmap); - } - - if (!shared) { - delete ass; - } - } - if (idmap != NULL) { - delete idmap; - } - } - - if (required && !rt) ALOGW("Unable to find resources file resources.arsc"); - if (!rt) { - mResources = rt = new ResTable(); - } - return rt; -} - -void AssetManager::updateResourceParamsLocked() const -{ - ResTable* res = mResources; - if (!res) { - return; - } - - size_t llen = mLocale ? strlen(mLocale) : 0; - mConfig->language[0] = 0; - mConfig->language[1] = 0; - mConfig->country[0] = 0; - mConfig->country[1] = 0; - if (llen >= 2) { - mConfig->language[0] = mLocale[0]; - mConfig->language[1] = mLocale[1]; - } - if (llen >= 5) { - mConfig->country[0] = mLocale[3]; - mConfig->country[1] = mLocale[4]; - } - mConfig->size = sizeof(*mConfig); - - res->setParameters(mConfig); -} - -Asset* AssetManager::openIdmapLocked(const struct asset_path& ap) const -{ - Asset* ass = NULL; - if (ap.idmap.size() != 0) { - ass = const_cast<AssetManager*>(this)-> - openAssetFromFileLocked(ap.idmap, Asset::ACCESS_BUFFER); - if (ass) { - ALOGV("loading idmap %s\n", ap.idmap.string()); - } else { - ALOGW("failed to load idmap %s\n", ap.idmap.string()); - } - } - return ass; -} - -const ResTable& AssetManager::getResources(bool required) const -{ - const ResTable* rt = getResTable(required); - return *rt; -} - -bool AssetManager::isUpToDate() -{ - AutoMutex _l(mLock); - return mZipSet.isUpToDate(); -} - -void AssetManager::getLocales(Vector<String8>* locales) const -{ - ResTable* res = mResources; - if (res != NULL) { - res->getLocales(locales); - } -} - -/* - * Open a non-asset file as if it were an asset, searching for it in the - * specified app. - * - * Pass in a NULL values for "appName" if the common app directory should - * be used. - */ -Asset* AssetManager::openNonAssetInPathLocked(const char* fileName, AccessMode mode, - const asset_path& ap) -{ - Asset* pAsset = NULL; - - /* look at the filesystem on disk */ - if (ap.type == kFileTypeDirectory) { - String8 path(ap.path); - path.appendPath(fileName); - - pAsset = openAssetFromFileLocked(path, mode); - - if (pAsset == NULL) { - /* try again, this time with ".gz" */ - path.append(".gz"); - pAsset = openAssetFromFileLocked(path, mode); - } - - if (pAsset != NULL) { - //printf("FOUND NA '%s' on disk\n", fileName); - pAsset->setAssetSource(path); - } - - /* look inside the zip file */ - } else { - String8 path(fileName); - - /* check the appropriate Zip file */ - ZipFileRO* pZip; - ZipEntryRO entry; - - pZip = getZipFileLocked(ap); - if (pZip != NULL) { - //printf("GOT zip, checking NA '%s'\n", (const char*) path); - entry = pZip->findEntryByName(path.string()); - if (entry != NULL) { - //printf("FOUND NA in Zip file for %s\n", appName ? appName : kAppCommon); - pAsset = openAssetFromZipLocked(pZip, entry, mode, path); - } - } - - if (pAsset != NULL) { - /* create a "source" name, for debug/display */ - pAsset->setAssetSource( - createZipSourceNameLocked(ZipSet::getPathName(ap.path.string()), String8(""), - String8(fileName))); - } - } - - return pAsset; -} - -/* - * Open an asset, searching for it in the directory hierarchy for the - * specified app. - * - * Pass in a NULL values for "appName" if the common app directory should - * be used. - */ -Asset* AssetManager::openInPathLocked(const char* fileName, AccessMode mode, - const asset_path& ap) -{ - Asset* pAsset = NULL; - - /* - * Try various combinations of locale and vendor. - */ - if (mLocale != NULL && mVendor != NULL) - pAsset = openInLocaleVendorLocked(fileName, mode, ap, mLocale, mVendor); - if (pAsset == NULL && mVendor != NULL) - pAsset = openInLocaleVendorLocked(fileName, mode, ap, NULL, mVendor); - if (pAsset == NULL && mLocale != NULL) - pAsset = openInLocaleVendorLocked(fileName, mode, ap, mLocale, NULL); - if (pAsset == NULL) - pAsset = openInLocaleVendorLocked(fileName, mode, ap, NULL, NULL); - - return pAsset; -} - -/* - * Open an asset, searching for it in the directory hierarchy for the - * specified locale and vendor. - * - * We also search in "app.jar". - * - * Pass in NULL values for "appName", "locale", and "vendor" if the - * defaults should be used. - */ -Asset* AssetManager::openInLocaleVendorLocked(const char* fileName, AccessMode mode, - const asset_path& ap, const char* locale, const char* vendor) -{ - Asset* pAsset = NULL; - - if (ap.type == kFileTypeDirectory) { - if (mCacheMode == CACHE_OFF) { - /* look at the filesystem on disk */ - String8 path(createPathNameLocked(ap, locale, vendor)); - path.appendPath(fileName); - - String8 excludeName(path); - excludeName.append(kExcludeExtension); - if (::getFileType(excludeName.string()) != kFileTypeNonexistent) { - /* say no more */ - //printf("+++ excluding '%s'\n", (const char*) excludeName); - return kExcludedAsset; - } - - pAsset = openAssetFromFileLocked(path, mode); - - if (pAsset == NULL) { - /* try again, this time with ".gz" */ - path.append(".gz"); - pAsset = openAssetFromFileLocked(path, mode); - } - - if (pAsset != NULL) - pAsset->setAssetSource(path); - } else { - /* find in cache */ - String8 path(createPathNameLocked(ap, locale, vendor)); - path.appendPath(fileName); - - AssetDir::FileInfo tmpInfo; - bool found = false; - - String8 excludeName(path); - excludeName.append(kExcludeExtension); - - if (mCache.indexOf(excludeName) != NAME_NOT_FOUND) { - /* go no farther */ - //printf("+++ Excluding '%s'\n", (const char*) excludeName); - return kExcludedAsset; - } - - /* - * File compression extensions (".gz") don't get stored in the - * name cache, so we have to try both here. - */ - if (mCache.indexOf(path) != NAME_NOT_FOUND) { - found = true; - pAsset = openAssetFromFileLocked(path, mode); - if (pAsset == NULL) { - /* try again, this time with ".gz" */ - path.append(".gz"); - pAsset = openAssetFromFileLocked(path, mode); - } - } - - if (pAsset != NULL) - pAsset->setAssetSource(path); - - /* - * Don't continue the search into the Zip files. Our cached info - * said it was a file on disk; to be consistent with openDir() - * we want to return the loose asset. If the cached file gets - * removed, we fail. - * - * The alternative is to update our cache when files get deleted, - * or make some sort of "best effort" promise, but for now I'm - * taking the hard line. - */ - if (found) { - if (pAsset == NULL) - ALOGD("Expected file not found: '%s'\n", path.string()); - return pAsset; - } - } - } - - /* - * Either it wasn't found on disk or on the cached view of the disk. - * Dig through the currently-opened set of Zip files. If caching - * is disabled, the Zip file may get reopened. - */ - if (pAsset == NULL && ap.type == kFileTypeRegular) { - String8 path; - - path.appendPath((locale != NULL) ? locale : kDefaultLocale); - path.appendPath((vendor != NULL) ? vendor : kDefaultVendor); - path.appendPath(fileName); - - /* check the appropriate Zip file */ - ZipFileRO* pZip; - ZipEntryRO entry; - - pZip = getZipFileLocked(ap); - if (pZip != NULL) { - //printf("GOT zip, checking '%s'\n", (const char*) path); - entry = pZip->findEntryByName(path.string()); - if (entry != NULL) { - //printf("FOUND in Zip file for %s/%s-%s\n", - // appName, locale, vendor); - pAsset = openAssetFromZipLocked(pZip, entry, mode, path); - } - } - - if (pAsset != NULL) { - /* create a "source" name, for debug/display */ - pAsset->setAssetSource(createZipSourceNameLocked(ZipSet::getPathName(ap.path.string()), - String8(""), String8(fileName))); - } - } - - return pAsset; -} - -/* - * Create a "source name" for a file from a Zip archive. - */ -String8 AssetManager::createZipSourceNameLocked(const String8& zipFileName, - const String8& dirName, const String8& fileName) -{ - String8 sourceName("zip:"); - sourceName.append(zipFileName); - sourceName.append(":"); - if (dirName.length() > 0) { - sourceName.appendPath(dirName); - } - sourceName.appendPath(fileName); - return sourceName; -} - -/* - * Create a path to a loose asset (asset-base/app/locale/vendor). - */ -String8 AssetManager::createPathNameLocked(const asset_path& ap, const char* locale, - const char* vendor) -{ - String8 path(ap.path); - path.appendPath((locale != NULL) ? locale : kDefaultLocale); - path.appendPath((vendor != NULL) ? vendor : kDefaultVendor); - return path; -} - -/* - * Create a path to a loose asset (asset-base/app/rootDir). - */ -String8 AssetManager::createPathNameLocked(const asset_path& ap, const char* rootDir) -{ - String8 path(ap.path); - if (rootDir != NULL) path.appendPath(rootDir); - return path; -} - -/* - * Return a pointer to one of our open Zip archives. Returns NULL if no - * matching Zip file exists. - * - * Right now we have 2 possible Zip files (1 each in app/"common"). - * - * If caching is set to CACHE_OFF, to get the expected behavior we - * need to reopen the Zip file on every request. That would be silly - * and expensive, so instead we just check the file modification date. - * - * Pass in NULL values for "appName", "locale", and "vendor" if the - * generics should be used. - */ -ZipFileRO* AssetManager::getZipFileLocked(const asset_path& ap) -{ - ALOGV("getZipFileLocked() in %p\n", this); - - return mZipSet.getZip(ap.path); -} - -/* - * Try to open an asset from a file on disk. - * - * If the file is compressed with gzip, we seek to the start of the - * deflated data and pass that in (just like we would for a Zip archive). - * - * For uncompressed data, we may already have an mmap()ed version sitting - * around. If so, we want to hand that to the Asset instead. - * - * This returns NULL if the file doesn't exist, couldn't be opened, or - * claims to be a ".gz" but isn't. - */ -Asset* AssetManager::openAssetFromFileLocked(const String8& pathName, - AccessMode mode) -{ - Asset* pAsset = NULL; - - if (strcasecmp(pathName.getPathExtension().string(), ".gz") == 0) { - //printf("TRYING '%s'\n", (const char*) pathName); - pAsset = Asset::createFromCompressedFile(pathName.string(), mode); - } else { - //printf("TRYING '%s'\n", (const char*) pathName); - pAsset = Asset::createFromFile(pathName.string(), mode); - } - - return pAsset; -} - -/* - * Given an entry in a Zip archive, create a new Asset object. - * - * If the entry is uncompressed, we may want to create or share a - * slice of shared memory. - */ -Asset* AssetManager::openAssetFromZipLocked(const ZipFileRO* pZipFile, - const ZipEntryRO entry, AccessMode mode, const String8& entryName) -{ - Asset* pAsset = NULL; - - // TODO: look for previously-created shared memory slice? - int method; - size_t uncompressedLen; - - //printf("USING Zip '%s'\n", pEntry->getFileName()); - - //pZipFile->getEntryInfo(entry, &method, &uncompressedLen, &compressedLen, - // &offset); - if (!pZipFile->getEntryInfo(entry, &method, &uncompressedLen, NULL, NULL, - NULL, NULL)) - { - ALOGW("getEntryInfo failed\n"); - return NULL; - } - - FileMap* dataMap = pZipFile->createEntryFileMap(entry); - if (dataMap == NULL) { - ALOGW("create map from entry failed\n"); - return NULL; - } - - if (method == ZipFileRO::kCompressStored) { - pAsset = Asset::createFromUncompressedMap(dataMap, mode); - ALOGV("Opened uncompressed entry %s in zip %s mode %d: %p", entryName.string(), - dataMap->getFileName(), mode, pAsset); - } else { - pAsset = Asset::createFromCompressedMap(dataMap, method, - uncompressedLen, mode); - ALOGV("Opened compressed entry %s in zip %s mode %d: %p", entryName.string(), - dataMap->getFileName(), mode, pAsset); - } - if (pAsset == NULL) { - /* unexpected */ - ALOGW("create from segment failed\n"); - } - - return pAsset; -} - - - -/* - * Open a directory in the asset namespace. - * - * An "asset directory" is simply the combination of all files in all - * locations, with ".gz" stripped for loose files. With app, locale, and - * vendor defined, we have 8 directories and 2 Zip archives to scan. - * - * Pass in "" for the root dir. - */ -AssetDir* AssetManager::openDir(const char* dirName) -{ - AutoMutex _l(mLock); - - AssetDir* pDir = NULL; - SortedVector<AssetDir::FileInfo>* pMergedInfo = NULL; - - LOG_FATAL_IF(mAssetPaths.size() == 0, "No assets added to AssetManager"); - assert(dirName != NULL); - - //printf("+++ openDir(%s) in '%s'\n", dirName, (const char*) mAssetBase); - - if (mCacheMode != CACHE_OFF && !mCacheValid) - loadFileNameCacheLocked(); - - pDir = new AssetDir; - - /* - * Scan the various directories, merging what we find into a single - * vector. We want to scan them in reverse priority order so that - * the ".EXCLUDE" processing works correctly. Also, if we decide we - * want to remember where the file is coming from, we'll get the right - * version. - * - * We start with Zip archives, then do loose files. - */ - pMergedInfo = new SortedVector<AssetDir::FileInfo>; - - size_t i = mAssetPaths.size(); - while (i > 0) { - i--; - const asset_path& ap = mAssetPaths.itemAt(i); - if (ap.type == kFileTypeRegular) { - ALOGV("Adding directory %s from zip %s", dirName, ap.path.string()); - scanAndMergeZipLocked(pMergedInfo, ap, kAssetsRoot, dirName); - } else { - ALOGV("Adding directory %s from dir %s", dirName, ap.path.string()); - scanAndMergeDirLocked(pMergedInfo, ap, kAssetsRoot, dirName); - } - } - -#if 0 - printf("FILE LIST:\n"); - for (i = 0; i < (size_t) pMergedInfo->size(); i++) { - printf(" %d: (%d) '%s'\n", i, - pMergedInfo->itemAt(i).getFileType(), - (const char*) pMergedInfo->itemAt(i).getFileName()); - } -#endif - - pDir->setFileList(pMergedInfo); - return pDir; -} - -/* - * Open a directory in the non-asset namespace. - * - * An "asset directory" is simply the combination of all files in all - * locations, with ".gz" stripped for loose files. With app, locale, and - * vendor defined, we have 8 directories and 2 Zip archives to scan. - * - * Pass in "" for the root dir. - */ -AssetDir* AssetManager::openNonAssetDir(void* cookie, const char* dirName) -{ - AutoMutex _l(mLock); - - AssetDir* pDir = NULL; - SortedVector<AssetDir::FileInfo>* pMergedInfo = NULL; - - LOG_FATAL_IF(mAssetPaths.size() == 0, "No assets added to AssetManager"); - assert(dirName != NULL); - - //printf("+++ openDir(%s) in '%s'\n", dirName, (const char*) mAssetBase); - - if (mCacheMode != CACHE_OFF && !mCacheValid) - loadFileNameCacheLocked(); - - pDir = new AssetDir; - - pMergedInfo = new SortedVector<AssetDir::FileInfo>; - - const size_t which = ((size_t)cookie)-1; - - if (which < mAssetPaths.size()) { - const asset_path& ap = mAssetPaths.itemAt(which); - if (ap.type == kFileTypeRegular) { - ALOGV("Adding directory %s from zip %s", dirName, ap.path.string()); - scanAndMergeZipLocked(pMergedInfo, ap, NULL, dirName); - } else { - ALOGV("Adding directory %s from dir %s", dirName, ap.path.string()); - scanAndMergeDirLocked(pMergedInfo, ap, NULL, dirName); - } - } - -#if 0 - printf("FILE LIST:\n"); - for (i = 0; i < (size_t) pMergedInfo->size(); i++) { - printf(" %d: (%d) '%s'\n", i, - pMergedInfo->itemAt(i).getFileType(), - (const char*) pMergedInfo->itemAt(i).getFileName()); - } -#endif - - pDir->setFileList(pMergedInfo); - return pDir; -} - -/* - * Scan the contents of the specified directory and merge them into the - * "pMergedInfo" vector, removing previous entries if we find "exclude" - * directives. - * - * Returns "false" if we found nothing to contribute. - */ -bool AssetManager::scanAndMergeDirLocked(SortedVector<AssetDir::FileInfo>* pMergedInfo, - const asset_path& ap, const char* rootDir, const char* dirName) -{ - SortedVector<AssetDir::FileInfo>* pContents; - String8 path; - - assert(pMergedInfo != NULL); - - //printf("scanAndMergeDir: %s %s %s %s\n", appName, locale, vendor,dirName); - - if (mCacheValid) { - int i, start, count; - - pContents = new SortedVector<AssetDir::FileInfo>; - - /* - * Get the basic partial path and find it in the cache. That's - * the start point for the search. - */ - path = createPathNameLocked(ap, rootDir); - if (dirName[0] != '\0') - path.appendPath(dirName); - - start = mCache.indexOf(path); - if (start == NAME_NOT_FOUND) { - //printf("+++ not found in cache: dir '%s'\n", (const char*) path); - delete pContents; - return false; - } - - /* - * The match string looks like "common/default/default/foo/bar/". - * The '/' on the end ensures that we don't match on the directory - * itself or on ".../foo/barfy/". - */ - path.append("/"); - - count = mCache.size(); - - /* - * Pick out the stuff in the current dir by examining the pathname. - * It needs to match the partial pathname prefix, and not have a '/' - * (fssep) anywhere after the prefix. - */ - for (i = start+1; i < count; i++) { - if (mCache[i].getFileName().length() > path.length() && - strncmp(mCache[i].getFileName().string(), path.string(), path.length()) == 0) - { - const char* name = mCache[i].getFileName().string(); - // XXX THIS IS BROKEN! Looks like we need to store the full - // path prefix separately from the file path. - if (strchr(name + path.length(), '/') == NULL) { - /* grab it, reducing path to just the filename component */ - AssetDir::FileInfo tmp = mCache[i]; - tmp.setFileName(tmp.getFileName().getPathLeaf()); - pContents->add(tmp); - } - } else { - /* no longer in the dir or its subdirs */ - break; - } - - } - } else { - path = createPathNameLocked(ap, rootDir); - if (dirName[0] != '\0') - path.appendPath(dirName); - pContents = scanDirLocked(path); - if (pContents == NULL) - return false; - } - - // if we wanted to do an incremental cache fill, we would do it here - - /* - * Process "exclude" directives. If we find a filename that ends with - * ".EXCLUDE", we look for a matching entry in the "merged" set, and - * remove it if we find it. We also delete the "exclude" entry. - */ - int i, count, exclExtLen; - - count = pContents->size(); - exclExtLen = strlen(kExcludeExtension); - for (i = 0; i < count; i++) { - const char* name; - int nameLen; - - name = pContents->itemAt(i).getFileName().string(); - nameLen = strlen(name); - if (nameLen > exclExtLen && - strcmp(name + (nameLen - exclExtLen), kExcludeExtension) == 0) - { - String8 match(name, nameLen - exclExtLen); - int matchIdx; - - matchIdx = AssetDir::FileInfo::findEntry(pMergedInfo, match); - if (matchIdx > 0) { - ALOGV("Excluding '%s' [%s]\n", - pMergedInfo->itemAt(matchIdx).getFileName().string(), - pMergedInfo->itemAt(matchIdx).getSourceName().string()); - pMergedInfo->removeAt(matchIdx); - } else { - //printf("+++ no match on '%s'\n", (const char*) match); - } - - ALOGD("HEY: size=%d removing %d\n", (int)pContents->size(), i); - pContents->removeAt(i); - i--; // adjust "for" loop - count--; // and loop limit - } - } - - mergeInfoLocked(pMergedInfo, pContents); - - delete pContents; - - return true; -} - -/* - * Scan the contents of the specified directory, and stuff what we find - * into a newly-allocated vector. - * - * Files ending in ".gz" will have their extensions removed. - * - * We should probably think about skipping files with "illegal" names, - * e.g. illegal characters (/\:) or excessive length. - * - * Returns NULL if the specified directory doesn't exist. - */ -SortedVector<AssetDir::FileInfo>* AssetManager::scanDirLocked(const String8& path) -{ - SortedVector<AssetDir::FileInfo>* pContents = NULL; - DIR* dir; - struct dirent* entry; - FileType fileType; - - ALOGV("Scanning dir '%s'\n", path.string()); - - dir = opendir(path.string()); - if (dir == NULL) - return NULL; - - pContents = new SortedVector<AssetDir::FileInfo>; - - while (1) { - entry = readdir(dir); - if (entry == NULL) - break; - - if (strcmp(entry->d_name, ".") == 0 || - strcmp(entry->d_name, "..") == 0) - continue; - -#ifdef _DIRENT_HAVE_D_TYPE - if (entry->d_type == DT_REG) - fileType = kFileTypeRegular; - else if (entry->d_type == DT_DIR) - fileType = kFileTypeDirectory; - else - fileType = kFileTypeUnknown; -#else - // stat the file - fileType = ::getFileType(path.appendPathCopy(entry->d_name).string()); -#endif - - if (fileType != kFileTypeRegular && fileType != kFileTypeDirectory) - continue; - - AssetDir::FileInfo info; - info.set(String8(entry->d_name), fileType); - if (strcasecmp(info.getFileName().getPathExtension().string(), ".gz") == 0) - info.setFileName(info.getFileName().getBasePath()); - info.setSourceName(path.appendPathCopy(info.getFileName())); - pContents->add(info); - } - - closedir(dir); - return pContents; -} - -/* - * Scan the contents out of the specified Zip archive, and merge what we - * find into "pMergedInfo". If the Zip archive in question doesn't exist, - * we return immediately. - * - * Returns "false" if we found nothing to contribute. - */ -bool AssetManager::scanAndMergeZipLocked(SortedVector<AssetDir::FileInfo>* pMergedInfo, - const asset_path& ap, const char* rootDir, const char* baseDirName) -{ - ZipFileRO* pZip; - Vector<String8> dirs; - AssetDir::FileInfo info; - SortedVector<AssetDir::FileInfo> contents; - String8 sourceName, zipName, dirName; - - pZip = mZipSet.getZip(ap.path); - if (pZip == NULL) { - ALOGW("Failure opening zip %s\n", ap.path.string()); - return false; - } - - zipName = ZipSet::getPathName(ap.path.string()); - - /* convert "sounds" to "rootDir/sounds" */ - if (rootDir != NULL) dirName = rootDir; - dirName.appendPath(baseDirName); - - /* - * Scan through the list of files, looking for a match. The files in - * the Zip table of contents are not in sorted order, so we have to - * process the entire list. We're looking for a string that begins - * with the characters in "dirName", is followed by a '/', and has no - * subsequent '/' in the stuff that follows. - * - * What makes this especially fun is that directories are not stored - * explicitly in Zip archives, so we have to infer them from context. - * When we see "sounds/foo.wav" we have to leave a note to ourselves - * to insert a directory called "sounds" into the list. We store - * these in temporary vector so that we only return each one once. - * - * Name comparisons are case-sensitive to match UNIX filesystem - * semantics. - */ - int dirNameLen = dirName.length(); - for (int i = 0; i < pZip->getNumEntries(); i++) { - ZipEntryRO entry; - char nameBuf[256]; - - entry = pZip->findEntryByIndex(i); - if (pZip->getEntryFileName(entry, nameBuf, sizeof(nameBuf)) != 0) { - // TODO: fix this if we expect to have long names - ALOGE("ARGH: name too long?\n"); - continue; - } - //printf("Comparing %s in %s?\n", nameBuf, dirName.string()); - if (dirNameLen == 0 || - (strncmp(nameBuf, dirName.string(), dirNameLen) == 0 && - nameBuf[dirNameLen] == '/')) - { - const char* cp; - const char* nextSlash; - - cp = nameBuf + dirNameLen; - if (dirNameLen != 0) - cp++; // advance past the '/' - - nextSlash = strchr(cp, '/'); -//xxx this may break if there are bare directory entries - if (nextSlash == NULL) { - /* this is a file in the requested directory */ - - info.set(String8(nameBuf).getPathLeaf(), kFileTypeRegular); - - info.setSourceName( - createZipSourceNameLocked(zipName, dirName, info.getFileName())); - - contents.add(info); - //printf("FOUND: file '%s'\n", info.getFileName().string()); - } else { - /* this is a subdir; add it if we don't already have it*/ - String8 subdirName(cp, nextSlash - cp); - size_t j; - size_t N = dirs.size(); - - for (j = 0; j < N; j++) { - if (subdirName == dirs[j]) { - break; - } - } - if (j == N) { - dirs.add(subdirName); - } - - //printf("FOUND: dir '%s'\n", subdirName.string()); - } - } - } - - /* - * Add the set of unique directories. - */ - for (int i = 0; i < (int) dirs.size(); i++) { - info.set(dirs[i], kFileTypeDirectory); - info.setSourceName( - createZipSourceNameLocked(zipName, dirName, info.getFileName())); - contents.add(info); - } - - mergeInfoLocked(pMergedInfo, &contents); - - return true; -} - - -/* - * Merge two vectors of FileInfo. - * - * The merged contents will be stuffed into *pMergedInfo. - * - * If an entry for a file exists in both "pMergedInfo" and "pContents", - * we use the newer "pContents" entry. - */ -void AssetManager::mergeInfoLocked(SortedVector<AssetDir::FileInfo>* pMergedInfo, - const SortedVector<AssetDir::FileInfo>* pContents) -{ - /* - * Merge what we found in this directory with what we found in - * other places. - * - * Two basic approaches: - * (1) Create a new array that holds the unique values of the two - * arrays. - * (2) Take the elements from pContents and shove them into pMergedInfo. - * - * Because these are vectors of complex objects, moving elements around - * inside the vector requires constructing new objects and allocating - * storage for members. With approach #1, we're always adding to the - * end, whereas with #2 we could be inserting multiple elements at the - * front of the vector. Approach #1 requires a full copy of the - * contents of pMergedInfo, but approach #2 requires the same copy for - * every insertion at the front of pMergedInfo. - * - * (We should probably use a SortedVector interface that allows us to - * just stuff items in, trusting us to maintain the sort order.) - */ - SortedVector<AssetDir::FileInfo>* pNewSorted; - int mergeMax, contMax; - int mergeIdx, contIdx; - - pNewSorted = new SortedVector<AssetDir::FileInfo>; - mergeMax = pMergedInfo->size(); - contMax = pContents->size(); - mergeIdx = contIdx = 0; - - while (mergeIdx < mergeMax || contIdx < contMax) { - if (mergeIdx == mergeMax) { - /* hit end of "merge" list, copy rest of "contents" */ - pNewSorted->add(pContents->itemAt(contIdx)); - contIdx++; - } else if (contIdx == contMax) { - /* hit end of "cont" list, copy rest of "merge" */ - pNewSorted->add(pMergedInfo->itemAt(mergeIdx)); - mergeIdx++; - } else if (pMergedInfo->itemAt(mergeIdx) == pContents->itemAt(contIdx)) - { - /* items are identical, add newer and advance both indices */ - pNewSorted->add(pContents->itemAt(contIdx)); - mergeIdx++; - contIdx++; - } else if (pMergedInfo->itemAt(mergeIdx) < pContents->itemAt(contIdx)) - { - /* "merge" is lower, add that one */ - pNewSorted->add(pMergedInfo->itemAt(mergeIdx)); - mergeIdx++; - } else { - /* "cont" is lower, add that one */ - assert(pContents->itemAt(contIdx) < pMergedInfo->itemAt(mergeIdx)); - pNewSorted->add(pContents->itemAt(contIdx)); - contIdx++; - } - } - - /* - * Overwrite the "merged" list with the new stuff. - */ - *pMergedInfo = *pNewSorted; - delete pNewSorted; - -#if 0 // for Vector, rather than SortedVector - int i, j; - for (i = pContents->size() -1; i >= 0; i--) { - bool add = true; - - for (j = pMergedInfo->size() -1; j >= 0; j--) { - /* case-sensitive comparisons, to behave like UNIX fs */ - if (strcmp(pContents->itemAt(i).mFileName, - pMergedInfo->itemAt(j).mFileName) == 0) - { - /* match, don't add this entry */ - add = false; - break; - } - } - - if (add) - pMergedInfo->add(pContents->itemAt(i)); - } -#endif -} - - -/* - * Load all files into the file name cache. We want to do this across - * all combinations of { appname, locale, vendor }, performing a recursive - * directory traversal. - * - * This is not the most efficient data structure. Also, gathering the - * information as we needed it (file-by-file or directory-by-directory) - * would be faster. However, on the actual device, 99% of the files will - * live in Zip archives, so this list will be very small. The trouble - * is that we have to check the "loose" files first, so it's important - * that we don't beat the filesystem silly looking for files that aren't - * there. - * - * Note on thread safety: this is the only function that causes updates - * to mCache, and anybody who tries to use it will call here if !mCacheValid, - * so we need to employ a mutex here. - */ -void AssetManager::loadFileNameCacheLocked(void) -{ - assert(!mCacheValid); - assert(mCache.size() == 0); - -#ifdef DO_TIMINGS // need to link against -lrt for this now - DurationTimer timer; - timer.start(); -#endif - - fncScanLocked(&mCache, ""); - -#ifdef DO_TIMINGS - timer.stop(); - ALOGD("Cache scan took %.3fms\n", - timer.durationUsecs() / 1000.0); -#endif - -#if 0 - int i; - printf("CACHED FILE LIST (%d entries):\n", mCache.size()); - for (i = 0; i < (int) mCache.size(); i++) { - printf(" %d: (%d) '%s'\n", i, - mCache.itemAt(i).getFileType(), - (const char*) mCache.itemAt(i).getFileName()); - } -#endif - - mCacheValid = true; -} - -/* - * Scan up to 8 versions of the specified directory. - */ -void AssetManager::fncScanLocked(SortedVector<AssetDir::FileInfo>* pMergedInfo, - const char* dirName) -{ - size_t i = mAssetPaths.size(); - while (i > 0) { - i--; - const asset_path& ap = mAssetPaths.itemAt(i); - fncScanAndMergeDirLocked(pMergedInfo, ap, NULL, NULL, dirName); - if (mLocale != NULL) - fncScanAndMergeDirLocked(pMergedInfo, ap, mLocale, NULL, dirName); - if (mVendor != NULL) - fncScanAndMergeDirLocked(pMergedInfo, ap, NULL, mVendor, dirName); - if (mLocale != NULL && mVendor != NULL) - fncScanAndMergeDirLocked(pMergedInfo, ap, mLocale, mVendor, dirName); - } -} - -/* - * Recursively scan this directory and all subdirs. - * - * This is similar to scanAndMergeDir, but we don't remove the .EXCLUDE - * files, and we prepend the extended partial path to the filenames. - */ -bool AssetManager::fncScanAndMergeDirLocked( - SortedVector<AssetDir::FileInfo>* pMergedInfo, - const asset_path& ap, const char* locale, const char* vendor, - const char* dirName) -{ - SortedVector<AssetDir::FileInfo>* pContents; - String8 partialPath; - String8 fullPath; - - // XXX This is broken -- the filename cache needs to hold the base - // asset path separately from its filename. - - partialPath = createPathNameLocked(ap, locale, vendor); - if (dirName[0] != '\0') { - partialPath.appendPath(dirName); - } - - fullPath = partialPath; - pContents = scanDirLocked(fullPath); - if (pContents == NULL) { - return false; // directory did not exist - } - - /* - * Scan all subdirectories of the current dir, merging what we find - * into "pMergedInfo". - */ - for (int i = 0; i < (int) pContents->size(); i++) { - if (pContents->itemAt(i).getFileType() == kFileTypeDirectory) { - String8 subdir(dirName); - subdir.appendPath(pContents->itemAt(i).getFileName()); - - fncScanAndMergeDirLocked(pMergedInfo, ap, locale, vendor, subdir.string()); - } - } - - /* - * To be consistent, we want entries for the root directory. If - * we're the root, add one now. - */ - if (dirName[0] == '\0') { - AssetDir::FileInfo tmpInfo; - - tmpInfo.set(String8(""), kFileTypeDirectory); - tmpInfo.setSourceName(createPathNameLocked(ap, locale, vendor)); - pContents->add(tmpInfo); - } - - /* - * We want to prepend the extended partial path to every entry in - * "pContents". It's the same value for each entry, so this will - * not change the sorting order of the vector contents. - */ - for (int i = 0; i < (int) pContents->size(); i++) { - const AssetDir::FileInfo& info = pContents->itemAt(i); - pContents->editItemAt(i).setFileName(partialPath.appendPathCopy(info.getFileName())); - } - - mergeInfoLocked(pMergedInfo, pContents); - return true; -} - -/* - * Trash the cache. - */ -void AssetManager::purgeFileNameCacheLocked(void) -{ - mCacheValid = false; - mCache.clear(); -} - -/* - * =========================================================================== - * AssetManager::SharedZip - * =========================================================================== - */ - - -Mutex AssetManager::SharedZip::gLock; -DefaultKeyedVector<String8, wp<AssetManager::SharedZip> > AssetManager::SharedZip::gOpen; - -AssetManager::SharedZip::SharedZip(const String8& path, time_t modWhen) - : mPath(path), mZipFile(NULL), mModWhen(modWhen), - mResourceTableAsset(NULL), mResourceTable(NULL) -{ - //ALOGI("Creating SharedZip %p %s\n", this, (const char*)mPath); - mZipFile = new ZipFileRO; - ALOGV("+++ opening zip '%s'\n", mPath.string()); - if (mZipFile->open(mPath.string()) != NO_ERROR) { - ALOGD("failed to open Zip archive '%s'\n", mPath.string()); - delete mZipFile; - mZipFile = NULL; - } -} - -sp<AssetManager::SharedZip> AssetManager::SharedZip::get(const String8& path) -{ - AutoMutex _l(gLock); - time_t modWhen = getFileModDate(path); - sp<SharedZip> zip = gOpen.valueFor(path).promote(); - if (zip != NULL && zip->mModWhen == modWhen) { - return zip; - } - zip = new SharedZip(path, modWhen); - gOpen.add(path, zip); - return zip; - -} - -ZipFileRO* AssetManager::SharedZip::getZip() -{ - return mZipFile; -} - -Asset* AssetManager::SharedZip::getResourceTableAsset() -{ - ALOGV("Getting from SharedZip %p resource asset %p\n", this, mResourceTableAsset); - return mResourceTableAsset; -} - -Asset* AssetManager::SharedZip::setResourceTableAsset(Asset* asset) -{ - { - AutoMutex _l(gLock); - if (mResourceTableAsset == NULL) { - mResourceTableAsset = asset; - // This is not thread safe the first time it is called, so - // do it here with the global lock held. - asset->getBuffer(true); - return asset; - } - } - delete asset; - return mResourceTableAsset; -} - -ResTable* AssetManager::SharedZip::getResourceTable() -{ - ALOGV("Getting from SharedZip %p resource table %p\n", this, mResourceTable); - return mResourceTable; -} - -ResTable* AssetManager::SharedZip::setResourceTable(ResTable* res) -{ - { - AutoMutex _l(gLock); - if (mResourceTable == NULL) { - mResourceTable = res; - return res; - } - } - delete res; - return mResourceTable; -} - -bool AssetManager::SharedZip::isUpToDate() -{ - time_t modWhen = getFileModDate(mPath.string()); - return mModWhen == modWhen; -} - -AssetManager::SharedZip::~SharedZip() -{ - //ALOGI("Destroying SharedZip %p %s\n", this, (const char*)mPath); - if (mResourceTable != NULL) { - delete mResourceTable; - } - if (mResourceTableAsset != NULL) { - delete mResourceTableAsset; - } - if (mZipFile != NULL) { - delete mZipFile; - ALOGV("Closed '%s'\n", mPath.string()); - } -} - -/* - * =========================================================================== - * AssetManager::ZipSet - * =========================================================================== - */ - -/* - * Constructor. - */ -AssetManager::ZipSet::ZipSet(void) -{ -} - -/* - * Destructor. Close any open archives. - */ -AssetManager::ZipSet::~ZipSet(void) -{ - size_t N = mZipFile.size(); - for (size_t i = 0; i < N; i++) - closeZip(i); -} - -/* - * Close a Zip file and reset the entry. - */ -void AssetManager::ZipSet::closeZip(int idx) -{ - mZipFile.editItemAt(idx) = NULL; -} - - -/* - * Retrieve the appropriate Zip file from the set. - */ -ZipFileRO* AssetManager::ZipSet::getZip(const String8& path) -{ - int idx = getIndex(path); - sp<SharedZip> zip = mZipFile[idx]; - if (zip == NULL) { - zip = SharedZip::get(path); - mZipFile.editItemAt(idx) = zip; - } - return zip->getZip(); -} - -Asset* AssetManager::ZipSet::getZipResourceTableAsset(const String8& path) -{ - int idx = getIndex(path); - sp<SharedZip> zip = mZipFile[idx]; - if (zip == NULL) { - zip = SharedZip::get(path); - mZipFile.editItemAt(idx) = zip; - } - return zip->getResourceTableAsset(); -} - -Asset* AssetManager::ZipSet::setZipResourceTableAsset(const String8& path, - Asset* asset) -{ - int idx = getIndex(path); - sp<SharedZip> zip = mZipFile[idx]; - // doesn't make sense to call before previously accessing. - return zip->setResourceTableAsset(asset); -} - -ResTable* AssetManager::ZipSet::getZipResourceTable(const String8& path) -{ - int idx = getIndex(path); - sp<SharedZip> zip = mZipFile[idx]; - if (zip == NULL) { - zip = SharedZip::get(path); - mZipFile.editItemAt(idx) = zip; - } - return zip->getResourceTable(); -} - -ResTable* AssetManager::ZipSet::setZipResourceTable(const String8& path, - ResTable* res) -{ - int idx = getIndex(path); - sp<SharedZip> zip = mZipFile[idx]; - // doesn't make sense to call before previously accessing. - return zip->setResourceTable(res); -} - -/* - * Generate the partial pathname for the specified archive. The caller - * gets to prepend the asset root directory. - * - * Returns something like "common/en-US-noogle.jar". - */ -/*static*/ String8 AssetManager::ZipSet::getPathName(const char* zipPath) -{ - return String8(zipPath); -} - -bool AssetManager::ZipSet::isUpToDate() -{ - const size_t N = mZipFile.size(); - for (size_t i=0; i<N; i++) { - if (mZipFile[i] != NULL && !mZipFile[i]->isUpToDate()) { - return false; - } - } - return true; -} - -/* - * Compute the zip file's index. - * - * "appName", "locale", and "vendor" should be set to NULL to indicate the - * default directory. - */ -int AssetManager::ZipSet::getIndex(const String8& zip) const -{ - const size_t N = mZipPath.size(); - for (size_t i=0; i<N; i++) { - if (mZipPath[i] == zip) { - return i; - } - } - - mZipPath.add(zip); - mZipFile.add(NULL); - - return mZipPath.size()-1; -} diff --git a/libs/utils/BackupData.cpp b/libs/utils/BackupData.cpp deleted file mode 100644 index f956306136..0000000000 --- a/libs/utils/BackupData.cpp +++ /dev/null @@ -1,381 +0,0 @@ -/* - * Copyright (C) 2009 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#define LOG_TAG "backup_data" - -#include <utils/BackupHelpers.h> -#include <utils/ByteOrder.h> - -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -#include <cutils/log.h> - -namespace android { - -static const bool DEBUG = false; - -/* - * File Format (v1): - * - * All ints are stored little-endian. - * - * - An app_header_v1 struct. - * - The name of the package, utf-8, null terminated, padded to 4-byte boundary. - * - A sequence of zero or more key/value paires (entities), each with - * - A entity_header_v1 struct - * - The key, utf-8, null terminated, padded to 4-byte boundary. - * - The value, padded to 4 byte boundary - */ - -const static int ROUND_UP[4] = { 0, 3, 2, 1 }; - -static inline size_t -round_up(size_t n) -{ - return n + ROUND_UP[n % 4]; -} - -static inline size_t -padding_extra(size_t n) -{ - return ROUND_UP[n % 4]; -} - -BackupDataWriter::BackupDataWriter(int fd) - :m_fd(fd), - m_status(NO_ERROR), - m_pos(0), - m_entityCount(0) -{ -} - -BackupDataWriter::~BackupDataWriter() -{ -} - -// Pad out anything they've previously written to the next 4 byte boundary. -status_t -BackupDataWriter::write_padding_for(int n) -{ - ssize_t amt; - ssize_t paddingSize; - - paddingSize = padding_extra(n); - if (paddingSize > 0) { - uint32_t padding = 0xbcbcbcbc; - if (DEBUG) ALOGI("writing %d padding bytes for %d", paddingSize, n); - amt = write(m_fd, &padding, paddingSize); - if (amt != paddingSize) { - m_status = errno; - return m_status; - } - m_pos += amt; - } - return NO_ERROR; -} - -status_t -BackupDataWriter::WriteEntityHeader(const String8& key, size_t dataSize) -{ - if (m_status != NO_ERROR) { - return m_status; - } - - ssize_t amt; - - amt = write_padding_for(m_pos); - if (amt != 0) { - return amt; - } - - String8 k; - if (m_keyPrefix.length() > 0) { - k = m_keyPrefix; - k += ":"; - k += key; - } else { - k = key; - } - if (DEBUG) { - ALOGD("Writing header: prefix='%s' key='%s' dataSize=%d", m_keyPrefix.string(), - key.string(), dataSize); - } - - entity_header_v1 header; - ssize_t keyLen; - - keyLen = k.length(); - - header.type = tolel(BACKUP_HEADER_ENTITY_V1); - header.keyLen = tolel(keyLen); - header.dataSize = tolel(dataSize); - - if (DEBUG) ALOGI("writing entity header, %d bytes", sizeof(entity_header_v1)); - amt = write(m_fd, &header, sizeof(entity_header_v1)); - if (amt != sizeof(entity_header_v1)) { - m_status = errno; - return m_status; - } - m_pos += amt; - - if (DEBUG) ALOGI("writing entity header key, %d bytes", keyLen+1); - amt = write(m_fd, k.string(), keyLen+1); - if (amt != keyLen+1) { - m_status = errno; - return m_status; - } - m_pos += amt; - - amt = write_padding_for(keyLen+1); - - m_entityCount++; - - return amt; -} - -status_t -BackupDataWriter::WriteEntityData(const void* data, size_t size) -{ - if (DEBUG) ALOGD("Writing data: size=%lu", (unsigned long) size); - - if (m_status != NO_ERROR) { - if (DEBUG) { - ALOGD("Not writing data - stream in error state %d (%s)", m_status, strerror(m_status)); - } - return m_status; - } - - // We don't write padding here, because they're allowed to call this several - // times with smaller buffers. We write it at the end of WriteEntityHeader - // instead. - ssize_t amt = write(m_fd, data, size); - if (amt != (ssize_t)size) { - m_status = errno; - if (DEBUG) ALOGD("write returned error %d (%s)", m_status, strerror(m_status)); - return m_status; - } - m_pos += amt; - return NO_ERROR; -} - -void -BackupDataWriter::SetKeyPrefix(const String8& keyPrefix) -{ - m_keyPrefix = keyPrefix; -} - - -BackupDataReader::BackupDataReader(int fd) - :m_fd(fd), - m_done(false), - m_status(NO_ERROR), - m_pos(0), - m_entityCount(0) -{ - memset(&m_header, 0, sizeof(m_header)); -} - -BackupDataReader::~BackupDataReader() -{ -} - -status_t -BackupDataReader::Status() -{ - return m_status; -} - -#define CHECK_SIZE(actual, expected) \ - do { \ - if ((actual) != (expected)) { \ - if ((actual) == 0) { \ - m_status = EIO; \ - m_done = true; \ - } else { \ - m_status = errno; \ - ALOGD("CHECK_SIZE(a=%ld e=%ld) failed at line %d m_status='%s'", \ - long(actual), long(expected), __LINE__, strerror(m_status)); \ - } \ - return m_status; \ - } \ - } while(0) -#define SKIP_PADDING() \ - do { \ - status_t err = skip_padding(); \ - if (err != NO_ERROR) { \ - ALOGD("SKIP_PADDING FAILED at line %d", __LINE__); \ - m_status = err; \ - return err; \ - } \ - } while(0) - -status_t -BackupDataReader::ReadNextHeader(bool* done, int* type) -{ - *done = m_done; - if (m_status != NO_ERROR) { - return m_status; - } - - int amt; - - amt = skip_padding(); - if (amt == EIO) { - *done = m_done = true; - return NO_ERROR; - } - else if (amt != NO_ERROR) { - return amt; - } - amt = read(m_fd, &m_header, sizeof(m_header)); - *done = m_done = (amt == 0); - if (*done) { - return NO_ERROR; - } - CHECK_SIZE(amt, sizeof(m_header)); - m_pos += sizeof(m_header); - if (type) { - *type = m_header.type; - } - - // validate and fix up the fields. - m_header.type = fromlel(m_header.type); - switch (m_header.type) - { - case BACKUP_HEADER_ENTITY_V1: - { - m_header.entity.keyLen = fromlel(m_header.entity.keyLen); - if (m_header.entity.keyLen <= 0) { - ALOGD("Entity header at %d has keyLen<=0: 0x%08x\n", (int)m_pos, - (int)m_header.entity.keyLen); - m_status = EINVAL; - } - m_header.entity.dataSize = fromlel(m_header.entity.dataSize); - m_entityCount++; - - // read the rest of the header (filename) - size_t size = m_header.entity.keyLen; - char* buf = m_key.lockBuffer(size); - if (buf == NULL) { - m_status = ENOMEM; - return m_status; - } - int amt = read(m_fd, buf, size+1); - CHECK_SIZE(amt, (int)size+1); - m_key.unlockBuffer(size); - m_pos += size+1; - SKIP_PADDING(); - m_dataEndPos = m_pos + m_header.entity.dataSize; - - break; - } - default: - ALOGD("Chunk header at %d has invalid type: 0x%08x", - (int)(m_pos - sizeof(m_header)), (int)m_header.type); - m_status = EINVAL; - } - - return m_status; -} - -bool -BackupDataReader::HasEntities() -{ - return m_status == NO_ERROR && m_header.type == BACKUP_HEADER_ENTITY_V1; -} - -status_t -BackupDataReader::ReadEntityHeader(String8* key, size_t* dataSize) -{ - if (m_status != NO_ERROR) { - return m_status; - } - if (m_header.type != BACKUP_HEADER_ENTITY_V1) { - return EINVAL; - } - *key = m_key; - *dataSize = m_header.entity.dataSize; - return NO_ERROR; -} - -status_t -BackupDataReader::SkipEntityData() -{ - if (m_status != NO_ERROR) { - return m_status; - } - if (m_header.type != BACKUP_HEADER_ENTITY_V1) { - return EINVAL; - } - if (m_header.entity.dataSize > 0) { - int pos = lseek(m_fd, m_dataEndPos, SEEK_SET); - if (pos == -1) { - return errno; - } - } - SKIP_PADDING(); - return NO_ERROR; -} - -ssize_t -BackupDataReader::ReadEntityData(void* data, size_t size) -{ - if (m_status != NO_ERROR) { - return -1; - } - int remaining = m_dataEndPos - m_pos; - //ALOGD("ReadEntityData size=%d m_pos=0x%x m_dataEndPos=0x%x remaining=%d\n", - // size, m_pos, m_dataEndPos, remaining); - if (remaining <= 0) { - return 0; - } - if (((int)size) > remaining) { - size = remaining; - } - //ALOGD(" reading %d bytes", size); - int amt = read(m_fd, data, size); - if (amt < 0) { - m_status = errno; - return -1; - } - if (amt == 0) { - m_status = EIO; - m_done = true; - } - m_pos += amt; - return amt; -} - -status_t -BackupDataReader::skip_padding() -{ - ssize_t amt; - ssize_t paddingSize; - - paddingSize = padding_extra(m_pos); - if (paddingSize > 0) { - uint32_t padding; - amt = read(m_fd, &padding, paddingSize); - CHECK_SIZE(amt, paddingSize); - m_pos += amt; - } - return NO_ERROR; -} - - -} // namespace android diff --git a/libs/utils/BackupHelpers.cpp b/libs/utils/BackupHelpers.cpp deleted file mode 100644 index f77a8917c7..0000000000 --- a/libs/utils/BackupHelpers.cpp +++ /dev/null @@ -1,1594 +0,0 @@ -/* - * Copyright (C) 2009 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#define LOG_TAG "file_backup_helper" - -#include <utils/BackupHelpers.h> - -#include <utils/KeyedVector.h> -#include <utils/ByteOrder.h> -#include <utils/String8.h> - -#include <errno.h> -#include <sys/types.h> -#include <sys/uio.h> -#include <sys/stat.h> -#include <sys/time.h> // for utimes -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <utime.h> -#include <fcntl.h> -#include <zlib.h> - -#include <cutils/log.h> - -namespace android { - -#define MAGIC0 0x70616e53 // Snap -#define MAGIC1 0x656c6946 // File - -/* - * File entity data format (v1): - * - * - 4-byte version number of the metadata, little endian (0x00000001 for v1) - * - 12 bytes of metadata - * - the file data itself - * - * i.e. a 16-byte metadata header followed by the raw file data. If the - * restore code does not recognize the metadata version, it can still - * interpret the file data itself correctly. - * - * file_metadata_v1: - * - * - 4 byte version number === 0x00000001 (little endian) - * - 4-byte access mode (little-endian) - * - undefined (8 bytes) - */ - -struct file_metadata_v1 { - int version; - int mode; - int undefined_1; - int undefined_2; -}; - -const static int CURRENT_METADATA_VERSION = 1; - -#if 1 -#define LOGP(f, x...) -#else -#if TEST_BACKUP_HELPERS -#define LOGP(f, x...) printf(f "\n", x) -#else -#define LOGP(x...) ALOGD(x) -#endif -#endif - -const static int ROUND_UP[4] = { 0, 3, 2, 1 }; - -static inline int -round_up(int n) -{ - return n + ROUND_UP[n % 4]; -} - -static int -read_snapshot_file(int fd, KeyedVector<String8,FileState>* snapshot) -{ - int bytesRead = 0; - int amt; - SnapshotHeader header; - - amt = read(fd, &header, sizeof(header)); - if (amt != sizeof(header)) { - return errno; - } - bytesRead += amt; - - if (header.magic0 != MAGIC0 || header.magic1 != MAGIC1) { - ALOGW("read_snapshot_file header.magic0=0x%08x magic1=0x%08x", header.magic0, header.magic1); - return 1; - } - - for (int i=0; i<header.fileCount; i++) { - FileState file; - char filenameBuf[128]; - - amt = read(fd, &file, sizeof(FileState)); - if (amt != sizeof(FileState)) { - ALOGW("read_snapshot_file FileState truncated/error with read at %d bytes\n", bytesRead); - return 1; - } - bytesRead += amt; - - // filename is not NULL terminated, but it is padded - int nameBufSize = round_up(file.nameLen); - char* filename = nameBufSize <= (int)sizeof(filenameBuf) - ? filenameBuf - : (char*)malloc(nameBufSize); - amt = read(fd, filename, nameBufSize); - if (amt == nameBufSize) { - snapshot->add(String8(filename, file.nameLen), file); - } - bytesRead += amt; - if (filename != filenameBuf) { - free(filename); - } - if (amt != nameBufSize) { - ALOGW("read_snapshot_file filename truncated/error with read at %d bytes\n", bytesRead); - return 1; - } - } - - if (header.totalSize != bytesRead) { - ALOGW("read_snapshot_file length mismatch: header.totalSize=%d bytesRead=%d\n", - header.totalSize, bytesRead); - return 1; - } - - return 0; -} - -static int -write_snapshot_file(int fd, const KeyedVector<String8,FileRec>& snapshot) -{ - int fileCount = 0; - int bytesWritten = sizeof(SnapshotHeader); - // preflight size - const int N = snapshot.size(); - for (int i=0; i<N; i++) { - const FileRec& g = snapshot.valueAt(i); - if (!g.deleted) { - const String8& name = snapshot.keyAt(i); - bytesWritten += sizeof(FileState) + round_up(name.length()); - fileCount++; - } - } - - LOGP("write_snapshot_file fd=%d\n", fd); - - int amt; - SnapshotHeader header = { MAGIC0, fileCount, MAGIC1, bytesWritten }; - - amt = write(fd, &header, sizeof(header)); - if (amt != sizeof(header)) { - ALOGW("write_snapshot_file error writing header %s", strerror(errno)); - return errno; - } - - for (int i=0; i<N; i++) { - FileRec r = snapshot.valueAt(i); - if (!r.deleted) { - const String8& name = snapshot.keyAt(i); - int nameLen = r.s.nameLen = name.length(); - - amt = write(fd, &r.s, sizeof(FileState)); - if (amt != sizeof(FileState)) { - ALOGW("write_snapshot_file error writing header %s", strerror(errno)); - return 1; - } - - // filename is not NULL terminated, but it is padded - amt = write(fd, name.string(), nameLen); - if (amt != nameLen) { - ALOGW("write_snapshot_file error writing filename %s", strerror(errno)); - return 1; - } - int paddingLen = ROUND_UP[nameLen % 4]; - if (paddingLen != 0) { - int padding = 0xabababab; - amt = write(fd, &padding, paddingLen); - if (amt != paddingLen) { - ALOGW("write_snapshot_file error writing %d bytes of filename padding %s", - paddingLen, strerror(errno)); - return 1; - } - } - } - } - - return 0; -} - -static int -write_delete_file(BackupDataWriter* dataStream, const String8& key) -{ - LOGP("write_delete_file %s\n", key.string()); - return dataStream->WriteEntityHeader(key, -1); -} - -static int -write_update_file(BackupDataWriter* dataStream, int fd, int mode, const String8& key, - char const* realFilename) -{ - LOGP("write_update_file %s (%s) : mode 0%o\n", realFilename, key.string(), mode); - - const int bufsize = 4*1024; - int err; - int amt; - int fileSize; - int bytesLeft; - file_metadata_v1 metadata; - - char* buf = (char*)malloc(bufsize); - int crc = crc32(0L, Z_NULL, 0); - - - fileSize = lseek(fd, 0, SEEK_END); - lseek(fd, 0, SEEK_SET); - - if (sizeof(metadata) != 16) { - ALOGE("ERROR: metadata block is the wrong size!"); - } - - bytesLeft = fileSize + sizeof(metadata); - err = dataStream->WriteEntityHeader(key, bytesLeft); - if (err != 0) { - free(buf); - return err; - } - - // store the file metadata first - metadata.version = tolel(CURRENT_METADATA_VERSION); - metadata.mode = tolel(mode); - metadata.undefined_1 = metadata.undefined_2 = 0; - err = dataStream->WriteEntityData(&metadata, sizeof(metadata)); - if (err != 0) { - free(buf); - return err; - } - bytesLeft -= sizeof(metadata); // bytesLeft should == fileSize now - - // now store the file content - while ((amt = read(fd, buf, bufsize)) != 0 && bytesLeft > 0) { - bytesLeft -= amt; - if (bytesLeft < 0) { - amt += bytesLeft; // Plus a negative is minus. Don't write more than we promised. - } - err = dataStream->WriteEntityData(buf, amt); - if (err != 0) { - free(buf); - return err; - } - } - if (bytesLeft != 0) { - if (bytesLeft > 0) { - // Pad out the space we promised in the buffer. We can't corrupt the buffer, - // even though the data we're sending is probably bad. - memset(buf, 0, bufsize); - while (bytesLeft > 0) { - amt = bytesLeft < bufsize ? bytesLeft : bufsize; - bytesLeft -= amt; - err = dataStream->WriteEntityData(buf, amt); - if (err != 0) { - free(buf); - return err; - } - } - } - ALOGE("write_update_file size mismatch for %s. expected=%d actual=%d." - " You aren't doing proper locking!", realFilename, fileSize, fileSize-bytesLeft); - } - - free(buf); - return NO_ERROR; -} - -static int -write_update_file(BackupDataWriter* dataStream, const String8& key, char const* realFilename) -{ - int err; - struct stat st; - - err = stat(realFilename, &st); - if (err < 0) { - return errno; - } - - int fd = open(realFilename, O_RDONLY); - if (fd == -1) { - return errno; - } - - err = write_update_file(dataStream, fd, st.st_mode, key, realFilename); - close(fd); - return err; -} - -static int -compute_crc32(int fd) -{ - const int bufsize = 4*1024; - int amt; - - char* buf = (char*)malloc(bufsize); - int crc = crc32(0L, Z_NULL, 0); - - lseek(fd, 0, SEEK_SET); - - while ((amt = read(fd, buf, bufsize)) != 0) { - crc = crc32(crc, (Bytef*)buf, amt); - } - - free(buf); - return crc; -} - -int -back_up_files(int oldSnapshotFD, BackupDataWriter* dataStream, int newSnapshotFD, - char const* const* files, char const* const* keys, int fileCount) -{ - int err; - KeyedVector<String8,FileState> oldSnapshot; - KeyedVector<String8,FileRec> newSnapshot; - - if (oldSnapshotFD != -1) { - err = read_snapshot_file(oldSnapshotFD, &oldSnapshot); - if (err != 0) { - // On an error, treat this as a full backup. - oldSnapshot.clear(); - } - } - - for (int i=0; i<fileCount; i++) { - String8 key(keys[i]); - FileRec r; - char const* file = files[i]; - r.file = file; - struct stat st; - - err = stat(file, &st); - if (err != 0) { - r.deleted = true; - } else { - r.deleted = false; - r.s.modTime_sec = st.st_mtime; - r.s.modTime_nsec = 0; // workaround sim breakage - //r.s.modTime_nsec = st.st_mtime_nsec; - r.s.mode = st.st_mode; - r.s.size = st.st_size; - // we compute the crc32 later down below, when we already have the file open. - - if (newSnapshot.indexOfKey(key) >= 0) { - LOGP("back_up_files key already in use '%s'", key.string()); - return -1; - } - } - newSnapshot.add(key, r); - } - - int n = 0; - int N = oldSnapshot.size(); - int m = 0; - - while (n<N && m<fileCount) { - const String8& p = oldSnapshot.keyAt(n); - const String8& q = newSnapshot.keyAt(m); - FileRec& g = newSnapshot.editValueAt(m); - int cmp = p.compare(q); - if (g.deleted || cmp < 0) { - // file removed - LOGP("file removed: %s", p.string()); - g.deleted = true; // They didn't mention the file, but we noticed that it's gone. - dataStream->WriteEntityHeader(p, -1); - n++; - } - else if (cmp > 0) { - // file added - LOGP("file added: %s", g.file.string()); - write_update_file(dataStream, q, g.file.string()); - m++; - } - else { - // both files exist, check them - const FileState& f = oldSnapshot.valueAt(n); - - int fd = open(g.file.string(), O_RDONLY); - if (fd < 0) { - // We can't open the file. Don't report it as a delete either. Let the - // server keep the old version. Maybe they'll be able to deal with it - // on restore. - LOGP("Unable to open file %s - skipping", g.file.string()); - } else { - g.s.crc32 = compute_crc32(fd); - - LOGP("%s", q.string()); - LOGP(" new: modTime=%d,%d mode=%04o size=%-3d crc32=0x%08x", - f.modTime_sec, f.modTime_nsec, f.mode, f.size, f.crc32); - LOGP(" old: modTime=%d,%d mode=%04o size=%-3d crc32=0x%08x", - g.s.modTime_sec, g.s.modTime_nsec, g.s.mode, g.s.size, g.s.crc32); - if (f.modTime_sec != g.s.modTime_sec || f.modTime_nsec != g.s.modTime_nsec - || f.mode != g.s.mode || f.size != g.s.size || f.crc32 != g.s.crc32) { - write_update_file(dataStream, fd, g.s.mode, p, g.file.string()); - } - - close(fd); - } - n++; - m++; - } - } - - // these were deleted - while (n<N) { - dataStream->WriteEntityHeader(oldSnapshot.keyAt(n), -1); - n++; - } - - // these were added - while (m<fileCount) { - const String8& q = newSnapshot.keyAt(m); - FileRec& g = newSnapshot.editValueAt(m); - write_update_file(dataStream, q, g.file.string()); - m++; - } - - err = write_snapshot_file(newSnapshotFD, newSnapshot); - - return 0; -} - -// Utility function, equivalent to stpcpy(): perform a strcpy, but instead of -// returning the initial dest, return a pointer to the trailing NUL. -static char* strcpy_ptr(char* dest, const char* str) { - if (dest && str) { - while ((*dest = *str) != 0) { - dest++; - str++; - } - } - return dest; -} - -static void calc_tar_checksum(char* buf) { - // [ 148 : 8 ] checksum -- to be calculated with this field as space chars - memset(buf + 148, ' ', 8); - - uint16_t sum = 0; - for (uint8_t* p = (uint8_t*) buf; p < ((uint8_t*)buf) + 512; p++) { - sum += *p; - } - - // Now write the real checksum value: - // [ 148 : 8 ] checksum: 6 octal digits [leading zeroes], NUL, SPC - sprintf(buf + 148, "%06o", sum); // the trailing space is already in place -} - -// Returns number of bytes written -static int write_pax_header_entry(char* buf, const char* key, const char* value) { - // start with the size of "1 key=value\n" - int len = strlen(key) + strlen(value) + 4; - if (len > 9) len++; - if (len > 99) len++; - if (len > 999) len++; - // since PATH_MAX is 4096 we don't expect to have to generate any single - // header entry longer than 9999 characters - - return sprintf(buf, "%d %s=%s\n", len, key, value); -} - -// Wire format to the backup manager service is chunked: each chunk is prefixed by -// a 4-byte count of its size. A chunk size of zero (four zero bytes) indicates EOD. -void send_tarfile_chunk(BackupDataWriter* writer, const char* buffer, size_t size) { - uint32_t chunk_size_no = htonl(size); - writer->WriteEntityData(&chunk_size_no, 4); - if (size != 0) writer->WriteEntityData(buffer, size); -} - -int write_tarfile(const String8& packageName, const String8& domain, - const String8& rootpath, const String8& filepath, BackupDataWriter* writer) -{ - // In the output stream everything is stored relative to the root - const char* relstart = filepath.string() + rootpath.length(); - if (*relstart == '/') relstart++; // won't be true when path == rootpath - String8 relpath(relstart); - - // If relpath is empty, it means this is the top of one of the standard named - // domain directories, so we should just skip it - if (relpath.length() == 0) { - return 0; - } - - // Too long a name for the ustar format? - // "apps/" + packagename + '/' + domainpath < 155 chars - // relpath < 100 chars - bool needExtended = false; - if ((5 + packageName.length() + 1 + domain.length() >= 155) || (relpath.length() >= 100)) { - needExtended = true; - } - - // Non-7bit-clean path also means needing pax extended format - if (!needExtended) { - for (size_t i = 0; i < filepath.length(); i++) { - if ((filepath[i] & 0x80) != 0) { - needExtended = true; - break; - } - } - } - - int err = 0; - struct stat64 s; - if (lstat64(filepath.string(), &s) != 0) { - err = errno; - ALOGE("Error %d (%s) from lstat64(%s)", err, strerror(err), filepath.string()); - return err; - } - - String8 fullname; // for pax later on - String8 prefix; - - const int isdir = S_ISDIR(s.st_mode); - if (isdir) s.st_size = 0; // directories get no actual data in the tar stream - - // !!! TODO: use mmap when possible to avoid churning the buffer cache - // !!! TODO: this will break with symlinks; need to use readlink(2) - int fd = open(filepath.string(), O_RDONLY); - if (fd < 0) { - err = errno; - ALOGE("Error %d (%s) from open(%s)", err, strerror(err), filepath.string()); - return err; - } - - // read/write up to this much at a time. - const size_t BUFSIZE = 32 * 1024; - char* buf = new char[BUFSIZE]; - char* paxHeader = buf + 512; // use a different chunk of it as separate scratch - char* paxData = buf + 1024; - - if (buf == NULL) { - ALOGE("Out of mem allocating transfer buffer"); - err = ENOMEM; - goto cleanup; - } - - // Good to go -- first construct the standard tar header at the start of the buffer - memset(buf, 0, BUFSIZE); - - // Magic fields for the ustar file format - strcat(buf + 257, "ustar"); - strcat(buf + 263, "00"); - - // [ 265 : 32 ] user name, ignored on restore - // [ 297 : 32 ] group name, ignored on restore - - // [ 100 : 8 ] file mode - snprintf(buf + 100, 8, "%06o ", s.st_mode & ~S_IFMT); - - // [ 108 : 8 ] uid -- ignored in Android format; uids are remapped at restore time - // [ 116 : 8 ] gid -- ignored in Android format - snprintf(buf + 108, 8, "0%lo", s.st_uid); - snprintf(buf + 116, 8, "0%lo", s.st_gid); - - // [ 124 : 12 ] file size in bytes - if (s.st_size > 077777777777LL) { - // very large files need a pax extended size header - needExtended = true; - } - snprintf(buf + 124, 12, "%011llo", (isdir) ? 0LL : s.st_size); - - // [ 136 : 12 ] last mod time as a UTC time_t - snprintf(buf + 136, 12, "%0lo", s.st_mtime); - - // [ 156 : 1 ] link/file type - uint8_t type; - if (isdir) { - type = '5'; // tar magic: '5' == directory - } else if (S_ISREG(s.st_mode)) { - type = '0'; // tar magic: '0' == normal file - } else { - ALOGW("Error: unknown file mode 0%o [%s]", s.st_mode, filepath.string()); - goto cleanup; - } - buf[156] = type; - - // [ 157 : 100 ] name of linked file [not implemented] - - { - // Prefix and main relative path. Path lengths have been preflighted. - if (packageName.length() > 0) { - prefix = "apps/"; - prefix += packageName; - } - if (domain.length() > 0) { - prefix.appendPath(domain); - } - - // pax extended means we don't put in a prefix field, and put a different - // string in the basic name field. We can also construct the full path name - // out of the substrings we've now built. - fullname = prefix; - fullname.appendPath(relpath); - - // ustar: - // [ 0 : 100 ]; file name/path - // [ 345 : 155 ] filename path prefix - // We only use the prefix area if fullname won't fit in the path - if (fullname.length() > 100) { - strncpy(buf, relpath.string(), 100); - strncpy(buf + 345, prefix.string(), 155); - } else { - strncpy(buf, fullname.string(), 100); - } - } - - // [ 329 : 8 ] and [ 337 : 8 ] devmajor/devminor, not used - - ALOGI(" Name: %s", fullname.string()); - - // If we're using a pax extended header, build & write that here; lengths are - // already preflighted - if (needExtended) { - char sizeStr[32]; // big enough for a 64-bit unsigned value in decimal - char* p = paxData; - - // construct the pax extended header data block - memset(paxData, 0, BUFSIZE - (paxData - buf)); - int len; - - // size header -- calc len in digits by actually rendering the number - // to a string - brute force but simple - snprintf(sizeStr, sizeof(sizeStr), "%lld", s.st_size); - p += write_pax_header_entry(p, "size", sizeStr); - - // fullname was generated above with the ustar paths - p += write_pax_header_entry(p, "path", fullname.string()); - - // Now we know how big the pax data is - int paxLen = p - paxData; - - // Now build the pax *header* templated on the ustar header - memcpy(paxHeader, buf, 512); - - String8 leaf = fullname.getPathLeaf(); - memset(paxHeader, 0, 100); // rewrite the name area - snprintf(paxHeader, 100, "PaxHeader/%s", leaf.string()); - memset(paxHeader + 345, 0, 155); // rewrite the prefix area - strncpy(paxHeader + 345, prefix.string(), 155); - - paxHeader[156] = 'x'; // mark it as a pax extended header - - // [ 124 : 12 ] size of pax extended header data - memset(paxHeader + 124, 0, 12); - snprintf(paxHeader + 124, 12, "%011o", p - paxData); - - // Checksum and write the pax block header - calc_tar_checksum(paxHeader); - send_tarfile_chunk(writer, paxHeader, 512); - - // Now write the pax data itself - int paxblocks = (paxLen + 511) / 512; - send_tarfile_chunk(writer, paxData, 512 * paxblocks); - } - - // Checksum and write the 512-byte ustar file header block to the output - calc_tar_checksum(buf); - send_tarfile_chunk(writer, buf, 512); - - // Now write the file data itself, for real files. We honor tar's convention that - // only full 512-byte blocks are sent to write(). - if (!isdir) { - off64_t toWrite = s.st_size; - while (toWrite > 0) { - size_t toRead = (toWrite < BUFSIZE) ? toWrite : BUFSIZE; - ssize_t nRead = read(fd, buf, toRead); - if (nRead < 0) { - err = errno; - ALOGE("Unable to read file [%s], err=%d (%s)", filepath.string(), - err, strerror(err)); - break; - } else if (nRead == 0) { - ALOGE("EOF but expect %lld more bytes in [%s]", (long long) toWrite, - filepath.string()); - err = EIO; - break; - } - - // At EOF we might have a short block; NUL-pad that to a 512-byte multiple. This - // depends on the OS guarantee that for ordinary files, read() will never return - // less than the number of bytes requested. - ssize_t partial = (nRead+512) % 512; - if (partial > 0) { - ssize_t remainder = 512 - partial; - memset(buf + nRead, 0, remainder); - nRead += remainder; - } - send_tarfile_chunk(writer, buf, nRead); - toWrite -= nRead; - } - } - -cleanup: - delete [] buf; -done: - close(fd); - return err; -} -// end tarfile - - - -#define RESTORE_BUF_SIZE (8*1024) - -RestoreHelperBase::RestoreHelperBase() -{ - m_buf = malloc(RESTORE_BUF_SIZE); - m_loggedUnknownMetadata = false; -} - -RestoreHelperBase::~RestoreHelperBase() -{ - free(m_buf); -} - -status_t -RestoreHelperBase::WriteFile(const String8& filename, BackupDataReader* in) -{ - ssize_t err; - size_t dataSize; - String8 key; - int fd; - void* buf = m_buf; - ssize_t amt; - int mode; - int crc; - struct stat st; - FileRec r; - - err = in->ReadEntityHeader(&key, &dataSize); - if (err != NO_ERROR) { - return err; - } - - // Get the metadata block off the head of the file entity and use that to - // set up the output file - file_metadata_v1 metadata; - amt = in->ReadEntityData(&metadata, sizeof(metadata)); - if (amt != sizeof(metadata)) { - ALOGW("Could not read metadata for %s -- %ld / %s", filename.string(), - (long)amt, strerror(errno)); - return EIO; - } - metadata.version = fromlel(metadata.version); - metadata.mode = fromlel(metadata.mode); - if (metadata.version > CURRENT_METADATA_VERSION) { - if (!m_loggedUnknownMetadata) { - m_loggedUnknownMetadata = true; - ALOGW("Restoring file with unsupported metadata version %d (currently %d)", - metadata.version, CURRENT_METADATA_VERSION); - } - } - mode = metadata.mode; - - // Write the file and compute the crc - crc = crc32(0L, Z_NULL, 0); - fd = open(filename.string(), O_CREAT|O_RDWR|O_TRUNC, mode); - if (fd == -1) { - ALOGW("Could not open file %s -- %s", filename.string(), strerror(errno)); - return errno; - } - - while ((amt = in->ReadEntityData(buf, RESTORE_BUF_SIZE)) > 0) { - err = write(fd, buf, amt); - if (err != amt) { - close(fd); - ALOGW("Error '%s' writing '%s'", strerror(errno), filename.string()); - return errno; - } - crc = crc32(crc, (Bytef*)buf, amt); - } - - close(fd); - - // Record for the snapshot - err = stat(filename.string(), &st); - if (err != 0) { - ALOGW("Error stating file that we just created %s", filename.string()); - return errno; - } - - r.file = filename; - r.deleted = false; - r.s.modTime_sec = st.st_mtime; - r.s.modTime_nsec = 0; // workaround sim breakage - //r.s.modTime_nsec = st.st_mtime_nsec; - r.s.mode = st.st_mode; - r.s.size = st.st_size; - r.s.crc32 = crc; - - m_files.add(key, r); - - return NO_ERROR; -} - -status_t -RestoreHelperBase::WriteSnapshot(int fd) -{ - return write_snapshot_file(fd, m_files);; -} - -#if TEST_BACKUP_HELPERS - -#define SCRATCH_DIR "/data/backup_helper_test/" - -static int -write_text_file(const char* path, const char* data) -{ - int amt; - int fd; - int len; - - fd = creat(path, 0666); - if (fd == -1) { - fprintf(stderr, "creat %s failed\n", path); - return errno; - } - - len = strlen(data); - amt = write(fd, data, len); - if (amt != len) { - fprintf(stderr, "error (%s) writing to file %s\n", strerror(errno), path); - return errno; - } - - close(fd); - - return 0; -} - -static int -compare_file(const char* path, const unsigned char* data, int len) -{ - int fd; - int amt; - - fd = open(path, O_RDONLY); - if (fd == -1) { - fprintf(stderr, "compare_file error (%s) opening %s\n", strerror(errno), path); - return errno; - } - - unsigned char* contents = (unsigned char*)malloc(len); - if (contents == NULL) { - fprintf(stderr, "malloc(%d) failed\n", len); - return ENOMEM; - } - - bool sizesMatch = true; - amt = lseek(fd, 0, SEEK_END); - if (amt != len) { - fprintf(stderr, "compare_file file length should be %d, was %d\n", len, amt); - sizesMatch = false; - } - lseek(fd, 0, SEEK_SET); - - int readLen = amt < len ? amt : len; - amt = read(fd, contents, readLen); - if (amt != readLen) { - fprintf(stderr, "compare_file read expected %d bytes but got %d\n", len, amt); - } - - bool contentsMatch = true; - for (int i=0; i<readLen; i++) { - if (data[i] != contents[i]) { - if (contentsMatch) { - fprintf(stderr, "compare_file contents are different: (index, expected, actual)\n"); - contentsMatch = false; - } - fprintf(stderr, " [%-2d] %02x %02x\n", i, data[i], contents[i]); - } - } - - free(contents); - return contentsMatch && sizesMatch ? 0 : 1; -} - -int -backup_helper_test_empty() -{ - int err; - int fd; - KeyedVector<String8,FileRec> snapshot; - const char* filename = SCRATCH_DIR "backup_helper_test_empty.snap"; - - system("rm -r " SCRATCH_DIR); - mkdir(SCRATCH_DIR, 0777); - - // write - fd = creat(filename, 0666); - if (fd == -1) { - fprintf(stderr, "error creating %s\n", filename); - return 1; - } - - err = write_snapshot_file(fd, snapshot); - - close(fd); - - if (err != 0) { - fprintf(stderr, "write_snapshot_file reported error %d (%s)\n", err, strerror(err)); - return err; - } - - static const unsigned char correct_data[] = { - 0x53, 0x6e, 0x61, 0x70, 0x00, 0x00, 0x00, 0x00, - 0x46, 0x69, 0x6c, 0x65, 0x10, 0x00, 0x00, 0x00 - }; - - err = compare_file(filename, correct_data, sizeof(correct_data)); - if (err != 0) { - return err; - } - - // read - fd = open(filename, O_RDONLY); - if (fd == -1) { - fprintf(stderr, "error opening for read %s\n", filename); - return 1; - } - - KeyedVector<String8,FileState> readSnapshot; - err = read_snapshot_file(fd, &readSnapshot); - if (err != 0) { - fprintf(stderr, "read_snapshot_file failed %d\n", err); - return err; - } - - if (readSnapshot.size() != 0) { - fprintf(stderr, "readSnapshot should be length 0\n"); - return 1; - } - - return 0; -} - -int -backup_helper_test_four() -{ - int err; - int fd; - KeyedVector<String8,FileRec> snapshot; - const char* filename = SCRATCH_DIR "backup_helper_test_four.snap"; - - system("rm -r " SCRATCH_DIR); - mkdir(SCRATCH_DIR, 0777); - - // write - fd = creat(filename, 0666); - if (fd == -1) { - fprintf(stderr, "error opening %s\n", filename); - return 1; - } - - String8 filenames[4]; - FileState states[4]; - FileRec r; - r.deleted = false; - - states[0].modTime_sec = 0xfedcba98; - states[0].modTime_nsec = 0xdeadbeef; - states[0].mode = 0777; // decimal 511, hex 0x000001ff - states[0].size = 0xababbcbc; - states[0].crc32 = 0x12345678; - states[0].nameLen = -12; - r.s = states[0]; - filenames[0] = String8("bytes_of_padding"); - snapshot.add(filenames[0], r); - - states[1].modTime_sec = 0x93400031; - states[1].modTime_nsec = 0xdeadbeef; - states[1].mode = 0666; // decimal 438, hex 0x000001b6 - states[1].size = 0x88557766; - states[1].crc32 = 0x22334422; - states[1].nameLen = -1; - r.s = states[1]; - filenames[1] = String8("bytes_of_padding3"); - snapshot.add(filenames[1], r); - - states[2].modTime_sec = 0x33221144; - states[2].modTime_nsec = 0xdeadbeef; - states[2].mode = 0744; // decimal 484, hex 0x000001e4 - states[2].size = 0x11223344; - states[2].crc32 = 0x01122334; - states[2].nameLen = 0; - r.s = states[2]; - filenames[2] = String8("bytes_of_padding_2"); - snapshot.add(filenames[2], r); - - states[3].modTime_sec = 0x33221144; - states[3].modTime_nsec = 0xdeadbeef; - states[3].mode = 0755; // decimal 493, hex 0x000001ed - states[3].size = 0x11223344; - states[3].crc32 = 0x01122334; - states[3].nameLen = 0; - r.s = states[3]; - filenames[3] = String8("bytes_of_padding__1"); - snapshot.add(filenames[3], r); - - err = write_snapshot_file(fd, snapshot); - - close(fd); - - if (err != 0) { - fprintf(stderr, "write_snapshot_file reported error %d (%s)\n", err, strerror(err)); - return err; - } - - static const unsigned char correct_data[] = { - // header - 0x53, 0x6e, 0x61, 0x70, 0x04, 0x00, 0x00, 0x00, - 0x46, 0x69, 0x6c, 0x65, 0xbc, 0x00, 0x00, 0x00, - - // bytes_of_padding - 0x98, 0xba, 0xdc, 0xfe, 0xef, 0xbe, 0xad, 0xde, - 0xff, 0x01, 0x00, 0x00, 0xbc, 0xbc, 0xab, 0xab, - 0x78, 0x56, 0x34, 0x12, 0x10, 0x00, 0x00, 0x00, - 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x6f, 0x66, - 0x5f, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, - - // bytes_of_padding3 - 0x31, 0x00, 0x40, 0x93, 0xef, 0xbe, 0xad, 0xde, - 0xb6, 0x01, 0x00, 0x00, 0x66, 0x77, 0x55, 0x88, - 0x22, 0x44, 0x33, 0x22, 0x11, 0x00, 0x00, 0x00, - 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x6f, 0x66, - 0x5f, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, - 0x33, 0xab, 0xab, 0xab, - - // bytes of padding2 - 0x44, 0x11, 0x22, 0x33, 0xef, 0xbe, 0xad, 0xde, - 0xe4, 0x01, 0x00, 0x00, 0x44, 0x33, 0x22, 0x11, - 0x34, 0x23, 0x12, 0x01, 0x12, 0x00, 0x00, 0x00, - 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x6f, 0x66, - 0x5f, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, - 0x5f, 0x32, 0xab, 0xab, - - // bytes of padding3 - 0x44, 0x11, 0x22, 0x33, 0xef, 0xbe, 0xad, 0xde, - 0xed, 0x01, 0x00, 0x00, 0x44, 0x33, 0x22, 0x11, - 0x34, 0x23, 0x12, 0x01, 0x13, 0x00, 0x00, 0x00, - 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x6f, 0x66, - 0x5f, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, - 0x5f, 0x5f, 0x31, 0xab - }; - - err = compare_file(filename, correct_data, sizeof(correct_data)); - if (err != 0) { - return err; - } - - // read - fd = open(filename, O_RDONLY); - if (fd == -1) { - fprintf(stderr, "error opening for read %s\n", filename); - return 1; - } - - - KeyedVector<String8,FileState> readSnapshot; - err = read_snapshot_file(fd, &readSnapshot); - if (err != 0) { - fprintf(stderr, "read_snapshot_file failed %d\n", err); - return err; - } - - if (readSnapshot.size() != 4) { - fprintf(stderr, "readSnapshot should be length 4 is %d\n", readSnapshot.size()); - return 1; - } - - bool matched = true; - for (size_t i=0; i<readSnapshot.size(); i++) { - const String8& name = readSnapshot.keyAt(i); - const FileState state = readSnapshot.valueAt(i); - - if (name != filenames[i] || states[i].modTime_sec != state.modTime_sec - || states[i].modTime_nsec != state.modTime_nsec || states[i].mode != state.mode - || states[i].size != state.size || states[i].crc32 != states[i].crc32) { - fprintf(stderr, "state %d expected={%d/%d, 0x%08x, %04o, 0x%08x, %3d} '%s'\n" - " actual={%d/%d, 0x%08x, %04o, 0x%08x, %3d} '%s'\n", i, - states[i].modTime_sec, states[i].modTime_nsec, states[i].mode, states[i].size, - states[i].crc32, name.length(), filenames[i].string(), - state.modTime_sec, state.modTime_nsec, state.mode, state.size, state.crc32, - state.nameLen, name.string()); - matched = false; - } - } - - return matched ? 0 : 1; -} - -// hexdump -v -e '" " 8/1 " 0x%02x," "\n"' data_writer.data -const unsigned char DATA_GOLDEN_FILE[] = { - 0x44, 0x61, 0x74, 0x61, 0x0b, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x5f, 0x70, - 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x00, - 0x6e, 0x6f, 0x5f, 0x70, 0x61, 0x64, 0x64, 0x69, - 0x6e, 0x67, 0x5f, 0x00, 0x44, 0x61, 0x74, 0x61, - 0x0c, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, - 0x70, 0x61, 0x64, 0x64, 0x65, 0x64, 0x5f, 0x74, - 0x6f, 0x5f, 0x5f, 0x33, 0x00, 0xbc, 0xbc, 0xbc, - 0x70, 0x61, 0x64, 0x64, 0x65, 0x64, 0x5f, 0x74, - 0x6f, 0x5f, 0x5f, 0x33, 0x00, 0xbc, 0xbc, 0xbc, - 0x44, 0x61, 0x74, 0x61, 0x0d, 0x00, 0x00, 0x00, - 0x0e, 0x00, 0x00, 0x00, 0x70, 0x61, 0x64, 0x64, - 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x5f, 0x32, 0x5f, - 0x5f, 0x00, 0xbc, 0xbc, 0x70, 0x61, 0x64, 0x64, - 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x5f, 0x32, 0x5f, - 0x5f, 0x00, 0xbc, 0xbc, 0x44, 0x61, 0x74, 0x61, - 0x0a, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, - 0x70, 0x61, 0x64, 0x64, 0x65, 0x64, 0x5f, 0x74, - 0x6f, 0x31, 0x00, 0xbc, 0x70, 0x61, 0x64, 0x64, - 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x31, 0x00 - -}; -const int DATA_GOLDEN_FILE_SIZE = sizeof(DATA_GOLDEN_FILE); - -static int -test_write_header_and_entity(BackupDataWriter& writer, const char* str) -{ - int err; - String8 text(str); - - err = writer.WriteEntityHeader(text, text.length()+1); - if (err != 0) { - fprintf(stderr, "WriteEntityHeader failed with %s\n", strerror(err)); - return err; - } - - err = writer.WriteEntityData(text.string(), text.length()+1); - if (err != 0) { - fprintf(stderr, "write failed for data '%s'\n", text.string()); - return errno; - } - - return err; -} - -int -backup_helper_test_data_writer() -{ - int err; - int fd; - const char* filename = SCRATCH_DIR "data_writer.data"; - - system("rm -r " SCRATCH_DIR); - mkdir(SCRATCH_DIR, 0777); - mkdir(SCRATCH_DIR "data", 0777); - - fd = creat(filename, 0666); - if (fd == -1) { - fprintf(stderr, "error creating: %s\n", strerror(errno)); - return errno; - } - - BackupDataWriter writer(fd); - - err = 0; - err |= test_write_header_and_entity(writer, "no_padding_"); - err |= test_write_header_and_entity(writer, "padded_to__3"); - err |= test_write_header_and_entity(writer, "padded_to_2__"); - err |= test_write_header_and_entity(writer, "padded_to1"); - - close(fd); - - err = compare_file(filename, DATA_GOLDEN_FILE, DATA_GOLDEN_FILE_SIZE); - if (err != 0) { - return err; - } - - return err; -} - -int -test_read_header_and_entity(BackupDataReader& reader, const char* str) -{ - int err; - int bufSize = strlen(str)+1; - char* buf = (char*)malloc(bufSize); - String8 string; - int cookie = 0x11111111; - size_t actualSize; - bool done; - int type; - ssize_t nRead; - - // printf("\n\n---------- test_read_header_and_entity -- %s\n\n", str); - - err = reader.ReadNextHeader(&done, &type); - if (done) { - fprintf(stderr, "should not be done yet\n"); - goto finished; - } - if (err != 0) { - fprintf(stderr, "ReadNextHeader (for app header) failed with %s\n", strerror(err)); - goto finished; - } - if (type != BACKUP_HEADER_ENTITY_V1) { - err = EINVAL; - fprintf(stderr, "type=0x%08x expected 0x%08x\n", type, BACKUP_HEADER_ENTITY_V1); - } - - err = reader.ReadEntityHeader(&string, &actualSize); - if (err != 0) { - fprintf(stderr, "ReadEntityHeader failed with %s\n", strerror(err)); - goto finished; - } - if (string != str) { - fprintf(stderr, "ReadEntityHeader expected key '%s' got '%s'\n", str, string.string()); - err = EINVAL; - goto finished; - } - if ((int)actualSize != bufSize) { - fprintf(stderr, "ReadEntityHeader expected dataSize 0x%08x got 0x%08x\n", bufSize, - actualSize); - err = EINVAL; - goto finished; - } - - nRead = reader.ReadEntityData(buf, bufSize); - if (nRead < 0) { - err = reader.Status(); - fprintf(stderr, "ReadEntityData failed with %s\n", strerror(err)); - goto finished; - } - - if (0 != memcmp(buf, str, bufSize)) { - fprintf(stderr, "ReadEntityData expected '%s' but got something starting with " - "%02x %02x %02x %02x '%c%c%c%c'\n", str, buf[0], buf[1], buf[2], buf[3], - buf[0], buf[1], buf[2], buf[3]); - err = EINVAL; - goto finished; - } - - // The next read will confirm whether it got the right amount of data. - -finished: - if (err != NO_ERROR) { - fprintf(stderr, "test_read_header_and_entity failed with %s\n", strerror(err)); - } - free(buf); - return err; -} - -int -backup_helper_test_data_reader() -{ - int err; - int fd; - const char* filename = SCRATCH_DIR "data_reader.data"; - - system("rm -r " SCRATCH_DIR); - mkdir(SCRATCH_DIR, 0777); - mkdir(SCRATCH_DIR "data", 0777); - - fd = creat(filename, 0666); - if (fd == -1) { - fprintf(stderr, "error creating: %s\n", strerror(errno)); - return errno; - } - - err = write(fd, DATA_GOLDEN_FILE, DATA_GOLDEN_FILE_SIZE); - if (err != DATA_GOLDEN_FILE_SIZE) { - fprintf(stderr, "Error \"%s\" writing golden file %s\n", strerror(errno), filename); - return errno; - } - - close(fd); - - fd = open(filename, O_RDONLY); - if (fd == -1) { - fprintf(stderr, "Error \"%s\" opening golden file %s for read\n", strerror(errno), - filename); - return errno; - } - - { - BackupDataReader reader(fd); - - err = 0; - - if (err == NO_ERROR) { - err = test_read_header_and_entity(reader, "no_padding_"); - } - - if (err == NO_ERROR) { - err = test_read_header_and_entity(reader, "padded_to__3"); - } - - if (err == NO_ERROR) { - err = test_read_header_and_entity(reader, "padded_to_2__"); - } - - if (err == NO_ERROR) { - err = test_read_header_and_entity(reader, "padded_to1"); - } - } - - close(fd); - - return err; -} - -static int -get_mod_time(const char* filename, struct timeval times[2]) -{ - int err; - struct stat64 st; - err = stat64(filename, &st); - if (err != 0) { - fprintf(stderr, "stat '%s' failed: %s\n", filename, strerror(errno)); - return errno; - } - times[0].tv_sec = st.st_atime; - times[1].tv_sec = st.st_mtime; - - // If st_atime is a macro then struct stat64 uses struct timespec - // to store the access and modif time values and typically - // st_*time_nsec is not defined. In glibc, this is controlled by - // __USE_MISC. -#ifdef __USE_MISC -#if !defined(st_atime) || defined(st_atime_nsec) -#error "Check if this __USE_MISC conditional is still needed." -#endif - times[0].tv_usec = st.st_atim.tv_nsec / 1000; - times[1].tv_usec = st.st_mtim.tv_nsec / 1000; -#else - times[0].tv_usec = st.st_atime_nsec / 1000; - times[1].tv_usec = st.st_mtime_nsec / 1000; -#endif - - return 0; -} - -int -backup_helper_test_files() -{ - int err; - int oldSnapshotFD; - int dataStreamFD; - int newSnapshotFD; - - system("rm -r " SCRATCH_DIR); - mkdir(SCRATCH_DIR, 0777); - mkdir(SCRATCH_DIR "data", 0777); - - write_text_file(SCRATCH_DIR "data/b", "b\nbb\n"); - write_text_file(SCRATCH_DIR "data/c", "c\ncc\n"); - write_text_file(SCRATCH_DIR "data/d", "d\ndd\n"); - write_text_file(SCRATCH_DIR "data/e", "e\nee\n"); - write_text_file(SCRATCH_DIR "data/f", "f\nff\n"); - write_text_file(SCRATCH_DIR "data/h", "h\nhh\n"); - - char const* files_before[] = { - SCRATCH_DIR "data/b", - SCRATCH_DIR "data/c", - SCRATCH_DIR "data/d", - SCRATCH_DIR "data/e", - SCRATCH_DIR "data/f" - }; - - char const* keys_before[] = { - "data/b", - "data/c", - "data/d", - "data/e", - "data/f" - }; - - dataStreamFD = creat(SCRATCH_DIR "1.data", 0666); - if (dataStreamFD == -1) { - fprintf(stderr, "error creating: %s\n", strerror(errno)); - return errno; - } - - newSnapshotFD = creat(SCRATCH_DIR "before.snap", 0666); - if (newSnapshotFD == -1) { - fprintf(stderr, "error creating: %s\n", strerror(errno)); - return errno; - } - - { - BackupDataWriter dataStream(dataStreamFD); - - err = back_up_files(-1, &dataStream, newSnapshotFD, files_before, keys_before, 5); - if (err != 0) { - return err; - } - } - - close(dataStreamFD); - close(newSnapshotFD); - - sleep(3); - - struct timeval d_times[2]; - struct timeval e_times[2]; - - err = get_mod_time(SCRATCH_DIR "data/d", d_times); - err |= get_mod_time(SCRATCH_DIR "data/e", e_times); - if (err != 0) { - return err; - } - - write_text_file(SCRATCH_DIR "data/a", "a\naa\n"); - unlink(SCRATCH_DIR "data/c"); - write_text_file(SCRATCH_DIR "data/c", "c\ncc\n"); - write_text_file(SCRATCH_DIR "data/d", "dd\ndd\n"); - utimes(SCRATCH_DIR "data/d", d_times); - write_text_file(SCRATCH_DIR "data/e", "z\nzz\n"); - utimes(SCRATCH_DIR "data/e", e_times); - write_text_file(SCRATCH_DIR "data/g", "g\ngg\n"); - unlink(SCRATCH_DIR "data/f"); - - char const* files_after[] = { - SCRATCH_DIR "data/a", // added - SCRATCH_DIR "data/b", // same - SCRATCH_DIR "data/c", // different mod time - SCRATCH_DIR "data/d", // different size (same mod time) - SCRATCH_DIR "data/e", // different contents (same mod time, same size) - SCRATCH_DIR "data/g" // added - }; - - char const* keys_after[] = { - "data/a", // added - "data/b", // same - "data/c", // different mod time - "data/d", // different size (same mod time) - "data/e", // different contents (same mod time, same size) - "data/g" // added - }; - - oldSnapshotFD = open(SCRATCH_DIR "before.snap", O_RDONLY); - if (oldSnapshotFD == -1) { - fprintf(stderr, "error opening: %s\n", strerror(errno)); - return errno; - } - - dataStreamFD = creat(SCRATCH_DIR "2.data", 0666); - if (dataStreamFD == -1) { - fprintf(stderr, "error creating: %s\n", strerror(errno)); - return errno; - } - - newSnapshotFD = creat(SCRATCH_DIR "after.snap", 0666); - if (newSnapshotFD == -1) { - fprintf(stderr, "error creating: %s\n", strerror(errno)); - return errno; - } - - { - BackupDataWriter dataStream(dataStreamFD); - - err = back_up_files(oldSnapshotFD, &dataStream, newSnapshotFD, files_after, keys_after, 6); - if (err != 0) { - return err; - } -} - - close(oldSnapshotFD); - close(dataStreamFD); - close(newSnapshotFD); - - return 0; -} - -int -backup_helper_test_null_base() -{ - int err; - int oldSnapshotFD; - int dataStreamFD; - int newSnapshotFD; - - system("rm -r " SCRATCH_DIR); - mkdir(SCRATCH_DIR, 0777); - mkdir(SCRATCH_DIR "data", 0777); - - write_text_file(SCRATCH_DIR "data/a", "a\naa\n"); - - char const* files[] = { - SCRATCH_DIR "data/a", - }; - - char const* keys[] = { - "a", - }; - - dataStreamFD = creat(SCRATCH_DIR "null_base.data", 0666); - if (dataStreamFD == -1) { - fprintf(stderr, "error creating: %s\n", strerror(errno)); - return errno; - } - - newSnapshotFD = creat(SCRATCH_DIR "null_base.snap", 0666); - if (newSnapshotFD == -1) { - fprintf(stderr, "error creating: %s\n", strerror(errno)); - return errno; - } - - { - BackupDataWriter dataStream(dataStreamFD); - - err = back_up_files(-1, &dataStream, newSnapshotFD, files, keys, 1); - if (err != 0) { - return err; - } - } - - close(dataStreamFD); - close(newSnapshotFD); - - return 0; -} - -int -backup_helper_test_missing_file() -{ - int err; - int oldSnapshotFD; - int dataStreamFD; - int newSnapshotFD; - - system("rm -r " SCRATCH_DIR); - mkdir(SCRATCH_DIR, 0777); - mkdir(SCRATCH_DIR "data", 0777); - - write_text_file(SCRATCH_DIR "data/b", "b\nbb\n"); - - char const* files[] = { - SCRATCH_DIR "data/a", - SCRATCH_DIR "data/b", - SCRATCH_DIR "data/c", - }; - - char const* keys[] = { - "a", - "b", - "c", - }; - - dataStreamFD = creat(SCRATCH_DIR "null_base.data", 0666); - if (dataStreamFD == -1) { - fprintf(stderr, "error creating: %s\n", strerror(errno)); - return errno; - } - - newSnapshotFD = creat(SCRATCH_DIR "null_base.snap", 0666); - if (newSnapshotFD == -1) { - fprintf(stderr, "error creating: %s\n", strerror(errno)); - return errno; - } - - { - BackupDataWriter dataStream(dataStreamFD); - - err = back_up_files(-1, &dataStream, newSnapshotFD, files, keys, 1); - if (err != 0) { - return err; - } - } - - close(dataStreamFD); - close(newSnapshotFD); - - return 0; -} - - -#endif // TEST_BACKUP_HELPERS - -} diff --git a/libs/utils/ObbFile.cpp b/libs/utils/ObbFile.cpp deleted file mode 100644 index ddf59914b8..0000000000 --- a/libs/utils/ObbFile.cpp +++ /dev/null @@ -1,345 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include <errno.h> -#include <fcntl.h> -#include <stdint.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -#define LOG_TAG "ObbFile" - -#include <utils/Compat.h> -#include <utils/Log.h> -#include <utils/ObbFile.h> - -//#define DEBUG 1 - -#define kFooterTagSize 8 /* last two 32-bit integers */ - -#define kFooterMinSize 33 /* 32-bit signature version (4 bytes) - * 32-bit package version (4 bytes) - * 32-bit flags (4 bytes) - * 64-bit salt (8 bytes) - * 32-bit package name size (4 bytes) - * >=1-character package name (1 byte) - * 32-bit footer size (4 bytes) - * 32-bit footer marker (4 bytes) - */ - -#define kMaxBufSize 32768 /* Maximum file read buffer */ - -#define kSignature 0x01059983U /* ObbFile signature */ - -#define kSigVersion 1 /* We only know about signature version 1 */ - -/* offsets in version 1 of the header */ -#define kPackageVersionOffset 4 -#define kFlagsOffset 8 -#define kSaltOffset 12 -#define kPackageNameLenOffset 20 -#define kPackageNameOffset 24 - -/* - * TEMP_FAILURE_RETRY is defined by some, but not all, versions of - * <unistd.h>. (Alas, it is not as standard as we'd hoped!) So, if it's - * not already defined, then define it here. - */ -#ifndef TEMP_FAILURE_RETRY -/* Used to retry syscalls that can return EINTR. */ -#define TEMP_FAILURE_RETRY(exp) ({ \ - typeof (exp) _rc; \ - do { \ - _rc = (exp); \ - } while (_rc == -1 && errno == EINTR); \ - _rc; }) -#endif - - -namespace android { - -ObbFile::ObbFile() - : mPackageName("") - , mVersion(-1) - , mFlags(0) -{ - memset(mSalt, 0, sizeof(mSalt)); -} - -ObbFile::~ObbFile() { -} - -bool ObbFile::readFrom(const char* filename) -{ - int fd; - bool success = false; - - fd = ::open(filename, O_RDONLY); - if (fd < 0) { - ALOGW("couldn't open file %s: %s", filename, strerror(errno)); - goto out; - } - success = readFrom(fd); - close(fd); - - if (!success) { - ALOGW("failed to read from %s (fd=%d)\n", filename, fd); - } - -out: - return success; -} - -bool ObbFile::readFrom(int fd) -{ - if (fd < 0) { - ALOGW("attempt to read from invalid fd\n"); - return false; - } - - return parseObbFile(fd); -} - -bool ObbFile::parseObbFile(int fd) -{ - off64_t fileLength = lseek64(fd, 0, SEEK_END); - - if (fileLength < kFooterMinSize) { - if (fileLength < 0) { - ALOGW("error seeking in ObbFile: %s\n", strerror(errno)); - } else { - ALOGW("file is only %lld (less than %d minimum)\n", fileLength, kFooterMinSize); - } - return false; - } - - ssize_t actual; - size_t footerSize; - - { - lseek64(fd, fileLength - kFooterTagSize, SEEK_SET); - - char *footer = new char[kFooterTagSize]; - actual = TEMP_FAILURE_RETRY(read(fd, footer, kFooterTagSize)); - if (actual != kFooterTagSize) { - ALOGW("couldn't read footer signature: %s\n", strerror(errno)); - return false; - } - - unsigned int fileSig = get4LE((unsigned char*)footer + sizeof(int32_t)); - if (fileSig != kSignature) { - ALOGW("footer didn't match magic string (expected 0x%08x; got 0x%08x)\n", - kSignature, fileSig); - return false; - } - - footerSize = get4LE((unsigned char*)footer); - if (footerSize > (size_t)fileLength - kFooterTagSize - || footerSize > kMaxBufSize) { - ALOGW("claimed footer size is too large (0x%08zx; file size is 0x%08llx)\n", - footerSize, fileLength); - return false; - } - - if (footerSize < (kFooterMinSize - kFooterTagSize)) { - ALOGW("claimed footer size is too small (0x%zx; minimum size is 0x%x)\n", - footerSize, kFooterMinSize - kFooterTagSize); - return false; - } - } - - off64_t fileOffset = fileLength - footerSize - kFooterTagSize; - if (lseek64(fd, fileOffset, SEEK_SET) != fileOffset) { - ALOGW("seek %lld failed: %s\n", fileOffset, strerror(errno)); - return false; - } - - mFooterStart = fileOffset; - - char* scanBuf = (char*)malloc(footerSize); - if (scanBuf == NULL) { - ALOGW("couldn't allocate scanBuf: %s\n", strerror(errno)); - return false; - } - - actual = TEMP_FAILURE_RETRY(read(fd, scanBuf, footerSize)); - // readAmount is guaranteed to be less than kMaxBufSize - if (actual != (ssize_t)footerSize) { - ALOGI("couldn't read ObbFile footer: %s\n", strerror(errno)); - free(scanBuf); - return false; - } - -#ifdef DEBUG - for (int i = 0; i < footerSize; ++i) { - ALOGI("char: 0x%02x\n", scanBuf[i]); - } -#endif - - uint32_t sigVersion = get4LE((unsigned char*)scanBuf); - if (sigVersion != kSigVersion) { - ALOGW("Unsupported ObbFile version %d\n", sigVersion); - free(scanBuf); - return false; - } - - mVersion = (int32_t) get4LE((unsigned char*)scanBuf + kPackageVersionOffset); - mFlags = (int32_t) get4LE((unsigned char*)scanBuf + kFlagsOffset); - - memcpy(&mSalt, (unsigned char*)scanBuf + kSaltOffset, sizeof(mSalt)); - - size_t packageNameLen = get4LE((unsigned char*)scanBuf + kPackageNameLenOffset); - if (packageNameLen == 0 - || packageNameLen > (footerSize - kPackageNameOffset)) { - ALOGW("bad ObbFile package name length (0x%04zx; 0x%04zx possible)\n", - packageNameLen, footerSize - kPackageNameOffset); - free(scanBuf); - return false; - } - - char* packageName = reinterpret_cast<char*>(scanBuf + kPackageNameOffset); - mPackageName = String8(const_cast<char*>(packageName), packageNameLen); - - free(scanBuf); - -#ifdef DEBUG - ALOGI("Obb scan succeeded: packageName=%s, version=%d\n", mPackageName.string(), mVersion); -#endif - - return true; -} - -bool ObbFile::writeTo(const char* filename) -{ - int fd; - bool success = false; - - fd = ::open(filename, O_WRONLY); - if (fd < 0) { - goto out; - } - success = writeTo(fd); - close(fd); - -out: - if (!success) { - ALOGW("failed to write to %s: %s\n", filename, strerror(errno)); - } - return success; -} - -bool ObbFile::writeTo(int fd) -{ - if (fd < 0) { - return false; - } - - lseek64(fd, 0, SEEK_END); - - if (mPackageName.size() == 0 || mVersion == -1) { - ALOGW("tried to write uninitialized ObbFile data\n"); - return false; - } - - unsigned char intBuf[sizeof(uint32_t)+1]; - memset(&intBuf, 0, sizeof(intBuf)); - - put4LE(intBuf, kSigVersion); - if (write(fd, &intBuf, sizeof(uint32_t)) != (ssize_t)sizeof(uint32_t)) { - ALOGW("couldn't write signature version: %s\n", strerror(errno)); - return false; - } - - put4LE(intBuf, mVersion); - if (write(fd, &intBuf, sizeof(uint32_t)) != (ssize_t)sizeof(uint32_t)) { - ALOGW("couldn't write package version\n"); - return false; - } - - put4LE(intBuf, mFlags); - if (write(fd, &intBuf, sizeof(uint32_t)) != (ssize_t)sizeof(uint32_t)) { - ALOGW("couldn't write package version\n"); - return false; - } - - if (write(fd, mSalt, sizeof(mSalt)) != (ssize_t)sizeof(mSalt)) { - ALOGW("couldn't write salt: %s\n", strerror(errno)); - return false; - } - - size_t packageNameLen = mPackageName.size(); - put4LE(intBuf, packageNameLen); - if (write(fd, &intBuf, sizeof(uint32_t)) != (ssize_t)sizeof(uint32_t)) { - ALOGW("couldn't write package name length: %s\n", strerror(errno)); - return false; - } - - if (write(fd, mPackageName.string(), packageNameLen) != (ssize_t)packageNameLen) { - ALOGW("couldn't write package name: %s\n", strerror(errno)); - return false; - } - - put4LE(intBuf, kPackageNameOffset + packageNameLen); - if (write(fd, &intBuf, sizeof(uint32_t)) != (ssize_t)sizeof(uint32_t)) { - ALOGW("couldn't write footer size: %s\n", strerror(errno)); - return false; - } - - put4LE(intBuf, kSignature); - if (write(fd, &intBuf, sizeof(uint32_t)) != (ssize_t)sizeof(uint32_t)) { - ALOGW("couldn't write footer magic signature: %s\n", strerror(errno)); - return false; - } - - return true; -} - -bool ObbFile::removeFrom(const char* filename) -{ - int fd; - bool success = false; - - fd = ::open(filename, O_RDWR); - if (fd < 0) { - goto out; - } - success = removeFrom(fd); - close(fd); - -out: - if (!success) { - ALOGW("failed to remove signature from %s: %s\n", filename, strerror(errno)); - } - return success; -} - -bool ObbFile::removeFrom(int fd) -{ - if (fd < 0) { - return false; - } - - if (!readFrom(fd)) { - return false; - } - - ftruncate(fd, mFooterStart); - - return true; -} - -} diff --git a/libs/utils/ResourceTypes.cpp b/libs/utils/ResourceTypes.cpp deleted file mode 100644 index 3fa562ec60..0000000000 --- a/libs/utils/ResourceTypes.cpp +++ /dev/null @@ -1,5583 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#define LOG_TAG "ResourceType" -//#define LOG_NDEBUG 0 - -#include <utils/Atomic.h> -#include <utils/ByteOrder.h> -#include <utils/Debug.h> -#include <utils/ResourceTypes.h> -#include <utils/String16.h> -#include <utils/String8.h> -#include <utils/TextOutput.h> -#include <utils/Log.h> - -#include <stdlib.h> -#include <string.h> -#include <memory.h> -#include <ctype.h> -#include <stdint.h> - -#ifndef INT32_MAX -#define INT32_MAX ((int32_t)(2147483647)) -#endif - -#define POOL_NOISY(x) //x -#define XML_NOISY(x) //x -#define TABLE_NOISY(x) //x -#define TABLE_GETENTRY(x) //x -#define TABLE_SUPER_NOISY(x) //x -#define LOAD_TABLE_NOISY(x) //x -#define TABLE_THEME(x) //x - -namespace android { - -#ifdef HAVE_WINSOCK -#undef nhtol -#undef htonl - -#ifdef HAVE_LITTLE_ENDIAN -#define ntohl(x) ( ((x) << 24) | (((x) >> 24) & 255) | (((x) << 8) & 0xff0000) | (((x) >> 8) & 0xff00) ) -#define htonl(x) ntohl(x) -#define ntohs(x) ( (((x) << 8) & 0xff00) | (((x) >> 8) & 255) ) -#define htons(x) ntohs(x) -#else -#define ntohl(x) (x) -#define htonl(x) (x) -#define ntohs(x) (x) -#define htons(x) (x) -#endif -#endif - -#define IDMAP_MAGIC 0x706d6469 -// size measured in sizeof(uint32_t) -#define IDMAP_HEADER_SIZE (ResTable::IDMAP_HEADER_SIZE_BYTES / sizeof(uint32_t)) - -static void printToLogFunc(void* cookie, const char* txt) -{ - ALOGV("%s", txt); -} - -// Standard C isspace() is only required to look at the low byte of its input, so -// produces incorrect results for UTF-16 characters. For safety's sake, assume that -// any high-byte UTF-16 code point is not whitespace. -inline int isspace16(char16_t c) { - return (c < 0x0080 && isspace(c)); -} - -// range checked; guaranteed to NUL-terminate within the stated number of available slots -// NOTE: if this truncates the dst string due to running out of space, no attempt is -// made to avoid splitting surrogate pairs. -static void strcpy16_dtoh(uint16_t* dst, const uint16_t* src, size_t avail) -{ - uint16_t* last = dst + avail - 1; - while (*src && (dst < last)) { - char16_t s = dtohs(*src); - *dst++ = s; - src++; - } - *dst = 0; -} - -static status_t validate_chunk(const ResChunk_header* chunk, - size_t minSize, - const uint8_t* dataEnd, - const char* name) -{ - const uint16_t headerSize = dtohs(chunk->headerSize); - const uint32_t size = dtohl(chunk->size); - - if (headerSize >= minSize) { - if (headerSize <= size) { - if (((headerSize|size)&0x3) == 0) { - if ((ssize_t)size <= (dataEnd-((const uint8_t*)chunk))) { - return NO_ERROR; - } - ALOGW("%s data size %p extends beyond resource end %p.", - name, (void*)size, - (void*)(dataEnd-((const uint8_t*)chunk))); - return BAD_TYPE; - } - ALOGW("%s size 0x%x or headerSize 0x%x is not on an integer boundary.", - name, (int)size, (int)headerSize); - return BAD_TYPE; - } - ALOGW("%s size %p is smaller than header size %p.", - name, (void*)size, (void*)(int)headerSize); - return BAD_TYPE; - } - ALOGW("%s header size %p is too small.", - name, (void*)(int)headerSize); - return BAD_TYPE; -} - -inline void Res_value::copyFrom_dtoh(const Res_value& src) -{ - size = dtohs(src.size); - res0 = src.res0; - dataType = src.dataType; - data = dtohl(src.data); -} - -void Res_png_9patch::deviceToFile() -{ - for (int i = 0; i < numXDivs; i++) { - xDivs[i] = htonl(xDivs[i]); - } - for (int i = 0; i < numYDivs; i++) { - yDivs[i] = htonl(yDivs[i]); - } - paddingLeft = htonl(paddingLeft); - paddingRight = htonl(paddingRight); - paddingTop = htonl(paddingTop); - paddingBottom = htonl(paddingBottom); - for (int i=0; i<numColors; i++) { - colors[i] = htonl(colors[i]); - } -} - -void Res_png_9patch::fileToDevice() -{ - for (int i = 0; i < numXDivs; i++) { - xDivs[i] = ntohl(xDivs[i]); - } - for (int i = 0; i < numYDivs; i++) { - yDivs[i] = ntohl(yDivs[i]); - } - paddingLeft = ntohl(paddingLeft); - paddingRight = ntohl(paddingRight); - paddingTop = ntohl(paddingTop); - paddingBottom = ntohl(paddingBottom); - for (int i=0; i<numColors; i++) { - colors[i] = ntohl(colors[i]); - } -} - -size_t Res_png_9patch::serializedSize() -{ - // The size of this struct is 32 bytes on the 32-bit target system - // 4 * int8_t - // 4 * int32_t - // 3 * pointer - return 32 - + numXDivs * sizeof(int32_t) - + numYDivs * sizeof(int32_t) - + numColors * sizeof(uint32_t); -} - -void* Res_png_9patch::serialize() -{ - // Use calloc since we're going to leave a few holes in the data - // and want this to run cleanly under valgrind - void* newData = calloc(1, serializedSize()); - serialize(newData); - return newData; -} - -void Res_png_9patch::serialize(void * outData) -{ - char* data = (char*) outData; - memmove(data, &wasDeserialized, 4); // copy wasDeserialized, numXDivs, numYDivs, numColors - memmove(data + 12, &paddingLeft, 16); // copy paddingXXXX - data += 32; - - memmove(data, this->xDivs, numXDivs * sizeof(int32_t)); - data += numXDivs * sizeof(int32_t); - memmove(data, this->yDivs, numYDivs * sizeof(int32_t)); - data += numYDivs * sizeof(int32_t); - memmove(data, this->colors, numColors * sizeof(uint32_t)); -} - -static void deserializeInternal(const void* inData, Res_png_9patch* outData) { - char* patch = (char*) inData; - if (inData != outData) { - memmove(&outData->wasDeserialized, patch, 4); // copy wasDeserialized, numXDivs, numYDivs, numColors - memmove(&outData->paddingLeft, patch + 12, 4); // copy wasDeserialized, numXDivs, numYDivs, numColors - } - outData->wasDeserialized = true; - char* data = (char*)outData; - data += sizeof(Res_png_9patch); - outData->xDivs = (int32_t*) data; - data += outData->numXDivs * sizeof(int32_t); - outData->yDivs = (int32_t*) data; - data += outData->numYDivs * sizeof(int32_t); - outData->colors = (uint32_t*) data; -} - -static bool assertIdmapHeader(const uint32_t* map, size_t sizeBytes) -{ - if (sizeBytes < ResTable::IDMAP_HEADER_SIZE_BYTES) { - ALOGW("idmap assertion failed: size=%d bytes\n", (int)sizeBytes); - return false; - } - if (*map != htodl(IDMAP_MAGIC)) { // htodl: map data expected to be in correct endianess - ALOGW("idmap assertion failed: invalid magic found (is 0x%08x, expected 0x%08x)\n", - *map, htodl(IDMAP_MAGIC)); - return false; - } - return true; -} - -static status_t idmapLookup(const uint32_t* map, size_t sizeBytes, uint32_t key, uint32_t* outValue) -{ - // see README for details on the format of map - if (!assertIdmapHeader(map, sizeBytes)) { - return UNKNOWN_ERROR; - } - map = map + IDMAP_HEADER_SIZE; // skip ahead to data segment - // size of data block, in uint32_t - const size_t size = (sizeBytes - ResTable::IDMAP_HEADER_SIZE_BYTES) / sizeof(uint32_t); - const uint32_t type = Res_GETTYPE(key) + 1; // add one, idmap stores "public" type id - const uint32_t entry = Res_GETENTRY(key); - const uint32_t typeCount = *map; - - if (type > typeCount) { - ALOGW("Resource ID map: type=%d exceeds number of types=%d\n", type, typeCount); - return UNKNOWN_ERROR; - } - if (typeCount > size) { - ALOGW("Resource ID map: number of types=%d exceeds size of map=%d\n", typeCount, (int)size); - return UNKNOWN_ERROR; - } - const uint32_t typeOffset = map[type]; - if (typeOffset == 0) { - *outValue = 0; - return NO_ERROR; - } - if (typeOffset + 1 > size) { - ALOGW("Resource ID map: type offset=%d exceeds reasonable value, size of map=%d\n", - typeOffset, (int)size); - return UNKNOWN_ERROR; - } - const uint32_t entryCount = map[typeOffset]; - const uint32_t entryOffset = map[typeOffset + 1]; - if (entryCount == 0 || entry < entryOffset || entry - entryOffset > entryCount - 1) { - *outValue = 0; - return NO_ERROR; - } - const uint32_t index = typeOffset + 2 + entry - entryOffset; - if (index > size) { - ALOGW("Resource ID map: entry index=%d exceeds size of map=%d\n", index, (int)size); - *outValue = 0; - return NO_ERROR; - } - *outValue = map[index]; - - return NO_ERROR; -} - -static status_t getIdmapPackageId(const uint32_t* map, size_t mapSize, uint32_t *outId) -{ - if (!assertIdmapHeader(map, mapSize)) { - return UNKNOWN_ERROR; - } - const uint32_t* p = map + IDMAP_HEADER_SIZE + 1; - while (*p == 0) { - ++p; - } - *outId = (map[*p + IDMAP_HEADER_SIZE + 2] >> 24) & 0x000000ff; - return NO_ERROR; -} - -Res_png_9patch* Res_png_9patch::deserialize(const void* inData) -{ - if (sizeof(void*) != sizeof(int32_t)) { - ALOGE("Cannot deserialize on non 32-bit system\n"); - return NULL; - } - deserializeInternal(inData, (Res_png_9patch*) inData); - return (Res_png_9patch*) inData; -} - -// -------------------------------------------------------------------- -// -------------------------------------------------------------------- -// -------------------------------------------------------------------- - -ResStringPool::ResStringPool() - : mError(NO_INIT), mOwnedData(NULL), mHeader(NULL), mCache(NULL) -{ -} - -ResStringPool::ResStringPool(const void* data, size_t size, bool copyData) - : mError(NO_INIT), mOwnedData(NULL), mHeader(NULL), mCache(NULL) -{ - setTo(data, size, copyData); -} - -ResStringPool::~ResStringPool() -{ - uninit(); -} - -status_t ResStringPool::setTo(const void* data, size_t size, bool copyData) -{ - if (!data || !size) { - return (mError=BAD_TYPE); - } - - uninit(); - - const bool notDeviceEndian = htods(0xf0) != 0xf0; - - if (copyData || notDeviceEndian) { - mOwnedData = malloc(size); - if (mOwnedData == NULL) { - return (mError=NO_MEMORY); - } - memcpy(mOwnedData, data, size); - data = mOwnedData; - } - - mHeader = (const ResStringPool_header*)data; - - if (notDeviceEndian) { - ResStringPool_header* h = const_cast<ResStringPool_header*>(mHeader); - h->header.headerSize = dtohs(mHeader->header.headerSize); - h->header.type = dtohs(mHeader->header.type); - h->header.size = dtohl(mHeader->header.size); - h->stringCount = dtohl(mHeader->stringCount); - h->styleCount = dtohl(mHeader->styleCount); - h->flags = dtohl(mHeader->flags); - h->stringsStart = dtohl(mHeader->stringsStart); - h->stylesStart = dtohl(mHeader->stylesStart); - } - - if (mHeader->header.headerSize > mHeader->header.size - || mHeader->header.size > size) { - ALOGW("Bad string block: header size %d or total size %d is larger than data size %d\n", - (int)mHeader->header.headerSize, (int)mHeader->header.size, (int)size); - return (mError=BAD_TYPE); - } - mSize = mHeader->header.size; - mEntries = (const uint32_t*) - (((const uint8_t*)data)+mHeader->header.headerSize); - - if (mHeader->stringCount > 0) { - if ((mHeader->stringCount*sizeof(uint32_t) < mHeader->stringCount) // uint32 overflow? - || (mHeader->header.headerSize+(mHeader->stringCount*sizeof(uint32_t))) - > size) { - ALOGW("Bad string block: entry of %d items extends past data size %d\n", - (int)(mHeader->header.headerSize+(mHeader->stringCount*sizeof(uint32_t))), - (int)size); - return (mError=BAD_TYPE); - } - - size_t charSize; - if (mHeader->flags&ResStringPool_header::UTF8_FLAG) { - charSize = sizeof(uint8_t); - mCache = (char16_t**)malloc(sizeof(char16_t**)*mHeader->stringCount); - memset(mCache, 0, sizeof(char16_t**)*mHeader->stringCount); - } else { - charSize = sizeof(char16_t); - } - - mStrings = (const void*) - (((const uint8_t*)data)+mHeader->stringsStart); - if (mHeader->stringsStart >= (mHeader->header.size-sizeof(uint16_t))) { - ALOGW("Bad string block: string pool starts at %d, after total size %d\n", - (int)mHeader->stringsStart, (int)mHeader->header.size); - return (mError=BAD_TYPE); - } - if (mHeader->styleCount == 0) { - mStringPoolSize = - (mHeader->header.size-mHeader->stringsStart)/charSize; - } else { - // check invariant: styles starts before end of data - if (mHeader->stylesStart >= (mHeader->header.size-sizeof(uint16_t))) { - ALOGW("Bad style block: style block starts at %d past data size of %d\n", - (int)mHeader->stylesStart, (int)mHeader->header.size); - return (mError=BAD_TYPE); - } - // check invariant: styles follow the strings - if (mHeader->stylesStart <= mHeader->stringsStart) { - ALOGW("Bad style block: style block starts at %d, before strings at %d\n", - (int)mHeader->stylesStart, (int)mHeader->stringsStart); - return (mError=BAD_TYPE); - } - mStringPoolSize = - (mHeader->stylesStart-mHeader->stringsStart)/charSize; - } - - // check invariant: stringCount > 0 requires a string pool to exist - if (mStringPoolSize == 0) { - ALOGW("Bad string block: stringCount is %d but pool size is 0\n", (int)mHeader->stringCount); - return (mError=BAD_TYPE); - } - - if (notDeviceEndian) { - size_t i; - uint32_t* e = const_cast<uint32_t*>(mEntries); - for (i=0; i<mHeader->stringCount; i++) { - e[i] = dtohl(mEntries[i]); - } - if (!(mHeader->flags&ResStringPool_header::UTF8_FLAG)) { - const char16_t* strings = (const char16_t*)mStrings; - char16_t* s = const_cast<char16_t*>(strings); - for (i=0; i<mStringPoolSize; i++) { - s[i] = dtohs(strings[i]); - } - } - } - - if ((mHeader->flags&ResStringPool_header::UTF8_FLAG && - ((uint8_t*)mStrings)[mStringPoolSize-1] != 0) || - (!mHeader->flags&ResStringPool_header::UTF8_FLAG && - ((char16_t*)mStrings)[mStringPoolSize-1] != 0)) { - ALOGW("Bad string block: last string is not 0-terminated\n"); - return (mError=BAD_TYPE); - } - } else { - mStrings = NULL; - mStringPoolSize = 0; - } - - if (mHeader->styleCount > 0) { - mEntryStyles = mEntries + mHeader->stringCount; - // invariant: integer overflow in calculating mEntryStyles - if (mEntryStyles < mEntries) { - ALOGW("Bad string block: integer overflow finding styles\n"); - return (mError=BAD_TYPE); - } - - if (((const uint8_t*)mEntryStyles-(const uint8_t*)mHeader) > (int)size) { - ALOGW("Bad string block: entry of %d styles extends past data size %d\n", - (int)((const uint8_t*)mEntryStyles-(const uint8_t*)mHeader), - (int)size); - return (mError=BAD_TYPE); - } - mStyles = (const uint32_t*) - (((const uint8_t*)data)+mHeader->stylesStart); - if (mHeader->stylesStart >= mHeader->header.size) { - ALOGW("Bad string block: style pool starts %d, after total size %d\n", - (int)mHeader->stylesStart, (int)mHeader->header.size); - return (mError=BAD_TYPE); - } - mStylePoolSize = - (mHeader->header.size-mHeader->stylesStart)/sizeof(uint32_t); - - if (notDeviceEndian) { - size_t i; - uint32_t* e = const_cast<uint32_t*>(mEntryStyles); - for (i=0; i<mHeader->styleCount; i++) { - e[i] = dtohl(mEntryStyles[i]); - } - uint32_t* s = const_cast<uint32_t*>(mStyles); - for (i=0; i<mStylePoolSize; i++) { - s[i] = dtohl(mStyles[i]); - } - } - - const ResStringPool_span endSpan = { - { htodl(ResStringPool_span::END) }, - htodl(ResStringPool_span::END), htodl(ResStringPool_span::END) - }; - if (memcmp(&mStyles[mStylePoolSize-(sizeof(endSpan)/sizeof(uint32_t))], - &endSpan, sizeof(endSpan)) != 0) { - ALOGW("Bad string block: last style is not 0xFFFFFFFF-terminated\n"); - return (mError=BAD_TYPE); - } - } else { - mEntryStyles = NULL; - mStyles = NULL; - mStylePoolSize = 0; - } - - return (mError=NO_ERROR); -} - -status_t ResStringPool::getError() const -{ - return mError; -} - -void ResStringPool::uninit() -{ - mError = NO_INIT; - if (mOwnedData) { - free(mOwnedData); - mOwnedData = NULL; - } - if (mHeader != NULL && mCache != NULL) { - for (size_t x = 0; x < mHeader->stringCount; x++) { - if (mCache[x] != NULL) { - free(mCache[x]); - mCache[x] = NULL; - } - } - free(mCache); - mCache = NULL; - } -} - -/** - * Strings in UTF-16 format have length indicated by a length encoded in the - * stored data. It is either 1 or 2 characters of length data. This allows a - * maximum length of 0x7FFFFFF (2147483647 bytes), but if you're storing that - * much data in a string, you're abusing them. - * - * If the high bit is set, then there are two characters or 4 bytes of length - * data encoded. In that case, drop the high bit of the first character and - * add it together with the next character. - */ -static inline size_t -decodeLength(const char16_t** str) -{ - size_t len = **str; - if ((len & 0x8000) != 0) { - (*str)++; - len = ((len & 0x7FFF) << 16) | **str; - } - (*str)++; - return len; -} - -/** - * Strings in UTF-8 format have length indicated by a length encoded in the - * stored data. It is either 1 or 2 characters of length data. This allows a - * maximum length of 0x7FFF (32767 bytes), but you should consider storing - * text in another way if you're using that much data in a single string. - * - * If the high bit is set, then there are two characters or 2 bytes of length - * data encoded. In that case, drop the high bit of the first character and - * add it together with the next character. - */ -static inline size_t -decodeLength(const uint8_t** str) -{ - size_t len = **str; - if ((len & 0x80) != 0) { - (*str)++; - len = ((len & 0x7F) << 8) | **str; - } - (*str)++; - return len; -} - -const uint16_t* ResStringPool::stringAt(size_t idx, size_t* u16len) const -{ - if (mError == NO_ERROR && idx < mHeader->stringCount) { - const bool isUTF8 = (mHeader->flags&ResStringPool_header::UTF8_FLAG) != 0; - const uint32_t off = mEntries[idx]/(isUTF8?sizeof(char):sizeof(char16_t)); - if (off < (mStringPoolSize-1)) { - if (!isUTF8) { - const char16_t* strings = (char16_t*)mStrings; - const char16_t* str = strings+off; - - *u16len = decodeLength(&str); - if ((uint32_t)(str+*u16len-strings) < mStringPoolSize) { - return str; - } else { - ALOGW("Bad string block: string #%d extends to %d, past end at %d\n", - (int)idx, (int)(str+*u16len-strings), (int)mStringPoolSize); - } - } else { - const uint8_t* strings = (uint8_t*)mStrings; - const uint8_t* u8str = strings+off; - - *u16len = decodeLength(&u8str); - size_t u8len = decodeLength(&u8str); - - // encLen must be less than 0x7FFF due to encoding. - if ((uint32_t)(u8str+u8len-strings) < mStringPoolSize) { - AutoMutex lock(mDecodeLock); - - if (mCache[idx] != NULL) { - return mCache[idx]; - } - - ssize_t actualLen = utf8_to_utf16_length(u8str, u8len); - if (actualLen < 0 || (size_t)actualLen != *u16len) { - ALOGW("Bad string block: string #%lld decoded length is not correct " - "%lld vs %llu\n", - (long long)idx, (long long)actualLen, (long long)*u16len); - return NULL; - } - - char16_t *u16str = (char16_t *)calloc(*u16len+1, sizeof(char16_t)); - if (!u16str) { - ALOGW("No memory when trying to allocate decode cache for string #%d\n", - (int)idx); - return NULL; - } - - utf8_to_utf16(u8str, u8len, u16str); - mCache[idx] = u16str; - return u16str; - } else { - ALOGW("Bad string block: string #%lld extends to %lld, past end at %lld\n", - (long long)idx, (long long)(u8str+u8len-strings), - (long long)mStringPoolSize); - } - } - } else { - ALOGW("Bad string block: string #%d entry is at %d, past end at %d\n", - (int)idx, (int)(off*sizeof(uint16_t)), - (int)(mStringPoolSize*sizeof(uint16_t))); - } - } - return NULL; -} - -const char* ResStringPool::string8At(size_t idx, size_t* outLen) const -{ - if (mError == NO_ERROR && idx < mHeader->stringCount) { - const bool isUTF8 = (mHeader->flags&ResStringPool_header::UTF8_FLAG) != 0; - const uint32_t off = mEntries[idx]/(isUTF8?sizeof(char):sizeof(char16_t)); - if (off < (mStringPoolSize-1)) { - if (isUTF8) { - const uint8_t* strings = (uint8_t*)mStrings; - const uint8_t* str = strings+off; - *outLen = decodeLength(&str); - size_t encLen = decodeLength(&str); - if ((uint32_t)(str+encLen-strings) < mStringPoolSize) { - return (const char*)str; - } else { - ALOGW("Bad string block: string #%d extends to %d, past end at %d\n", - (int)idx, (int)(str+encLen-strings), (int)mStringPoolSize); - } - } - } else { - ALOGW("Bad string block: string #%d entry is at %d, past end at %d\n", - (int)idx, (int)(off*sizeof(uint16_t)), - (int)(mStringPoolSize*sizeof(uint16_t))); - } - } - return NULL; -} - -const String8 ResStringPool::string8ObjectAt(size_t idx) const -{ - size_t len; - const char *str = (const char*)string8At(idx, &len); - if (str != NULL) { - return String8(str); - } - return String8(stringAt(idx, &len)); -} - -const ResStringPool_span* ResStringPool::styleAt(const ResStringPool_ref& ref) const -{ - return styleAt(ref.index); -} - -const ResStringPool_span* ResStringPool::styleAt(size_t idx) const -{ - if (mError == NO_ERROR && idx < mHeader->styleCount) { - const uint32_t off = (mEntryStyles[idx]/sizeof(uint32_t)); - if (off < mStylePoolSize) { - return (const ResStringPool_span*)(mStyles+off); - } else { - ALOGW("Bad string block: style #%d entry is at %d, past end at %d\n", - (int)idx, (int)(off*sizeof(uint32_t)), - (int)(mStylePoolSize*sizeof(uint32_t))); - } - } - return NULL; -} - -ssize_t ResStringPool::indexOfString(const char16_t* str, size_t strLen) const -{ - if (mError != NO_ERROR) { - return mError; - } - - size_t len; - - // TODO optimize searching for UTF-8 strings taking into account - // the cache fill to determine when to convert the searched-for - // string key to UTF-8. - - if (mHeader->flags&ResStringPool_header::SORTED_FLAG) { - // Do a binary search for the string... - ssize_t l = 0; - ssize_t h = mHeader->stringCount-1; - - ssize_t mid; - while (l <= h) { - mid = l + (h - l)/2; - const char16_t* s = stringAt(mid, &len); - int c = s ? strzcmp16(s, len, str, strLen) : -1; - POOL_NOISY(printf("Looking for %s, at %s, cmp=%d, l/mid/h=%d/%d/%d\n", - String8(str).string(), - String8(s).string(), - c, (int)l, (int)mid, (int)h)); - if (c == 0) { - return mid; - } else if (c < 0) { - l = mid + 1; - } else { - h = mid - 1; - } - } - } else { - // It is unusual to get the ID from an unsorted string block... - // most often this happens because we want to get IDs for style - // span tags; since those always appear at the end of the string - // block, start searching at the back. - for (int i=mHeader->stringCount-1; i>=0; i--) { - const char16_t* s = stringAt(i, &len); - POOL_NOISY(printf("Looking for %s, at %s, i=%d\n", - String8(str, strLen).string(), - String8(s).string(), - i)); - if (s && strzcmp16(s, len, str, strLen) == 0) { - return i; - } - } - } - - return NAME_NOT_FOUND; -} - -size_t ResStringPool::size() const -{ - return (mError == NO_ERROR) ? mHeader->stringCount : 0; -} - -size_t ResStringPool::styleCount() const -{ - return (mError == NO_ERROR) ? mHeader->styleCount : 0; -} - -size_t ResStringPool::bytes() const -{ - return (mError == NO_ERROR) ? mHeader->header.size : 0; -} - -bool ResStringPool::isSorted() const -{ - return (mHeader->flags&ResStringPool_header::SORTED_FLAG)!=0; -} - -bool ResStringPool::isUTF8() const -{ - return (mHeader->flags&ResStringPool_header::UTF8_FLAG)!=0; -} - -// -------------------------------------------------------------------- -// -------------------------------------------------------------------- -// -------------------------------------------------------------------- - -ResXMLParser::ResXMLParser(const ResXMLTree& tree) - : mTree(tree), mEventCode(BAD_DOCUMENT) -{ -} - -void ResXMLParser::restart() -{ - mCurNode = NULL; - mEventCode = mTree.mError == NO_ERROR ? START_DOCUMENT : BAD_DOCUMENT; -} -const ResStringPool& ResXMLParser::getStrings() const -{ - return mTree.mStrings; -} - -ResXMLParser::event_code_t ResXMLParser::getEventType() const -{ - return mEventCode; -} - -ResXMLParser::event_code_t ResXMLParser::next() -{ - if (mEventCode == START_DOCUMENT) { - mCurNode = mTree.mRootNode; - mCurExt = mTree.mRootExt; - return (mEventCode=mTree.mRootCode); - } else if (mEventCode >= FIRST_CHUNK_CODE) { - return nextNode(); - } - return mEventCode; -} - -int32_t ResXMLParser::getCommentID() const -{ - return mCurNode != NULL ? dtohl(mCurNode->comment.index) : -1; -} - -const uint16_t* ResXMLParser::getComment(size_t* outLen) const -{ - int32_t id = getCommentID(); - return id >= 0 ? mTree.mStrings.stringAt(id, outLen) : NULL; -} - -uint32_t ResXMLParser::getLineNumber() const -{ - return mCurNode != NULL ? dtohl(mCurNode->lineNumber) : -1; -} - -int32_t ResXMLParser::getTextID() const -{ - if (mEventCode == TEXT) { - return dtohl(((const ResXMLTree_cdataExt*)mCurExt)->data.index); - } - return -1; -} - -const uint16_t* ResXMLParser::getText(size_t* outLen) const -{ - int32_t id = getTextID(); - return id >= 0 ? mTree.mStrings.stringAt(id, outLen) : NULL; -} - -ssize_t ResXMLParser::getTextValue(Res_value* outValue) const -{ - if (mEventCode == TEXT) { - outValue->copyFrom_dtoh(((const ResXMLTree_cdataExt*)mCurExt)->typedData); - return sizeof(Res_value); - } - return BAD_TYPE; -} - -int32_t ResXMLParser::getNamespacePrefixID() const -{ - if (mEventCode == START_NAMESPACE || mEventCode == END_NAMESPACE) { - return dtohl(((const ResXMLTree_namespaceExt*)mCurExt)->prefix.index); - } - return -1; -} - -const uint16_t* ResXMLParser::getNamespacePrefix(size_t* outLen) const -{ - int32_t id = getNamespacePrefixID(); - //printf("prefix=%d event=%p\n", id, mEventCode); - return id >= 0 ? mTree.mStrings.stringAt(id, outLen) : NULL; -} - -int32_t ResXMLParser::getNamespaceUriID() const -{ - if (mEventCode == START_NAMESPACE || mEventCode == END_NAMESPACE) { - return dtohl(((const ResXMLTree_namespaceExt*)mCurExt)->uri.index); - } - return -1; -} - -const uint16_t* ResXMLParser::getNamespaceUri(size_t* outLen) const -{ - int32_t id = getNamespaceUriID(); - //printf("uri=%d event=%p\n", id, mEventCode); - return id >= 0 ? mTree.mStrings.stringAt(id, outLen) : NULL; -} - -int32_t ResXMLParser::getElementNamespaceID() const -{ - if (mEventCode == START_TAG) { - return dtohl(((const ResXMLTree_attrExt*)mCurExt)->ns.index); - } - if (mEventCode == END_TAG) { - return dtohl(((const ResXMLTree_endElementExt*)mCurExt)->ns.index); - } - return -1; -} - -const uint16_t* ResXMLParser::getElementNamespace(size_t* outLen) const -{ - int32_t id = getElementNamespaceID(); - return id >= 0 ? mTree.mStrings.stringAt(id, outLen) : NULL; -} - -int32_t ResXMLParser::getElementNameID() const -{ - if (mEventCode == START_TAG) { - return dtohl(((const ResXMLTree_attrExt*)mCurExt)->name.index); - } - if (mEventCode == END_TAG) { - return dtohl(((const ResXMLTree_endElementExt*)mCurExt)->name.index); - } - return -1; -} - -const uint16_t* ResXMLParser::getElementName(size_t* outLen) const -{ - int32_t id = getElementNameID(); - return id >= 0 ? mTree.mStrings.stringAt(id, outLen) : NULL; -} - -size_t ResXMLParser::getAttributeCount() const -{ - if (mEventCode == START_TAG) { - return dtohs(((const ResXMLTree_attrExt*)mCurExt)->attributeCount); - } - return 0; -} - -int32_t ResXMLParser::getAttributeNamespaceID(size_t idx) const -{ - if (mEventCode == START_TAG) { - const ResXMLTree_attrExt* tag = (const ResXMLTree_attrExt*)mCurExt; - if (idx < dtohs(tag->attributeCount)) { - const ResXMLTree_attribute* attr = (const ResXMLTree_attribute*) - (((const uint8_t*)tag) - + dtohs(tag->attributeStart) - + (dtohs(tag->attributeSize)*idx)); - return dtohl(attr->ns.index); - } - } - return -2; -} - -const uint16_t* ResXMLParser::getAttributeNamespace(size_t idx, size_t* outLen) const -{ - int32_t id = getAttributeNamespaceID(idx); - //printf("attribute namespace=%d idx=%d event=%p\n", id, idx, mEventCode); - //XML_NOISY(printf("getAttributeNamespace 0x%x=0x%x\n", idx, id)); - return id >= 0 ? mTree.mStrings.stringAt(id, outLen) : NULL; -} - -int32_t ResXMLParser::getAttributeNameID(size_t idx) const -{ - if (mEventCode == START_TAG) { - const ResXMLTree_attrExt* tag = (const ResXMLTree_attrExt*)mCurExt; - if (idx < dtohs(tag->attributeCount)) { - const ResXMLTree_attribute* attr = (const ResXMLTree_attribute*) - (((const uint8_t*)tag) - + dtohs(tag->attributeStart) - + (dtohs(tag->attributeSize)*idx)); - return dtohl(attr->name.index); - } - } - return -1; -} - -const uint16_t* ResXMLParser::getAttributeName(size_t idx, size_t* outLen) const -{ - int32_t id = getAttributeNameID(idx); - //printf("attribute name=%d idx=%d event=%p\n", id, idx, mEventCode); - //XML_NOISY(printf("getAttributeName 0x%x=0x%x\n", idx, id)); - return id >= 0 ? mTree.mStrings.stringAt(id, outLen) : NULL; -} - -uint32_t ResXMLParser::getAttributeNameResID(size_t idx) const -{ - int32_t id = getAttributeNameID(idx); - if (id >= 0 && (size_t)id < mTree.mNumResIds) { - return dtohl(mTree.mResIds[id]); - } - return 0; -} - -int32_t ResXMLParser::getAttributeValueStringID(size_t idx) const -{ - if (mEventCode == START_TAG) { - const ResXMLTree_attrExt* tag = (const ResXMLTree_attrExt*)mCurExt; - if (idx < dtohs(tag->attributeCount)) { - const ResXMLTree_attribute* attr = (const ResXMLTree_attribute*) - (((const uint8_t*)tag) - + dtohs(tag->attributeStart) - + (dtohs(tag->attributeSize)*idx)); - return dtohl(attr->rawValue.index); - } - } - return -1; -} - -const uint16_t* ResXMLParser::getAttributeStringValue(size_t idx, size_t* outLen) const -{ - int32_t id = getAttributeValueStringID(idx); - //XML_NOISY(printf("getAttributeValue 0x%x=0x%x\n", idx, id)); - return id >= 0 ? mTree.mStrings.stringAt(id, outLen) : NULL; -} - -int32_t ResXMLParser::getAttributeDataType(size_t idx) const -{ - if (mEventCode == START_TAG) { - const ResXMLTree_attrExt* tag = (const ResXMLTree_attrExt*)mCurExt; - if (idx < dtohs(tag->attributeCount)) { - const ResXMLTree_attribute* attr = (const ResXMLTree_attribute*) - (((const uint8_t*)tag) - + dtohs(tag->attributeStart) - + (dtohs(tag->attributeSize)*idx)); - return attr->typedValue.dataType; - } - } - return Res_value::TYPE_NULL; -} - -int32_t ResXMLParser::getAttributeData(size_t idx) const -{ - if (mEventCode == START_TAG) { - const ResXMLTree_attrExt* tag = (const ResXMLTree_attrExt*)mCurExt; - if (idx < dtohs(tag->attributeCount)) { - const ResXMLTree_attribute* attr = (const ResXMLTree_attribute*) - (((const uint8_t*)tag) - + dtohs(tag->attributeStart) - + (dtohs(tag->attributeSize)*idx)); - return dtohl(attr->typedValue.data); - } - } - return 0; -} - -ssize_t ResXMLParser::getAttributeValue(size_t idx, Res_value* outValue) const -{ - if (mEventCode == START_TAG) { - const ResXMLTree_attrExt* tag = (const ResXMLTree_attrExt*)mCurExt; - if (idx < dtohs(tag->attributeCount)) { - const ResXMLTree_attribute* attr = (const ResXMLTree_attribute*) - (((const uint8_t*)tag) - + dtohs(tag->attributeStart) - + (dtohs(tag->attributeSize)*idx)); - outValue->copyFrom_dtoh(attr->typedValue); - return sizeof(Res_value); - } - } - return BAD_TYPE; -} - -ssize_t ResXMLParser::indexOfAttribute(const char* ns, const char* attr) const -{ - String16 nsStr(ns != NULL ? ns : ""); - String16 attrStr(attr); - return indexOfAttribute(ns ? nsStr.string() : NULL, ns ? nsStr.size() : 0, - attrStr.string(), attrStr.size()); -} - -ssize_t ResXMLParser::indexOfAttribute(const char16_t* ns, size_t nsLen, - const char16_t* attr, size_t attrLen) const -{ - if (mEventCode == START_TAG) { - const size_t N = getAttributeCount(); - for (size_t i=0; i<N; i++) { - size_t curNsLen, curAttrLen; - const char16_t* curNs = getAttributeNamespace(i, &curNsLen); - const char16_t* curAttr = getAttributeName(i, &curAttrLen); - //printf("%d: ns=%p attr=%p curNs=%p curAttr=%p\n", - // i, ns, attr, curNs, curAttr); - //printf(" --> attr=%s, curAttr=%s\n", - // String8(attr).string(), String8(curAttr).string()); - if (attr && curAttr && (strzcmp16(attr, attrLen, curAttr, curAttrLen) == 0)) { - if (ns == NULL) { - if (curNs == NULL) return i; - } else if (curNs != NULL) { - //printf(" --> ns=%s, curNs=%s\n", - // String8(ns).string(), String8(curNs).string()); - if (strzcmp16(ns, nsLen, curNs, curNsLen) == 0) return i; - } - } - } - } - - return NAME_NOT_FOUND; -} - -ssize_t ResXMLParser::indexOfID() const -{ - if (mEventCode == START_TAG) { - const ssize_t idx = dtohs(((const ResXMLTree_attrExt*)mCurExt)->idIndex); - if (idx > 0) return (idx-1); - } - return NAME_NOT_FOUND; -} - -ssize_t ResXMLParser::indexOfClass() const -{ - if (mEventCode == START_TAG) { - const ssize_t idx = dtohs(((const ResXMLTree_attrExt*)mCurExt)->classIndex); - if (idx > 0) return (idx-1); - } - return NAME_NOT_FOUND; -} - -ssize_t ResXMLParser::indexOfStyle() const -{ - if (mEventCode == START_TAG) { - const ssize_t idx = dtohs(((const ResXMLTree_attrExt*)mCurExt)->styleIndex); - if (idx > 0) return (idx-1); - } - return NAME_NOT_FOUND; -} - -ResXMLParser::event_code_t ResXMLParser::nextNode() -{ - if (mEventCode < 0) { - return mEventCode; - } - - do { - const ResXMLTree_node* next = (const ResXMLTree_node*) - (((const uint8_t*)mCurNode) + dtohl(mCurNode->header.size)); - //ALOGW("Next node: prev=%p, next=%p\n", mCurNode, next); - - if (((const uint8_t*)next) >= mTree.mDataEnd) { - mCurNode = NULL; - return (mEventCode=END_DOCUMENT); - } - - if (mTree.validateNode(next) != NO_ERROR) { - mCurNode = NULL; - return (mEventCode=BAD_DOCUMENT); - } - - mCurNode = next; - const uint16_t headerSize = dtohs(next->header.headerSize); - const uint32_t totalSize = dtohl(next->header.size); - mCurExt = ((const uint8_t*)next) + headerSize; - size_t minExtSize = 0; - event_code_t eventCode = (event_code_t)dtohs(next->header.type); - switch ((mEventCode=eventCode)) { - case RES_XML_START_NAMESPACE_TYPE: - case RES_XML_END_NAMESPACE_TYPE: - minExtSize = sizeof(ResXMLTree_namespaceExt); - break; - case RES_XML_START_ELEMENT_TYPE: - minExtSize = sizeof(ResXMLTree_attrExt); - break; - case RES_XML_END_ELEMENT_TYPE: - minExtSize = sizeof(ResXMLTree_endElementExt); - break; - case RES_XML_CDATA_TYPE: - minExtSize = sizeof(ResXMLTree_cdataExt); - break; - default: - ALOGW("Unknown XML block: header type %d in node at %d\n", - (int)dtohs(next->header.type), - (int)(((const uint8_t*)next)-((const uint8_t*)mTree.mHeader))); - continue; - } - - if ((totalSize-headerSize) < minExtSize) { - ALOGW("Bad XML block: header type 0x%x in node at 0x%x has size %d, need %d\n", - (int)dtohs(next->header.type), - (int)(((const uint8_t*)next)-((const uint8_t*)mTree.mHeader)), - (int)(totalSize-headerSize), (int)minExtSize); - return (mEventCode=BAD_DOCUMENT); - } - - //printf("CurNode=%p, CurExt=%p, headerSize=%d, minExtSize=%d\n", - // mCurNode, mCurExt, headerSize, minExtSize); - - return eventCode; - } while (true); -} - -void ResXMLParser::getPosition(ResXMLParser::ResXMLPosition* pos) const -{ - pos->eventCode = mEventCode; - pos->curNode = mCurNode; - pos->curExt = mCurExt; -} - -void ResXMLParser::setPosition(const ResXMLParser::ResXMLPosition& pos) -{ - mEventCode = pos.eventCode; - mCurNode = pos.curNode; - mCurExt = pos.curExt; -} - - -// -------------------------------------------------------------------- - -static volatile int32_t gCount = 0; - -ResXMLTree::ResXMLTree() - : ResXMLParser(*this) - , mError(NO_INIT), mOwnedData(NULL) -{ - //ALOGI("Creating ResXMLTree %p #%d\n", this, android_atomic_inc(&gCount)+1); - restart(); -} - -ResXMLTree::ResXMLTree(const void* data, size_t size, bool copyData) - : ResXMLParser(*this) - , mError(NO_INIT), mOwnedData(NULL) -{ - //ALOGI("Creating ResXMLTree %p #%d\n", this, android_atomic_inc(&gCount)+1); - setTo(data, size, copyData); -} - -ResXMLTree::~ResXMLTree() -{ - //ALOGI("Destroying ResXMLTree in %p #%d\n", this, android_atomic_dec(&gCount)-1); - uninit(); -} - -status_t ResXMLTree::setTo(const void* data, size_t size, bool copyData) -{ - uninit(); - mEventCode = START_DOCUMENT; - - if (copyData) { - mOwnedData = malloc(size); - if (mOwnedData == NULL) { - return (mError=NO_MEMORY); - } - memcpy(mOwnedData, data, size); - data = mOwnedData; - } - - mHeader = (const ResXMLTree_header*)data; - mSize = dtohl(mHeader->header.size); - if (dtohs(mHeader->header.headerSize) > mSize || mSize > size) { - ALOGW("Bad XML block: header size %d or total size %d is larger than data size %d\n", - (int)dtohs(mHeader->header.headerSize), - (int)dtohl(mHeader->header.size), (int)size); - mError = BAD_TYPE; - restart(); - return mError; - } - mDataEnd = ((const uint8_t*)mHeader) + mSize; - - mStrings.uninit(); - mRootNode = NULL; - mResIds = NULL; - mNumResIds = 0; - - // First look for a couple interesting chunks: the string block - // and first XML node. - const ResChunk_header* chunk = - (const ResChunk_header*)(((const uint8_t*)mHeader) + dtohs(mHeader->header.headerSize)); - const ResChunk_header* lastChunk = chunk; - while (((const uint8_t*)chunk) < (mDataEnd-sizeof(ResChunk_header)) && - ((const uint8_t*)chunk) < (mDataEnd-dtohl(chunk->size))) { - status_t err = validate_chunk(chunk, sizeof(ResChunk_header), mDataEnd, "XML"); - if (err != NO_ERROR) { - mError = err; - goto done; - } - const uint16_t type = dtohs(chunk->type); - const size_t size = dtohl(chunk->size); - XML_NOISY(printf("Scanning @ %p: type=0x%x, size=0x%x\n", - (void*)(((uint32_t)chunk)-((uint32_t)mHeader)), type, size)); - if (type == RES_STRING_POOL_TYPE) { - mStrings.setTo(chunk, size); - } else if (type == RES_XML_RESOURCE_MAP_TYPE) { - mResIds = (const uint32_t*) - (((const uint8_t*)chunk)+dtohs(chunk->headerSize)); - mNumResIds = (dtohl(chunk->size)-dtohs(chunk->headerSize))/sizeof(uint32_t); - } else if (type >= RES_XML_FIRST_CHUNK_TYPE - && type <= RES_XML_LAST_CHUNK_TYPE) { - if (validateNode((const ResXMLTree_node*)chunk) != NO_ERROR) { - mError = BAD_TYPE; - goto done; - } - mCurNode = (const ResXMLTree_node*)lastChunk; - if (nextNode() == BAD_DOCUMENT) { - mError = BAD_TYPE; - goto done; - } - mRootNode = mCurNode; - mRootExt = mCurExt; - mRootCode = mEventCode; - break; - } else { - XML_NOISY(printf("Skipping unknown chunk!\n")); - } - lastChunk = chunk; - chunk = (const ResChunk_header*) - (((const uint8_t*)chunk) + size); - } - - if (mRootNode == NULL) { - ALOGW("Bad XML block: no root element node found\n"); - mError = BAD_TYPE; - goto done; - } - - mError = mStrings.getError(); - -done: - restart(); - return mError; -} - -status_t ResXMLTree::getError() const -{ - return mError; -} - -void ResXMLTree::uninit() -{ - mError = NO_INIT; - mStrings.uninit(); - if (mOwnedData) { - free(mOwnedData); - mOwnedData = NULL; - } - restart(); -} - -status_t ResXMLTree::validateNode(const ResXMLTree_node* node) const -{ - const uint16_t eventCode = dtohs(node->header.type); - - status_t err = validate_chunk( - &node->header, sizeof(ResXMLTree_node), - mDataEnd, "ResXMLTree_node"); - - if (err >= NO_ERROR) { - // Only perform additional validation on START nodes - if (eventCode != RES_XML_START_ELEMENT_TYPE) { - return NO_ERROR; - } - - const uint16_t headerSize = dtohs(node->header.headerSize); - const uint32_t size = dtohl(node->header.size); - const ResXMLTree_attrExt* attrExt = (const ResXMLTree_attrExt*) - (((const uint8_t*)node) + headerSize); - // check for sensical values pulled out of the stream so far... - if ((size >= headerSize + sizeof(ResXMLTree_attrExt)) - && ((void*)attrExt > (void*)node)) { - const size_t attrSize = ((size_t)dtohs(attrExt->attributeSize)) - * dtohs(attrExt->attributeCount); - if ((dtohs(attrExt->attributeStart)+attrSize) <= (size-headerSize)) { - return NO_ERROR; - } - ALOGW("Bad XML block: node attributes use 0x%x bytes, only have 0x%x bytes\n", - (unsigned int)(dtohs(attrExt->attributeStart)+attrSize), - (unsigned int)(size-headerSize)); - } - else { - ALOGW("Bad XML start block: node header size 0x%x, size 0x%x\n", - (unsigned int)headerSize, (unsigned int)size); - } - return BAD_TYPE; - } - - return err; - -#if 0 - const bool isStart = dtohs(node->header.type) == RES_XML_START_ELEMENT_TYPE; - - const uint16_t headerSize = dtohs(node->header.headerSize); - const uint32_t size = dtohl(node->header.size); - - if (headerSize >= (isStart ? sizeof(ResXMLTree_attrNode) : sizeof(ResXMLTree_node))) { - if (size >= headerSize) { - if (((const uint8_t*)node) <= (mDataEnd-size)) { - if (!isStart) { - return NO_ERROR; - } - if ((((size_t)dtohs(node->attributeSize))*dtohs(node->attributeCount)) - <= (size-headerSize)) { - return NO_ERROR; - } - ALOGW("Bad XML block: node attributes use 0x%x bytes, only have 0x%x bytes\n", - ((int)dtohs(node->attributeSize))*dtohs(node->attributeCount), - (int)(size-headerSize)); - return BAD_TYPE; - } - ALOGW("Bad XML block: node at 0x%x extends beyond data end 0x%x\n", - (int)(((const uint8_t*)node)-((const uint8_t*)mHeader)), (int)mSize); - return BAD_TYPE; - } - ALOGW("Bad XML block: node at 0x%x header size 0x%x smaller than total size 0x%x\n", - (int)(((const uint8_t*)node)-((const uint8_t*)mHeader)), - (int)headerSize, (int)size); - return BAD_TYPE; - } - ALOGW("Bad XML block: node at 0x%x header size 0x%x too small\n", - (int)(((const uint8_t*)node)-((const uint8_t*)mHeader)), - (int)headerSize); - return BAD_TYPE; -#endif -} - -// -------------------------------------------------------------------- -// -------------------------------------------------------------------- -// -------------------------------------------------------------------- - -void ResTable_config::copyFromDeviceNoSwap(const ResTable_config& o) { - const size_t size = dtohl(o.size); - if (size >= sizeof(ResTable_config)) { - *this = o; - } else { - memcpy(this, &o, size); - memset(((uint8_t*)this)+size, 0, sizeof(ResTable_config)-size); - } -} - -void ResTable_config::copyFromDtoH(const ResTable_config& o) { - copyFromDeviceNoSwap(o); - size = sizeof(ResTable_config); - mcc = dtohs(mcc); - mnc = dtohs(mnc); - density = dtohs(density); - screenWidth = dtohs(screenWidth); - screenHeight = dtohs(screenHeight); - sdkVersion = dtohs(sdkVersion); - minorVersion = dtohs(minorVersion); - smallestScreenWidthDp = dtohs(smallestScreenWidthDp); - screenWidthDp = dtohs(screenWidthDp); - screenHeightDp = dtohs(screenHeightDp); -} - -void ResTable_config::swapHtoD() { - size = htodl(size); - mcc = htods(mcc); - mnc = htods(mnc); - density = htods(density); - screenWidth = htods(screenWidth); - screenHeight = htods(screenHeight); - sdkVersion = htods(sdkVersion); - minorVersion = htods(minorVersion); - smallestScreenWidthDp = htods(smallestScreenWidthDp); - screenWidthDp = htods(screenWidthDp); - screenHeightDp = htods(screenHeightDp); -} - -int ResTable_config::compare(const ResTable_config& o) const { - int32_t diff = (int32_t)(imsi - o.imsi); - if (diff != 0) return diff; - diff = (int32_t)(locale - o.locale); - if (diff != 0) return diff; - diff = (int32_t)(screenType - o.screenType); - if (diff != 0) return diff; - diff = (int32_t)(input - o.input); - if (diff != 0) return diff; - diff = (int32_t)(screenSize - o.screenSize); - if (diff != 0) return diff; - diff = (int32_t)(version - o.version); - if (diff != 0) return diff; - diff = (int32_t)(screenLayout - o.screenLayout); - if (diff != 0) return diff; - diff = (int32_t)(uiMode - o.uiMode); - if (diff != 0) return diff; - diff = (int32_t)(smallestScreenWidthDp - o.smallestScreenWidthDp); - if (diff != 0) return diff; - diff = (int32_t)(screenSizeDp - o.screenSizeDp); - return (int)diff; -} - -int ResTable_config::compareLogical(const ResTable_config& o) const { - if (mcc != o.mcc) { - return mcc < o.mcc ? -1 : 1; - } - if (mnc != o.mnc) { - return mnc < o.mnc ? -1 : 1; - } - if (language[0] != o.language[0]) { - return language[0] < o.language[0] ? -1 : 1; - } - if (language[1] != o.language[1]) { - return language[1] < o.language[1] ? -1 : 1; - } - if (country[0] != o.country[0]) { - return country[0] < o.country[0] ? -1 : 1; - } - if (country[1] != o.country[1]) { - return country[1] < o.country[1] ? -1 : 1; - } - if (smallestScreenWidthDp != o.smallestScreenWidthDp) { - return smallestScreenWidthDp < o.smallestScreenWidthDp ? -1 : 1; - } - if (screenWidthDp != o.screenWidthDp) { - return screenWidthDp < o.screenWidthDp ? -1 : 1; - } - if (screenHeightDp != o.screenHeightDp) { - return screenHeightDp < o.screenHeightDp ? -1 : 1; - } - if (screenWidth != o.screenWidth) { - return screenWidth < o.screenWidth ? -1 : 1; - } - if (screenHeight != o.screenHeight) { - return screenHeight < o.screenHeight ? -1 : 1; - } - if (density != o.density) { - return density < o.density ? -1 : 1; - } - if (orientation != o.orientation) { - return orientation < o.orientation ? -1 : 1; - } - if (touchscreen != o.touchscreen) { - return touchscreen < o.touchscreen ? -1 : 1; - } - if (input != o.input) { - return input < o.input ? -1 : 1; - } - if (screenLayout != o.screenLayout) { - return screenLayout < o.screenLayout ? -1 : 1; - } - if (uiMode != o.uiMode) { - return uiMode < o.uiMode ? -1 : 1; - } - if (version != o.version) { - return version < o.version ? -1 : 1; - } - return 0; -} - -int ResTable_config::diff(const ResTable_config& o) const { - int diffs = 0; - if (mcc != o.mcc) diffs |= CONFIG_MCC; - if (mnc != o.mnc) diffs |= CONFIG_MNC; - if (locale != o.locale) diffs |= CONFIG_LOCALE; - if (orientation != o.orientation) diffs |= CONFIG_ORIENTATION; - if (density != o.density) diffs |= CONFIG_DENSITY; - if (touchscreen != o.touchscreen) diffs |= CONFIG_TOUCHSCREEN; - if (((inputFlags^o.inputFlags)&(MASK_KEYSHIDDEN|MASK_NAVHIDDEN)) != 0) - diffs |= CONFIG_KEYBOARD_HIDDEN; - if (keyboard != o.keyboard) diffs |= CONFIG_KEYBOARD; - if (navigation != o.navigation) diffs |= CONFIG_NAVIGATION; - if (screenSize != o.screenSize) diffs |= CONFIG_SCREEN_SIZE; - if (version != o.version) diffs |= CONFIG_VERSION; - if (screenLayout != o.screenLayout) diffs |= CONFIG_SCREEN_LAYOUT; - if (uiMode != o.uiMode) diffs |= CONFIG_UI_MODE; - if (smallestScreenWidthDp != o.smallestScreenWidthDp) diffs |= CONFIG_SMALLEST_SCREEN_SIZE; - if (screenSizeDp != o.screenSizeDp) diffs |= CONFIG_SCREEN_SIZE; - return diffs; -} - -bool ResTable_config::isMoreSpecificThan(const ResTable_config& o) const { - // The order of the following tests defines the importance of one - // configuration parameter over another. Those tests first are more - // important, trumping any values in those following them. - if (imsi || o.imsi) { - if (mcc != o.mcc) { - if (!mcc) return false; - if (!o.mcc) return true; - } - - if (mnc != o.mnc) { - if (!mnc) return false; - if (!o.mnc) return true; - } - } - - if (locale || o.locale) { - if (language[0] != o.language[0]) { - if (!language[0]) return false; - if (!o.language[0]) return true; - } - - if (country[0] != o.country[0]) { - if (!country[0]) return false; - if (!o.country[0]) return true; - } - } - - if (smallestScreenWidthDp || o.smallestScreenWidthDp) { - if (smallestScreenWidthDp != o.smallestScreenWidthDp) { - if (!smallestScreenWidthDp) return false; - if (!o.smallestScreenWidthDp) return true; - } - } - - if (screenSizeDp || o.screenSizeDp) { - if (screenWidthDp != o.screenWidthDp) { - if (!screenWidthDp) return false; - if (!o.screenWidthDp) return true; - } - - if (screenHeightDp != o.screenHeightDp) { - if (!screenHeightDp) return false; - if (!o.screenHeightDp) return true; - } - } - - if (screenLayout || o.screenLayout) { - if (((screenLayout^o.screenLayout) & MASK_SCREENSIZE) != 0) { - if (!(screenLayout & MASK_SCREENSIZE)) return false; - if (!(o.screenLayout & MASK_SCREENSIZE)) return true; - } - if (((screenLayout^o.screenLayout) & MASK_SCREENLONG) != 0) { - if (!(screenLayout & MASK_SCREENLONG)) return false; - if (!(o.screenLayout & MASK_SCREENLONG)) return true; - } - } - - if (orientation != o.orientation) { - if (!orientation) return false; - if (!o.orientation) return true; - } - - if (uiMode || o.uiMode) { - if (((uiMode^o.uiMode) & MASK_UI_MODE_TYPE) != 0) { - if (!(uiMode & MASK_UI_MODE_TYPE)) return false; - if (!(o.uiMode & MASK_UI_MODE_TYPE)) return true; - } - if (((uiMode^o.uiMode) & MASK_UI_MODE_NIGHT) != 0) { - if (!(uiMode & MASK_UI_MODE_NIGHT)) return false; - if (!(o.uiMode & MASK_UI_MODE_NIGHT)) return true; - } - } - - // density is never 'more specific' - // as the default just equals 160 - - if (touchscreen != o.touchscreen) { - if (!touchscreen) return false; - if (!o.touchscreen) return true; - } - - if (input || o.input) { - if (((inputFlags^o.inputFlags) & MASK_KEYSHIDDEN) != 0) { - if (!(inputFlags & MASK_KEYSHIDDEN)) return false; - if (!(o.inputFlags & MASK_KEYSHIDDEN)) return true; - } - - if (((inputFlags^o.inputFlags) & MASK_NAVHIDDEN) != 0) { - if (!(inputFlags & MASK_NAVHIDDEN)) return false; - if (!(o.inputFlags & MASK_NAVHIDDEN)) return true; - } - - if (keyboard != o.keyboard) { - if (!keyboard) return false; - if (!o.keyboard) return true; - } - - if (navigation != o.navigation) { - if (!navigation) return false; - if (!o.navigation) return true; - } - } - - if (screenSize || o.screenSize) { - if (screenWidth != o.screenWidth) { - if (!screenWidth) return false; - if (!o.screenWidth) return true; - } - - if (screenHeight != o.screenHeight) { - if (!screenHeight) return false; - if (!o.screenHeight) return true; - } - } - - if (version || o.version) { - if (sdkVersion != o.sdkVersion) { - if (!sdkVersion) return false; - if (!o.sdkVersion) return true; - } - - if (minorVersion != o.minorVersion) { - if (!minorVersion) return false; - if (!o.minorVersion) return true; - } - } - return false; -} - -bool ResTable_config::isBetterThan(const ResTable_config& o, - const ResTable_config* requested) const { - if (requested) { - if (imsi || o.imsi) { - if ((mcc != o.mcc) && requested->mcc) { - return (mcc); - } - - if ((mnc != o.mnc) && requested->mnc) { - return (mnc); - } - } - - if (locale || o.locale) { - if ((language[0] != o.language[0]) && requested->language[0]) { - return (language[0]); - } - - if ((country[0] != o.country[0]) && requested->country[0]) { - return (country[0]); - } - } - - if (smallestScreenWidthDp || o.smallestScreenWidthDp) { - // The configuration closest to the actual size is best. - // We assume that larger configs have already been filtered - // out at this point. That means we just want the largest one. - return smallestScreenWidthDp >= o.smallestScreenWidthDp; - } - - if (screenSizeDp || o.screenSizeDp) { - // "Better" is based on the sum of the difference between both - // width and height from the requested dimensions. We are - // assuming the invalid configs (with smaller dimens) have - // already been filtered. Note that if a particular dimension - // is unspecified, we will end up with a large value (the - // difference between 0 and the requested dimension), which is - // good since we will prefer a config that has specified a - // dimension value. - int myDelta = 0, otherDelta = 0; - if (requested->screenWidthDp) { - myDelta += requested->screenWidthDp - screenWidthDp; - otherDelta += requested->screenWidthDp - o.screenWidthDp; - } - if (requested->screenHeightDp) { - myDelta += requested->screenHeightDp - screenHeightDp; - otherDelta += requested->screenHeightDp - o.screenHeightDp; - } - //ALOGI("Comparing this %dx%d to other %dx%d in %dx%d: myDelta=%d otherDelta=%d", - // screenWidthDp, screenHeightDp, o.screenWidthDp, o.screenHeightDp, - // requested->screenWidthDp, requested->screenHeightDp, myDelta, otherDelta); - return (myDelta <= otherDelta); - } - - if (screenLayout || o.screenLayout) { - if (((screenLayout^o.screenLayout) & MASK_SCREENSIZE) != 0 - && (requested->screenLayout & MASK_SCREENSIZE)) { - // A little backwards compatibility here: undefined is - // considered equivalent to normal. But only if the - // requested size is at least normal; otherwise, small - // is better than the default. - int mySL = (screenLayout & MASK_SCREENSIZE); - int oSL = (o.screenLayout & MASK_SCREENSIZE); - int fixedMySL = mySL; - int fixedOSL = oSL; - if ((requested->screenLayout & MASK_SCREENSIZE) >= SCREENSIZE_NORMAL) { - if (fixedMySL == 0) fixedMySL = SCREENSIZE_NORMAL; - if (fixedOSL == 0) fixedOSL = SCREENSIZE_NORMAL; - } - // For screen size, the best match is the one that is - // closest to the requested screen size, but not over - // (the not over part is dealt with in match() below). - if (fixedMySL == fixedOSL) { - // If the two are the same, but 'this' is actually - // undefined, then the other is really a better match. - if (mySL == 0) return false; - return true; - } - return fixedMySL >= fixedOSL; - } - if (((screenLayout^o.screenLayout) & MASK_SCREENLONG) != 0 - && (requested->screenLayout & MASK_SCREENLONG)) { - return (screenLayout & MASK_SCREENLONG); - } - } - - if ((orientation != o.orientation) && requested->orientation) { - return (orientation); - } - - if (uiMode || o.uiMode) { - if (((uiMode^o.uiMode) & MASK_UI_MODE_TYPE) != 0 - && (requested->uiMode & MASK_UI_MODE_TYPE)) { - return (uiMode & MASK_UI_MODE_TYPE); - } - if (((uiMode^o.uiMode) & MASK_UI_MODE_NIGHT) != 0 - && (requested->uiMode & MASK_UI_MODE_NIGHT)) { - return (uiMode & MASK_UI_MODE_NIGHT); - } - } - - if (screenType || o.screenType) { - if (density != o.density) { - // density is tough. Any density is potentially useful - // because the system will scale it. Scaling down - // is generally better than scaling up. - // Default density counts as 160dpi (the system default) - // TODO - remove 160 constants - int h = (density?density:160); - int l = (o.density?o.density:160); - bool bImBigger = true; - if (l > h) { - int t = h; - h = l; - l = t; - bImBigger = false; - } - - int reqValue = (requested->density?requested->density:160); - if (reqValue >= h) { - // requested value higher than both l and h, give h - return bImBigger; - } - if (l >= reqValue) { - // requested value lower than both l and h, give l - return !bImBigger; - } - // saying that scaling down is 2x better than up - if (((2 * l) - reqValue) * h > reqValue * reqValue) { - return !bImBigger; - } else { - return bImBigger; - } - } - - if ((touchscreen != o.touchscreen) && requested->touchscreen) { - return (touchscreen); - } - } - - if (input || o.input) { - const int keysHidden = inputFlags & MASK_KEYSHIDDEN; - const int oKeysHidden = o.inputFlags & MASK_KEYSHIDDEN; - if (keysHidden != oKeysHidden) { - const int reqKeysHidden = - requested->inputFlags & MASK_KEYSHIDDEN; - if (reqKeysHidden) { - - if (!keysHidden) return false; - if (!oKeysHidden) return true; - // For compatibility, we count KEYSHIDDEN_NO as being - // the same as KEYSHIDDEN_SOFT. Here we disambiguate - // these by making an exact match more specific. - if (reqKeysHidden == keysHidden) return true; - if (reqKeysHidden == oKeysHidden) return false; - } - } - - const int navHidden = inputFlags & MASK_NAVHIDDEN; - const int oNavHidden = o.inputFlags & MASK_NAVHIDDEN; - if (navHidden != oNavHidden) { - const int reqNavHidden = - requested->inputFlags & MASK_NAVHIDDEN; - if (reqNavHidden) { - - if (!navHidden) return false; - if (!oNavHidden) return true; - } - } - - if ((keyboard != o.keyboard) && requested->keyboard) { - return (keyboard); - } - - if ((navigation != o.navigation) && requested->navigation) { - return (navigation); - } - } - - if (screenSize || o.screenSize) { - // "Better" is based on the sum of the difference between both - // width and height from the requested dimensions. We are - // assuming the invalid configs (with smaller sizes) have - // already been filtered. Note that if a particular dimension - // is unspecified, we will end up with a large value (the - // difference between 0 and the requested dimension), which is - // good since we will prefer a config that has specified a - // size value. - int myDelta = 0, otherDelta = 0; - if (requested->screenWidth) { - myDelta += requested->screenWidth - screenWidth; - otherDelta += requested->screenWidth - o.screenWidth; - } - if (requested->screenHeight) { - myDelta += requested->screenHeight - screenHeight; - otherDelta += requested->screenHeight - o.screenHeight; - } - return (myDelta <= otherDelta); - } - - if (version || o.version) { - if ((sdkVersion != o.sdkVersion) && requested->sdkVersion) { - return (sdkVersion > o.sdkVersion); - } - - if ((minorVersion != o.minorVersion) && - requested->minorVersion) { - return (minorVersion); - } - } - - return false; - } - return isMoreSpecificThan(o); -} - -bool ResTable_config::match(const ResTable_config& settings) const { - if (imsi != 0) { - if (mcc != 0 && mcc != settings.mcc) { - return false; - } - if (mnc != 0 && mnc != settings.mnc) { - return false; - } - } - if (locale != 0) { - if (language[0] != 0 - && (language[0] != settings.language[0] - || language[1] != settings.language[1])) { - return false; - } - if (country[0] != 0 - && (country[0] != settings.country[0] - || country[1] != settings.country[1])) { - return false; - } - } - if (screenConfig != 0) { - const int screenSize = screenLayout&MASK_SCREENSIZE; - const int setScreenSize = settings.screenLayout&MASK_SCREENSIZE; - // Any screen sizes for larger screens than the setting do not - // match. - if (screenSize != 0 && screenSize > setScreenSize) { - return false; - } - - const int screenLong = screenLayout&MASK_SCREENLONG; - const int setScreenLong = settings.screenLayout&MASK_SCREENLONG; - if (screenLong != 0 && screenLong != setScreenLong) { - return false; - } - - const int uiModeType = uiMode&MASK_UI_MODE_TYPE; - const int setUiModeType = settings.uiMode&MASK_UI_MODE_TYPE; - if (uiModeType != 0 && uiModeType != setUiModeType) { - return false; - } - - const int uiModeNight = uiMode&MASK_UI_MODE_NIGHT; - const int setUiModeNight = settings.uiMode&MASK_UI_MODE_NIGHT; - if (uiModeNight != 0 && uiModeNight != setUiModeNight) { - return false; - } - - if (smallestScreenWidthDp != 0 - && smallestScreenWidthDp > settings.smallestScreenWidthDp) { - return false; - } - } - if (screenSizeDp != 0) { - if (screenWidthDp != 0 && screenWidthDp > settings.screenWidthDp) { - //ALOGI("Filtering out width %d in requested %d", screenWidthDp, settings.screenWidthDp); - return false; - } - if (screenHeightDp != 0 && screenHeightDp > settings.screenHeightDp) { - //ALOGI("Filtering out height %d in requested %d", screenHeightDp, settings.screenHeightDp); - return false; - } - } - if (screenType != 0) { - if (orientation != 0 && orientation != settings.orientation) { - return false; - } - // density always matches - we can scale it. See isBetterThan - if (touchscreen != 0 && touchscreen != settings.touchscreen) { - return false; - } - } - if (input != 0) { - const int keysHidden = inputFlags&MASK_KEYSHIDDEN; - const int setKeysHidden = settings.inputFlags&MASK_KEYSHIDDEN; - if (keysHidden != 0 && keysHidden != setKeysHidden) { - // For compatibility, we count a request for KEYSHIDDEN_NO as also - // matching the more recent KEYSHIDDEN_SOFT. Basically - // KEYSHIDDEN_NO means there is some kind of keyboard available. - //ALOGI("Matching keysHidden: have=%d, config=%d\n", keysHidden, setKeysHidden); - if (keysHidden != KEYSHIDDEN_NO || setKeysHidden != KEYSHIDDEN_SOFT) { - //ALOGI("No match!"); - return false; - } - } - const int navHidden = inputFlags&MASK_NAVHIDDEN; - const int setNavHidden = settings.inputFlags&MASK_NAVHIDDEN; - if (navHidden != 0 && navHidden != setNavHidden) { - return false; - } - if (keyboard != 0 && keyboard != settings.keyboard) { - return false; - } - if (navigation != 0 && navigation != settings.navigation) { - return false; - } - } - if (screenSize != 0) { - if (screenWidth != 0 && screenWidth > settings.screenWidth) { - return false; - } - if (screenHeight != 0 && screenHeight > settings.screenHeight) { - return false; - } - } - if (version != 0) { - if (sdkVersion != 0 && sdkVersion > settings.sdkVersion) { - return false; - } - if (minorVersion != 0 && minorVersion != settings.minorVersion) { - return false; - } - } - return true; -} - -void ResTable_config::getLocale(char str[6]) const { - memset(str, 0, 6); - if (language[0]) { - str[0] = language[0]; - str[1] = language[1]; - if (country[0]) { - str[2] = '_'; - str[3] = country[0]; - str[4] = country[1]; - } - } -} - -String8 ResTable_config::toString() const { - String8 res; - - if (mcc != 0) { - if (res.size() > 0) res.append("-"); - res.appendFormat("%dmcc", dtohs(mcc)); - } - if (mnc != 0) { - if (res.size() > 0) res.append("-"); - res.appendFormat("%dmnc", dtohs(mnc)); - } - if (language[0] != 0) { - if (res.size() > 0) res.append("-"); - res.append(language, 2); - } - if (country[0] != 0) { - if (res.size() > 0) res.append("-"); - res.append(country, 2); - } - if (smallestScreenWidthDp != 0) { - if (res.size() > 0) res.append("-"); - res.appendFormat("sw%ddp", dtohs(smallestScreenWidthDp)); - } - if (screenWidthDp != 0) { - if (res.size() > 0) res.append("-"); - res.appendFormat("w%ddp", dtohs(screenWidthDp)); - } - if (screenHeightDp != 0) { - if (res.size() > 0) res.append("-"); - res.appendFormat("h%ddp", dtohs(screenHeightDp)); - } - if ((screenLayout&MASK_SCREENSIZE) != SCREENSIZE_ANY) { - if (res.size() > 0) res.append("-"); - switch (screenLayout&ResTable_config::MASK_SCREENSIZE) { - case ResTable_config::SCREENSIZE_SMALL: - res.append("small"); - break; - case ResTable_config::SCREENSIZE_NORMAL: - res.append("normal"); - break; - case ResTable_config::SCREENSIZE_LARGE: - res.append("large"); - break; - case ResTable_config::SCREENSIZE_XLARGE: - res.append("xlarge"); - break; - default: - res.appendFormat("screenLayoutSize=%d", - dtohs(screenLayout&ResTable_config::MASK_SCREENSIZE)); - break; - } - } - if ((screenLayout&MASK_SCREENLONG) != 0) { - if (res.size() > 0) res.append("-"); - switch (screenLayout&ResTable_config::MASK_SCREENLONG) { - case ResTable_config::SCREENLONG_NO: - res.append("notlong"); - break; - case ResTable_config::SCREENLONG_YES: - res.append("long"); - break; - default: - res.appendFormat("screenLayoutLong=%d", - dtohs(screenLayout&ResTable_config::MASK_SCREENLONG)); - break; - } - } - if (orientation != ORIENTATION_ANY) { - if (res.size() > 0) res.append("-"); - switch (orientation) { - case ResTable_config::ORIENTATION_PORT: - res.append("port"); - break; - case ResTable_config::ORIENTATION_LAND: - res.append("land"); - break; - case ResTable_config::ORIENTATION_SQUARE: - res.append("square"); - break; - default: - res.appendFormat("orientation=%d", dtohs(orientation)); - break; - } - } - if ((uiMode&MASK_UI_MODE_TYPE) != UI_MODE_TYPE_ANY) { - if (res.size() > 0) res.append("-"); - switch (uiMode&ResTable_config::MASK_UI_MODE_TYPE) { - case ResTable_config::UI_MODE_TYPE_DESK: - res.append("desk"); - break; - case ResTable_config::UI_MODE_TYPE_CAR: - res.append("car"); - break; - case ResTable_config::UI_MODE_TYPE_TELEVISION: - res.append("television"); - break; - case ResTable_config::UI_MODE_TYPE_APPLIANCE: - res.append("appliance"); - break; - default: - res.appendFormat("uiModeType=%d", - dtohs(screenLayout&ResTable_config::MASK_UI_MODE_TYPE)); - break; - } - } - if ((uiMode&MASK_UI_MODE_NIGHT) != 0) { - if (res.size() > 0) res.append("-"); - switch (uiMode&ResTable_config::MASK_UI_MODE_NIGHT) { - case ResTable_config::UI_MODE_NIGHT_NO: - res.append("notnight"); - break; - case ResTable_config::UI_MODE_NIGHT_YES: - res.append("night"); - break; - default: - res.appendFormat("uiModeNight=%d", - dtohs(uiMode&MASK_UI_MODE_NIGHT)); - break; - } - } - if (density != DENSITY_DEFAULT) { - if (res.size() > 0) res.append("-"); - switch (density) { - case ResTable_config::DENSITY_LOW: - res.append("ldpi"); - break; - case ResTable_config::DENSITY_MEDIUM: - res.append("mdpi"); - break; - case ResTable_config::DENSITY_TV: - res.append("tvdpi"); - break; - case ResTable_config::DENSITY_HIGH: - res.append("hdpi"); - break; - case ResTable_config::DENSITY_XHIGH: - res.append("xhdpi"); - break; - case ResTable_config::DENSITY_XXHIGH: - res.append("xxhdpi"); - break; - case ResTable_config::DENSITY_NONE: - res.append("nodpi"); - break; - default: - res.appendFormat("density=%d", dtohs(density)); - break; - } - } - if (touchscreen != TOUCHSCREEN_ANY) { - if (res.size() > 0) res.append("-"); - switch (touchscreen) { - case ResTable_config::TOUCHSCREEN_NOTOUCH: - res.append("notouch"); - break; - case ResTable_config::TOUCHSCREEN_FINGER: - res.append("finger"); - break; - case ResTable_config::TOUCHSCREEN_STYLUS: - res.append("stylus"); - break; - default: - res.appendFormat("touchscreen=%d", dtohs(touchscreen)); - break; - } - } - if (keyboard != KEYBOARD_ANY) { - if (res.size() > 0) res.append("-"); - switch (keyboard) { - case ResTable_config::KEYBOARD_NOKEYS: - res.append("nokeys"); - break; - case ResTable_config::KEYBOARD_QWERTY: - res.append("qwerty"); - break; - case ResTable_config::KEYBOARD_12KEY: - res.append("12key"); - break; - default: - res.appendFormat("keyboard=%d", dtohs(keyboard)); - break; - } - } - if ((inputFlags&MASK_KEYSHIDDEN) != 0) { - if (res.size() > 0) res.append("-"); - switch (inputFlags&MASK_KEYSHIDDEN) { - case ResTable_config::KEYSHIDDEN_NO: - res.append("keysexposed"); - break; - case ResTable_config::KEYSHIDDEN_YES: - res.append("keyshidden"); - break; - case ResTable_config::KEYSHIDDEN_SOFT: - res.append("keyssoft"); - break; - } - } - if (navigation != NAVIGATION_ANY) { - if (res.size() > 0) res.append("-"); - switch (navigation) { - case ResTable_config::NAVIGATION_NONAV: - res.append("nonav"); - break; - case ResTable_config::NAVIGATION_DPAD: - res.append("dpad"); - break; - case ResTable_config::NAVIGATION_TRACKBALL: - res.append("trackball"); - break; - case ResTable_config::NAVIGATION_WHEEL: - res.append("wheel"); - break; - default: - res.appendFormat("navigation=%d", dtohs(navigation)); - break; - } - } - if ((inputFlags&MASK_NAVHIDDEN) != 0) { - if (res.size() > 0) res.append("-"); - switch (inputFlags&MASK_NAVHIDDEN) { - case ResTable_config::NAVHIDDEN_NO: - res.append("navsexposed"); - break; - case ResTable_config::NAVHIDDEN_YES: - res.append("navhidden"); - break; - default: - res.appendFormat("inputFlagsNavHidden=%d", - dtohs(inputFlags&MASK_NAVHIDDEN)); - break; - } - } - if (screenSize != 0) { - if (res.size() > 0) res.append("-"); - res.appendFormat("%dx%d", dtohs(screenWidth), dtohs(screenHeight)); - } - if (version != 0) { - if (res.size() > 0) res.append("-"); - res.appendFormat("v%d", dtohs(sdkVersion)); - if (minorVersion != 0) { - res.appendFormat(".%d", dtohs(minorVersion)); - } - } - - return res; -} - -// -------------------------------------------------------------------- -// -------------------------------------------------------------------- -// -------------------------------------------------------------------- - -struct ResTable::Header -{ - Header(ResTable* _owner) : owner(_owner), ownedData(NULL), header(NULL), - resourceIDMap(NULL), resourceIDMapSize(0) { } - - ~Header() - { - free(resourceIDMap); - } - - ResTable* const owner; - void* ownedData; - const ResTable_header* header; - size_t size; - const uint8_t* dataEnd; - size_t index; - void* cookie; - - ResStringPool values; - uint32_t* resourceIDMap; - size_t resourceIDMapSize; -}; - -struct ResTable::Type -{ - Type(const Header* _header, const Package* _package, size_t count) - : header(_header), package(_package), entryCount(count), - typeSpec(NULL), typeSpecFlags(NULL) { } - const Header* const header; - const Package* const package; - const size_t entryCount; - const ResTable_typeSpec* typeSpec; - const uint32_t* typeSpecFlags; - Vector<const ResTable_type*> configs; -}; - -struct ResTable::Package -{ - Package(ResTable* _owner, const Header* _header, const ResTable_package* _package) - : owner(_owner), header(_header), package(_package) { } - ~Package() - { - size_t i = types.size(); - while (i > 0) { - i--; - delete types[i]; - } - } - - ResTable* const owner; - const Header* const header; - const ResTable_package* const package; - Vector<Type*> types; - - ResStringPool typeStrings; - ResStringPool keyStrings; - - const Type* getType(size_t idx) const { - return idx < types.size() ? types[idx] : NULL; - } -}; - -// A group of objects describing a particular resource package. -// The first in 'package' is always the root object (from the resource -// table that defined the package); the ones after are skins on top of it. -struct ResTable::PackageGroup -{ - PackageGroup(ResTable* _owner, const String16& _name, uint32_t _id) - : owner(_owner), name(_name), id(_id), typeCount(0), bags(NULL) { } - ~PackageGroup() { - clearBagCache(); - const size_t N = packages.size(); - for (size_t i=0; i<N; i++) { - Package* pkg = packages[i]; - if (pkg->owner == owner) { - delete pkg; - } - } - } - - void clearBagCache() { - if (bags) { - TABLE_NOISY(printf("bags=%p\n", bags)); - Package* pkg = packages[0]; - TABLE_NOISY(printf("typeCount=%x\n", typeCount)); - for (size_t i=0; i<typeCount; i++) { - TABLE_NOISY(printf("type=%d\n", i)); - const Type* type = pkg->getType(i); - if (type != NULL) { - bag_set** typeBags = bags[i]; - TABLE_NOISY(printf("typeBags=%p\n", typeBags)); - if (typeBags) { - TABLE_NOISY(printf("type->entryCount=%x\n", type->entryCount)); - const size_t N = type->entryCount; - for (size_t j=0; j<N; j++) { - if (typeBags[j] && typeBags[j] != (bag_set*)0xFFFFFFFF) - free(typeBags[j]); - } - free(typeBags); - } - } - } - free(bags); - bags = NULL; - } - } - - ResTable* const owner; - String16 const name; - uint32_t const id; - Vector<Package*> packages; - - // This is for finding typeStrings and other common package stuff. - Package* basePackage; - - // For quick access. - size_t typeCount; - - // Computed attribute bags, first indexed by the type and second - // by the entry in that type. - bag_set*** bags; -}; - -struct ResTable::bag_set -{ - size_t numAttrs; // number in array - size_t availAttrs; // total space in array - uint32_t typeSpecFlags; - // Followed by 'numAttr' bag_entry structures. -}; - -ResTable::Theme::Theme(const ResTable& table) - : mTable(table) -{ - memset(mPackages, 0, sizeof(mPackages)); -} - -ResTable::Theme::~Theme() -{ - for (size_t i=0; i<Res_MAXPACKAGE; i++) { - package_info* pi = mPackages[i]; - if (pi != NULL) { - free_package(pi); - } - } -} - -void ResTable::Theme::free_package(package_info* pi) -{ - for (size_t j=0; j<pi->numTypes; j++) { - theme_entry* te = pi->types[j].entries; - if (te != NULL) { - free(te); - } - } - free(pi); -} - -ResTable::Theme::package_info* ResTable::Theme::copy_package(package_info* pi) -{ - package_info* newpi = (package_info*)malloc( - sizeof(package_info) + (pi->numTypes*sizeof(type_info))); - newpi->numTypes = pi->numTypes; - for (size_t j=0; j<newpi->numTypes; j++) { - size_t cnt = pi->types[j].numEntries; - newpi->types[j].numEntries = cnt; - theme_entry* te = pi->types[j].entries; - if (te != NULL) { - theme_entry* newte = (theme_entry*)malloc(cnt*sizeof(theme_entry)); - newpi->types[j].entries = newte; - memcpy(newte, te, cnt*sizeof(theme_entry)); - } else { - newpi->types[j].entries = NULL; - } - } - return newpi; -} - -status_t ResTable::Theme::applyStyle(uint32_t resID, bool force) -{ - const bag_entry* bag; - uint32_t bagTypeSpecFlags = 0; - mTable.lock(); - const ssize_t N = mTable.getBagLocked(resID, &bag, &bagTypeSpecFlags); - TABLE_NOISY(LOGV("Applying style 0x%08x to theme %p, count=%d", resID, this, N)); - if (N < 0) { - mTable.unlock(); - return N; - } - - uint32_t curPackage = 0xffffffff; - ssize_t curPackageIndex = 0; - package_info* curPI = NULL; - uint32_t curType = 0xffffffff; - size_t numEntries = 0; - theme_entry* curEntries = NULL; - - const bag_entry* end = bag + N; - while (bag < end) { - const uint32_t attrRes = bag->map.name.ident; - const uint32_t p = Res_GETPACKAGE(attrRes); - const uint32_t t = Res_GETTYPE(attrRes); - const uint32_t e = Res_GETENTRY(attrRes); - - if (curPackage != p) { - const ssize_t pidx = mTable.getResourcePackageIndex(attrRes); - if (pidx < 0) { - ALOGE("Style contains key with bad package: 0x%08x\n", attrRes); - bag++; - continue; - } - curPackage = p; - curPackageIndex = pidx; - curPI = mPackages[pidx]; - if (curPI == NULL) { - PackageGroup* const grp = mTable.mPackageGroups[pidx]; - int cnt = grp->typeCount; - curPI = (package_info*)malloc( - sizeof(package_info) + (cnt*sizeof(type_info))); - curPI->numTypes = cnt; - memset(curPI->types, 0, cnt*sizeof(type_info)); - mPackages[pidx] = curPI; - } - curType = 0xffffffff; - } - if (curType != t) { - if (t >= curPI->numTypes) { - ALOGE("Style contains key with bad type: 0x%08x\n", attrRes); - bag++; - continue; - } - curType = t; - curEntries = curPI->types[t].entries; - if (curEntries == NULL) { - PackageGroup* const grp = mTable.mPackageGroups[curPackageIndex]; - const Type* type = grp->packages[0]->getType(t); - int cnt = type != NULL ? type->entryCount : 0; - curEntries = (theme_entry*)malloc(cnt*sizeof(theme_entry)); - memset(curEntries, Res_value::TYPE_NULL, cnt*sizeof(theme_entry)); - curPI->types[t].numEntries = cnt; - curPI->types[t].entries = curEntries; - } - numEntries = curPI->types[t].numEntries; - } - if (e >= numEntries) { - ALOGE("Style contains key with bad entry: 0x%08x\n", attrRes); - bag++; - continue; - } - theme_entry* curEntry = curEntries + e; - TABLE_NOISY(LOGV("Attr 0x%08x: type=0x%x, data=0x%08x; curType=0x%x", - attrRes, bag->map.value.dataType, bag->map.value.data, - curEntry->value.dataType)); - if (force || curEntry->value.dataType == Res_value::TYPE_NULL) { - curEntry->stringBlock = bag->stringBlock; - curEntry->typeSpecFlags |= bagTypeSpecFlags; - curEntry->value = bag->map.value; - } - - bag++; - } - - mTable.unlock(); - - //ALOGI("Applying style 0x%08x (force=%d) theme %p...\n", resID, force, this); - //dumpToLog(); - - return NO_ERROR; -} - -status_t ResTable::Theme::setTo(const Theme& other) -{ - //ALOGI("Setting theme %p from theme %p...\n", this, &other); - //dumpToLog(); - //other.dumpToLog(); - - if (&mTable == &other.mTable) { - for (size_t i=0; i<Res_MAXPACKAGE; i++) { - if (mPackages[i] != NULL) { - free_package(mPackages[i]); - } - if (other.mPackages[i] != NULL) { - mPackages[i] = copy_package(other.mPackages[i]); - } else { - mPackages[i] = NULL; - } - } - } else { - // @todo: need to really implement this, not just copy - // the system package (which is still wrong because it isn't - // fixing up resource references). - for (size_t i=0; i<Res_MAXPACKAGE; i++) { - if (mPackages[i] != NULL) { - free_package(mPackages[i]); - } - if (i == 0 && other.mPackages[i] != NULL) { - mPackages[i] = copy_package(other.mPackages[i]); - } else { - mPackages[i] = NULL; - } - } - } - - //ALOGI("Final theme:"); - //dumpToLog(); - - return NO_ERROR; -} - -ssize_t ResTable::Theme::getAttribute(uint32_t resID, Res_value* outValue, - uint32_t* outTypeSpecFlags) const -{ - int cnt = 20; - - if (outTypeSpecFlags != NULL) *outTypeSpecFlags = 0; - - do { - const ssize_t p = mTable.getResourcePackageIndex(resID); - const uint32_t t = Res_GETTYPE(resID); - const uint32_t e = Res_GETENTRY(resID); - - TABLE_THEME(LOGI("Looking up attr 0x%08x in theme %p", resID, this)); - - if (p >= 0) { - const package_info* const pi = mPackages[p]; - TABLE_THEME(LOGI("Found package: %p", pi)); - if (pi != NULL) { - TABLE_THEME(LOGI("Desired type index is %ld in avail %d", t, pi->numTypes)); - if (t < pi->numTypes) { - const type_info& ti = pi->types[t]; - TABLE_THEME(LOGI("Desired entry index is %ld in avail %d", e, ti.numEntries)); - if (e < ti.numEntries) { - const theme_entry& te = ti.entries[e]; - if (outTypeSpecFlags != NULL) { - *outTypeSpecFlags |= te.typeSpecFlags; - } - TABLE_THEME(LOGI("Theme value: type=0x%x, data=0x%08x", - te.value.dataType, te.value.data)); - const uint8_t type = te.value.dataType; - if (type == Res_value::TYPE_ATTRIBUTE) { - if (cnt > 0) { - cnt--; - resID = te.value.data; - continue; - } - ALOGW("Too many attribute references, stopped at: 0x%08x\n", resID); - return BAD_INDEX; - } else if (type != Res_value::TYPE_NULL) { - *outValue = te.value; - return te.stringBlock; - } - return BAD_INDEX; - } - } - } - } - break; - - } while (true); - - return BAD_INDEX; -} - -ssize_t ResTable::Theme::resolveAttributeReference(Res_value* inOutValue, - ssize_t blockIndex, uint32_t* outLastRef, - uint32_t* inoutTypeSpecFlags, ResTable_config* inoutConfig) const -{ - //printf("Resolving type=0x%x\n", inOutValue->dataType); - if (inOutValue->dataType == Res_value::TYPE_ATTRIBUTE) { - uint32_t newTypeSpecFlags; - blockIndex = getAttribute(inOutValue->data, inOutValue, &newTypeSpecFlags); - TABLE_THEME(LOGI("Resolving attr reference: blockIndex=%d, type=0x%x, data=%p\n", - (int)blockIndex, (int)inOutValue->dataType, (void*)inOutValue->data)); - if (inoutTypeSpecFlags != NULL) *inoutTypeSpecFlags |= newTypeSpecFlags; - //printf("Retrieved attribute new type=0x%x\n", inOutValue->dataType); - if (blockIndex < 0) { - return blockIndex; - } - } - return mTable.resolveReference(inOutValue, blockIndex, outLastRef, - inoutTypeSpecFlags, inoutConfig); -} - -void ResTable::Theme::dumpToLog() const -{ - ALOGI("Theme %p:\n", this); - for (size_t i=0; i<Res_MAXPACKAGE; i++) { - package_info* pi = mPackages[i]; - if (pi == NULL) continue; - - ALOGI(" Package #0x%02x:\n", (int)(i+1)); - for (size_t j=0; j<pi->numTypes; j++) { - type_info& ti = pi->types[j]; - if (ti.numEntries == 0) continue; - - ALOGI(" Type #0x%02x:\n", (int)(j+1)); - for (size_t k=0; k<ti.numEntries; k++) { - theme_entry& te = ti.entries[k]; - if (te.value.dataType == Res_value::TYPE_NULL) continue; - ALOGI(" 0x%08x: t=0x%x, d=0x%08x (block=%d)\n", - (int)Res_MAKEID(i, j, k), - te.value.dataType, (int)te.value.data, (int)te.stringBlock); - } - } - } -} - -ResTable::ResTable() - : mError(NO_INIT) -{ - memset(&mParams, 0, sizeof(mParams)); - memset(mPackageMap, 0, sizeof(mPackageMap)); - //ALOGI("Creating ResTable %p\n", this); -} - -ResTable::ResTable(const void* data, size_t size, void* cookie, bool copyData) - : mError(NO_INIT) -{ - memset(&mParams, 0, sizeof(mParams)); - memset(mPackageMap, 0, sizeof(mPackageMap)); - add(data, size, cookie, copyData); - LOG_FATAL_IF(mError != NO_ERROR, "Error parsing resource table"); - //ALOGI("Creating ResTable %p\n", this); -} - -ResTable::~ResTable() -{ - //ALOGI("Destroying ResTable in %p\n", this); - uninit(); -} - -inline ssize_t ResTable::getResourcePackageIndex(uint32_t resID) const -{ - return ((ssize_t)mPackageMap[Res_GETPACKAGE(resID)+1])-1; -} - -status_t ResTable::add(const void* data, size_t size, void* cookie, bool copyData, - const void* idmap) -{ - return add(data, size, cookie, NULL, copyData, reinterpret_cast<const Asset*>(idmap)); -} - -status_t ResTable::add(Asset* asset, void* cookie, bool copyData, const void* idmap) -{ - const void* data = asset->getBuffer(true); - if (data == NULL) { - ALOGW("Unable to get buffer of resource asset file"); - return UNKNOWN_ERROR; - } - size_t size = (size_t)asset->getLength(); - return add(data, size, cookie, asset, copyData, reinterpret_cast<const Asset*>(idmap)); -} - -status_t ResTable::add(ResTable* src) -{ - mError = src->mError; - - for (size_t i=0; i<src->mHeaders.size(); i++) { - mHeaders.add(src->mHeaders[i]); - } - - for (size_t i=0; i<src->mPackageGroups.size(); i++) { - PackageGroup* srcPg = src->mPackageGroups[i]; - PackageGroup* pg = new PackageGroup(this, srcPg->name, srcPg->id); - for (size_t j=0; j<srcPg->packages.size(); j++) { - pg->packages.add(srcPg->packages[j]); - } - pg->basePackage = srcPg->basePackage; - pg->typeCount = srcPg->typeCount; - mPackageGroups.add(pg); - } - - memcpy(mPackageMap, src->mPackageMap, sizeof(mPackageMap)); - - return mError; -} - -status_t ResTable::add(const void* data, size_t size, void* cookie, - Asset* asset, bool copyData, const Asset* idmap) -{ - if (!data) return NO_ERROR; - Header* header = new Header(this); - header->index = mHeaders.size(); - header->cookie = cookie; - if (idmap != NULL) { - const size_t idmap_size = idmap->getLength(); - const void* idmap_data = const_cast<Asset*>(idmap)->getBuffer(true); - header->resourceIDMap = (uint32_t*)malloc(idmap_size); - if (header->resourceIDMap == NULL) { - delete header; - return (mError = NO_MEMORY); - } - memcpy((void*)header->resourceIDMap, idmap_data, idmap_size); - header->resourceIDMapSize = idmap_size; - } - mHeaders.add(header); - - const bool notDeviceEndian = htods(0xf0) != 0xf0; - - LOAD_TABLE_NOISY( - ALOGV("Adding resources to ResTable: data=%p, size=0x%x, cookie=%p, asset=%p, copy=%d " - "idmap=%p\n", data, size, cookie, asset, copyData, idmap)); - - if (copyData || notDeviceEndian) { - header->ownedData = malloc(size); - if (header->ownedData == NULL) { - return (mError=NO_MEMORY); - } - memcpy(header->ownedData, data, size); - data = header->ownedData; - } - - header->header = (const ResTable_header*)data; - header->size = dtohl(header->header->header.size); - //ALOGI("Got size 0x%x, again size 0x%x, raw size 0x%x\n", header->size, - // dtohl(header->header->header.size), header->header->header.size); - LOAD_TABLE_NOISY(LOGV("Loading ResTable @%p:\n", header->header)); - LOAD_TABLE_NOISY(printHexData(2, header->header, header->size < 256 ? header->size : 256, - 16, 16, 0, false, printToLogFunc)); - if (dtohs(header->header->header.headerSize) > header->size - || header->size > size) { - ALOGW("Bad resource table: header size 0x%x or total size 0x%x is larger than data size 0x%x\n", - (int)dtohs(header->header->header.headerSize), - (int)header->size, (int)size); - return (mError=BAD_TYPE); - } - if (((dtohs(header->header->header.headerSize)|header->size)&0x3) != 0) { - ALOGW("Bad resource table: header size 0x%x or total size 0x%x is not on an integer boundary\n", - (int)dtohs(header->header->header.headerSize), - (int)header->size); - return (mError=BAD_TYPE); - } - header->dataEnd = ((const uint8_t*)header->header) + header->size; - - // Iterate through all chunks. - size_t curPackage = 0; - - const ResChunk_header* chunk = - (const ResChunk_header*)(((const uint8_t*)header->header) - + dtohs(header->header->header.headerSize)); - while (((const uint8_t*)chunk) <= (header->dataEnd-sizeof(ResChunk_header)) && - ((const uint8_t*)chunk) <= (header->dataEnd-dtohl(chunk->size))) { - status_t err = validate_chunk(chunk, sizeof(ResChunk_header), header->dataEnd, "ResTable"); - if (err != NO_ERROR) { - return (mError=err); - } - TABLE_NOISY(LOGV("Chunk: type=0x%x, headerSize=0x%x, size=0x%x, pos=%p\n", - dtohs(chunk->type), dtohs(chunk->headerSize), dtohl(chunk->size), - (void*)(((const uint8_t*)chunk) - ((const uint8_t*)header->header)))); - const size_t csize = dtohl(chunk->size); - const uint16_t ctype = dtohs(chunk->type); - if (ctype == RES_STRING_POOL_TYPE) { - if (header->values.getError() != NO_ERROR) { - // Only use the first string chunk; ignore any others that - // may appear. - status_t err = header->values.setTo(chunk, csize); - if (err != NO_ERROR) { - return (mError=err); - } - } else { - ALOGW("Multiple string chunks found in resource table."); - } - } else if (ctype == RES_TABLE_PACKAGE_TYPE) { - if (curPackage >= dtohl(header->header->packageCount)) { - ALOGW("More package chunks were found than the %d declared in the header.", - dtohl(header->header->packageCount)); - return (mError=BAD_TYPE); - } - uint32_t idmap_id = 0; - if (idmap != NULL) { - uint32_t tmp; - if (getIdmapPackageId(header->resourceIDMap, - header->resourceIDMapSize, - &tmp) == NO_ERROR) { - idmap_id = tmp; - } - } - if (parsePackage((ResTable_package*)chunk, header, idmap_id) != NO_ERROR) { - return mError; - } - curPackage++; - } else { - ALOGW("Unknown chunk type %p in table at %p.\n", - (void*)(int)(ctype), - (void*)(((const uint8_t*)chunk) - ((const uint8_t*)header->header))); - } - chunk = (const ResChunk_header*) - (((const uint8_t*)chunk) + csize); - } - - if (curPackage < dtohl(header->header->packageCount)) { - ALOGW("Fewer package chunks (%d) were found than the %d declared in the header.", - (int)curPackage, dtohl(header->header->packageCount)); - return (mError=BAD_TYPE); - } - mError = header->values.getError(); - if (mError != NO_ERROR) { - ALOGW("No string values found in resource table!"); - } - - TABLE_NOISY(LOGV("Returning from add with mError=%d\n", mError)); - return mError; -} - -status_t ResTable::getError() const -{ - return mError; -} - -void ResTable::uninit() -{ - mError = NO_INIT; - size_t N = mPackageGroups.size(); - for (size_t i=0; i<N; i++) { - PackageGroup* g = mPackageGroups[i]; - delete g; - } - N = mHeaders.size(); - for (size_t i=0; i<N; i++) { - Header* header = mHeaders[i]; - if (header->owner == this) { - if (header->ownedData) { - free(header->ownedData); - } - delete header; - } - } - - mPackageGroups.clear(); - mHeaders.clear(); -} - -bool ResTable::getResourceName(uint32_t resID, resource_name* outName) const -{ - if (mError != NO_ERROR) { - return false; - } - - const ssize_t p = getResourcePackageIndex(resID); - const int t = Res_GETTYPE(resID); - const int e = Res_GETENTRY(resID); - - if (p < 0) { - if (Res_GETPACKAGE(resID)+1 == 0) { - ALOGW("No package identifier when getting name for resource number 0x%08x", resID); - } else { - ALOGW("No known package when getting name for resource number 0x%08x", resID); - } - return false; - } - if (t < 0) { - ALOGW("No type identifier when getting name for resource number 0x%08x", resID); - return false; - } - - const PackageGroup* const grp = mPackageGroups[p]; - if (grp == NULL) { - ALOGW("Bad identifier when getting name for resource number 0x%08x", resID); - return false; - } - if (grp->packages.size() > 0) { - const Package* const package = grp->packages[0]; - - const ResTable_type* type; - const ResTable_entry* entry; - ssize_t offset = getEntry(package, t, e, NULL, &type, &entry, NULL); - if (offset <= 0) { - return false; - } - - outName->package = grp->name.string(); - outName->packageLen = grp->name.size(); - outName->type = grp->basePackage->typeStrings.stringAt(t, &outName->typeLen); - outName->name = grp->basePackage->keyStrings.stringAt( - dtohl(entry->key.index), &outName->nameLen); - - // If we have a bad index for some reason, we should abort. - if (outName->type == NULL || outName->name == NULL) { - return false; - } - - return true; - } - - return false; -} - -ssize_t ResTable::getResource(uint32_t resID, Res_value* outValue, bool mayBeBag, uint16_t density, - uint32_t* outSpecFlags, ResTable_config* outConfig) const -{ - if (mError != NO_ERROR) { - return mError; - } - - const ssize_t p = getResourcePackageIndex(resID); - const int t = Res_GETTYPE(resID); - const int e = Res_GETENTRY(resID); - - if (p < 0) { - if (Res_GETPACKAGE(resID)+1 == 0) { - ALOGW("No package identifier when getting value for resource number 0x%08x", resID); - } else { - ALOGW("No known package when getting value for resource number 0x%08x", resID); - } - return BAD_INDEX; - } - if (t < 0) { - ALOGW("No type identifier when getting value for resource number 0x%08x", resID); - return BAD_INDEX; - } - - const Res_value* bestValue = NULL; - const Package* bestPackage = NULL; - ResTable_config bestItem; - memset(&bestItem, 0, sizeof(bestItem)); // make the compiler shut up - - if (outSpecFlags != NULL) *outSpecFlags = 0; - - // Look through all resource packages, starting with the most - // recently added. - const PackageGroup* const grp = mPackageGroups[p]; - if (grp == NULL) { - ALOGW("Bad identifier when getting value for resource number 0x%08x", resID); - return BAD_INDEX; - } - - // Allow overriding density - const ResTable_config* desiredConfig = &mParams; - ResTable_config* overrideConfig = NULL; - if (density > 0) { - overrideConfig = (ResTable_config*) malloc(sizeof(ResTable_config)); - if (overrideConfig == NULL) { - ALOGE("Couldn't malloc ResTable_config for overrides: %s", strerror(errno)); - return BAD_INDEX; - } - memcpy(overrideConfig, &mParams, sizeof(ResTable_config)); - overrideConfig->density = density; - desiredConfig = overrideConfig; - } - - ssize_t rc = BAD_VALUE; - size_t ip = grp->packages.size(); - while (ip > 0) { - ip--; - int T = t; - int E = e; - - const Package* const package = grp->packages[ip]; - if (package->header->resourceIDMap) { - uint32_t overlayResID = 0x0; - status_t retval = idmapLookup(package->header->resourceIDMap, - package->header->resourceIDMapSize, - resID, &overlayResID); - if (retval == NO_ERROR && overlayResID != 0x0) { - // for this loop iteration, this is the type and entry we really want - ALOGV("resource map 0x%08x -> 0x%08x\n", resID, overlayResID); - T = Res_GETTYPE(overlayResID); - E = Res_GETENTRY(overlayResID); - } else { - // resource not present in overlay package, continue with the next package - continue; - } - } - - const ResTable_type* type; - const ResTable_entry* entry; - const Type* typeClass; - ssize_t offset = getEntry(package, T, E, desiredConfig, &type, &entry, &typeClass); - if (offset <= 0) { - // No {entry, appropriate config} pair found in package. If this - // package is an overlay package (ip != 0), this simply means the - // overlay package did not specify a default. - // Non-overlay packages are still required to provide a default. - if (offset < 0 && ip == 0) { - ALOGW("Failure getting entry for 0x%08x (t=%d e=%d) in package %zd (error %d)\n", - resID, T, E, ip, (int)offset); - rc = offset; - goto out; - } - continue; - } - - if ((dtohs(entry->flags)&entry->FLAG_COMPLEX) != 0) { - if (!mayBeBag) { - ALOGW("Requesting resource %p failed because it is complex\n", - (void*)resID); - } - continue; - } - - TABLE_NOISY(aout << "Resource type data: " - << HexDump(type, dtohl(type->header.size)) << endl); - - if ((size_t)offset > (dtohl(type->header.size)-sizeof(Res_value))) { - ALOGW("ResTable_item at %d is beyond type chunk data %d", - (int)offset, dtohl(type->header.size)); - rc = BAD_TYPE; - goto out; - } - - const Res_value* item = - (const Res_value*)(((const uint8_t*)type) + offset); - ResTable_config thisConfig; - thisConfig.copyFromDtoH(type->config); - - if (outSpecFlags != NULL) { - if (typeClass->typeSpecFlags != NULL) { - *outSpecFlags |= dtohl(typeClass->typeSpecFlags[E]); - } else { - *outSpecFlags = -1; - } - } - - if (bestPackage != NULL && - (bestItem.isMoreSpecificThan(thisConfig) || bestItem.diff(thisConfig) == 0)) { - // Discard thisConfig not only if bestItem is more specific, but also if the two configs - // are identical (diff == 0), or overlay packages will not take effect. - continue; - } - - bestItem = thisConfig; - bestValue = item; - bestPackage = package; - } - - TABLE_NOISY(printf("Found result: package %p\n", bestPackage)); - - if (bestValue) { - outValue->size = dtohs(bestValue->size); - outValue->res0 = bestValue->res0; - outValue->dataType = bestValue->dataType; - outValue->data = dtohl(bestValue->data); - if (outConfig != NULL) { - *outConfig = bestItem; - } - TABLE_NOISY(size_t len; - printf("Found value: pkg=%d, type=%d, str=%s, int=%d\n", - bestPackage->header->index, - outValue->dataType, - outValue->dataType == bestValue->TYPE_STRING - ? String8(bestPackage->header->values.stringAt( - outValue->data, &len)).string() - : "", - outValue->data)); - rc = bestPackage->header->index; - goto out; - } - -out: - if (overrideConfig != NULL) { - free(overrideConfig); - } - - return rc; -} - -ssize_t ResTable::resolveReference(Res_value* value, ssize_t blockIndex, - uint32_t* outLastRef, uint32_t* inoutTypeSpecFlags, - ResTable_config* outConfig) const -{ - int count=0; - while (blockIndex >= 0 && value->dataType == value->TYPE_REFERENCE - && value->data != 0 && count < 20) { - if (outLastRef) *outLastRef = value->data; - uint32_t lastRef = value->data; - uint32_t newFlags = 0; - const ssize_t newIndex = getResource(value->data, value, true, 0, &newFlags, - outConfig); - if (newIndex == BAD_INDEX) { - return BAD_INDEX; - } - TABLE_THEME(LOGI("Resolving reference %p: newIndex=%d, type=0x%x, data=%p\n", - (void*)lastRef, (int)newIndex, (int)value->dataType, (void*)value->data)); - //printf("Getting reference 0x%08x: newIndex=%d\n", value->data, newIndex); - if (inoutTypeSpecFlags != NULL) *inoutTypeSpecFlags |= newFlags; - if (newIndex < 0) { - // This can fail if the resource being referenced is a style... - // in this case, just return the reference, and expect the - // caller to deal with. - return blockIndex; - } - blockIndex = newIndex; - count++; - } - return blockIndex; -} - -const char16_t* ResTable::valueToString( - const Res_value* value, size_t stringBlock, - char16_t tmpBuffer[TMP_BUFFER_SIZE], size_t* outLen) -{ - if (!value) { - return NULL; - } - if (value->dataType == value->TYPE_STRING) { - return getTableStringBlock(stringBlock)->stringAt(value->data, outLen); - } - // XXX do int to string conversions. - return NULL; -} - -ssize_t ResTable::lockBag(uint32_t resID, const bag_entry** outBag) const -{ - mLock.lock(); - ssize_t err = getBagLocked(resID, outBag); - if (err < NO_ERROR) { - //printf("*** get failed! unlocking\n"); - mLock.unlock(); - } - return err; -} - -void ResTable::unlockBag(const bag_entry* bag) const -{ - //printf("<<< unlockBag %p\n", this); - mLock.unlock(); -} - -void ResTable::lock() const -{ - mLock.lock(); -} - -void ResTable::unlock() const -{ - mLock.unlock(); -} - -ssize_t ResTable::getBagLocked(uint32_t resID, const bag_entry** outBag, - uint32_t* outTypeSpecFlags) const -{ - if (mError != NO_ERROR) { - return mError; - } - - const ssize_t p = getResourcePackageIndex(resID); - const int t = Res_GETTYPE(resID); - const int e = Res_GETENTRY(resID); - - if (p < 0) { - ALOGW("Invalid package identifier when getting bag for resource number 0x%08x", resID); - return BAD_INDEX; - } - if (t < 0) { - ALOGW("No type identifier when getting bag for resource number 0x%08x", resID); - return BAD_INDEX; - } - - //printf("Get bag: id=0x%08x, p=%d, t=%d\n", resID, p, t); - PackageGroup* const grp = mPackageGroups[p]; - if (grp == NULL) { - ALOGW("Bad identifier when getting bag for resource number 0x%08x", resID); - return false; - } - - if (t >= (int)grp->typeCount) { - ALOGW("Type identifier 0x%x is larger than type count 0x%x", - t+1, (int)grp->typeCount); - return BAD_INDEX; - } - - const Package* const basePackage = grp->packages[0]; - - const Type* const typeConfigs = basePackage->getType(t); - - const size_t NENTRY = typeConfigs->entryCount; - if (e >= (int)NENTRY) { - ALOGW("Entry identifier 0x%x is larger than entry count 0x%x", - e, (int)typeConfigs->entryCount); - return BAD_INDEX; - } - - // First see if we've already computed this bag... - if (grp->bags) { - bag_set** typeSet = grp->bags[t]; - if (typeSet) { - bag_set* set = typeSet[e]; - if (set) { - if (set != (bag_set*)0xFFFFFFFF) { - if (outTypeSpecFlags != NULL) { - *outTypeSpecFlags = set->typeSpecFlags; - } - *outBag = (bag_entry*)(set+1); - //ALOGI("Found existing bag for: %p\n", (void*)resID); - return set->numAttrs; - } - ALOGW("Attempt to retrieve bag 0x%08x which is invalid or in a cycle.", - resID); - return BAD_INDEX; - } - } - } - - // Bag not found, we need to compute it! - if (!grp->bags) { - grp->bags = (bag_set***)malloc(sizeof(bag_set*)*grp->typeCount); - if (!grp->bags) return NO_MEMORY; - memset(grp->bags, 0, sizeof(bag_set*)*grp->typeCount); - } - - bag_set** typeSet = grp->bags[t]; - if (!typeSet) { - typeSet = (bag_set**)malloc(sizeof(bag_set*)*NENTRY); - if (!typeSet) return NO_MEMORY; - memset(typeSet, 0, sizeof(bag_set*)*NENTRY); - grp->bags[t] = typeSet; - } - - // Mark that we are currently working on this one. - typeSet[e] = (bag_set*)0xFFFFFFFF; - - // This is what we are building. - bag_set* set = NULL; - - TABLE_NOISY(LOGI("Building bag: %p\n", (void*)resID)); - - ResTable_config bestConfig; - memset(&bestConfig, 0, sizeof(bestConfig)); - - // Now collect all bag attributes from all packages. - size_t ip = grp->packages.size(); - while (ip > 0) { - ip--; - int T = t; - int E = e; - - const Package* const package = grp->packages[ip]; - if (package->header->resourceIDMap) { - uint32_t overlayResID = 0x0; - status_t retval = idmapLookup(package->header->resourceIDMap, - package->header->resourceIDMapSize, - resID, &overlayResID); - if (retval == NO_ERROR && overlayResID != 0x0) { - // for this loop iteration, this is the type and entry we really want - ALOGV("resource map 0x%08x -> 0x%08x\n", resID, overlayResID); - T = Res_GETTYPE(overlayResID); - E = Res_GETENTRY(overlayResID); - } else { - // resource not present in overlay package, continue with the next package - continue; - } - } - - const ResTable_type* type; - const ResTable_entry* entry; - const Type* typeClass; - ALOGV("Getting entry pkg=%p, t=%d, e=%d\n", package, T, E); - ssize_t offset = getEntry(package, T, E, &mParams, &type, &entry, &typeClass); - ALOGV("Resulting offset=%d\n", offset); - if (offset <= 0) { - // No {entry, appropriate config} pair found in package. If this - // package is an overlay package (ip != 0), this simply means the - // overlay package did not specify a default. - // Non-overlay packages are still required to provide a default. - if (offset < 0 && ip == 0) { - if (set) free(set); - return offset; - } - continue; - } - - if ((dtohs(entry->flags)&entry->FLAG_COMPLEX) == 0) { - ALOGW("Skipping entry %p in package table %d because it is not complex!\n", - (void*)resID, (int)ip); - continue; - } - - if (set != NULL && !type->config.isBetterThan(bestConfig, NULL)) { - continue; - } - bestConfig = type->config; - if (set) { - free(set); - set = NULL; - } - - const uint16_t entrySize = dtohs(entry->size); - const uint32_t parent = entrySize >= sizeof(ResTable_map_entry) - ? dtohl(((const ResTable_map_entry*)entry)->parent.ident) : 0; - const uint32_t count = entrySize >= sizeof(ResTable_map_entry) - ? dtohl(((const ResTable_map_entry*)entry)->count) : 0; - - size_t N = count; - - TABLE_NOISY(LOGI("Found map: size=%p parent=%p count=%d\n", - entrySize, parent, count)); - - // If this map inherits from another, we need to start - // with its parent's values. Otherwise start out empty. - TABLE_NOISY(printf("Creating new bag, entrySize=0x%08x, parent=0x%08x\n", - entrySize, parent)); - if (parent) { - const bag_entry* parentBag; - uint32_t parentTypeSpecFlags = 0; - const ssize_t NP = getBagLocked(parent, &parentBag, &parentTypeSpecFlags); - const size_t NT = ((NP >= 0) ? NP : 0) + N; - set = (bag_set*)malloc(sizeof(bag_set)+sizeof(bag_entry)*NT); - if (set == NULL) { - return NO_MEMORY; - } - if (NP > 0) { - memcpy(set+1, parentBag, NP*sizeof(bag_entry)); - set->numAttrs = NP; - TABLE_NOISY(LOGI("Initialized new bag with %d inherited attributes.\n", NP)); - } else { - TABLE_NOISY(LOGI("Initialized new bag with no inherited attributes.\n")); - set->numAttrs = 0; - } - set->availAttrs = NT; - set->typeSpecFlags = parentTypeSpecFlags; - } else { - set = (bag_set*)malloc(sizeof(bag_set)+sizeof(bag_entry)*N); - if (set == NULL) { - return NO_MEMORY; - } - set->numAttrs = 0; - set->availAttrs = N; - set->typeSpecFlags = 0; - } - - if (typeClass->typeSpecFlags != NULL) { - set->typeSpecFlags |= dtohl(typeClass->typeSpecFlags[E]); - } else { - set->typeSpecFlags = -1; - } - - // Now merge in the new attributes... - ssize_t curOff = offset; - const ResTable_map* map; - bag_entry* entries = (bag_entry*)(set+1); - size_t curEntry = 0; - uint32_t pos = 0; - TABLE_NOISY(LOGI("Starting with set %p, entries=%p, avail=%d\n", - set, entries, set->availAttrs)); - while (pos < count) { - TABLE_NOISY(printf("Now at %p\n", (void*)curOff)); - - if ((size_t)curOff > (dtohl(type->header.size)-sizeof(ResTable_map))) { - ALOGW("ResTable_map at %d is beyond type chunk data %d", - (int)curOff, dtohl(type->header.size)); - return BAD_TYPE; - } - map = (const ResTable_map*)(((const uint8_t*)type) + curOff); - N++; - - const uint32_t newName = htodl(map->name.ident); - bool isInside; - uint32_t oldName = 0; - while ((isInside=(curEntry < set->numAttrs)) - && (oldName=entries[curEntry].map.name.ident) < newName) { - TABLE_NOISY(printf("#%d: Keeping existing attribute: 0x%08x\n", - curEntry, entries[curEntry].map.name.ident)); - curEntry++; - } - - if ((!isInside) || oldName != newName) { - // This is a new attribute... figure out what to do with it. - if (set->numAttrs >= set->availAttrs) { - // Need to alloc more memory... - const size_t newAvail = set->availAttrs+N; - set = (bag_set*)realloc(set, - sizeof(bag_set) - + sizeof(bag_entry)*newAvail); - if (set == NULL) { - return NO_MEMORY; - } - set->availAttrs = newAvail; - entries = (bag_entry*)(set+1); - TABLE_NOISY(printf("Reallocated set %p, entries=%p, avail=%d\n", - set, entries, set->availAttrs)); - } - if (isInside) { - // Going in the middle, need to make space. - memmove(entries+curEntry+1, entries+curEntry, - sizeof(bag_entry)*(set->numAttrs-curEntry)); - set->numAttrs++; - } - TABLE_NOISY(printf("#%d: Inserting new attribute: 0x%08x\n", - curEntry, newName)); - } else { - TABLE_NOISY(printf("#%d: Replacing existing attribute: 0x%08x\n", - curEntry, oldName)); - } - - bag_entry* cur = entries+curEntry; - - cur->stringBlock = package->header->index; - cur->map.name.ident = newName; - cur->map.value.copyFrom_dtoh(map->value); - TABLE_NOISY(printf("Setting entry #%d %p: block=%d, name=0x%08x, type=%d, data=0x%08x\n", - curEntry, cur, cur->stringBlock, cur->map.name.ident, - cur->map.value.dataType, cur->map.value.data)); - - // On to the next! - curEntry++; - pos++; - const size_t size = dtohs(map->value.size); - curOff += size + sizeof(*map)-sizeof(map->value); - }; - if (curEntry > set->numAttrs) { - set->numAttrs = curEntry; - } - } - - // And this is it... - typeSet[e] = set; - if (set) { - if (outTypeSpecFlags != NULL) { - *outTypeSpecFlags = set->typeSpecFlags; - } - *outBag = (bag_entry*)(set+1); - TABLE_NOISY(LOGI("Returning %d attrs\n", set->numAttrs)); - return set->numAttrs; - } - return BAD_INDEX; -} - -void ResTable::setParameters(const ResTable_config* params) -{ - mLock.lock(); - TABLE_GETENTRY(LOGI("Setting parameters: imsi:%d/%d lang:%c%c cnt:%c%c " - "orien:%d touch:%d density:%d key:%d inp:%d nav:%d sz:%dx%d sw%ddp w%ddp h%ddp\n", - params->mcc, params->mnc, - params->language[0] ? params->language[0] : '-', - params->language[1] ? params->language[1] : '-', - params->country[0] ? params->country[0] : '-', - params->country[1] ? params->country[1] : '-', - params->orientation, - params->touchscreen, - params->density, - params->keyboard, - params->inputFlags, - params->navigation, - params->screenWidth, - params->screenHeight, - params->smallestScreenWidthDp, - params->screenWidthDp, - params->screenHeightDp)); - mParams = *params; - for (size_t i=0; i<mPackageGroups.size(); i++) { - TABLE_NOISY(LOGI("CLEARING BAGS FOR GROUP %d!", i)); - mPackageGroups[i]->clearBagCache(); - } - mLock.unlock(); -} - -void ResTable::getParameters(ResTable_config* params) const -{ - mLock.lock(); - *params = mParams; - mLock.unlock(); -} - -struct id_name_map { - uint32_t id; - size_t len; - char16_t name[6]; -}; - -const static id_name_map ID_NAMES[] = { - { ResTable_map::ATTR_TYPE, 5, { '^', 't', 'y', 'p', 'e' } }, - { ResTable_map::ATTR_L10N, 5, { '^', 'l', '1', '0', 'n' } }, - { ResTable_map::ATTR_MIN, 4, { '^', 'm', 'i', 'n' } }, - { ResTable_map::ATTR_MAX, 4, { '^', 'm', 'a', 'x' } }, - { ResTable_map::ATTR_OTHER, 6, { '^', 'o', 't', 'h', 'e', 'r' } }, - { ResTable_map::ATTR_ZERO, 5, { '^', 'z', 'e', 'r', 'o' } }, - { ResTable_map::ATTR_ONE, 4, { '^', 'o', 'n', 'e' } }, - { ResTable_map::ATTR_TWO, 4, { '^', 't', 'w', 'o' } }, - { ResTable_map::ATTR_FEW, 4, { '^', 'f', 'e', 'w' } }, - { ResTable_map::ATTR_MANY, 5, { '^', 'm', 'a', 'n', 'y' } }, -}; - -uint32_t ResTable::identifierForName(const char16_t* name, size_t nameLen, - const char16_t* type, size_t typeLen, - const char16_t* package, - size_t packageLen, - uint32_t* outTypeSpecFlags) const -{ - TABLE_SUPER_NOISY(printf("Identifier for name: error=%d\n", mError)); - - // Check for internal resource identifier as the very first thing, so - // that we will always find them even when there are no resources. - if (name[0] == '^') { - const int N = (sizeof(ID_NAMES)/sizeof(ID_NAMES[0])); - size_t len; - for (int i=0; i<N; i++) { - const id_name_map* m = ID_NAMES + i; - len = m->len; - if (len != nameLen) { - continue; - } - for (size_t j=1; j<len; j++) { - if (m->name[j] != name[j]) { - goto nope; - } - } - if (outTypeSpecFlags) { - *outTypeSpecFlags = ResTable_typeSpec::SPEC_PUBLIC; - } - return m->id; -nope: - ; - } - if (nameLen > 7) { - if (name[1] == 'i' && name[2] == 'n' - && name[3] == 'd' && name[4] == 'e' && name[5] == 'x' - && name[6] == '_') { - int index = atoi(String8(name + 7, nameLen - 7).string()); - if (Res_CHECKID(index)) { - ALOGW("Array resource index: %d is too large.", - index); - return 0; - } - if (outTypeSpecFlags) { - *outTypeSpecFlags = ResTable_typeSpec::SPEC_PUBLIC; - } - return Res_MAKEARRAY(index); - } - } - return 0; - } - - if (mError != NO_ERROR) { - return 0; - } - - bool fakePublic = false; - - // Figure out the package and type we are looking in... - - const char16_t* packageEnd = NULL; - const char16_t* typeEnd = NULL; - const char16_t* const nameEnd = name+nameLen; - const char16_t* p = name; - while (p < nameEnd) { - if (*p == ':') packageEnd = p; - else if (*p == '/') typeEnd = p; - p++; - } - if (*name == '@') { - name++; - if (*name == '*') { - fakePublic = true; - name++; - } - } - if (name >= nameEnd) { - return 0; - } - - if (packageEnd) { - package = name; - packageLen = packageEnd-name; - name = packageEnd+1; - } else if (!package) { - return 0; - } - - if (typeEnd) { - type = name; - typeLen = typeEnd-name; - name = typeEnd+1; - } else if (!type) { - return 0; - } - - if (name >= nameEnd) { - return 0; - } - nameLen = nameEnd-name; - - TABLE_NOISY(printf("Looking for identifier: type=%s, name=%s, package=%s\n", - String8(type, typeLen).string(), - String8(name, nameLen).string(), - String8(package, packageLen).string())); - - const size_t NG = mPackageGroups.size(); - for (size_t ig=0; ig<NG; ig++) { - const PackageGroup* group = mPackageGroups[ig]; - - if (strzcmp16(package, packageLen, - group->name.string(), group->name.size())) { - TABLE_NOISY(printf("Skipping package group: %s\n", String8(group->name).string())); - continue; - } - - const ssize_t ti = group->basePackage->typeStrings.indexOfString(type, typeLen); - if (ti < 0) { - TABLE_NOISY(printf("Type not found in package %s\n", String8(group->name).string())); - continue; - } - - const ssize_t ei = group->basePackage->keyStrings.indexOfString(name, nameLen); - if (ei < 0) { - TABLE_NOISY(printf("Name not found in package %s\n", String8(group->name).string())); - continue; - } - - TABLE_NOISY(printf("Search indices: type=%d, name=%d\n", ti, ei)); - - const Type* const typeConfigs = group->packages[0]->getType(ti); - if (typeConfigs == NULL || typeConfigs->configs.size() <= 0) { - TABLE_NOISY(printf("Expected type structure not found in package %s for idnex %d\n", - String8(group->name).string(), ti)); - } - - size_t NTC = typeConfigs->configs.size(); - for (size_t tci=0; tci<NTC; tci++) { - const ResTable_type* const ty = typeConfigs->configs[tci]; - const uint32_t typeOffset = dtohl(ty->entriesStart); - - const uint8_t* const end = ((const uint8_t*)ty) + dtohl(ty->header.size); - const uint32_t* const eindex = (const uint32_t*) - (((const uint8_t*)ty) + dtohs(ty->header.headerSize)); - - const size_t NE = dtohl(ty->entryCount); - for (size_t i=0; i<NE; i++) { - uint32_t offset = dtohl(eindex[i]); - if (offset == ResTable_type::NO_ENTRY) { - continue; - } - - offset += typeOffset; - - if (offset > (dtohl(ty->header.size)-sizeof(ResTable_entry))) { - ALOGW("ResTable_entry at %d is beyond type chunk data %d", - offset, dtohl(ty->header.size)); - return 0; - } - if ((offset&0x3) != 0) { - ALOGW("ResTable_entry at %d (pkg=%d type=%d ent=%d) is not on an integer boundary when looking for %s:%s/%s", - (int)offset, (int)group->id, (int)ti+1, (int)i, - String8(package, packageLen).string(), - String8(type, typeLen).string(), - String8(name, nameLen).string()); - return 0; - } - - const ResTable_entry* const entry = (const ResTable_entry*) - (((const uint8_t*)ty) + offset); - if (dtohs(entry->size) < sizeof(*entry)) { - ALOGW("ResTable_entry size %d is too small", dtohs(entry->size)); - return BAD_TYPE; - } - - TABLE_SUPER_NOISY(printf("Looking at entry #%d: want str %d, have %d\n", - i, ei, dtohl(entry->key.index))); - if (dtohl(entry->key.index) == (size_t)ei) { - if (outTypeSpecFlags) { - *outTypeSpecFlags = typeConfigs->typeSpecFlags[i]; - if (fakePublic) { - *outTypeSpecFlags |= ResTable_typeSpec::SPEC_PUBLIC; - } - } - return Res_MAKEID(group->id-1, ti, i); - } - } - } - } - - return 0; -} - -bool ResTable::expandResourceRef(const uint16_t* refStr, size_t refLen, - String16* outPackage, - String16* outType, - String16* outName, - const String16* defType, - const String16* defPackage, - const char** outErrorMsg, - bool* outPublicOnly) -{ - const char16_t* packageEnd = NULL; - const char16_t* typeEnd = NULL; - const char16_t* p = refStr; - const char16_t* const end = p + refLen; - while (p < end) { - if (*p == ':') packageEnd = p; - else if (*p == '/') { - typeEnd = p; - break; - } - p++; - } - p = refStr; - if (*p == '@') p++; - - if (outPublicOnly != NULL) { - *outPublicOnly = true; - } - if (*p == '*') { - p++; - if (outPublicOnly != NULL) { - *outPublicOnly = false; - } - } - - if (packageEnd) { - *outPackage = String16(p, packageEnd-p); - p = packageEnd+1; - } else { - if (!defPackage) { - if (outErrorMsg) { - *outErrorMsg = "No resource package specified"; - } - return false; - } - *outPackage = *defPackage; - } - if (typeEnd) { - *outType = String16(p, typeEnd-p); - p = typeEnd+1; - } else { - if (!defType) { - if (outErrorMsg) { - *outErrorMsg = "No resource type specified"; - } - return false; - } - *outType = *defType; - } - *outName = String16(p, end-p); - if(**outPackage == 0) { - if(outErrorMsg) { - *outErrorMsg = "Resource package cannot be an empty string"; - } - return false; - } - if(**outType == 0) { - if(outErrorMsg) { - *outErrorMsg = "Resource type cannot be an empty string"; - } - return false; - } - if(**outName == 0) { - if(outErrorMsg) { - *outErrorMsg = "Resource id cannot be an empty string"; - } - return false; - } - return true; -} - -static uint32_t get_hex(char c, bool* outError) -{ - if (c >= '0' && c <= '9') { - return c - '0'; - } else if (c >= 'a' && c <= 'f') { - return c - 'a' + 0xa; - } else if (c >= 'A' && c <= 'F') { - return c - 'A' + 0xa; - } - *outError = true; - return 0; -} - -struct unit_entry -{ - const char* name; - size_t len; - uint8_t type; - uint32_t unit; - float scale; -}; - -static const unit_entry unitNames[] = { - { "px", strlen("px"), Res_value::TYPE_DIMENSION, Res_value::COMPLEX_UNIT_PX, 1.0f }, - { "dip", strlen("dip"), Res_value::TYPE_DIMENSION, Res_value::COMPLEX_UNIT_DIP, 1.0f }, - { "dp", strlen("dp"), Res_value::TYPE_DIMENSION, Res_value::COMPLEX_UNIT_DIP, 1.0f }, - { "sp", strlen("sp"), Res_value::TYPE_DIMENSION, Res_value::COMPLEX_UNIT_SP, 1.0f }, - { "pt", strlen("pt"), Res_value::TYPE_DIMENSION, Res_value::COMPLEX_UNIT_PT, 1.0f }, - { "in", strlen("in"), Res_value::TYPE_DIMENSION, Res_value::COMPLEX_UNIT_IN, 1.0f }, - { "mm", strlen("mm"), Res_value::TYPE_DIMENSION, Res_value::COMPLEX_UNIT_MM, 1.0f }, - { "%", strlen("%"), Res_value::TYPE_FRACTION, Res_value::COMPLEX_UNIT_FRACTION, 1.0f/100 }, - { "%p", strlen("%p"), Res_value::TYPE_FRACTION, Res_value::COMPLEX_UNIT_FRACTION_PARENT, 1.0f/100 }, - { NULL, 0, 0, 0, 0 } -}; - -static bool parse_unit(const char* str, Res_value* outValue, - float* outScale, const char** outEnd) -{ - const char* end = str; - while (*end != 0 && !isspace((unsigned char)*end)) { - end++; - } - const size_t len = end-str; - - const char* realEnd = end; - while (*realEnd != 0 && isspace((unsigned char)*realEnd)) { - realEnd++; - } - if (*realEnd != 0) { - return false; - } - - const unit_entry* cur = unitNames; - while (cur->name) { - if (len == cur->len && strncmp(cur->name, str, len) == 0) { - outValue->dataType = cur->type; - outValue->data = cur->unit << Res_value::COMPLEX_UNIT_SHIFT; - *outScale = cur->scale; - *outEnd = end; - //printf("Found unit %s for %s\n", cur->name, str); - return true; - } - cur++; - } - - return false; -} - - -bool ResTable::stringToInt(const char16_t* s, size_t len, Res_value* outValue) -{ - while (len > 0 && isspace16(*s)) { - s++; - len--; - } - - if (len <= 0) { - return false; - } - - size_t i = 0; - int32_t val = 0; - bool neg = false; - - if (*s == '-') { - neg = true; - i++; - } - - if (s[i] < '0' || s[i] > '9') { - return false; - } - - // Decimal or hex? - if (s[i] == '0' && s[i+1] == 'x') { - if (outValue) - outValue->dataType = outValue->TYPE_INT_HEX; - i += 2; - bool error = false; - while (i < len && !error) { - val = (val*16) + get_hex(s[i], &error); - i++; - } - if (error) { - return false; - } - } else { - if (outValue) - outValue->dataType = outValue->TYPE_INT_DEC; - while (i < len) { - if (s[i] < '0' || s[i] > '9') { - return false; - } - val = (val*10) + s[i]-'0'; - i++; - } - } - - if (neg) val = -val; - - while (i < len && isspace16(s[i])) { - i++; - } - - if (i == len) { - if (outValue) - outValue->data = val; - return true; - } - - return false; -} - -bool ResTable::stringToFloat(const char16_t* s, size_t len, Res_value* outValue) -{ - while (len > 0 && isspace16(*s)) { - s++; - len--; - } - - if (len <= 0) { - return false; - } - - char buf[128]; - int i=0; - while (len > 0 && *s != 0 && i < 126) { - if (*s > 255) { - return false; - } - buf[i++] = *s++; - len--; - } - - if (len > 0) { - return false; - } - if (buf[0] < '0' && buf[0] > '9' && buf[0] != '.') { - return false; - } - - buf[i] = 0; - const char* end; - float f = strtof(buf, (char**)&end); - - if (*end != 0 && !isspace((unsigned char)*end)) { - // Might be a unit... - float scale; - if (parse_unit(end, outValue, &scale, &end)) { - f *= scale; - const bool neg = f < 0; - if (neg) f = -f; - uint64_t bits = (uint64_t)(f*(1<<23)+.5f); - uint32_t radix; - uint32_t shift; - if ((bits&0x7fffff) == 0) { - // Always use 23p0 if there is no fraction, just to make - // things easier to read. - radix = Res_value::COMPLEX_RADIX_23p0; - shift = 23; - } else if ((bits&0xffffffffff800000LL) == 0) { - // Magnitude is zero -- can fit in 0 bits of precision. - radix = Res_value::COMPLEX_RADIX_0p23; - shift = 0; - } else if ((bits&0xffffffff80000000LL) == 0) { - // Magnitude can fit in 8 bits of precision. - radix = Res_value::COMPLEX_RADIX_8p15; - shift = 8; - } else if ((bits&0xffffff8000000000LL) == 0) { - // Magnitude can fit in 16 bits of precision. - radix = Res_value::COMPLEX_RADIX_16p7; - shift = 16; - } else { - // Magnitude needs entire range, so no fractional part. - radix = Res_value::COMPLEX_RADIX_23p0; - shift = 23; - } - int32_t mantissa = (int32_t)( - (bits>>shift) & Res_value::COMPLEX_MANTISSA_MASK); - if (neg) { - mantissa = (-mantissa) & Res_value::COMPLEX_MANTISSA_MASK; - } - outValue->data |= - (radix<<Res_value::COMPLEX_RADIX_SHIFT) - | (mantissa<<Res_value::COMPLEX_MANTISSA_SHIFT); - //printf("Input value: %f 0x%016Lx, mult: %f, radix: %d, shift: %d, final: 0x%08x\n", - // f * (neg ? -1 : 1), bits, f*(1<<23), - // radix, shift, outValue->data); - return true; - } - return false; - } - - while (*end != 0 && isspace((unsigned char)*end)) { - end++; - } - - if (*end == 0) { - if (outValue) { - outValue->dataType = outValue->TYPE_FLOAT; - *(float*)(&outValue->data) = f; - return true; - } - } - - return false; -} - -bool ResTable::stringToValue(Res_value* outValue, String16* outString, - const char16_t* s, size_t len, - bool preserveSpaces, bool coerceType, - uint32_t attrID, - const String16* defType, - const String16* defPackage, - Accessor* accessor, - void* accessorCookie, - uint32_t attrType, - bool enforcePrivate) const -{ - bool localizationSetting = accessor != NULL && accessor->getLocalizationSetting(); - const char* errorMsg = NULL; - - outValue->size = sizeof(Res_value); - outValue->res0 = 0; - - // First strip leading/trailing whitespace. Do this before handling - // escapes, so they can be used to force whitespace into the string. - if (!preserveSpaces) { - while (len > 0 && isspace16(*s)) { - s++; - len--; - } - while (len > 0 && isspace16(s[len-1])) { - len--; - } - // If the string ends with '\', then we keep the space after it. - if (len > 0 && s[len-1] == '\\' && s[len] != 0) { - len++; - } - } - - //printf("Value for: %s\n", String8(s, len).string()); - - uint32_t l10nReq = ResTable_map::L10N_NOT_REQUIRED; - uint32_t attrMin = 0x80000000, attrMax = 0x7fffffff; - bool fromAccessor = false; - if (attrID != 0 && !Res_INTERNALID(attrID)) { - const ssize_t p = getResourcePackageIndex(attrID); - const bag_entry* bag; - ssize_t cnt = p >= 0 ? lockBag(attrID, &bag) : -1; - //printf("For attr 0x%08x got bag of %d\n", attrID, cnt); - if (cnt >= 0) { - while (cnt > 0) { - //printf("Entry 0x%08x = 0x%08x\n", bag->map.name.ident, bag->map.value.data); - switch (bag->map.name.ident) { - case ResTable_map::ATTR_TYPE: - attrType = bag->map.value.data; - break; - case ResTable_map::ATTR_MIN: - attrMin = bag->map.value.data; - break; - case ResTable_map::ATTR_MAX: - attrMax = bag->map.value.data; - break; - case ResTable_map::ATTR_L10N: - l10nReq = bag->map.value.data; - break; - } - bag++; - cnt--; - } - unlockBag(bag); - } else if (accessor && accessor->getAttributeType(attrID, &attrType)) { - fromAccessor = true; - if (attrType == ResTable_map::TYPE_ENUM - || attrType == ResTable_map::TYPE_FLAGS - || attrType == ResTable_map::TYPE_INTEGER) { - accessor->getAttributeMin(attrID, &attrMin); - accessor->getAttributeMax(attrID, &attrMax); - } - if (localizationSetting) { - l10nReq = accessor->getAttributeL10N(attrID); - } - } - } - - const bool canStringCoerce = - coerceType && (attrType&ResTable_map::TYPE_STRING) != 0; - - if (*s == '@') { - outValue->dataType = outValue->TYPE_REFERENCE; - - // Note: we don't check attrType here because the reference can - // be to any other type; we just need to count on the client making - // sure the referenced type is correct. - - //printf("Looking up ref: %s\n", String8(s, len).string()); - - // It's a reference! - if (len == 5 && s[1]=='n' && s[2]=='u' && s[3]=='l' && s[4]=='l') { - outValue->data = 0; - return true; - } else { - bool createIfNotFound = false; - const char16_t* resourceRefName; - int resourceNameLen; - if (len > 2 && s[1] == '+') { - createIfNotFound = true; - resourceRefName = s + 2; - resourceNameLen = len - 2; - } else if (len > 2 && s[1] == '*') { - enforcePrivate = false; - resourceRefName = s + 2; - resourceNameLen = len - 2; - } else { - createIfNotFound = false; - resourceRefName = s + 1; - resourceNameLen = len - 1; - } - String16 package, type, name; - if (!expandResourceRef(resourceRefName,resourceNameLen, &package, &type, &name, - defType, defPackage, &errorMsg)) { - if (accessor != NULL) { - accessor->reportError(accessorCookie, errorMsg); - } - return false; - } - - uint32_t specFlags = 0; - uint32_t rid = identifierForName(name.string(), name.size(), type.string(), - type.size(), package.string(), package.size(), &specFlags); - if (rid != 0) { - if (enforcePrivate) { - if ((specFlags&ResTable_typeSpec::SPEC_PUBLIC) == 0) { - if (accessor != NULL) { - accessor->reportError(accessorCookie, "Resource is not public."); - } - return false; - } - } - if (!accessor) { - outValue->data = rid; - return true; - } - rid = Res_MAKEID( - accessor->getRemappedPackage(Res_GETPACKAGE(rid)), - Res_GETTYPE(rid), Res_GETENTRY(rid)); - TABLE_NOISY(printf("Incl %s:%s/%s: 0x%08x\n", - String8(package).string(), String8(type).string(), - String8(name).string(), rid)); - outValue->data = rid; - return true; - } - - if (accessor) { - uint32_t rid = accessor->getCustomResourceWithCreation(package, type, name, - createIfNotFound); - if (rid != 0) { - TABLE_NOISY(printf("Pckg %s:%s/%s: 0x%08x\n", - String8(package).string(), String8(type).string(), - String8(name).string(), rid)); - outValue->data = rid; - return true; - } - } - } - - if (accessor != NULL) { - accessor->reportError(accessorCookie, "No resource found that matches the given name"); - } - return false; - } - - // if we got to here, and localization is required and it's not a reference, - // complain and bail. - if (l10nReq == ResTable_map::L10N_SUGGESTED) { - if (localizationSetting) { - if (accessor != NULL) { - accessor->reportError(accessorCookie, "This attribute must be localized."); - } - } - } - - if (*s == '#') { - // It's a color! Convert to an integer of the form 0xaarrggbb. - uint32_t color = 0; - bool error = false; - if (len == 4) { - outValue->dataType = outValue->TYPE_INT_COLOR_RGB4; - color |= 0xFF000000; - color |= get_hex(s[1], &error) << 20; - color |= get_hex(s[1], &error) << 16; - color |= get_hex(s[2], &error) << 12; - color |= get_hex(s[2], &error) << 8; - color |= get_hex(s[3], &error) << 4; - color |= get_hex(s[3], &error); - } else if (len == 5) { - outValue->dataType = outValue->TYPE_INT_COLOR_ARGB4; - color |= get_hex(s[1], &error) << 28; - color |= get_hex(s[1], &error) << 24; - color |= get_hex(s[2], &error) << 20; - color |= get_hex(s[2], &error) << 16; - color |= get_hex(s[3], &error) << 12; - color |= get_hex(s[3], &error) << 8; - color |= get_hex(s[4], &error) << 4; - color |= get_hex(s[4], &error); - } else if (len == 7) { - outValue->dataType = outValue->TYPE_INT_COLOR_RGB8; - color |= 0xFF000000; - color |= get_hex(s[1], &error) << 20; - color |= get_hex(s[2], &error) << 16; - color |= get_hex(s[3], &error) << 12; - color |= get_hex(s[4], &error) << 8; - color |= get_hex(s[5], &error) << 4; - color |= get_hex(s[6], &error); - } else if (len == 9) { - outValue->dataType = outValue->TYPE_INT_COLOR_ARGB8; - color |= get_hex(s[1], &error) << 28; - color |= get_hex(s[2], &error) << 24; - color |= get_hex(s[3], &error) << 20; - color |= get_hex(s[4], &error) << 16; - color |= get_hex(s[5], &error) << 12; - color |= get_hex(s[6], &error) << 8; - color |= get_hex(s[7], &error) << 4; - color |= get_hex(s[8], &error); - } else { - error = true; - } - if (!error) { - if ((attrType&ResTable_map::TYPE_COLOR) == 0) { - if (!canStringCoerce) { - if (accessor != NULL) { - accessor->reportError(accessorCookie, - "Color types not allowed"); - } - return false; - } - } else { - outValue->data = color; - //printf("Color input=%s, output=0x%x\n", String8(s, len).string(), color); - return true; - } - } else { - if ((attrType&ResTable_map::TYPE_COLOR) != 0) { - if (accessor != NULL) { - accessor->reportError(accessorCookie, "Color value not valid --" - " must be #rgb, #argb, #rrggbb, or #aarrggbb"); - } - #if 0 - fprintf(stderr, "%s: Color ID %s value %s is not valid\n", - "Resource File", //(const char*)in->getPrintableSource(), - String8(*curTag).string(), - String8(s, len).string()); - #endif - return false; - } - } - } - - if (*s == '?') { - outValue->dataType = outValue->TYPE_ATTRIBUTE; - - // Note: we don't check attrType here because the reference can - // be to any other type; we just need to count on the client making - // sure the referenced type is correct. - - //printf("Looking up attr: %s\n", String8(s, len).string()); - - static const String16 attr16("attr"); - String16 package, type, name; - if (!expandResourceRef(s+1, len-1, &package, &type, &name, - &attr16, defPackage, &errorMsg)) { - if (accessor != NULL) { - accessor->reportError(accessorCookie, errorMsg); - } - return false; - } - - //printf("Pkg: %s, Type: %s, Name: %s\n", - // String8(package).string(), String8(type).string(), - // String8(name).string()); - uint32_t specFlags = 0; - uint32_t rid = - identifierForName(name.string(), name.size(), - type.string(), type.size(), - package.string(), package.size(), &specFlags); - if (rid != 0) { - if (enforcePrivate) { - if ((specFlags&ResTable_typeSpec::SPEC_PUBLIC) == 0) { - if (accessor != NULL) { - accessor->reportError(accessorCookie, "Attribute is not public."); - } - return false; - } - } - if (!accessor) { - outValue->data = rid; - return true; - } - rid = Res_MAKEID( - accessor->getRemappedPackage(Res_GETPACKAGE(rid)), - Res_GETTYPE(rid), Res_GETENTRY(rid)); - //printf("Incl %s:%s/%s: 0x%08x\n", - // String8(package).string(), String8(type).string(), - // String8(name).string(), rid); - outValue->data = rid; - return true; - } - - if (accessor) { - uint32_t rid = accessor->getCustomResource(package, type, name); - if (rid != 0) { - //printf("Mine %s:%s/%s: 0x%08x\n", - // String8(package).string(), String8(type).string(), - // String8(name).string(), rid); - outValue->data = rid; - return true; - } - } - - if (accessor != NULL) { - accessor->reportError(accessorCookie, "No resource found that matches the given name"); - } - return false; - } - - if (stringToInt(s, len, outValue)) { - if ((attrType&ResTable_map::TYPE_INTEGER) == 0) { - // If this type does not allow integers, but does allow floats, - // fall through on this error case because the float type should - // be able to accept any integer value. - if (!canStringCoerce && (attrType&ResTable_map::TYPE_FLOAT) == 0) { - if (accessor != NULL) { - accessor->reportError(accessorCookie, "Integer types not allowed"); - } - return false; - } - } else { - if (((int32_t)outValue->data) < ((int32_t)attrMin) - || ((int32_t)outValue->data) > ((int32_t)attrMax)) { - if (accessor != NULL) { - accessor->reportError(accessorCookie, "Integer value out of range"); - } - return false; - } - return true; - } - } - - if (stringToFloat(s, len, outValue)) { - if (outValue->dataType == Res_value::TYPE_DIMENSION) { - if ((attrType&ResTable_map::TYPE_DIMENSION) != 0) { - return true; - } - if (!canStringCoerce) { - if (accessor != NULL) { - accessor->reportError(accessorCookie, "Dimension types not allowed"); - } - return false; - } - } else if (outValue->dataType == Res_value::TYPE_FRACTION) { - if ((attrType&ResTable_map::TYPE_FRACTION) != 0) { - return true; - } - if (!canStringCoerce) { - if (accessor != NULL) { - accessor->reportError(accessorCookie, "Fraction types not allowed"); - } - return false; - } - } else if ((attrType&ResTable_map::TYPE_FLOAT) == 0) { - if (!canStringCoerce) { - if (accessor != NULL) { - accessor->reportError(accessorCookie, "Float types not allowed"); - } - return false; - } - } else { - return true; - } - } - - if (len == 4) { - if ((s[0] == 't' || s[0] == 'T') && - (s[1] == 'r' || s[1] == 'R') && - (s[2] == 'u' || s[2] == 'U') && - (s[3] == 'e' || s[3] == 'E')) { - if ((attrType&ResTable_map::TYPE_BOOLEAN) == 0) { - if (!canStringCoerce) { - if (accessor != NULL) { - accessor->reportError(accessorCookie, "Boolean types not allowed"); - } - return false; - } - } else { - outValue->dataType = outValue->TYPE_INT_BOOLEAN; - outValue->data = (uint32_t)-1; - return true; - } - } - } - - if (len == 5) { - if ((s[0] == 'f' || s[0] == 'F') && - (s[1] == 'a' || s[1] == 'A') && - (s[2] == 'l' || s[2] == 'L') && - (s[3] == 's' || s[3] == 'S') && - (s[4] == 'e' || s[4] == 'E')) { - if ((attrType&ResTable_map::TYPE_BOOLEAN) == 0) { - if (!canStringCoerce) { - if (accessor != NULL) { - accessor->reportError(accessorCookie, "Boolean types not allowed"); - } - return false; - } - } else { - outValue->dataType = outValue->TYPE_INT_BOOLEAN; - outValue->data = 0; - return true; - } - } - } - - if ((attrType&ResTable_map::TYPE_ENUM) != 0) { - const ssize_t p = getResourcePackageIndex(attrID); - const bag_entry* bag; - ssize_t cnt = p >= 0 ? lockBag(attrID, &bag) : -1; - //printf("Got %d for enum\n", cnt); - if (cnt >= 0) { - resource_name rname; - while (cnt > 0) { - if (!Res_INTERNALID(bag->map.name.ident)) { - //printf("Trying attr #%08x\n", bag->map.name.ident); - if (getResourceName(bag->map.name.ident, &rname)) { - #if 0 - printf("Matching %s against %s (0x%08x)\n", - String8(s, len).string(), - String8(rname.name, rname.nameLen).string(), - bag->map.name.ident); - #endif - if (strzcmp16(s, len, rname.name, rname.nameLen) == 0) { - outValue->dataType = bag->map.value.dataType; - outValue->data = bag->map.value.data; - unlockBag(bag); - return true; - } - } - - } - bag++; - cnt--; - } - unlockBag(bag); - } - - if (fromAccessor) { - if (accessor->getAttributeEnum(attrID, s, len, outValue)) { - return true; - } - } - } - - if ((attrType&ResTable_map::TYPE_FLAGS) != 0) { - const ssize_t p = getResourcePackageIndex(attrID); - const bag_entry* bag; - ssize_t cnt = p >= 0 ? lockBag(attrID, &bag) : -1; - //printf("Got %d for flags\n", cnt); - if (cnt >= 0) { - bool failed = false; - resource_name rname; - outValue->dataType = Res_value::TYPE_INT_HEX; - outValue->data = 0; - const char16_t* end = s + len; - const char16_t* pos = s; - while (pos < end && !failed) { - const char16_t* start = pos; - pos++; - while (pos < end && *pos != '|') { - pos++; - } - //printf("Looking for: %s\n", String8(start, pos-start).string()); - const bag_entry* bagi = bag; - ssize_t i; - for (i=0; i<cnt; i++, bagi++) { - if (!Res_INTERNALID(bagi->map.name.ident)) { - //printf("Trying attr #%08x\n", bagi->map.name.ident); - if (getResourceName(bagi->map.name.ident, &rname)) { - #if 0 - printf("Matching %s against %s (0x%08x)\n", - String8(start,pos-start).string(), - String8(rname.name, rname.nameLen).string(), - bagi->map.name.ident); - #endif - if (strzcmp16(start, pos-start, rname.name, rname.nameLen) == 0) { - outValue->data |= bagi->map.value.data; - break; - } - } - } - } - if (i >= cnt) { - // Didn't find this flag identifier. - failed = true; - } - if (pos < end) { - pos++; - } - } - unlockBag(bag); - if (!failed) { - //printf("Final flag value: 0x%lx\n", outValue->data); - return true; - } - } - - - if (fromAccessor) { - if (accessor->getAttributeFlags(attrID, s, len, outValue)) { - //printf("Final flag value: 0x%lx\n", outValue->data); - return true; - } - } - } - - if ((attrType&ResTable_map::TYPE_STRING) == 0) { - if (accessor != NULL) { - accessor->reportError(accessorCookie, "String types not allowed"); - } - return false; - } - - // Generic string handling... - outValue->dataType = outValue->TYPE_STRING; - if (outString) { - bool failed = collectString(outString, s, len, preserveSpaces, &errorMsg); - if (accessor != NULL) { - accessor->reportError(accessorCookie, errorMsg); - } - return failed; - } - - return true; -} - -bool ResTable::collectString(String16* outString, - const char16_t* s, size_t len, - bool preserveSpaces, - const char** outErrorMsg, - bool append) -{ - String16 tmp; - - char quoted = 0; - const char16_t* p = s; - while (p < (s+len)) { - while (p < (s+len)) { - const char16_t c = *p; - if (c == '\\') { - break; - } - if (!preserveSpaces) { - if (quoted == 0 && isspace16(c) - && (c != ' ' || isspace16(*(p+1)))) { - break; - } - if (c == '"' && (quoted == 0 || quoted == '"')) { - break; - } - if (c == '\'' && (quoted == 0 || quoted == '\'')) { - /* - * In practice, when people write ' instead of \' - * in a string, they are doing it by accident - * instead of really meaning to use ' as a quoting - * character. Warn them so they don't lose it. - */ - if (outErrorMsg) { - *outErrorMsg = "Apostrophe not preceded by \\"; - } - return false; - } - } - p++; - } - if (p < (s+len)) { - if (p > s) { - tmp.append(String16(s, p-s)); - } - if (!preserveSpaces && (*p == '"' || *p == '\'')) { - if (quoted == 0) { - quoted = *p; - } else { - quoted = 0; - } - p++; - } else if (!preserveSpaces && isspace16(*p)) { - // Space outside of a quote -- consume all spaces and - // leave a single plain space char. - tmp.append(String16(" ")); - p++; - while (p < (s+len) && isspace16(*p)) { - p++; - } - } else if (*p == '\\') { - p++; - if (p < (s+len)) { - switch (*p) { - case 't': - tmp.append(String16("\t")); - break; - case 'n': - tmp.append(String16("\n")); - break; - case '#': - tmp.append(String16("#")); - break; - case '@': - tmp.append(String16("@")); - break; - case '?': - tmp.append(String16("?")); - break; - case '"': - tmp.append(String16("\"")); - break; - case '\'': - tmp.append(String16("'")); - break; - case '\\': - tmp.append(String16("\\")); - break; - case 'u': - { - char16_t chr = 0; - int i = 0; - while (i < 4 && p[1] != 0) { - p++; - i++; - int c; - if (*p >= '0' && *p <= '9') { - c = *p - '0'; - } else if (*p >= 'a' && *p <= 'f') { - c = *p - 'a' + 10; - } else if (*p >= 'A' && *p <= 'F') { - c = *p - 'A' + 10; - } else { - if (outErrorMsg) { - *outErrorMsg = "Bad character in \\u unicode escape sequence"; - } - return false; - } - chr = (chr<<4) | c; - } - tmp.append(String16(&chr, 1)); - } break; - default: - // ignore unknown escape chars. - break; - } - p++; - } - } - len -= (p-s); - s = p; - } - } - - if (tmp.size() != 0) { - if (len > 0) { - tmp.append(String16(s, len)); - } - if (append) { - outString->append(tmp); - } else { - outString->setTo(tmp); - } - } else { - if (append) { - outString->append(String16(s, len)); - } else { - outString->setTo(s, len); - } - } - - return true; -} - -size_t ResTable::getBasePackageCount() const -{ - if (mError != NO_ERROR) { - return 0; - } - return mPackageGroups.size(); -} - -const char16_t* ResTable::getBasePackageName(size_t idx) const -{ - if (mError != NO_ERROR) { - return 0; - } - LOG_FATAL_IF(idx >= mPackageGroups.size(), - "Requested package index %d past package count %d", - (int)idx, (int)mPackageGroups.size()); - return mPackageGroups[idx]->name.string(); -} - -uint32_t ResTable::getBasePackageId(size_t idx) const -{ - if (mError != NO_ERROR) { - return 0; - } - LOG_FATAL_IF(idx >= mPackageGroups.size(), - "Requested package index %d past package count %d", - (int)idx, (int)mPackageGroups.size()); - return mPackageGroups[idx]->id; -} - -size_t ResTable::getTableCount() const -{ - return mHeaders.size(); -} - -const ResStringPool* ResTable::getTableStringBlock(size_t index) const -{ - return &mHeaders[index]->values; -} - -void* ResTable::getTableCookie(size_t index) const -{ - return mHeaders[index]->cookie; -} - -void ResTable::getConfigurations(Vector<ResTable_config>* configs) const -{ - const size_t I = mPackageGroups.size(); - for (size_t i=0; i<I; i++) { - const PackageGroup* packageGroup = mPackageGroups[i]; - const size_t J = packageGroup->packages.size(); - for (size_t j=0; j<J; j++) { - const Package* package = packageGroup->packages[j]; - const size_t K = package->types.size(); - for (size_t k=0; k<K; k++) { - const Type* type = package->types[k]; - if (type == NULL) continue; - const size_t L = type->configs.size(); - for (size_t l=0; l<L; l++) { - const ResTable_type* config = type->configs[l]; - const ResTable_config* cfg = &config->config; - // only insert unique - const size_t M = configs->size(); - size_t m; - for (m=0; m<M; m++) { - if (0 == (*configs)[m].compare(*cfg)) { - break; - } - } - // if we didn't find it - if (m == M) { - configs->add(*cfg); - } - } - } - } - } -} - -void ResTable::getLocales(Vector<String8>* locales) const -{ - Vector<ResTable_config> configs; - ALOGV("calling getConfigurations"); - getConfigurations(&configs); - ALOGV("called getConfigurations size=%d", (int)configs.size()); - const size_t I = configs.size(); - for (size_t i=0; i<I; i++) { - char locale[6]; - configs[i].getLocale(locale); - const size_t J = locales->size(); - size_t j; - for (j=0; j<J; j++) { - if (0 == strcmp(locale, (*locales)[j].string())) { - break; - } - } - if (j == J) { - locales->add(String8(locale)); - } - } -} - -ssize_t ResTable::getEntry( - const Package* package, int typeIndex, int entryIndex, - const ResTable_config* config, - const ResTable_type** outType, const ResTable_entry** outEntry, - const Type** outTypeClass) const -{ - ALOGV("Getting entry from package %p\n", package); - const ResTable_package* const pkg = package->package; - - const Type* allTypes = package->getType(typeIndex); - ALOGV("allTypes=%p\n", allTypes); - if (allTypes == NULL) { - ALOGV("Skipping entry type index 0x%02x because type is NULL!\n", typeIndex); - return 0; - } - - if ((size_t)entryIndex >= allTypes->entryCount) { - ALOGW("getEntry failing because entryIndex %d is beyond type entryCount %d", - entryIndex, (int)allTypes->entryCount); - return BAD_TYPE; - } - - const ResTable_type* type = NULL; - uint32_t offset = ResTable_type::NO_ENTRY; - ResTable_config bestConfig; - memset(&bestConfig, 0, sizeof(bestConfig)); // make the compiler shut up - - const size_t NT = allTypes->configs.size(); - for (size_t i=0; i<NT; i++) { - const ResTable_type* const thisType = allTypes->configs[i]; - if (thisType == NULL) continue; - - ResTable_config thisConfig; - thisConfig.copyFromDtoH(thisType->config); - - TABLE_GETENTRY(LOGI("Match entry 0x%x in type 0x%x (sz 0x%x): %s\n", - entryIndex, typeIndex+1, dtohl(thisType->config.size), - thisConfig.toString().string())); - - // Check to make sure this one is valid for the current parameters. - if (config && !thisConfig.match(*config)) { - TABLE_GETENTRY(LOGI("Does not match config!\n")); - continue; - } - - // Check if there is the desired entry in this type. - - const uint8_t* const end = ((const uint8_t*)thisType) - + dtohl(thisType->header.size); - const uint32_t* const eindex = (const uint32_t*) - (((const uint8_t*)thisType) + dtohs(thisType->header.headerSize)); - - uint32_t thisOffset = dtohl(eindex[entryIndex]); - if (thisOffset == ResTable_type::NO_ENTRY) { - TABLE_GETENTRY(LOGI("Skipping because it is not defined!\n")); - continue; - } - - if (type != NULL) { - // Check if this one is less specific than the last found. If so, - // we will skip it. We check starting with things we most care - // about to those we least care about. - if (!thisConfig.isBetterThan(bestConfig, config)) { - TABLE_GETENTRY(LOGI("This config is worse than last!\n")); - continue; - } - } - - type = thisType; - offset = thisOffset; - bestConfig = thisConfig; - TABLE_GETENTRY(LOGI("Best entry so far -- using it!\n")); - if (!config) break; - } - - if (type == NULL) { - TABLE_GETENTRY(LOGI("No value found for requested entry!\n")); - return BAD_INDEX; - } - - offset += dtohl(type->entriesStart); - TABLE_NOISY(aout << "Looking in resource table " << package->header->header - << ", typeOff=" - << (void*)(((const char*)type)-((const char*)package->header->header)) - << ", offset=" << (void*)offset << endl); - - if (offset > (dtohl(type->header.size)-sizeof(ResTable_entry))) { - ALOGW("ResTable_entry at 0x%x is beyond type chunk data 0x%x", - offset, dtohl(type->header.size)); - return BAD_TYPE; - } - if ((offset&0x3) != 0) { - ALOGW("ResTable_entry at 0x%x is not on an integer boundary", - offset); - return BAD_TYPE; - } - - const ResTable_entry* const entry = (const ResTable_entry*) - (((const uint8_t*)type) + offset); - if (dtohs(entry->size) < sizeof(*entry)) { - ALOGW("ResTable_entry size 0x%x is too small", dtohs(entry->size)); - return BAD_TYPE; - } - - *outType = type; - *outEntry = entry; - if (outTypeClass != NULL) { - *outTypeClass = allTypes; - } - return offset + dtohs(entry->size); -} - -status_t ResTable::parsePackage(const ResTable_package* const pkg, - const Header* const header, uint32_t idmap_id) -{ - const uint8_t* base = (const uint8_t*)pkg; - status_t err = validate_chunk(&pkg->header, sizeof(*pkg), - header->dataEnd, "ResTable_package"); - if (err != NO_ERROR) { - return (mError=err); - } - - const size_t pkgSize = dtohl(pkg->header.size); - - if (dtohl(pkg->typeStrings) >= pkgSize) { - ALOGW("ResTable_package type strings at %p are past chunk size %p.", - (void*)dtohl(pkg->typeStrings), (void*)pkgSize); - return (mError=BAD_TYPE); - } - if ((dtohl(pkg->typeStrings)&0x3) != 0) { - ALOGW("ResTable_package type strings at %p is not on an integer boundary.", - (void*)dtohl(pkg->typeStrings)); - return (mError=BAD_TYPE); - } - if (dtohl(pkg->keyStrings) >= pkgSize) { - ALOGW("ResTable_package key strings at %p are past chunk size %p.", - (void*)dtohl(pkg->keyStrings), (void*)pkgSize); - return (mError=BAD_TYPE); - } - if ((dtohl(pkg->keyStrings)&0x3) != 0) { - ALOGW("ResTable_package key strings at %p is not on an integer boundary.", - (void*)dtohl(pkg->keyStrings)); - return (mError=BAD_TYPE); - } - - Package* package = NULL; - PackageGroup* group = NULL; - uint32_t id = idmap_id != 0 ? idmap_id : dtohl(pkg->id); - // If at this point id == 0, pkg is an overlay package without a - // corresponding idmap. During regular usage, overlay packages are - // always loaded alongside their idmaps, but during idmap creation - // the package is temporarily loaded by itself. - if (id < 256) { - - package = new Package(this, header, pkg); - if (package == NULL) { - return (mError=NO_MEMORY); - } - - size_t idx = mPackageMap[id]; - if (idx == 0) { - idx = mPackageGroups.size()+1; - - char16_t tmpName[sizeof(pkg->name)/sizeof(char16_t)]; - strcpy16_dtoh(tmpName, pkg->name, sizeof(pkg->name)/sizeof(char16_t)); - group = new PackageGroup(this, String16(tmpName), id); - if (group == NULL) { - delete package; - return (mError=NO_MEMORY); - } - - err = package->typeStrings.setTo(base+dtohl(pkg->typeStrings), - header->dataEnd-(base+dtohl(pkg->typeStrings))); - if (err != NO_ERROR) { - delete group; - delete package; - return (mError=err); - } - err = package->keyStrings.setTo(base+dtohl(pkg->keyStrings), - header->dataEnd-(base+dtohl(pkg->keyStrings))); - if (err != NO_ERROR) { - delete group; - delete package; - return (mError=err); - } - - //printf("Adding new package id %d at index %d\n", id, idx); - err = mPackageGroups.add(group); - if (err < NO_ERROR) { - return (mError=err); - } - group->basePackage = package; - - mPackageMap[id] = (uint8_t)idx; - } else { - group = mPackageGroups.itemAt(idx-1); - if (group == NULL) { - return (mError=UNKNOWN_ERROR); - } - } - err = group->packages.add(package); - if (err < NO_ERROR) { - return (mError=err); - } - } else { - LOG_ALWAYS_FATAL("Package id out of range"); - return NO_ERROR; - } - - - // Iterate through all chunks. - size_t curPackage = 0; - - const ResChunk_header* chunk = - (const ResChunk_header*)(((const uint8_t*)pkg) - + dtohs(pkg->header.headerSize)); - const uint8_t* endPos = ((const uint8_t*)pkg) + dtohs(pkg->header.size); - while (((const uint8_t*)chunk) <= (endPos-sizeof(ResChunk_header)) && - ((const uint8_t*)chunk) <= (endPos-dtohl(chunk->size))) { - TABLE_NOISY(LOGV("PackageChunk: type=0x%x, headerSize=0x%x, size=0x%x, pos=%p\n", - dtohs(chunk->type), dtohs(chunk->headerSize), dtohl(chunk->size), - (void*)(((const uint8_t*)chunk) - ((const uint8_t*)header->header)))); - const size_t csize = dtohl(chunk->size); - const uint16_t ctype = dtohs(chunk->type); - if (ctype == RES_TABLE_TYPE_SPEC_TYPE) { - const ResTable_typeSpec* typeSpec = (const ResTable_typeSpec*)(chunk); - err = validate_chunk(&typeSpec->header, sizeof(*typeSpec), - endPos, "ResTable_typeSpec"); - if (err != NO_ERROR) { - return (mError=err); - } - - const size_t typeSpecSize = dtohl(typeSpec->header.size); - - LOAD_TABLE_NOISY(printf("TypeSpec off %p: type=0x%x, headerSize=0x%x, size=%p\n", - (void*)(base-(const uint8_t*)chunk), - dtohs(typeSpec->header.type), - dtohs(typeSpec->header.headerSize), - (void*)typeSize)); - // look for block overrun or int overflow when multiplying by 4 - if ((dtohl(typeSpec->entryCount) > (INT32_MAX/sizeof(uint32_t)) - || dtohs(typeSpec->header.headerSize)+(sizeof(uint32_t)*dtohl(typeSpec->entryCount)) - > typeSpecSize)) { - ALOGW("ResTable_typeSpec entry index to %p extends beyond chunk end %p.", - (void*)(dtohs(typeSpec->header.headerSize) - +(sizeof(uint32_t)*dtohl(typeSpec->entryCount))), - (void*)typeSpecSize); - return (mError=BAD_TYPE); - } - - if (typeSpec->id == 0) { - ALOGW("ResTable_type has an id of 0."); - return (mError=BAD_TYPE); - } - - while (package->types.size() < typeSpec->id) { - package->types.add(NULL); - } - Type* t = package->types[typeSpec->id-1]; - if (t == NULL) { - t = new Type(header, package, dtohl(typeSpec->entryCount)); - package->types.editItemAt(typeSpec->id-1) = t; - } else if (dtohl(typeSpec->entryCount) != t->entryCount) { - ALOGW("ResTable_typeSpec entry count inconsistent: given %d, previously %d", - (int)dtohl(typeSpec->entryCount), (int)t->entryCount); - return (mError=BAD_TYPE); - } - t->typeSpecFlags = (const uint32_t*)( - ((const uint8_t*)typeSpec) + dtohs(typeSpec->header.headerSize)); - t->typeSpec = typeSpec; - - } else if (ctype == RES_TABLE_TYPE_TYPE) { - const ResTable_type* type = (const ResTable_type*)(chunk); - err = validate_chunk(&type->header, sizeof(*type)-sizeof(ResTable_config)+4, - endPos, "ResTable_type"); - if (err != NO_ERROR) { - return (mError=err); - } - - const size_t typeSize = dtohl(type->header.size); - - LOAD_TABLE_NOISY(printf("Type off %p: type=0x%x, headerSize=0x%x, size=%p\n", - (void*)(base-(const uint8_t*)chunk), - dtohs(type->header.type), - dtohs(type->header.headerSize), - (void*)typeSize)); - if (dtohs(type->header.headerSize)+(sizeof(uint32_t)*dtohl(type->entryCount)) - > typeSize) { - ALOGW("ResTable_type entry index to %p extends beyond chunk end %p.", - (void*)(dtohs(type->header.headerSize) - +(sizeof(uint32_t)*dtohl(type->entryCount))), - (void*)typeSize); - return (mError=BAD_TYPE); - } - if (dtohl(type->entryCount) != 0 - && dtohl(type->entriesStart) > (typeSize-sizeof(ResTable_entry))) { - ALOGW("ResTable_type entriesStart at %p extends beyond chunk end %p.", - (void*)dtohl(type->entriesStart), (void*)typeSize); - return (mError=BAD_TYPE); - } - if (type->id == 0) { - ALOGW("ResTable_type has an id of 0."); - return (mError=BAD_TYPE); - } - - while (package->types.size() < type->id) { - package->types.add(NULL); - } - Type* t = package->types[type->id-1]; - if (t == NULL) { - t = new Type(header, package, dtohl(type->entryCount)); - package->types.editItemAt(type->id-1) = t; - } else if (dtohl(type->entryCount) != t->entryCount) { - ALOGW("ResTable_type entry count inconsistent: given %d, previously %d", - (int)dtohl(type->entryCount), (int)t->entryCount); - return (mError=BAD_TYPE); - } - - TABLE_GETENTRY( - ResTable_config thisConfig; - thisConfig.copyFromDtoH(type->config); - ALOGI("Adding config to type %d: %s\n", - type->id, thisConfig.toString().string())); - t->configs.add(type); - } else { - status_t err = validate_chunk(chunk, sizeof(ResChunk_header), - endPos, "ResTable_package:unknown"); - if (err != NO_ERROR) { - return (mError=err); - } - } - chunk = (const ResChunk_header*) - (((const uint8_t*)chunk) + csize); - } - - if (group->typeCount == 0) { - group->typeCount = package->types.size(); - } - - return NO_ERROR; -} - -status_t ResTable::createIdmap(const ResTable& overlay, uint32_t originalCrc, uint32_t overlayCrc, - void** outData, size_t* outSize) const -{ - // see README for details on the format of map - if (mPackageGroups.size() == 0) { - return UNKNOWN_ERROR; - } - if (mPackageGroups[0]->packages.size() == 0) { - return UNKNOWN_ERROR; - } - - Vector<Vector<uint32_t> > map; - const PackageGroup* pg = mPackageGroups[0]; - const Package* pkg = pg->packages[0]; - size_t typeCount = pkg->types.size(); - // starting size is header + first item (number of types in map) - *outSize = (IDMAP_HEADER_SIZE + 1) * sizeof(uint32_t); - const String16 overlayPackage(overlay.mPackageGroups[0]->packages[0]->package->name); - const uint32_t pkg_id = pkg->package->id << 24; - - for (size_t typeIndex = 0; typeIndex < typeCount; ++typeIndex) { - ssize_t offset = -1; - const Type* typeConfigs = pkg->getType(typeIndex); - ssize_t mapIndex = map.add(); - if (mapIndex < 0) { - return NO_MEMORY; - } - Vector<uint32_t>& vector = map.editItemAt(mapIndex); - for (size_t entryIndex = 0; entryIndex < typeConfigs->entryCount; ++entryIndex) { - uint32_t resID = (0xff000000 & ((pkg->package->id)<<24)) - | (0x00ff0000 & ((typeIndex+1)<<16)) - | (0x0000ffff & (entryIndex)); - resource_name resName; - if (!this->getResourceName(resID, &resName)) { - ALOGW("idmap: resource 0x%08x has spec but lacks values, skipping\n", resID); - continue; - } - - const String16 overlayType(resName.type, resName.typeLen); - const String16 overlayName(resName.name, resName.nameLen); - uint32_t overlayResID = overlay.identifierForName(overlayName.string(), - overlayName.size(), - overlayType.string(), - overlayType.size(), - overlayPackage.string(), - overlayPackage.size()); - if (overlayResID != 0) { - // overlay package has package ID == 0, use original package's ID instead - overlayResID |= pkg_id; - } - vector.push(overlayResID); - if (overlayResID != 0 && offset == -1) { - offset = Res_GETENTRY(resID); - } -#if 0 - if (overlayResID != 0) { - ALOGD("%s/%s 0x%08x -> 0x%08x\n", - String8(String16(resName.type)).string(), - String8(String16(resName.name)).string(), - resID, overlayResID); - } -#endif - } - - if (offset != -1) { - // shave off leading and trailing entries which lack overlay values - vector.removeItemsAt(0, offset); - vector.insertAt((uint32_t)offset, 0, 1); - while (vector.top() == 0) { - vector.pop(); - } - // reserve space for number and offset of entries, and the actual entries - *outSize += (2 + vector.size()) * sizeof(uint32_t); - } else { - // no entries of current type defined in overlay package - vector.clear(); - // reserve space for type offset - *outSize += 1 * sizeof(uint32_t); - } - } - - if ((*outData = malloc(*outSize)) == NULL) { - return NO_MEMORY; - } - uint32_t* data = (uint32_t*)*outData; - *data++ = htodl(IDMAP_MAGIC); - *data++ = htodl(originalCrc); - *data++ = htodl(overlayCrc); - const size_t mapSize = map.size(); - *data++ = htodl(mapSize); - size_t offset = mapSize; - for (size_t i = 0; i < mapSize; ++i) { - const Vector<uint32_t>& vector = map.itemAt(i); - const size_t N = vector.size(); - if (N == 0) { - *data++ = htodl(0); - } else { - offset++; - *data++ = htodl(offset); - offset += N; - } - } - for (size_t i = 0; i < mapSize; ++i) { - const Vector<uint32_t>& vector = map.itemAt(i); - const size_t N = vector.size(); - if (N == 0) { - continue; - } - *data++ = htodl(N - 1); // do not count the offset (which is vector's first element) - for (size_t j = 0; j < N; ++j) { - const uint32_t& overlayResID = vector.itemAt(j); - *data++ = htodl(overlayResID); - } - } - - return NO_ERROR; -} - -bool ResTable::getIdmapInfo(const void* idmap, size_t sizeBytes, - uint32_t* pOriginalCrc, uint32_t* pOverlayCrc) -{ - const uint32_t* map = (const uint32_t*)idmap; - if (!assertIdmapHeader(map, sizeBytes)) { - return false; - } - *pOriginalCrc = map[1]; - *pOverlayCrc = map[2]; - return true; -} - - -#ifndef HAVE_ANDROID_OS -#define CHAR16_TO_CSTR(c16, len) (String8(String16(c16,len)).string()) - -#define CHAR16_ARRAY_EQ(constant, var, len) \ - ((len == (sizeof(constant)/sizeof(constant[0]))) && (0 == memcmp((var), (constant), (len)))) - -void print_complex(uint32_t complex, bool isFraction) -{ - const float MANTISSA_MULT = - 1.0f / (1<<Res_value::COMPLEX_MANTISSA_SHIFT); - const float RADIX_MULTS[] = { - 1.0f*MANTISSA_MULT, 1.0f/(1<<7)*MANTISSA_MULT, - 1.0f/(1<<15)*MANTISSA_MULT, 1.0f/(1<<23)*MANTISSA_MULT - }; - - float value = (complex&(Res_value::COMPLEX_MANTISSA_MASK - <<Res_value::COMPLEX_MANTISSA_SHIFT)) - * RADIX_MULTS[(complex>>Res_value::COMPLEX_RADIX_SHIFT) - & Res_value::COMPLEX_RADIX_MASK]; - printf("%f", value); - - if (!isFraction) { - switch ((complex>>Res_value::COMPLEX_UNIT_SHIFT)&Res_value::COMPLEX_UNIT_MASK) { - case Res_value::COMPLEX_UNIT_PX: printf("px"); break; - case Res_value::COMPLEX_UNIT_DIP: printf("dp"); break; - case Res_value::COMPLEX_UNIT_SP: printf("sp"); break; - case Res_value::COMPLEX_UNIT_PT: printf("pt"); break; - case Res_value::COMPLEX_UNIT_IN: printf("in"); break; - case Res_value::COMPLEX_UNIT_MM: printf("mm"); break; - default: printf(" (unknown unit)"); break; - } - } else { - switch ((complex>>Res_value::COMPLEX_UNIT_SHIFT)&Res_value::COMPLEX_UNIT_MASK) { - case Res_value::COMPLEX_UNIT_FRACTION: printf("%%"); break; - case Res_value::COMPLEX_UNIT_FRACTION_PARENT: printf("%%p"); break; - default: printf(" (unknown unit)"); break; - } - } -} - -// Normalize a string for output -String8 ResTable::normalizeForOutput( const char *input ) -{ - String8 ret; - char buff[2]; - buff[1] = '\0'; - - while (*input != '\0') { - switch (*input) { - // All interesting characters are in the ASCII zone, so we are making our own lives - // easier by scanning the string one byte at a time. - case '\\': - ret += "\\\\"; - break; - case '\n': - ret += "\\n"; - break; - case '"': - ret += "\\\""; - break; - default: - buff[0] = *input; - ret += buff; - break; - } - - input++; - } - - return ret; -} - -void ResTable::print_value(const Package* pkg, const Res_value& value) const -{ - if (value.dataType == Res_value::TYPE_NULL) { - printf("(null)\n"); - } else if (value.dataType == Res_value::TYPE_REFERENCE) { - printf("(reference) 0x%08x\n", value.data); - } else if (value.dataType == Res_value::TYPE_ATTRIBUTE) { - printf("(attribute) 0x%08x\n", value.data); - } else if (value.dataType == Res_value::TYPE_STRING) { - size_t len; - const char* str8 = pkg->header->values.string8At( - value.data, &len); - if (str8 != NULL) { - printf("(string8) \"%s\"\n", normalizeForOutput(str8).string()); - } else { - const char16_t* str16 = pkg->header->values.stringAt( - value.data, &len); - if (str16 != NULL) { - printf("(string16) \"%s\"\n", - normalizeForOutput(String8(str16, len).string()).string()); - } else { - printf("(string) null\n"); - } - } - } else if (value.dataType == Res_value::TYPE_FLOAT) { - printf("(float) %g\n", *(const float*)&value.data); - } else if (value.dataType == Res_value::TYPE_DIMENSION) { - printf("(dimension) "); - print_complex(value.data, false); - printf("\n"); - } else if (value.dataType == Res_value::TYPE_FRACTION) { - printf("(fraction) "); - print_complex(value.data, true); - printf("\n"); - } else if (value.dataType >= Res_value::TYPE_FIRST_COLOR_INT - || value.dataType <= Res_value::TYPE_LAST_COLOR_INT) { - printf("(color) #%08x\n", value.data); - } else if (value.dataType == Res_value::TYPE_INT_BOOLEAN) { - printf("(boolean) %s\n", value.data ? "true" : "false"); - } else if (value.dataType >= Res_value::TYPE_FIRST_INT - || value.dataType <= Res_value::TYPE_LAST_INT) { - printf("(int) 0x%08x or %d\n", value.data, value.data); - } else { - printf("(unknown type) t=0x%02x d=0x%08x (s=0x%04x r=0x%02x)\n", - (int)value.dataType, (int)value.data, - (int)value.size, (int)value.res0); - } -} - -void ResTable::print(bool inclValues) const -{ - if (mError != 0) { - printf("mError=0x%x (%s)\n", mError, strerror(mError)); - } -#if 0 - printf("mParams=%c%c-%c%c,\n", - mParams.language[0], mParams.language[1], - mParams.country[0], mParams.country[1]); -#endif - size_t pgCount = mPackageGroups.size(); - printf("Package Groups (%d)\n", (int)pgCount); - for (size_t pgIndex=0; pgIndex<pgCount; pgIndex++) { - const PackageGroup* pg = mPackageGroups[pgIndex]; - printf("Package Group %d id=%d packageCount=%d name=%s\n", - (int)pgIndex, pg->id, (int)pg->packages.size(), - String8(pg->name).string()); - - size_t pkgCount = pg->packages.size(); - for (size_t pkgIndex=0; pkgIndex<pkgCount; pkgIndex++) { - const Package* pkg = pg->packages[pkgIndex]; - size_t typeCount = pkg->types.size(); - printf(" Package %d id=%d name=%s typeCount=%d\n", (int)pkgIndex, - pkg->package->id, String8(String16(pkg->package->name)).string(), - (int)typeCount); - for (size_t typeIndex=0; typeIndex<typeCount; typeIndex++) { - const Type* typeConfigs = pkg->getType(typeIndex); - if (typeConfigs == NULL) { - printf(" type %d NULL\n", (int)typeIndex); - continue; - } - const size_t NTC = typeConfigs->configs.size(); - printf(" type %d configCount=%d entryCount=%d\n", - (int)typeIndex, (int)NTC, (int)typeConfigs->entryCount); - if (typeConfigs->typeSpecFlags != NULL) { - for (size_t entryIndex=0; entryIndex<typeConfigs->entryCount; entryIndex++) { - uint32_t resID = (0xff000000 & ((pkg->package->id)<<24)) - | (0x00ff0000 & ((typeIndex+1)<<16)) - | (0x0000ffff & (entryIndex)); - resource_name resName; - if (this->getResourceName(resID, &resName)) { - printf(" spec resource 0x%08x %s:%s/%s: flags=0x%08x\n", - resID, - CHAR16_TO_CSTR(resName.package, resName.packageLen), - CHAR16_TO_CSTR(resName.type, resName.typeLen), - CHAR16_TO_CSTR(resName.name, resName.nameLen), - dtohl(typeConfigs->typeSpecFlags[entryIndex])); - } else { - printf(" INVALID TYPE CONFIG FOR RESOURCE 0x%08x\n", resID); - } - } - } - for (size_t configIndex=0; configIndex<NTC; configIndex++) { - const ResTable_type* type = typeConfigs->configs[configIndex]; - if ((((uint64_t)type)&0x3) != 0) { - printf(" NON-INTEGER ResTable_type ADDRESS: %p\n", type); - continue; - } - String8 configStr = type->config.toString(); - printf(" config %s:\n", configStr.size() > 0 - ? configStr.string() : "(default)"); - size_t entryCount = dtohl(type->entryCount); - uint32_t entriesStart = dtohl(type->entriesStart); - if ((entriesStart&0x3) != 0) { - printf(" NON-INTEGER ResTable_type entriesStart OFFSET: %p\n", (void*)entriesStart); - continue; - } - uint32_t typeSize = dtohl(type->header.size); - if ((typeSize&0x3) != 0) { - printf(" NON-INTEGER ResTable_type header.size: %p\n", (void*)typeSize); - continue; - } - for (size_t entryIndex=0; entryIndex<entryCount; entryIndex++) { - - const uint8_t* const end = ((const uint8_t*)type) - + dtohl(type->header.size); - const uint32_t* const eindex = (const uint32_t*) - (((const uint8_t*)type) + dtohs(type->header.headerSize)); - - uint32_t thisOffset = dtohl(eindex[entryIndex]); - if (thisOffset == ResTable_type::NO_ENTRY) { - continue; - } - - uint32_t resID = (0xff000000 & ((pkg->package->id)<<24)) - | (0x00ff0000 & ((typeIndex+1)<<16)) - | (0x0000ffff & (entryIndex)); - resource_name resName; - if (this->getResourceName(resID, &resName)) { - printf(" resource 0x%08x %s:%s/%s: ", resID, - CHAR16_TO_CSTR(resName.package, resName.packageLen), - CHAR16_TO_CSTR(resName.type, resName.typeLen), - CHAR16_TO_CSTR(resName.name, resName.nameLen)); - } else { - printf(" INVALID RESOURCE 0x%08x: ", resID); - } - if ((thisOffset&0x3) != 0) { - printf("NON-INTEGER OFFSET: %p\n", (void*)thisOffset); - continue; - } - if ((thisOffset+sizeof(ResTable_entry)) > typeSize) { - printf("OFFSET OUT OF BOUNDS: %p+%p (size is %p)\n", - (void*)entriesStart, (void*)thisOffset, - (void*)typeSize); - continue; - } - - const ResTable_entry* ent = (const ResTable_entry*) - (((const uint8_t*)type) + entriesStart + thisOffset); - if (((entriesStart + thisOffset)&0x3) != 0) { - printf("NON-INTEGER ResTable_entry OFFSET: %p\n", - (void*)(entriesStart + thisOffset)); - continue; - } - - uint16_t esize = dtohs(ent->size); - if ((esize&0x3) != 0) { - printf("NON-INTEGER ResTable_entry SIZE: %p\n", (void*)esize); - continue; - } - if ((thisOffset+esize) > typeSize) { - printf("ResTable_entry OUT OF BOUNDS: %p+%p+%p (size is %p)\n", - (void*)entriesStart, (void*)thisOffset, - (void*)esize, (void*)typeSize); - continue; - } - - const Res_value* valuePtr = NULL; - const ResTable_map_entry* bagPtr = NULL; - Res_value value; - if ((dtohs(ent->flags)&ResTable_entry::FLAG_COMPLEX) != 0) { - printf("<bag>"); - bagPtr = (const ResTable_map_entry*)ent; - } else { - valuePtr = (const Res_value*) - (((const uint8_t*)ent) + esize); - value.copyFrom_dtoh(*valuePtr); - printf("t=0x%02x d=0x%08x (s=0x%04x r=0x%02x)", - (int)value.dataType, (int)value.data, - (int)value.size, (int)value.res0); - } - - if ((dtohs(ent->flags)&ResTable_entry::FLAG_PUBLIC) != 0) { - printf(" (PUBLIC)"); - } - printf("\n"); - - if (inclValues) { - if (valuePtr != NULL) { - printf(" "); - print_value(pkg, value); - } else if (bagPtr != NULL) { - const int N = dtohl(bagPtr->count); - const uint8_t* baseMapPtr = (const uint8_t*)ent; - size_t mapOffset = esize; - const ResTable_map* mapPtr = (ResTable_map*)(baseMapPtr+mapOffset); - printf(" Parent=0x%08x, Count=%d\n", - dtohl(bagPtr->parent.ident), N); - for (int i=0; i<N && mapOffset < (typeSize-sizeof(ResTable_map)); i++) { - printf(" #%i (Key=0x%08x): ", - i, dtohl(mapPtr->name.ident)); - value.copyFrom_dtoh(mapPtr->value); - print_value(pkg, value); - const size_t size = dtohs(mapPtr->value.size); - mapOffset += size + sizeof(*mapPtr)-sizeof(mapPtr->value); - mapPtr = (ResTable_map*)(baseMapPtr+mapOffset); - } - } - } - } - } - } - } - } -} - -#endif // HAVE_ANDROID_OS - -} // namespace android diff --git a/libs/utils/StreamingZipInflater.cpp b/libs/utils/StreamingZipInflater.cpp deleted file mode 100644 index 8512170ae9..0000000000 --- a/libs/utils/StreamingZipInflater.cpp +++ /dev/null @@ -1,226 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -//#define LOG_NDEBUG 0 -#define LOG_TAG "szipinf" -#include <utils/Log.h> - -#include <utils/FileMap.h> -#include <utils/StreamingZipInflater.h> -#include <string.h> -#include <stddef.h> -#include <assert.h> - -static inline size_t min_of(size_t a, size_t b) { return (a < b) ? a : b; } - -using namespace android; - -/* - * Streaming access to compressed asset data in an open fd - */ -StreamingZipInflater::StreamingZipInflater(int fd, off64_t compDataStart, - size_t uncompSize, size_t compSize) { - mFd = fd; - mDataMap = NULL; - mInFileStart = compDataStart; - mOutTotalSize = uncompSize; - mInTotalSize = compSize; - - mInBufSize = StreamingZipInflater::INPUT_CHUNK_SIZE; - mInBuf = new uint8_t[mInBufSize]; - - mOutBufSize = StreamingZipInflater::OUTPUT_CHUNK_SIZE; - mOutBuf = new uint8_t[mOutBufSize]; - - initInflateState(); -} - -/* - * Streaming access to compressed data held in an mmapped region of memory - */ -StreamingZipInflater::StreamingZipInflater(FileMap* dataMap, size_t uncompSize) { - mFd = -1; - mDataMap = dataMap; - mOutTotalSize = uncompSize; - mInTotalSize = dataMap->getDataLength(); - - mInBuf = (uint8_t*) dataMap->getDataPtr(); - mInBufSize = mInTotalSize; - - mOutBufSize = StreamingZipInflater::OUTPUT_CHUNK_SIZE; - mOutBuf = new uint8_t[mOutBufSize]; - - initInflateState(); -} - -StreamingZipInflater::~StreamingZipInflater() { - // tear down the in-flight zip state just in case - ::inflateEnd(&mInflateState); - - if (mDataMap == NULL) { - delete [] mInBuf; - } - delete [] mOutBuf; -} - -void StreamingZipInflater::initInflateState() { - ALOGV("Initializing inflate state"); - - memset(&mInflateState, 0, sizeof(mInflateState)); - mInflateState.zalloc = Z_NULL; - mInflateState.zfree = Z_NULL; - mInflateState.opaque = Z_NULL; - mInflateState.next_in = (Bytef*)mInBuf; - mInflateState.next_out = (Bytef*) mOutBuf; - mInflateState.avail_out = mOutBufSize; - mInflateState.data_type = Z_UNKNOWN; - - mOutLastDecoded = mOutDeliverable = mOutCurPosition = 0; - mInNextChunkOffset = 0; - mStreamNeedsInit = true; - - if (mDataMap == NULL) { - ::lseek(mFd, mInFileStart, SEEK_SET); - mInflateState.avail_in = 0; // set when a chunk is read in - } else { - mInflateState.avail_in = mInBufSize; - } -} - -/* - * Basic approach: - * - * 1. If we have undelivered uncompressed data, send it. At this point - * either we've satisfied the request, or we've exhausted the available - * output data in mOutBuf. - * - * 2. While we haven't sent enough data to satisfy the request: - * 0. if the request is for more data than exists, bail. - * a. if there is no input data to decode, read some into the input buffer - * and readjust the z_stream input pointers - * b. point the output to the start of the output buffer and decode what we can - * c. deliver whatever output data we can - */ -ssize_t StreamingZipInflater::read(void* outBuf, size_t count) { - uint8_t* dest = (uint8_t*) outBuf; - size_t bytesRead = 0; - size_t toRead = min_of(count, size_t(mOutTotalSize - mOutCurPosition)); - while (toRead > 0) { - // First, write from whatever we already have decoded and ready to go - size_t deliverable = min_of(toRead, mOutLastDecoded - mOutDeliverable); - if (deliverable > 0) { - if (outBuf != NULL) memcpy(dest, mOutBuf + mOutDeliverable, deliverable); - mOutDeliverable += deliverable; - mOutCurPosition += deliverable; - dest += deliverable; - bytesRead += deliverable; - toRead -= deliverable; - } - - // need more data? time to decode some. - if (toRead > 0) { - // if we don't have any data to decode, read some in. If we're working - // from mmapped data this won't happen, because the clipping to total size - // will prevent reading off the end of the mapped input chunk. - if (mInflateState.avail_in == 0) { - int err = readNextChunk(); - if (err < 0) { - ALOGE("Unable to access asset data: %d", err); - if (!mStreamNeedsInit) { - ::inflateEnd(&mInflateState); - initInflateState(); - } - return -1; - } - } - // we know we've drained whatever is in the out buffer now, so just - // start from scratch there, reading all the input we have at present. - mInflateState.next_out = (Bytef*) mOutBuf; - mInflateState.avail_out = mOutBufSize; - - /* - ALOGV("Inflating to outbuf: avail_in=%u avail_out=%u next_in=%p next_out=%p", - mInflateState.avail_in, mInflateState.avail_out, - mInflateState.next_in, mInflateState.next_out); - */ - int result = Z_OK; - if (mStreamNeedsInit) { - ALOGV("Initializing zlib to inflate"); - result = inflateInit2(&mInflateState, -MAX_WBITS); - mStreamNeedsInit = false; - } - if (result == Z_OK) result = ::inflate(&mInflateState, Z_SYNC_FLUSH); - if (result < 0) { - // Whoops, inflation failed - ALOGE("Error inflating asset: %d", result); - ::inflateEnd(&mInflateState); - initInflateState(); - return -1; - } else { - if (result == Z_STREAM_END) { - // we know we have to have reached the target size here and will - // not try to read any further, so just wind things up. - ::inflateEnd(&mInflateState); - } - - // Note how much data we got, and off we go - mOutDeliverable = 0; - mOutLastDecoded = mOutBufSize - mInflateState.avail_out; - } - } - } - return bytesRead; -} - -int StreamingZipInflater::readNextChunk() { - assert(mDataMap == NULL); - - if (mInNextChunkOffset < mInTotalSize) { - size_t toRead = min_of(mInBufSize, mInTotalSize - mInNextChunkOffset); - if (toRead > 0) { - ssize_t didRead = ::read(mFd, mInBuf, toRead); - //ALOGV("Reading input chunk, size %08x didread %08x", toRead, didRead); - if (didRead < 0) { - // TODO: error - ALOGE("Error reading asset data"); - return didRead; - } else { - mInNextChunkOffset += didRead; - mInflateState.next_in = (Bytef*) mInBuf; - mInflateState.avail_in = didRead; - } - } - } - return 0; -} - -// seeking backwards requires uncompressing fom the beginning, so is very -// expensive. seeking forwards only requires uncompressing from the current -// position to the destination. -off64_t StreamingZipInflater::seekAbsolute(off64_t absoluteInputPosition) { - if (absoluteInputPosition < mOutCurPosition) { - // rewind and reprocess the data from the beginning - if (!mStreamNeedsInit) { - ::inflateEnd(&mInflateState); - } - initInflateState(); - read(NULL, absoluteInputPosition); - } else if (absoluteInputPosition > mOutCurPosition) { - read(NULL, absoluteInputPosition - mOutCurPosition); - } - // else if the target position *is* our current position, do nothing - return absoluteInputPosition; -} diff --git a/libs/utils/ZipFileCRO.cpp b/libs/utils/ZipFileCRO.cpp deleted file mode 100644 index 55dfd9f873..0000000000 --- a/libs/utils/ZipFileCRO.cpp +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include <utils/ZipFileCRO.h> -#include <utils/ZipFileRO.h> - -using namespace android; - -ZipFileCRO ZipFileXRO_open(const char* path) { - ZipFileRO* zip = new ZipFileRO(); - if (zip->open(path) == NO_ERROR) { - return (ZipFileCRO)zip; - } - return NULL; -} - -void ZipFileCRO_destroy(ZipFileCRO zipToken) { - ZipFileRO* zip = (ZipFileRO*)zipToken; - delete zip; -} - -ZipEntryCRO ZipFileCRO_findEntryByName(ZipFileCRO zipToken, - const char* fileName) { - ZipFileRO* zip = (ZipFileRO*)zipToken; - return (ZipEntryCRO)zip->findEntryByName(fileName); -} - -bool ZipFileCRO_getEntryInfo(ZipFileCRO zipToken, ZipEntryRO entryToken, - int* pMethod, size_t* pUncompLen, - size_t* pCompLen, off64_t* pOffset, long* pModWhen, long* pCrc32) { - ZipFileRO* zip = (ZipFileRO*)zipToken; - ZipEntryRO entry = (ZipEntryRO)entryToken; - return zip->getEntryInfo(entry, pMethod, pUncompLen, pCompLen, pOffset, - pModWhen, pCrc32); -} - -bool ZipFileCRO_uncompressEntry(ZipFileCRO zipToken, ZipEntryRO entryToken, int fd) { - ZipFileRO* zip = (ZipFileRO*)zipToken; - ZipEntryRO entry = (ZipEntryRO)entryToken; - return zip->uncompressEntry(entry, fd); -} diff --git a/libs/utils/ZipFileRO.cpp b/libs/utils/ZipFileRO.cpp deleted file mode 100644 index 1498aac07e..0000000000 --- a/libs/utils/ZipFileRO.cpp +++ /dev/null @@ -1,931 +0,0 @@ -/* - * Copyright (C) 2007 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// -// Read-only access to Zip archives, with minimal heap allocation. -// -#define LOG_TAG "zipro" -//#define LOG_NDEBUG 0 -#include <utils/ZipFileRO.h> -#include <utils/Log.h> -#include <utils/misc.h> -#include <utils/threads.h> - -#include <zlib.h> - -#include <string.h> -#include <fcntl.h> -#include <errno.h> -#include <assert.h> -#include <unistd.h> - -#if HAVE_PRINTF_ZD -# define ZD "%zd" -# define ZD_TYPE ssize_t -#else -# define ZD "%ld" -# define ZD_TYPE long -#endif - -/* - * We must open binary files using open(path, ... | O_BINARY) under Windows. - * Otherwise strange read errors will happen. - */ -#ifndef O_BINARY -# define O_BINARY 0 -#endif - -/* - * TEMP_FAILURE_RETRY is defined by some, but not all, versions of - * <unistd.h>. (Alas, it is not as standard as we'd hoped!) So, if it's - * not already defined, then define it here. - */ -#ifndef TEMP_FAILURE_RETRY -/* Used to retry syscalls that can return EINTR. */ -#define TEMP_FAILURE_RETRY(exp) ({ \ - typeof (exp) _rc; \ - do { \ - _rc = (exp); \ - } while (_rc == -1 && errno == EINTR); \ - _rc; }) -#endif - -using namespace android; - -/* - * Zip file constants. - */ -#define kEOCDSignature 0x06054b50 -#define kEOCDLen 22 -#define kEOCDNumEntries 8 // offset to #of entries in file -#define kEOCDSize 12 // size of the central directory -#define kEOCDFileOffset 16 // offset to central directory - -#define kMaxCommentLen 65535 // longest possible in ushort -#define kMaxEOCDSearch (kMaxCommentLen + kEOCDLen) - -#define kLFHSignature 0x04034b50 -#define kLFHLen 30 // excluding variable-len fields -#define kLFHNameLen 26 // offset to filename length -#define kLFHExtraLen 28 // offset to extra length - -#define kCDESignature 0x02014b50 -#define kCDELen 46 // excluding variable-len fields -#define kCDEMethod 10 // offset to compression method -#define kCDEModWhen 12 // offset to modification timestamp -#define kCDECRC 16 // offset to entry CRC -#define kCDECompLen 20 // offset to compressed length -#define kCDEUncompLen 24 // offset to uncompressed length -#define kCDENameLen 28 // offset to filename length -#define kCDEExtraLen 30 // offset to extra length -#define kCDECommentLen 32 // offset to comment length -#define kCDELocalOffset 42 // offset to local hdr - -/* - * The values we return for ZipEntryRO use 0 as an invalid value, so we - * want to adjust the hash table index by a fixed amount. Using a large - * value helps insure that people don't mix & match arguments, e.g. to - * findEntryByIndex(). - */ -#define kZipEntryAdj 10000 - -ZipFileRO::~ZipFileRO() { - free(mHashTable); - if (mDirectoryMap) - mDirectoryMap->release(); - if (mFd >= 0) - TEMP_FAILURE_RETRY(close(mFd)); - if (mFileName) - free(mFileName); -} - -/* - * Convert a ZipEntryRO to a hash table index, verifying that it's in a - * valid range. - */ -int ZipFileRO::entryToIndex(const ZipEntryRO entry) const -{ - long ent = ((long) entry) - kZipEntryAdj; - if (ent < 0 || ent >= mHashTableSize || mHashTable[ent].name == NULL) { - ALOGW("Invalid ZipEntryRO %p (%ld)\n", entry, ent); - return -1; - } - return ent; -} - - -/* - * Open the specified file read-only. We memory-map the entire thing and - * close the file before returning. - */ -status_t ZipFileRO::open(const char* zipFileName) -{ - int fd = -1; - - assert(mDirectoryMap == NULL); - - /* - * Open and map the specified file. - */ - fd = ::open(zipFileName, O_RDONLY | O_BINARY); - if (fd < 0) { - ALOGW("Unable to open zip '%s': %s\n", zipFileName, strerror(errno)); - return NAME_NOT_FOUND; - } - - mFileLength = lseek64(fd, 0, SEEK_END); - if (mFileLength < kEOCDLen) { - TEMP_FAILURE_RETRY(close(fd)); - return UNKNOWN_ERROR; - } - - if (mFileName != NULL) { - free(mFileName); - } - mFileName = strdup(zipFileName); - - mFd = fd; - - /* - * Find the Central Directory and store its size and number of entries. - */ - if (!mapCentralDirectory()) { - goto bail; - } - - /* - * Verify Central Directory and create data structures for fast access. - */ - if (!parseZipArchive()) { - goto bail; - } - - return OK; - -bail: - free(mFileName); - mFileName = NULL; - TEMP_FAILURE_RETRY(close(fd)); - return UNKNOWN_ERROR; -} - -/* - * Parse the Zip archive, verifying its contents and initializing internal - * data structures. - */ -bool ZipFileRO::mapCentralDirectory(void) -{ - ssize_t readAmount = kMaxEOCDSearch; - if (readAmount > (ssize_t) mFileLength) - readAmount = mFileLength; - - unsigned char* scanBuf = (unsigned char*) malloc(readAmount); - if (scanBuf == NULL) { - ALOGW("couldn't allocate scanBuf: %s", strerror(errno)); - free(scanBuf); - return false; - } - - /* - * Make sure this is a Zip archive. - */ - if (lseek64(mFd, 0, SEEK_SET) != 0) { - ALOGW("seek to start failed: %s", strerror(errno)); - free(scanBuf); - return false; - } - - ssize_t actual = TEMP_FAILURE_RETRY(read(mFd, scanBuf, sizeof(int32_t))); - if (actual != (ssize_t) sizeof(int32_t)) { - ALOGI("couldn't read first signature from zip archive: %s", strerror(errno)); - free(scanBuf); - return false; - } - - { - unsigned int header = get4LE(scanBuf); - if (header == kEOCDSignature) { - ALOGI("Found Zip archive, but it looks empty\n"); - free(scanBuf); - return false; - } else if (header != kLFHSignature) { - ALOGV("Not a Zip archive (found 0x%08x)\n", header); - free(scanBuf); - return false; - } - } - - /* - * Perform the traditional EOCD snipe hunt. - * - * We're searching for the End of Central Directory magic number, - * which appears at the start of the EOCD block. It's followed by - * 18 bytes of EOCD stuff and up to 64KB of archive comment. We - * need to read the last part of the file into a buffer, dig through - * it to find the magic number, parse some values out, and use those - * to determine the extent of the CD. - * - * We start by pulling in the last part of the file. - */ - off64_t searchStart = mFileLength - readAmount; - - if (lseek64(mFd, searchStart, SEEK_SET) != searchStart) { - ALOGW("seek %ld failed: %s\n", (long) searchStart, strerror(errno)); - free(scanBuf); - return false; - } - actual = TEMP_FAILURE_RETRY(read(mFd, scanBuf, readAmount)); - if (actual != (ssize_t) readAmount) { - ALOGW("Zip: read " ZD ", expected " ZD ". Failed: %s\n", - (ZD_TYPE) actual, (ZD_TYPE) readAmount, strerror(errno)); - free(scanBuf); - return false; - } - - /* - * Scan backward for the EOCD magic. In an archive without a trailing - * comment, we'll find it on the first try. (We may want to consider - * doing an initial minimal read; if we don't find it, retry with a - * second read as above.) - */ - int i; - for (i = readAmount - kEOCDLen; i >= 0; i--) { - if (scanBuf[i] == 0x50 && get4LE(&scanBuf[i]) == kEOCDSignature) { - ALOGV("+++ Found EOCD at buf+%d\n", i); - break; - } - } - if (i < 0) { - ALOGD("Zip: EOCD not found, %s is not zip\n", mFileName); - free(scanBuf); - return false; - } - - off64_t eocdOffset = searchStart + i; - const unsigned char* eocdPtr = scanBuf + i; - - assert(eocdOffset < mFileLength); - - /* - * Grab the CD offset and size, and the number of entries in the - * archive. After that, we can release our EOCD hunt buffer. - */ - unsigned int numEntries = get2LE(eocdPtr + kEOCDNumEntries); - unsigned int dirSize = get4LE(eocdPtr + kEOCDSize); - unsigned int dirOffset = get4LE(eocdPtr + kEOCDFileOffset); - free(scanBuf); - - // Verify that they look reasonable. - if ((long long) dirOffset + (long long) dirSize > (long long) eocdOffset) { - ALOGW("bad offsets (dir %ld, size %u, eocd %ld)\n", - (long) dirOffset, dirSize, (long) eocdOffset); - return false; - } - if (numEntries == 0) { - ALOGW("empty archive?\n"); - return false; - } - - ALOGV("+++ numEntries=%d dirSize=%d dirOffset=%d\n", - numEntries, dirSize, dirOffset); - - mDirectoryMap = new FileMap(); - if (mDirectoryMap == NULL) { - ALOGW("Unable to create directory map: %s", strerror(errno)); - return false; - } - - if (!mDirectoryMap->create(mFileName, mFd, dirOffset, dirSize, true)) { - ALOGW("Unable to map '%s' (" ZD " to " ZD "): %s\n", mFileName, - (ZD_TYPE) dirOffset, (ZD_TYPE) (dirOffset + dirSize), strerror(errno)); - return false; - } - - mNumEntries = numEntries; - mDirectoryOffset = dirOffset; - - return true; -} - -bool ZipFileRO::parseZipArchive(void) -{ - bool result = false; - const unsigned char* cdPtr = (const unsigned char*) mDirectoryMap->getDataPtr(); - size_t cdLength = mDirectoryMap->getDataLength(); - int numEntries = mNumEntries; - - /* - * Create hash table. We have a minimum 75% load factor, possibly as - * low as 50% after we round off to a power of 2. - */ - mHashTableSize = roundUpPower2(1 + (numEntries * 4) / 3); - mHashTable = (HashEntry*) calloc(mHashTableSize, sizeof(HashEntry)); - - /* - * Walk through the central directory, adding entries to the hash - * table. - */ - const unsigned char* ptr = cdPtr; - for (int i = 0; i < numEntries; i++) { - if (get4LE(ptr) != kCDESignature) { - ALOGW("Missed a central dir sig (at %d)\n", i); - goto bail; - } - if (ptr + kCDELen > cdPtr + cdLength) { - ALOGW("Ran off the end (at %d)\n", i); - goto bail; - } - - long localHdrOffset = (long) get4LE(ptr + kCDELocalOffset); - if (localHdrOffset >= mDirectoryOffset) { - ALOGW("bad LFH offset %ld at entry %d\n", localHdrOffset, i); - goto bail; - } - - unsigned int fileNameLen, extraLen, commentLen, hash; - - fileNameLen = get2LE(ptr + kCDENameLen); - extraLen = get2LE(ptr + kCDEExtraLen); - commentLen = get2LE(ptr + kCDECommentLen); - - /* add the CDE filename to the hash table */ - hash = computeHash((const char*)ptr + kCDELen, fileNameLen); - addToHash((const char*)ptr + kCDELen, fileNameLen, hash); - - ptr += kCDELen + fileNameLen + extraLen + commentLen; - if ((size_t)(ptr - cdPtr) > cdLength) { - ALOGW("bad CD advance (%d vs " ZD ") at entry %d\n", - (int) (ptr - cdPtr), (ZD_TYPE) cdLength, i); - goto bail; - } - } - ALOGV("+++ zip good scan %d entries\n", numEntries); - result = true; - -bail: - return result; -} - -/* - * Simple string hash function for non-null-terminated strings. - */ -/*static*/ unsigned int ZipFileRO::computeHash(const char* str, int len) -{ - unsigned int hash = 0; - - while (len--) - hash = hash * 31 + *str++; - - return hash; -} - -/* - * Add a new entry to the hash table. - */ -void ZipFileRO::addToHash(const char* str, int strLen, unsigned int hash) -{ - int ent = hash & (mHashTableSize-1); - - /* - * We over-allocate the table, so we're guaranteed to find an empty slot. - */ - while (mHashTable[ent].name != NULL) - ent = (ent + 1) & (mHashTableSize-1); - - mHashTable[ent].name = str; - mHashTable[ent].nameLen = strLen; -} - -/* - * Find a matching entry. - * - * Returns NULL if not found. - */ -ZipEntryRO ZipFileRO::findEntryByName(const char* fileName) const -{ - /* - * If the ZipFileRO instance is not initialized, the entry number will - * end up being garbage since mHashTableSize is -1. - */ - if (mHashTableSize <= 0) { - return NULL; - } - - int nameLen = strlen(fileName); - unsigned int hash = computeHash(fileName, nameLen); - int ent = hash & (mHashTableSize-1); - - while (mHashTable[ent].name != NULL) { - if (mHashTable[ent].nameLen == nameLen && - memcmp(mHashTable[ent].name, fileName, nameLen) == 0) - { - /* match */ - return (ZipEntryRO)(long)(ent + kZipEntryAdj); - } - - ent = (ent + 1) & (mHashTableSize-1); - } - - return NULL; -} - -/* - * Find the Nth entry. - * - * This currently involves walking through the sparse hash table, counting - * non-empty entries. If we need to speed this up we can either allocate - * a parallel lookup table or (perhaps better) provide an iterator interface. - */ -ZipEntryRO ZipFileRO::findEntryByIndex(int idx) const -{ - if (idx < 0 || idx >= mNumEntries) { - ALOGW("Invalid index %d\n", idx); - return NULL; - } - - for (int ent = 0; ent < mHashTableSize; ent++) { - if (mHashTable[ent].name != NULL) { - if (idx-- == 0) - return (ZipEntryRO) (ent + kZipEntryAdj); - } - } - - return NULL; -} - -/* - * Get the useful fields from the zip entry. - * - * Returns "false" if the offsets to the fields or the contents of the fields - * appear to be bogus. - */ -bool ZipFileRO::getEntryInfo(ZipEntryRO entry, int* pMethod, size_t* pUncompLen, - size_t* pCompLen, off64_t* pOffset, long* pModWhen, long* pCrc32) const -{ - bool ret = false; - - const int ent = entryToIndex(entry); - if (ent < 0) - return false; - - HashEntry hashEntry = mHashTable[ent]; - - /* - * Recover the start of the central directory entry from the filename - * pointer. The filename is the first entry past the fixed-size data, - * so we can just subtract back from that. - */ - const unsigned char* ptr = (const unsigned char*) hashEntry.name; - off64_t cdOffset = mDirectoryOffset; - - ptr -= kCDELen; - - int method = get2LE(ptr + kCDEMethod); - if (pMethod != NULL) - *pMethod = method; - - if (pModWhen != NULL) - *pModWhen = get4LE(ptr + kCDEModWhen); - if (pCrc32 != NULL) - *pCrc32 = get4LE(ptr + kCDECRC); - - size_t compLen = get4LE(ptr + kCDECompLen); - if (pCompLen != NULL) - *pCompLen = compLen; - size_t uncompLen = get4LE(ptr + kCDEUncompLen); - if (pUncompLen != NULL) - *pUncompLen = uncompLen; - - /* - * If requested, determine the offset of the start of the data. All we - * have is the offset to the Local File Header, which is variable size, - * so we have to read the contents of the struct to figure out where - * the actual data starts. - * - * We also need to make sure that the lengths are not so large that - * somebody trying to map the compressed or uncompressed data runs - * off the end of the mapped region. - * - * Note we don't verify compLen/uncompLen if they don't request the - * dataOffset, because dataOffset is expensive to determine. However, - * if they don't have the file offset, they're not likely to be doing - * anything with the contents. - */ - if (pOffset != NULL) { - long localHdrOffset = get4LE(ptr + kCDELocalOffset); - if (localHdrOffset + kLFHLen >= cdOffset) { - ALOGE("ERROR: bad local hdr offset in zip\n"); - return false; - } - - unsigned char lfhBuf[kLFHLen]; - -#ifdef HAVE_PREAD - /* - * This file descriptor might be from zygote's preloaded assets, - * so we need to do an pread64() instead of a lseek64() + read() to - * guarantee atomicity across the processes with the shared file - * descriptors. - */ - ssize_t actual = - TEMP_FAILURE_RETRY(pread64(mFd, lfhBuf, sizeof(lfhBuf), localHdrOffset)); - - if (actual != sizeof(lfhBuf)) { - ALOGW("failed reading lfh from offset %ld\n", localHdrOffset); - return false; - } - - if (get4LE(lfhBuf) != kLFHSignature) { - ALOGW("didn't find signature at start of lfh; wanted: offset=%ld data=0x%08x; " - "got: data=0x%08lx\n", - localHdrOffset, kLFHSignature, get4LE(lfhBuf)); - return false; - } -#else /* HAVE_PREAD */ - /* - * For hosts don't have pread64() we cannot guarantee atomic reads from - * an offset in a file. Android should never run on those platforms. - * File descriptors inherited from a fork() share file offsets and - * there would be nothing to protect from two different processes - * calling lseek64() concurrently. - */ - - { - AutoMutex _l(mFdLock); - - if (lseek64(mFd, localHdrOffset, SEEK_SET) != localHdrOffset) { - ALOGW("failed seeking to lfh at offset %ld\n", localHdrOffset); - return false; - } - - ssize_t actual = - TEMP_FAILURE_RETRY(read(mFd, lfhBuf, sizeof(lfhBuf))); - if (actual != sizeof(lfhBuf)) { - ALOGW("failed reading lfh from offset %ld\n", localHdrOffset); - return false; - } - - if (get4LE(lfhBuf) != kLFHSignature) { - off64_t actualOffset = lseek64(mFd, 0, SEEK_CUR); - ALOGW("didn't find signature at start of lfh; wanted: offset=%ld data=0x%08x; " - "got: offset=" ZD " data=0x%08lx\n", - localHdrOffset, kLFHSignature, (ZD_TYPE) actualOffset, get4LE(lfhBuf)); - return false; - } - } -#endif /* HAVE_PREAD */ - - off64_t dataOffset = localHdrOffset + kLFHLen - + get2LE(lfhBuf + kLFHNameLen) + get2LE(lfhBuf + kLFHExtraLen); - if (dataOffset >= cdOffset) { - ALOGW("bad data offset %ld in zip\n", (long) dataOffset); - return false; - } - - /* check lengths */ - if ((off64_t)(dataOffset + compLen) > cdOffset) { - ALOGW("bad compressed length in zip (%ld + " ZD " > %ld)\n", - (long) dataOffset, (ZD_TYPE) compLen, (long) cdOffset); - return false; - } - - if (method == kCompressStored && - (off64_t)(dataOffset + uncompLen) > cdOffset) - { - ALOGE("ERROR: bad uncompressed length in zip (%ld + " ZD " > %ld)\n", - (long) dataOffset, (ZD_TYPE) uncompLen, (long) cdOffset); - return false; - } - - *pOffset = dataOffset; - } - - return true; -} - -/* - * Copy the entry's filename to the buffer. - */ -int ZipFileRO::getEntryFileName(ZipEntryRO entry, char* buffer, int bufLen) - const -{ - int ent = entryToIndex(entry); - if (ent < 0) - return -1; - - int nameLen = mHashTable[ent].nameLen; - if (bufLen < nameLen+1) - return nameLen+1; - - memcpy(buffer, mHashTable[ent].name, nameLen); - buffer[nameLen] = '\0'; - return 0; -} - -/* - * Create a new FileMap object that spans the data in "entry". - */ -FileMap* ZipFileRO::createEntryFileMap(ZipEntryRO entry) const -{ - /* - * TODO: the efficient way to do this is to modify FileMap to allow - * sub-regions of a file to be mapped. A reference-counting scheme - * can manage the base memory mapping. For now, we just create a brand - * new mapping off of the Zip archive file descriptor. - */ - - FileMap* newMap; - size_t compLen; - off64_t offset; - - if (!getEntryInfo(entry, NULL, NULL, &compLen, &offset, NULL, NULL)) - return NULL; - - newMap = new FileMap(); - if (!newMap->create(mFileName, mFd, offset, compLen, true)) { - newMap->release(); - return NULL; - } - - return newMap; -} - -/* - * Uncompress an entry, in its entirety, into the provided output buffer. - * - * This doesn't verify the data's CRC, which might be useful for - * uncompressed data. The caller should be able to manage it. - */ -bool ZipFileRO::uncompressEntry(ZipEntryRO entry, void* buffer) const -{ - const size_t kSequentialMin = 32768; - bool result = false; - int ent = entryToIndex(entry); - if (ent < 0) - return -1; - - int method; - size_t uncompLen, compLen; - off64_t offset; - const unsigned char* ptr; - - getEntryInfo(entry, &method, &uncompLen, &compLen, &offset, NULL, NULL); - - FileMap* file = createEntryFileMap(entry); - if (file == NULL) { - goto bail; - } - - ptr = (const unsigned char*) file->getDataPtr(); - - /* - * Experiment with madvise hint. When we want to uncompress a file, - * we pull some stuff out of the central dir entry and then hit a - * bunch of compressed or uncompressed data sequentially. The CDE - * visit will cause a limited amount of read-ahead because it's at - * the end of the file. We could end up doing lots of extra disk - * access if the file we're prying open is small. Bottom line is we - * probably don't want to turn MADV_SEQUENTIAL on and leave it on. - * - * So, if the compressed size of the file is above a certain minimum - * size, temporarily boost the read-ahead in the hope that the extra - * pair of system calls are negated by a reduction in page faults. - */ - if (compLen > kSequentialMin) - file->advise(FileMap::SEQUENTIAL); - - if (method == kCompressStored) { - memcpy(buffer, ptr, uncompLen); - } else { - if (!inflateBuffer(buffer, ptr, uncompLen, compLen)) - goto unmap; - } - - if (compLen > kSequentialMin) - file->advise(FileMap::NORMAL); - - result = true; - -unmap: - file->release(); -bail: - return result; -} - -/* - * Uncompress an entry, in its entirety, to an open file descriptor. - * - * This doesn't verify the data's CRC, but probably should. - */ -bool ZipFileRO::uncompressEntry(ZipEntryRO entry, int fd) const -{ - bool result = false; - int ent = entryToIndex(entry); - if (ent < 0) - return -1; - - int method; - size_t uncompLen, compLen; - off64_t offset; - const unsigned char* ptr; - - getEntryInfo(entry, &method, &uncompLen, &compLen, &offset, NULL, NULL); - - FileMap* file = createEntryFileMap(entry); - if (file == NULL) { - goto bail; - } - - ptr = (const unsigned char*) file->getDataPtr(); - - if (method == kCompressStored) { - ssize_t actual = write(fd, ptr, uncompLen); - if (actual < 0) { - ALOGE("Write failed: %s\n", strerror(errno)); - goto unmap; - } else if ((size_t) actual != uncompLen) { - ALOGE("Partial write during uncompress (" ZD " of " ZD ")\n", - (ZD_TYPE) actual, (ZD_TYPE) uncompLen); - goto unmap; - } else { - ALOGI("+++ successful write\n"); - } - } else { - if (!inflateBuffer(fd, ptr, uncompLen, compLen)) - goto unmap; - } - - result = true; - -unmap: - file->release(); -bail: - return result; -} - -/* - * Uncompress "deflate" data from one buffer to another. - */ -/*static*/ bool ZipFileRO::inflateBuffer(void* outBuf, const void* inBuf, - size_t uncompLen, size_t compLen) -{ - bool result = false; - z_stream zstream; - int zerr; - - /* - * Initialize the zlib stream struct. - */ - memset(&zstream, 0, sizeof(zstream)); - zstream.zalloc = Z_NULL; - zstream.zfree = Z_NULL; - zstream.opaque = Z_NULL; - zstream.next_in = (Bytef*)inBuf; - zstream.avail_in = compLen; - zstream.next_out = (Bytef*) outBuf; - zstream.avail_out = uncompLen; - zstream.data_type = Z_UNKNOWN; - - /* - * Use the undocumented "negative window bits" feature to tell zlib - * that there's no zlib header waiting for it. - */ - zerr = inflateInit2(&zstream, -MAX_WBITS); - if (zerr != Z_OK) { - if (zerr == Z_VERSION_ERROR) { - ALOGE("Installed zlib is not compatible with linked version (%s)\n", - ZLIB_VERSION); - } else { - ALOGE("Call to inflateInit2 failed (zerr=%d)\n", zerr); - } - goto bail; - } - - /* - * Expand data. - */ - zerr = inflate(&zstream, Z_FINISH); - if (zerr != Z_STREAM_END) { - ALOGW("Zip inflate failed, zerr=%d (nIn=%p aIn=%u nOut=%p aOut=%u)\n", - zerr, zstream.next_in, zstream.avail_in, - zstream.next_out, zstream.avail_out); - goto z_bail; - } - - /* paranoia */ - if (zstream.total_out != uncompLen) { - ALOGW("Size mismatch on inflated file (%ld vs " ZD ")\n", - zstream.total_out, (ZD_TYPE) uncompLen); - goto z_bail; - } - - result = true; - -z_bail: - inflateEnd(&zstream); /* free up any allocated structures */ - -bail: - return result; -} - -/* - * Uncompress "deflate" data from one buffer to an open file descriptor. - */ -/*static*/ bool ZipFileRO::inflateBuffer(int fd, const void* inBuf, - size_t uncompLen, size_t compLen) -{ - bool result = false; - const size_t kWriteBufSize = 32768; - unsigned char writeBuf[kWriteBufSize]; - z_stream zstream; - int zerr; - - /* - * Initialize the zlib stream struct. - */ - memset(&zstream, 0, sizeof(zstream)); - zstream.zalloc = Z_NULL; - zstream.zfree = Z_NULL; - zstream.opaque = Z_NULL; - zstream.next_in = (Bytef*)inBuf; - zstream.avail_in = compLen; - zstream.next_out = (Bytef*) writeBuf; - zstream.avail_out = sizeof(writeBuf); - zstream.data_type = Z_UNKNOWN; - - /* - * Use the undocumented "negative window bits" feature to tell zlib - * that there's no zlib header waiting for it. - */ - zerr = inflateInit2(&zstream, -MAX_WBITS); - if (zerr != Z_OK) { - if (zerr == Z_VERSION_ERROR) { - ALOGE("Installed zlib is not compatible with linked version (%s)\n", - ZLIB_VERSION); - } else { - ALOGE("Call to inflateInit2 failed (zerr=%d)\n", zerr); - } - goto bail; - } - - /* - * Loop while we have more to do. - */ - do { - /* - * Expand data. - */ - zerr = inflate(&zstream, Z_NO_FLUSH); - if (zerr != Z_OK && zerr != Z_STREAM_END) { - ALOGW("zlib inflate: zerr=%d (nIn=%p aIn=%u nOut=%p aOut=%u)\n", - zerr, zstream.next_in, zstream.avail_in, - zstream.next_out, zstream.avail_out); - goto z_bail; - } - - /* write when we're full or when we're done */ - if (zstream.avail_out == 0 || - (zerr == Z_STREAM_END && zstream.avail_out != sizeof(writeBuf))) - { - long writeSize = zstream.next_out - writeBuf; - int cc = write(fd, writeBuf, writeSize); - if (cc != (int) writeSize) { - ALOGW("write failed in inflate (%d vs %ld)\n", cc, writeSize); - goto z_bail; - } - - zstream.next_out = writeBuf; - zstream.avail_out = sizeof(writeBuf); - } - } while (zerr == Z_OK); - - assert(zerr == Z_STREAM_END); /* other errors should've been caught */ - - /* paranoia */ - if (zstream.total_out != uncompLen) { - ALOGW("Size mismatch on inflated file (%ld vs " ZD ")\n", - zstream.total_out, (ZD_TYPE) uncompLen); - goto z_bail; - } - - result = true; - -z_bail: - inflateEnd(&zstream); /* free up any allocated structures */ - -bail: - return result; -} diff --git a/libs/utils/ZipUtils.cpp b/libs/utils/ZipUtils.cpp deleted file mode 100644 index 2dbdc1d380..0000000000 --- a/libs/utils/ZipUtils.cpp +++ /dev/null @@ -1,343 +0,0 @@ -/* - * Copyright (C) 2007 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// -// Misc zip/gzip utility functions. -// - -#define LOG_TAG "ziputil" - -#include <utils/ZipUtils.h> -#include <utils/ZipFileRO.h> -#include <utils/Log.h> - -#include <stdlib.h> -#include <string.h> -#include <assert.h> - -#include <zlib.h> - -using namespace android; - -/* - * Utility function that expands zip/gzip "deflate" compressed data - * into a buffer. - * - * "fd" is an open file positioned at the start of the "deflate" data - * "buf" must hold at least "uncompressedLen" bytes. - */ -/*static*/ bool ZipUtils::inflateToBuffer(int fd, void* buf, - long uncompressedLen, long compressedLen) -{ - bool result = false; - const unsigned long kReadBufSize = 32768; - unsigned char* readBuf = NULL; - z_stream zstream; - int zerr; - unsigned long compRemaining; - - assert(uncompressedLen >= 0); - assert(compressedLen >= 0); - - readBuf = new unsigned char[kReadBufSize]; - if (readBuf == NULL) - goto bail; - compRemaining = compressedLen; - - /* - * Initialize the zlib stream. - */ - memset(&zstream, 0, sizeof(zstream)); - zstream.zalloc = Z_NULL; - zstream.zfree = Z_NULL; - zstream.opaque = Z_NULL; - zstream.next_in = NULL; - zstream.avail_in = 0; - zstream.next_out = (Bytef*) buf; - zstream.avail_out = uncompressedLen; - zstream.data_type = Z_UNKNOWN; - - /* - * Use the undocumented "negative window bits" feature to tell zlib - * that there's no zlib header waiting for it. - */ - zerr = inflateInit2(&zstream, -MAX_WBITS); - if (zerr != Z_OK) { - if (zerr == Z_VERSION_ERROR) { - ALOGE("Installed zlib is not compatible with linked version (%s)\n", - ZLIB_VERSION); - } else { - ALOGE("Call to inflateInit2 failed (zerr=%d)\n", zerr); - } - goto bail; - } - - /* - * Loop while we have data. - */ - do { - unsigned long getSize; - - /* read as much as we can */ - if (zstream.avail_in == 0) { - getSize = (compRemaining > kReadBufSize) ? - kReadBufSize : compRemaining; - ALOGV("+++ reading %ld bytes (%ld left)\n", - getSize, compRemaining); - - int cc = read(fd, readBuf, getSize); - if (cc != (int) getSize) { - ALOGD("inflate read failed (%d vs %ld)\n", - cc, getSize); - goto z_bail; - } - - compRemaining -= getSize; - - zstream.next_in = readBuf; - zstream.avail_in = getSize; - } - - /* uncompress the data */ - zerr = inflate(&zstream, Z_NO_FLUSH); - if (zerr != Z_OK && zerr != Z_STREAM_END) { - ALOGD("zlib inflate call failed (zerr=%d)\n", zerr); - goto z_bail; - } - - /* output buffer holds all, so no need to write the output */ - } while (zerr == Z_OK); - - assert(zerr == Z_STREAM_END); /* other errors should've been caught */ - - if ((long) zstream.total_out != uncompressedLen) { - ALOGW("Size mismatch on inflated file (%ld vs %ld)\n", - zstream.total_out, uncompressedLen); - goto z_bail; - } - - // success! - result = true; - -z_bail: - inflateEnd(&zstream); /* free up any allocated structures */ - -bail: - delete[] readBuf; - return result; -} - -/* - * Utility function that expands zip/gzip "deflate" compressed data - * into a buffer. - * - * (This is a clone of the previous function, but it takes a FILE* instead - * of an fd. We could pass fileno(fd) to the above, but we can run into - * trouble when "fp" has a different notion of what fd's file position is.) - * - * "fp" is an open file positioned at the start of the "deflate" data - * "buf" must hold at least "uncompressedLen" bytes. - */ -/*static*/ bool ZipUtils::inflateToBuffer(FILE* fp, void* buf, - long uncompressedLen, long compressedLen) -{ - bool result = false; - const unsigned long kReadBufSize = 32768; - unsigned char* readBuf = NULL; - z_stream zstream; - int zerr; - unsigned long compRemaining; - - assert(uncompressedLen >= 0); - assert(compressedLen >= 0); - - readBuf = new unsigned char[kReadBufSize]; - if (readBuf == NULL) - goto bail; - compRemaining = compressedLen; - - /* - * Initialize the zlib stream. - */ - memset(&zstream, 0, sizeof(zstream)); - zstream.zalloc = Z_NULL; - zstream.zfree = Z_NULL; - zstream.opaque = Z_NULL; - zstream.next_in = NULL; - zstream.avail_in = 0; - zstream.next_out = (Bytef*) buf; - zstream.avail_out = uncompressedLen; - zstream.data_type = Z_UNKNOWN; - - /* - * Use the undocumented "negative window bits" feature to tell zlib - * that there's no zlib header waiting for it. - */ - zerr = inflateInit2(&zstream, -MAX_WBITS); - if (zerr != Z_OK) { - if (zerr == Z_VERSION_ERROR) { - ALOGE("Installed zlib is not compatible with linked version (%s)\n", - ZLIB_VERSION); - } else { - ALOGE("Call to inflateInit2 failed (zerr=%d)\n", zerr); - } - goto bail; - } - - /* - * Loop while we have data. - */ - do { - unsigned long getSize; - - /* read as much as we can */ - if (zstream.avail_in == 0) { - getSize = (compRemaining > kReadBufSize) ? - kReadBufSize : compRemaining; - ALOGV("+++ reading %ld bytes (%ld left)\n", - getSize, compRemaining); - - int cc = fread(readBuf, 1, getSize, fp); - if (cc != (int) getSize) { - ALOGD("inflate read failed (%d vs %ld)\n", - cc, getSize); - goto z_bail; - } - - compRemaining -= getSize; - - zstream.next_in = readBuf; - zstream.avail_in = getSize; - } - - /* uncompress the data */ - zerr = inflate(&zstream, Z_NO_FLUSH); - if (zerr != Z_OK && zerr != Z_STREAM_END) { - ALOGD("zlib inflate call failed (zerr=%d)\n", zerr); - goto z_bail; - } - - /* output buffer holds all, so no need to write the output */ - } while (zerr == Z_OK); - - assert(zerr == Z_STREAM_END); /* other errors should've been caught */ - - if ((long) zstream.total_out != uncompressedLen) { - ALOGW("Size mismatch on inflated file (%ld vs %ld)\n", - zstream.total_out, uncompressedLen); - goto z_bail; - } - - // success! - result = true; - -z_bail: - inflateEnd(&zstream); /* free up any allocated structures */ - -bail: - delete[] readBuf; - return result; -} - -/* - * Look at the contents of a gzip archive. We want to know where the - * data starts, and how long it will be after it is uncompressed. - * - * We expect to find the CRC and length as the last 8 bytes on the file. - * This is a pretty reasonable thing to expect for locally-compressed - * files, but there's a small chance that some extra padding got thrown - * on (the man page talks about compressed data written to tape). We - * don't currently deal with that here. If "gzip -l" whines, we're going - * to fail too. - * - * On exit, "fp" is pointing at the start of the compressed data. - */ -/*static*/ bool ZipUtils::examineGzip(FILE* fp, int* pCompressionMethod, - long* pUncompressedLen, long* pCompressedLen, unsigned long* pCRC32) -{ - enum { // flags - FTEXT = 0x01, - FHCRC = 0x02, - FEXTRA = 0x04, - FNAME = 0x08, - FCOMMENT = 0x10, - }; - int ic; - int method, flags; - int i; - - ic = getc(fp); - if (ic != 0x1f || getc(fp) != 0x8b) - return false; // not gzip - method = getc(fp); - flags = getc(fp); - - /* quick sanity checks */ - if (method == EOF || flags == EOF) - return false; - if (method != ZipFileRO::kCompressDeflated) - return false; - - /* skip over 4 bytes of mod time, 1 byte XFL, 1 byte OS */ - for (i = 0; i < 6; i++) - (void) getc(fp); - /* consume "extra" field, if present */ - if ((flags & FEXTRA) != 0) { - int len; - - len = getc(fp); - len |= getc(fp) << 8; - while (len-- && getc(fp) != EOF) - ; - } - /* consume filename, if present */ - if ((flags & FNAME) != 0) { - do { - ic = getc(fp); - } while (ic != 0 && ic != EOF); - } - /* consume comment, if present */ - if ((flags & FCOMMENT) != 0) { - do { - ic = getc(fp); - } while (ic != 0 && ic != EOF); - } - /* consume 16-bit header CRC, if present */ - if ((flags & FHCRC) != 0) { - (void) getc(fp); - (void) getc(fp); - } - - if (feof(fp) || ferror(fp)) - return false; - - /* seek to the end; CRC and length are in the last 8 bytes */ - long curPosn = ftell(fp); - unsigned char buf[8]; - fseek(fp, -8, SEEK_END); - *pCompressedLen = ftell(fp) - curPosn; - - if (fread(buf, 1, 8, fp) != 8) - return false; - /* seek back to start of compressed data */ - fseek(fp, curPosn, SEEK_SET); - - *pCompressionMethod = method; - *pCRC32 = ZipFileRO::get4LE(&buf[0]); - *pUncompressedLen = ZipFileRO::get4LE(&buf[4]); - - return true; -} diff --git a/libs/utils/tests/Android.mk b/libs/utils/tests/Android.mk index 58230f429e..a6811fcf8e 100644 --- a/libs/utils/tests/Android.mk +++ b/libs/utils/tests/Android.mk @@ -7,10 +7,8 @@ test_src_files := \ BasicHashtable_test.cpp \ BlobCache_test.cpp \ Looper_test.cpp \ - ObbFile_test.cpp \ String8_test.cpp \ Unicode_test.cpp \ - ZipFileRO_test.cpp \ shared_libraries := \ libz \ diff --git a/libs/utils/tests/ObbFile_test.cpp b/libs/utils/tests/ObbFile_test.cpp deleted file mode 100644 index 46b30c2a6d..0000000000 --- a/libs/utils/tests/ObbFile_test.cpp +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#define LOG_TAG "ObbFile_test" -#include <utils/Log.h> -#include <utils/ObbFile.h> -#include <utils/RefBase.h> -#include <utils/String8.h> - -#include <gtest/gtest.h> - -#include <fcntl.h> -#include <string.h> - -namespace android { - -#define TEST_FILENAME "/test.obb" - -class ObbFileTest : public testing::Test { -protected: - sp<ObbFile> mObbFile; - char* mExternalStorage; - char* mFileName; - - virtual void SetUp() { - mObbFile = new ObbFile(); - mExternalStorage = getenv("EXTERNAL_STORAGE"); - - const int totalLen = strlen(mExternalStorage) + strlen(TEST_FILENAME) + 1; - mFileName = new char[totalLen]; - snprintf(mFileName, totalLen, "%s%s", mExternalStorage, TEST_FILENAME); - - int fd = ::open(mFileName, O_CREAT | O_TRUNC); - if (fd < 0) { - FAIL() << "Couldn't create " << mFileName << " for tests"; - } - } - - virtual void TearDown() { - } -}; - -TEST_F(ObbFileTest, ReadFailure) { - EXPECT_FALSE(mObbFile->readFrom(-1)) - << "No failure on invalid file descriptor"; -} - -TEST_F(ObbFileTest, WriteThenRead) { - const char* packageName = "com.example.obbfile"; - const int32_t versionNum = 1; - - mObbFile->setPackageName(String8(packageName)); - mObbFile->setVersion(versionNum); -#define SALT_SIZE 8 - unsigned char salt[SALT_SIZE] = {0x01, 0x10, 0x55, 0xAA, 0xFF, 0x00, 0x5A, 0xA5}; - EXPECT_TRUE(mObbFile->setSalt(salt, SALT_SIZE)) - << "Salt should be successfully set"; - - EXPECT_TRUE(mObbFile->writeTo(mFileName)) - << "couldn't write to fake .obb file"; - - mObbFile = new ObbFile(); - - EXPECT_TRUE(mObbFile->readFrom(mFileName)) - << "couldn't read from fake .obb file"; - - EXPECT_EQ(versionNum, mObbFile->getVersion()) - << "version didn't come out the same as it went in"; - const char* currentPackageName = mObbFile->getPackageName().string(); - EXPECT_STREQ(packageName, currentPackageName) - << "package name didn't come out the same as it went in"; - - size_t saltLen; - const unsigned char* newSalt = mObbFile->getSalt(&saltLen); - - EXPECT_EQ(sizeof(salt), saltLen) - << "salt sizes were not the same"; - - for (int i = 0; i < sizeof(salt); i++) { - EXPECT_EQ(salt[i], newSalt[i]) - << "salt character " << i << " should be equal"; - } - EXPECT_TRUE(memcmp(newSalt, salt, sizeof(salt)) == 0) - << "salts should be the same"; -} - -} diff --git a/libs/utils/tests/ZipFileRO_test.cpp b/libs/utils/tests/ZipFileRO_test.cpp deleted file mode 100644 index 7a1d0bd958..0000000000 --- a/libs/utils/tests/ZipFileRO_test.cpp +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#define LOG_TAG "ZipFileRO_test" -#include <utils/Log.h> -#include <utils/ZipFileRO.h> - -#include <gtest/gtest.h> - -#include <fcntl.h> -#include <string.h> - -namespace android { - -class ZipFileROTest : public testing::Test { -protected: - virtual void SetUp() { - } - - virtual void TearDown() { - } -}; - -TEST_F(ZipFileROTest, ZipTimeConvertSuccess) { - struct tm t; - - // 2011-06-29 14:40:40 - long when = 0x3EDD7514; - - ZipFileRO::zipTimeToTimespec(when, &t); - - EXPECT_EQ(2011, t.tm_year + 1900) - << "Year was improperly converted."; - - EXPECT_EQ(6, t.tm_mon) - << "Month was improperly converted."; - - EXPECT_EQ(29, t.tm_mday) - << "Day was improperly converted."; - - EXPECT_EQ(14, t.tm_hour) - << "Hour was improperly converted."; - - EXPECT_EQ(40, t.tm_min) - << "Minute was improperly converted."; - - EXPECT_EQ(40, t.tm_sec) - << "Second was improperly converted."; -} - -} diff --git a/opengl/libagl/TextureObjectManager.cpp b/opengl/libagl/TextureObjectManager.cpp index 6a006aabfa..06d45cc22e 100644 --- a/opengl/libagl/TextureObjectManager.cpp +++ b/opengl/libagl/TextureObjectManager.cpp @@ -19,8 +19,6 @@ #include "context.h" #include "TextureObjectManager.h" -#include <private/ui/android_natives_priv.h> - namespace android { // ---------------------------------------------------------------------------- diff --git a/opengl/libagl/context.h b/opengl/libagl/context.h index ef36b569d9..7065a30324 100644 --- a/opengl/libagl/context.h +++ b/opengl/libagl/context.h @@ -1,20 +1,642 @@ -/* libs/opengles/context.h -** -** Copyright 2006, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - -#include <private/opengles/gl_context.h> +/* + * Copyright (C) 2006 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ANDROID_OPENGLES_CONTEXT_H +#define ANDROID_OPENGLES_CONTEXT_H + +#include <stdint.h> +#include <stddef.h> +#include <sys/types.h> +#include <pthread.h> +#ifdef HAVE_ANDROID_OS +#include <bionic_tls.h> +#endif + +#include <private/pixelflinger/ggl_context.h> +#include <hardware/gralloc.h> + +#include <GLES/gl.h> +#include <GLES/glext.h> + +namespace android { + + +const unsigned int OGLES_NUM_COMPRESSED_TEXTURE_FORMATS = 10 +#ifdef GL_OES_compressed_ETC1_RGB8_texture + + 1 +#endif + ; + +class EGLTextureObject; +class EGLSurfaceManager; +class EGLBufferObjectManager; + +namespace gl { + +struct ogles_context_t; +struct matrixx_t; +struct transform_t; +struct buffer_t; + +ogles_context_t* getGlContext(); + +template<typename T> +static inline void swap(T& a, T& b) { + T t(a); a = b; b = t; +} +template<typename T> +inline T max(T a, T b) { + return a<b ? b : a; +} +template<typename T> +inline T max(T a, T b, T c) { + return max(a, max(b, c)); +} +template<typename T> +inline T min(T a, T b) { + return a<b ? a : b; +} +template<typename T> +inline T min(T a, T b, T c) { + return min(a, min(b, c)); +} +template<typename T> +inline T min(T a, T b, T c, T d) { + return min(min(a,b), min(c,d)); +} + +// ---------------------------------------------------------------------------- +// vertices +// ---------------------------------------------------------------------------- + +struct vec3_t { + union { + struct { GLfixed x, y, z; }; + struct { GLfixed r, g, b; }; + struct { GLfixed S, T, R; }; + GLfixed v[3]; + }; +}; + +struct vec4_t { + union { + struct { GLfixed x, y, z, w; }; + struct { GLfixed r, g, b, a; }; + struct { GLfixed S, T, R, Q; }; + GLfixed v[4]; + }; +}; + +struct vertex_t { + enum { + // these constant matter for our clipping + CLIP_L = 0x0001, // clipping flags + CLIP_R = 0x0002, + CLIP_B = 0x0004, + CLIP_T = 0x0008, + CLIP_N = 0x0010, + CLIP_F = 0x0020, + + EYE = 0x0040, + RESERVED = 0x0080, + + USER_CLIP_0 = 0x0100, // user clipping flags + USER_CLIP_1 = 0x0200, + USER_CLIP_2 = 0x0400, + USER_CLIP_3 = 0x0800, + USER_CLIP_4 = 0x1000, + USER_CLIP_5 = 0x2000, + + LIT = 0x4000, // lighting has been applied + TT = 0x8000, // texture coords transformed + + FRUSTUM_CLIP_ALL= 0x003F, + USER_CLIP_ALL = 0x3F00, + CLIP_ALL = 0x3F3F, + }; + + // the fields below are arranged to minimize d-cache usage + // we group together, by cache-line, the fields most likely to be used + + union { + vec4_t obj; + vec4_t eye; + }; + vec4_t clip; + + uint32_t flags; + size_t index; // cache tag, and vertex index + GLfixed fog; + uint8_t locked; + uint8_t mru; + uint8_t reserved[2]; + vec4_t window; + + vec4_t color; + vec4_t texture[GGL_TEXTURE_UNIT_COUNT]; + uint32_t reserved1[4]; + + inline void clear() { + flags = index = locked = mru = 0; + } +}; + +struct point_size_t { + GGLcoord size; + GLboolean smooth; +}; + +struct line_width_t { + GGLcoord width; + GLboolean smooth; +}; + +struct polygon_offset_t { + GLfixed factor; + GLfixed units; + GLboolean enable; +}; + +// ---------------------------------------------------------------------------- +// arrays +// ---------------------------------------------------------------------------- + +struct array_t { + typedef void (*fetcher_t)(ogles_context_t*, GLfixed*, const GLvoid*); + fetcher_t fetch; + GLvoid const* physical_pointer; + GLint size; + GLsizei stride; + GLvoid const* pointer; + buffer_t const* bo; + uint16_t type; + GLboolean enable; + GLboolean pad; + GLsizei bounds; + void init(GLint, GLenum, GLsizei, const GLvoid *, const buffer_t*, GLsizei); + inline void resolve(); + inline const GLubyte* element(GLint i) const { + return (const GLubyte*)physical_pointer + i * stride; + } +}; + +struct array_machine_t { + array_t vertex; + array_t normal; + array_t color; + array_t texture[GGL_TEXTURE_UNIT_COUNT]; + uint8_t activeTexture; + uint8_t tmu; + uint16_t cull; + uint32_t flags; + GLenum indicesType; + buffer_t const* array_buffer; + buffer_t const* element_array_buffer; + + void (*compileElements)(ogles_context_t*, vertex_t*, GLint, GLsizei); + void (*compileElement)(ogles_context_t*, vertex_t*, GLint); + + void (*mvp_transform)(transform_t const*, vec4_t*, vec4_t const*); + void (*mv_transform)(transform_t const*, vec4_t*, vec4_t const*); + void (*tex_transform[2])(transform_t const*, vec4_t*, vec4_t const*); + void (*perspective)(ogles_context_t*c, vertex_t* v); + void (*clipVertex)(ogles_context_t* c, vertex_t* nv, + GGLfixed t, const vertex_t* s, const vertex_t* p); + void (*clipEye)(ogles_context_t* c, vertex_t* nv, + GGLfixed t, const vertex_t* s, const vertex_t* p); +}; + +struct vertex_cache_t { + enum { + // must be at least 4 + // 3 vertice for triangles + // or 2 + 2 for indexed triangles w/ cache contention + VERTEX_BUFFER_SIZE = 8, + // must be a power of two and at least 3 + VERTEX_CACHE_SIZE = 64, // 8 KB + + INDEX_BITS = 16, + INDEX_MASK = ((1LU<<INDEX_BITS)-1), + INDEX_SEQ = 1LU<<INDEX_BITS, + }; + vertex_t* vBuffer; + vertex_t* vCache; + uint32_t sequence; + void* base; + uint32_t total; + uint32_t misses; + int64_t startTime; + void init(); + void uninit(); + void clear(); + void dump_stats(GLenum mode); +}; + +// ---------------------------------------------------------------------------- +// fog +// ---------------------------------------------------------------------------- + +struct fog_t { + GLfixed density; + GLfixed start; + GLfixed end; + GLfixed invEndMinusStart; + GLenum mode; + GLfixed (*fog)(ogles_context_t* c, GLfixed z); +}; + +// ---------------------------------------------------------------------------- +// user clip planes +// ---------------------------------------------------------------------------- + +const unsigned int OGLES_MAX_CLIP_PLANES = 6; + +struct clip_plane_t { + vec4_t equation; +}; + +struct user_clip_planes_t { + clip_plane_t plane[OGLES_MAX_CLIP_PLANES]; + uint32_t enable; +}; + +// ---------------------------------------------------------------------------- +// lighting +// ---------------------------------------------------------------------------- + +const unsigned int OGLES_MAX_LIGHTS = 8; + +struct light_t { + vec4_t ambient; + vec4_t diffuse; + vec4_t specular; + vec4_t implicitAmbient; + vec4_t implicitDiffuse; + vec4_t implicitSpecular; + vec4_t position; // position in eye space + vec4_t objPosition; + vec4_t normalizedObjPosition; + vec4_t spotDir; + vec4_t normalizedSpotDir; + GLfixed spotExp; + GLfixed spotCutoff; + GLfixed spotCutoffCosine; + GLfixed attenuation[3]; + GLfixed rConstAttenuation; + GLboolean enable; +}; + +struct material_t { + vec4_t ambient; + vec4_t diffuse; + vec4_t specular; + vec4_t emission; + GLfixed shininess; +}; + +struct light_model_t { + vec4_t ambient; + GLboolean twoSide; +}; + +struct color_material_t { + GLenum face; + GLenum mode; + GLboolean enable; +}; + +struct lighting_t { + light_t lights[OGLES_MAX_LIGHTS]; + material_t front; + light_model_t lightModel; + color_material_t colorMaterial; + vec4_t implicitSceneEmissionAndAmbient; + vec4_t objViewer; + uint32_t enabledLights; + GLboolean enable; + GLenum shadeModel; + typedef void (*light_fct_t)(ogles_context_t*, vertex_t*); + void (*lightVertex)(ogles_context_t* c, vertex_t* v); + void (*lightTriangle)(ogles_context_t* c, + vertex_t* v0, vertex_t* v1, vertex_t* v2); +}; + +struct culling_t { + GLenum cullFace; + GLenum frontFace; + GLboolean enable; +}; + +// ---------------------------------------------------------------------------- +// textures +// ---------------------------------------------------------------------------- + +struct texture_unit_t { + GLuint name; + EGLTextureObject* texture; + uint8_t dirty; +}; + +struct texture_state_t +{ + texture_unit_t tmu[GGL_TEXTURE_UNIT_COUNT]; + int active; // active tmu + EGLTextureObject* defaultTexture; + GGLContext* ggl; + uint8_t packAlignment; + uint8_t unpackAlignment; +}; + +// ---------------------------------------------------------------------------- +// transformation and matrices +// ---------------------------------------------------------------------------- + +struct matrixf_t; + +struct matrixx_t { + GLfixed m[16]; + void load(const matrixf_t& rhs); +}; + +struct matrix_stack_t; + + +struct matrixf_t { + void loadIdentity(); + void load(const matrixf_t& rhs); + + inline GLfloat* editElements() { return m; } + inline GLfloat const* elements() const { return m; } + + void set(const GLfixed* rhs); + void set(const GLfloat* rhs); + + static void multiply(matrixf_t& r, + const matrixf_t& lhs, const matrixf_t& rhs); + + void dump(const char* what); + +private: + friend struct matrix_stack_t; + GLfloat m[16]; + void load(const GLfixed* rhs); + void load(const GLfloat* rhs); + void multiply(const matrixf_t& rhs); + void translate(GLfloat x, GLfloat y, GLfloat z); + void scale(GLfloat x, GLfloat y, GLfloat z); + void rotate(GLfloat a, GLfloat x, GLfloat y, GLfloat z); +}; + +enum { + OP_IDENTITY = 0x00, + OP_TRANSLATE = 0x01, + OP_UNIFORM_SCALE = 0x02, + OP_SCALE = 0x05, + OP_ROTATE = 0x08, + OP_SKEW = 0x10, + OP_ALL = 0x1F +}; + +struct transform_t { + enum { + FLAGS_2D_PROJECTION = 0x1 + }; + matrixx_t matrix; + uint32_t flags; + uint32_t ops; + + union { + struct { + void (*point2)(transform_t const* t, vec4_t*, vec4_t const*); + void (*point3)(transform_t const* t, vec4_t*, vec4_t const*); + void (*point4)(transform_t const* t, vec4_t*, vec4_t const*); + }; + void (*pointv[3])(transform_t const* t, vec4_t*, vec4_t const*); + }; + + void loadIdentity(); + void picker(); + void dump(const char* what); +}; + +struct mvui_transform_t : public transform_t +{ + void picker(); +}; + +struct matrix_stack_t { + enum { + DO_PICKER = 0x1, + DO_FLOAT_TO_FIXED = 0x2 + }; + transform_t transform; + uint8_t maxDepth; + uint8_t depth; + uint8_t dirty; + uint8_t reserved; + matrixf_t *stack; + uint8_t *ops; + void init(int depth); + void uninit(); + void loadIdentity(); + void load(const GLfixed* rhs); + void load(const GLfloat* rhs); + void multiply(const matrixf_t& rhs); + void translate(GLfloat x, GLfloat y, GLfloat z); + void scale(GLfloat x, GLfloat y, GLfloat z); + void rotate(GLfloat a, GLfloat x, GLfloat y, GLfloat z); + GLint push(); + GLint pop(); + void validate(); + matrixf_t& top() { return stack[depth]; } + const matrixf_t& top() const { return stack[depth]; } + uint32_t top_ops() const { return ops[depth]; } + inline bool isRigidBody() const { + return !(ops[depth] & ~(OP_TRANSLATE|OP_UNIFORM_SCALE|OP_ROTATE)); + } +}; + +struct vp_transform_t { + transform_t transform; + matrixf_t matrix; + GLfloat zNear; + GLfloat zFar; + void loadIdentity(); +}; + +struct transform_state_t { + enum { + MODELVIEW = 0x01, + PROJECTION = 0x02, + VIEWPORT = 0x04, + TEXTURE = 0x08, + MVUI = 0x10, + MVIT = 0x20, + MVP = 0x40, + }; + matrix_stack_t *current; + matrix_stack_t modelview; + matrix_stack_t projection; + matrix_stack_t texture[GGL_TEXTURE_UNIT_COUNT]; + + // modelview * projection + transform_t mvp __attribute__((aligned(32))); + // viewport transformation + vp_transform_t vpt __attribute__((aligned(32))); + // same for 4-D vertices + transform_t mvp4; + // full modelview inverse transpose + transform_t mvit4; + // upper 3x3 of mv-inverse-transpose (for normals) + mvui_transform_t mvui; + + GLenum matrixMode; + GLenum rescaleNormals; + uint32_t dirty; + void invalidate(); + void update_mvp(); + void update_mvit(); + void update_mvui(); +}; + +struct viewport_t { + GLint x; + GLint y; + GLsizei w; + GLsizei h; + struct { + GLint x; + GLint y; + } surfaceport; + struct { + GLint x; + GLint y; + GLsizei w; + GLsizei h; + } scissor; +}; + +// ---------------------------------------------------------------------------- +// Lerping +// ---------------------------------------------------------------------------- + +struct compute_iterators_t +{ + void initTriangle( + vertex_t const* v0, + vertex_t const* v1, + vertex_t const* v2); + + void initLine( + vertex_t const* v0, + vertex_t const* v1); + + inline void initLerp(vertex_t const* v0, uint32_t enables); + + int iteratorsScale(int32_t it[3], + int32_t c0, int32_t c1, int32_t c2) const; + + void iterators1616(GGLfixed it[3], + GGLfixed c0, GGLfixed c1, GGLfixed c2) const; + + void iterators0032(int32_t it[3], + int32_t c0, int32_t c1, int32_t c2) const; + + void iterators0032(int64_t it[3], + int32_t c0, int32_t c1, int32_t c2) const; + + GGLcoord area() const { return m_area; } + +private: + // don't change order of members here -- used by iterators.S + GGLcoord m_dx01, m_dy10, m_dx20, m_dy02; + GGLcoord m_x0, m_y0; + GGLcoord m_area; + uint8_t m_scale; + uint8_t m_area_scale; + uint8_t m_reserved[2]; + +}; + +// ---------------------------------------------------------------------------- +// state +// ---------------------------------------------------------------------------- + +#ifdef HAVE_ANDROID_OS + // We have a dedicated TLS slot in bionic + inline void setGlThreadSpecific(ogles_context_t *value) { + ((uint32_t *)__get_tls())[TLS_SLOT_OPENGL] = (uint32_t)value; + } + inline ogles_context_t* getGlThreadSpecific() { + return (ogles_context_t *)(((unsigned *)__get_tls())[TLS_SLOT_OPENGL]); + } +#else + extern pthread_key_t gGLKey; + inline void setGlThreadSpecific(ogles_context_t *value) { + pthread_setspecific(gGLKey, value); + } + inline ogles_context_t* getGlThreadSpecific() { + return static_cast<ogles_context_t*>(pthread_getspecific(gGLKey)); + } +#endif + + +struct prims_t { + typedef ogles_context_t* GL; + void (*renderPoint)(GL, vertex_t*); + void (*renderLine)(GL, vertex_t*, vertex_t*); + void (*renderTriangle)(GL, vertex_t*, vertex_t*, vertex_t*); +}; + +struct ogles_context_t { + context_t rasterizer; + array_machine_t arrays __attribute__((aligned(32))); + texture_state_t textures; + transform_state_t transforms; + vertex_cache_t vc; + prims_t prims; + culling_t cull; + lighting_t lighting; + user_clip_planes_t clipPlanes; + compute_iterators_t lerp; __attribute__((aligned(32))); + vertex_t current; + vec4_t currentColorClamped; + vec3_t currentNormal; + viewport_t viewport; + point_size_t point; + line_width_t line; + polygon_offset_t polygonOffset; + fog_t fog; + uint32_t perspective : 1; + uint32_t transformTextures : 1; + EGLSurfaceManager* surfaceManager; + EGLBufferObjectManager* bufferObjectManager; + + GLenum error; + + static inline ogles_context_t* get() { + return getGlThreadSpecific(); + } + +}; + +}; // namespace gl +}; // namespace android using namespace android::gl; + +#endif // ANDROID_OPENGLES_CONTEXT_H + diff --git a/opengl/libagl/egl.cpp b/opengl/libagl/egl.cpp index eb55beefd9..92d32a282b 100644 --- a/opengl/libagl/egl.cpp +++ b/opengl/libagl/egl.cpp @@ -30,6 +30,7 @@ #include <cutils/atomic.h> #include <utils/threads.h> +#include <ui/ANativeObjectBase.h> #include <EGL/egl.h> #include <EGL/eglext.h> @@ -39,8 +40,6 @@ #include <pixelflinger/format.h> #include <pixelflinger/pixelflinger.h> -#include <private/ui/android_natives_priv.h> - #include "context.h" #include "state.h" #include "texture.h" @@ -49,13 +48,14 @@ #undef NELEM #define NELEM(x) (sizeof(x)/sizeof(*(x))) +// ---------------------------------------------------------------------------- EGLBoolean EGLAPI eglSetSwapRectangleANDROID(EGLDisplay dpy, EGLSurface draw, EGLint left, EGLint top, EGLint width, EGLint height); - // ---------------------------------------------------------------------------- namespace android { + // ---------------------------------------------------------------------------- const unsigned int NUM_DISPLAYS = 1; diff --git a/opengl/libagl/texture.cpp b/opengl/libagl/texture.cpp index 88e865124e..08536dfd25 100644 --- a/opengl/libagl/texture.cpp +++ b/opengl/libagl/texture.cpp @@ -23,7 +23,6 @@ #include "texture.h" #include "TextureObjectManager.h" -#include <private/ui/android_natives_priv.h> #include <ETC1/etc1.h> namespace android { diff --git a/opengl/libs/GLES_trace/TODO.txt b/opengl/libs/GLES_trace/TODO.txt deleted file mode 100644 index f5e6e9518c..0000000000 --- a/opengl/libs/GLES_trace/TODO.txt +++ /dev/null @@ -1,14 +0,0 @@ -TODO: - - Context - Currently, we don't do anything regarding the contexts that are created. - Need to maintain more state regarding contexts, and figure out what happens in the - presence of multiple contexts. - - - Transport: Each GLMessage is sent via a socket as soon as the message is received. - i.e., there is no buffering of messages. Buffering should improve performance. - - - Initialization: On first connection, send some basic information that includes: - 1. version of the trace library - 2. implementation dependent GL state variables such as # of vertex arrays etc. - - - eglSwapBuffers: The images are lzf compressed, but there is no mode that transfers - only the differences from the previous images. diff --git a/opengl/libs/GLES_trace/gltrace.proto b/opengl/libs/GLES_trace/gltrace.proto index 11cf24f590..2893e6e874 100644 --- a/opengl/libs/GLES_trace/gltrace.proto +++ b/opengl/libs/GLES_trace/gltrace.proto @@ -543,11 +543,13 @@ message GLMessage { required int32 context_id = 1; // GL context ID required int64 start_time = 2; // time when call was invoked - required int32 duration = 3; // duration of the call + required int32 duration = 3; // duration of the call (MONOTONIC TIME) required Function function = 4 [default = invalid]; // GL function called repeated DataType args = 5; // GL function's arguments optional DataType returnValue = 6; // GL function's return value optional FrameBuffer fb = 7; // contents of the framebuffer + + optional int32 threadtime = 8; // duration of the call (THREAD TIME) }; diff --git a/opengl/libs/GLES_trace/src/gltrace.pb.cpp b/opengl/libs/GLES_trace/src/gltrace.pb.cpp index bb9d4a70e8..d5f8180e26 100644 --- a/opengl/libs/GLES_trace/src/gltrace.pb.cpp +++ b/opengl/libs/GLES_trace/src/gltrace.pb.cpp @@ -1663,6 +1663,7 @@ const int GLMessage::kFunctionFieldNumber; const int GLMessage::kArgsFieldNumber; const int GLMessage::kReturnValueFieldNumber; const int GLMessage::kFbFieldNumber; +const int GLMessage::kThreadtimeFieldNumber; #endif // !_MSC_VER GLMessage::GLMessage() @@ -1689,6 +1690,7 @@ void GLMessage::SharedCtor() { function_ = 3000; returnvalue_ = NULL; fb_ = NULL; + threadtime_ = 0; ::memset(_has_bits_, 0, sizeof(_has_bits_)); } @@ -1730,6 +1732,7 @@ void GLMessage::Clear() { if (_has_bit(6)) { if (fb_ != NULL) fb_->::android::gltrace::GLMessage_FrameBuffer::Clear(); } + threadtime_ = 0; } args_.Clear(); ::memset(_has_bits_, 0, sizeof(_has_bits_)); @@ -1846,6 +1849,22 @@ bool GLMessage::MergePartialFromCodedStream( } else { goto handle_uninterpreted; } + if (input->ExpectTag(64)) goto parse_threadtime; + break; + } + + // optional int32 threadtime = 8; + case 8: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + parse_threadtime: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( + input, &threadtime_))); + _set_bit(7); + } else { + goto handle_uninterpreted; + } if (input->ExpectAtEnd()) return true; break; } @@ -1906,6 +1925,11 @@ void GLMessage::SerializeWithCachedSizes( 7, this->fb(), output); } + // optional int32 threadtime = 8; + if (_has_bit(7)) { + ::google::protobuf::internal::WireFormatLite::WriteInt32(8, this->threadtime(), output); + } + } int GLMessage::ByteSize() const { @@ -1953,6 +1977,13 @@ int GLMessage::ByteSize() const { this->fb()); } + // optional int32 threadtime = 8; + if (has_threadtime()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int32Size( + this->threadtime()); + } + } // repeated .android.gltrace.GLMessage.DataType args = 5; total_size += 1 * this->args_size(); @@ -1995,6 +2026,9 @@ void GLMessage::MergeFrom(const GLMessage& from) { if (from._has_bit(6)) { mutable_fb()->::android::gltrace::GLMessage_FrameBuffer::MergeFrom(from.fb()); } + if (from._has_bit(7)) { + set_threadtime(from.threadtime()); + } } } @@ -2028,6 +2062,7 @@ void GLMessage::Swap(GLMessage* other) { args_.Swap(&other->args_); std::swap(returnvalue_, other->returnvalue_); std::swap(fb_, other->fb_); + std::swap(threadtime_, other->threadtime_); std::swap(_has_bits_[0], other->_has_bits_[0]); std::swap(_cached_size_, other->_cached_size_); } diff --git a/opengl/libs/GLES_trace/src/gltrace.pb.h b/opengl/libs/GLES_trace/src/gltrace.pb.h index e3b8990fae..a4fcbd3545 100644 --- a/opengl/libs/GLES_trace/src/gltrace.pb.h +++ b/opengl/libs/GLES_trace/src/gltrace.pb.h @@ -1418,6 +1418,13 @@ class GLMessage : public ::google::protobuf::MessageLite { inline const ::android::gltrace::GLMessage_FrameBuffer& fb() const; inline ::android::gltrace::GLMessage_FrameBuffer* mutable_fb(); + // optional int32 threadtime = 8; + inline bool has_threadtime() const; + inline void clear_threadtime(); + static const int kThreadtimeFieldNumber = 8; + inline ::google::protobuf::int32 threadtime() const; + inline void set_threadtime(::google::protobuf::int32 value); + // @@protoc_insertion_point(class_scope:android.gltrace.GLMessage) private: mutable int _cached_size_; @@ -1429,11 +1436,12 @@ class GLMessage : public ::google::protobuf::MessageLite { ::google::protobuf::RepeatedPtrField< ::android::gltrace::GLMessage_DataType > args_; ::android::gltrace::GLMessage_DataType* returnvalue_; ::android::gltrace::GLMessage_FrameBuffer* fb_; + ::google::protobuf::int32 threadtime_; friend void protobuf_AddDesc_gltrace_2eproto(); friend void protobuf_AssignDesc_gltrace_2eproto(); friend void protobuf_ShutdownFile_gltrace_2eproto(); - ::google::protobuf::uint32 _has_bits_[(7 + 31) / 32]; + ::google::protobuf::uint32 _has_bits_[(8 + 31) / 32]; // WHY DOES & HAVE LOWER PRECEDENCE THAN != !? inline bool _has_bit(int index) const { @@ -1860,6 +1868,22 @@ inline ::android::gltrace::GLMessage_FrameBuffer* GLMessage::mutable_fb() { return fb_; } +// optional int32 threadtime = 8; +inline bool GLMessage::has_threadtime() const { + return _has_bit(7); +} +inline void GLMessage::clear_threadtime() { + threadtime_ = 0; + _clear_bit(7); +} +inline ::google::protobuf::int32 GLMessage::threadtime() const { + return threadtime_; +} +inline void GLMessage::set_threadtime(::google::protobuf::int32 value) { + _set_bit(7); + threadtime_ = value; +} + // @@protoc_insertion_point(namespace_scope) diff --git a/opengl/libs/GLES_trace/src/gltrace_api.cpp b/opengl/libs/GLES_trace/src/gltrace_api.cpp index a2366ac9b9..cef6cbb165 100644 --- a/opengl/libs/GLES_trace/src/gltrace_api.cpp +++ b/opengl/libs/GLES_trace/src/gltrace_api.cpp @@ -43,11 +43,18 @@ void GLTrace_glActiveTexture(GLenum texture) { arg_texture->add_intvalue((int)texture); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glActiveTexture(texture); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -70,11 +77,18 @@ void GLTrace_glAttachShader(GLuint program, GLuint shader) { arg_shader->add_intvalue(shader); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glAttachShader(program, shader); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -103,11 +117,19 @@ void GLTrace_glBindAttribLocation(GLuint program, GLuint index, const GLchar* na arg_name->add_intvalue((int)name); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glBindAttribLocation(program, index, name); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) name, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -130,11 +152,18 @@ void GLTrace_glBindBuffer(GLenum target, GLuint buffer) { arg_buffer->add_intvalue(buffer); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glBindBuffer(target, buffer); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -157,11 +186,18 @@ void GLTrace_glBindFramebuffer(GLenum target, GLuint framebuffer) { arg_framebuffer->add_intvalue(framebuffer); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glBindFramebuffer(target, framebuffer); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -184,11 +220,18 @@ void GLTrace_glBindRenderbuffer(GLenum target, GLuint renderbuffer) { arg_renderbuffer->add_intvalue(renderbuffer); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glBindRenderbuffer(target, renderbuffer); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -211,11 +254,18 @@ void GLTrace_glBindTexture(GLenum target, GLuint texture) { arg_texture->add_intvalue(texture); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glBindTexture(target, texture); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -250,11 +300,18 @@ void GLTrace_glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf arg_alpha->add_floatvalue(alpha); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glBlendColor(red, green, blue, alpha); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -271,11 +328,18 @@ void GLTrace_glBlendEquation(GLenum mode) { arg_mode->add_intvalue((int)mode); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glBlendEquation(mode); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -298,11 +362,18 @@ void GLTrace_glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha) { arg_modeAlpha->add_intvalue((int)modeAlpha); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glBlendEquationSeparate(modeRGB, modeAlpha); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -325,11 +396,18 @@ void GLTrace_glBlendFunc(GLenum sfactor, GLenum dfactor) { arg_dfactor->add_intvalue((int)dfactor); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glBlendFunc(sfactor, dfactor); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -364,11 +442,18 @@ void GLTrace_glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, arg_dstAlpha->add_intvalue((int)dstAlpha); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glBlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -388,7 +473,7 @@ void GLTrace_glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GL GLMessage_DataType *arg_size = glmsg.add_args(); arg_size->set_isarray(false); arg_size->set_type(GLMessage::DataType::INT); - arg_size->add_intvalue((int)size); + arg_size->add_intvalue(size); // copy argument data GLMessage_DataType *arg_data = glmsg.add_args(); @@ -403,11 +488,19 @@ void GLTrace_glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GL arg_usage->add_intvalue((int)usage); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glBufferData(target, size, data, usage); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) data, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -427,13 +520,13 @@ void GLTrace_glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, co GLMessage_DataType *arg_offset = glmsg.add_args(); arg_offset->set_isarray(false); arg_offset->set_type(GLMessage::DataType::INT); - arg_offset->add_intvalue((int)offset); + arg_offset->add_intvalue(offset); // copy argument size GLMessage_DataType *arg_size = glmsg.add_args(); arg_size->set_isarray(false); arg_size->set_type(GLMessage::DataType::INT); - arg_size->add_intvalue((int)size); + arg_size->add_intvalue(size); // copy argument data GLMessage_DataType *arg_data = glmsg.add_args(); @@ -442,11 +535,19 @@ void GLTrace_glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, co arg_data->add_intvalue((int)data); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glBufferSubData(target, offset, size, data); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) data, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -463,9 +564,11 @@ GLenum GLTrace_glCheckFramebufferStatus(GLenum target) { arg_target->add_intvalue((int)target); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); GLenum retValue = glContext->hooks->gl.glCheckFramebufferStatus(target); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); // set return value GLMessage_DataType *rt = glmsg.mutable_returnvalue(); @@ -473,7 +576,12 @@ GLenum GLTrace_glCheckFramebufferStatus(GLenum target) { rt->set_type(GLMessage::DataType::ENUM); rt->add_intvalue((int)retValue); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); return retValue; @@ -492,11 +600,18 @@ void GLTrace_glClear(GLbitfield mask) { arg_mask->add_intvalue(mask); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glClear(mask); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -531,11 +646,18 @@ void GLTrace_glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf arg_alpha->add_floatvalue(alpha); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glClearColor(red, green, blue, alpha); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -552,11 +674,18 @@ void GLTrace_glClearDepthf(GLclampf depth) { arg_depth->add_floatvalue(depth); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glClearDepthf(depth); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -573,11 +702,18 @@ void GLTrace_glClearStencil(GLint s) { arg_s->add_intvalue(s); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glClearStencil(s); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -612,11 +748,18 @@ void GLTrace_glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboole arg_alpha->add_boolvalue(alpha); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glColorMask(red, green, blue, alpha); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -633,11 +776,18 @@ void GLTrace_glCompileShader(GLuint shader) { arg_shader->add_intvalue(shader); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glCompileShader(shader); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -696,11 +846,19 @@ void GLTrace_glCompressedTexImage2D(GLenum target, GLint level, GLenum internalf arg_data->add_intvalue((int)data); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) data, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -765,11 +923,19 @@ void GLTrace_glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset arg_data->add_intvalue((int)data); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) data, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -828,11 +994,18 @@ void GLTrace_glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, arg_border->add_intvalue(border); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glCopyTexImage2D(target, level, internalformat, x, y, width, height, border); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -891,11 +1064,18 @@ void GLTrace_glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLin arg_height->add_intvalue(height); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -906,9 +1086,11 @@ GLuint GLTrace_glCreateProgram(void) { glmsg.set_function(GLMessage::glCreateProgram); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); GLuint retValue = glContext->hooks->gl.glCreateProgram(); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); // set return value GLMessage_DataType *rt = glmsg.mutable_returnvalue(); @@ -916,7 +1098,12 @@ GLuint GLTrace_glCreateProgram(void) { rt->set_type(GLMessage::DataType::INT); rt->add_intvalue(retValue); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); return retValue; @@ -935,9 +1122,11 @@ GLuint GLTrace_glCreateShader(GLenum type) { arg_type->add_intvalue((int)type); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); GLuint retValue = glContext->hooks->gl.glCreateShader(type); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); // set return value GLMessage_DataType *rt = glmsg.mutable_returnvalue(); @@ -945,7 +1134,12 @@ GLuint GLTrace_glCreateShader(GLenum type) { rt->set_type(GLMessage::DataType::INT); rt->add_intvalue(retValue); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); return retValue; @@ -964,11 +1158,18 @@ void GLTrace_glCullFace(GLenum mode) { arg_mode->add_intvalue((int)mode); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glCullFace(mode); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -991,11 +1192,19 @@ void GLTrace_glDeleteBuffers(GLsizei n, const GLuint* buffers) { arg_buffers->add_intvalue((int)buffers); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glDeleteBuffers(n, buffers); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) buffers, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -1018,11 +1227,19 @@ void GLTrace_glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers) { arg_framebuffers->add_intvalue((int)framebuffers); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glDeleteFramebuffers(n, framebuffers); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) framebuffers, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -1039,11 +1256,18 @@ void GLTrace_glDeleteProgram(GLuint program) { arg_program->add_intvalue(program); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glDeleteProgram(program); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -1066,11 +1290,19 @@ void GLTrace_glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers) { arg_renderbuffers->add_intvalue((int)renderbuffers); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glDeleteRenderbuffers(n, renderbuffers); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) renderbuffers, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -1087,11 +1319,18 @@ void GLTrace_glDeleteShader(GLuint shader) { arg_shader->add_intvalue(shader); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glDeleteShader(shader); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -1114,11 +1353,19 @@ void GLTrace_glDeleteTextures(GLsizei n, const GLuint* textures) { arg_textures->add_intvalue((int)textures); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glDeleteTextures(n, textures); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) textures, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -1135,11 +1382,18 @@ void GLTrace_glDepthFunc(GLenum func) { arg_func->add_intvalue((int)func); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glDepthFunc(func); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -1156,11 +1410,18 @@ void GLTrace_glDepthMask(GLboolean flag) { arg_flag->add_boolvalue(flag); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glDepthMask(flag); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -1183,11 +1444,18 @@ void GLTrace_glDepthRangef(GLclampf zNear, GLclampf zFar) { arg_zFar->add_floatvalue(zFar); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glDepthRangef(zNear, zFar); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -1210,11 +1478,18 @@ void GLTrace_glDetachShader(GLuint program, GLuint shader) { arg_shader->add_intvalue(shader); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glDetachShader(program, shader); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -1231,11 +1506,18 @@ void GLTrace_glDisable(GLenum cap) { arg_cap->add_intvalue((int)cap); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glDisable(cap); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -1252,11 +1534,18 @@ void GLTrace_glDisableVertexAttribArray(GLuint index) { arg_index->add_intvalue(index); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glDisableVertexAttribArray(index); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -1285,11 +1574,18 @@ void GLTrace_glDrawArrays(GLenum mode, GLint first, GLsizei count) { arg_count->add_intvalue(count); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glDrawArrays(mode, first, count); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -1324,11 +1620,19 @@ void GLTrace_glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoi arg_indices->add_intvalue((int)indices); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glDrawElements(mode, count, type, indices); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) indices, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -1345,11 +1649,18 @@ void GLTrace_glEnable(GLenum cap) { arg_cap->add_intvalue((int)cap); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glEnable(cap); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -1366,11 +1677,18 @@ void GLTrace_glEnableVertexAttribArray(GLuint index) { arg_index->add_intvalue(index); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glEnableVertexAttribArray(index); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -1381,11 +1699,18 @@ void GLTrace_glFinish(void) { glmsg.set_function(GLMessage::glFinish); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glFinish(); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -1396,11 +1721,18 @@ void GLTrace_glFlush(void) { glmsg.set_function(GLMessage::glFlush); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glFlush(); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -1435,11 +1767,18 @@ void GLTrace_glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum arg_renderbuffer->add_intvalue(renderbuffer); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -1480,11 +1819,18 @@ void GLTrace_glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum tex arg_level->add_intvalue(level); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glFramebufferTexture2D(target, attachment, textarget, texture, level); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -1501,11 +1847,18 @@ void GLTrace_glFrontFace(GLenum mode) { arg_mode->add_intvalue((int)mode); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glFrontFace(mode); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -1528,11 +1881,19 @@ void GLTrace_glGenBuffers(GLsizei n, GLuint* buffers) { arg_buffers->add_intvalue((int)buffers); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGenBuffers(n, buffers); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) buffers, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -1549,11 +1910,18 @@ void GLTrace_glGenerateMipmap(GLenum target) { arg_target->add_intvalue((int)target); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGenerateMipmap(target); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -1576,11 +1944,19 @@ void GLTrace_glGenFramebuffers(GLsizei n, GLuint* framebuffers) { arg_framebuffers->add_intvalue((int)framebuffers); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGenFramebuffers(n, framebuffers); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) framebuffers, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -1603,11 +1979,19 @@ void GLTrace_glGenRenderbuffers(GLsizei n, GLuint* renderbuffers) { arg_renderbuffers->add_intvalue((int)renderbuffers); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGenRenderbuffers(n, renderbuffers); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) renderbuffers, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -1630,11 +2014,19 @@ void GLTrace_glGenTextures(GLsizei n, GLuint* textures) { arg_textures->add_intvalue((int)textures); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGenTextures(n, textures); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) textures, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -1687,11 +2079,22 @@ void GLTrace_glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GL arg_name->add_intvalue((int)name); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetActiveAttrib(program, index, bufsize, length, size, type, name); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) length, + (void *) size, + (void *) type, + (void *) name, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -1744,11 +2147,22 @@ void GLTrace_glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, G arg_name->add_intvalue((int)name); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetActiveUniform(program, index, bufsize, length, size, type, name); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) length, + (void *) size, + (void *) type, + (void *) name, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -1783,11 +2197,20 @@ void GLTrace_glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* cou arg_shaders->add_intvalue((int)shaders); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetAttachedShaders(program, maxcount, count, shaders); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) count, + (void *) shaders, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -1810,9 +2233,11 @@ int GLTrace_glGetAttribLocation(GLuint program, const GLchar* name) { arg_name->add_intvalue((int)name); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); int retValue = glContext->hooks->gl.glGetAttribLocation(program, name); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); // set return value GLMessage_DataType *rt = glmsg.mutable_returnvalue(); @@ -1820,7 +2245,13 @@ int GLTrace_glGetAttribLocation(GLuint program, const GLchar* name) { rt->set_type(GLMessage::DataType::INT); rt->add_intvalue(retValue); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) name, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); return retValue; @@ -1845,11 +2276,19 @@ void GLTrace_glGetBooleanv(GLenum pname, GLboolean* params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetBooleanv(pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) params, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -1878,11 +2317,19 @@ void GLTrace_glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params) arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetBufferParameteriv(target, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) params, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -1893,9 +2340,11 @@ GLenum GLTrace_glGetError(void) { glmsg.set_function(GLMessage::glGetError); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); GLenum retValue = glContext->hooks->gl.glGetError(); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); // set return value GLMessage_DataType *rt = glmsg.mutable_returnvalue(); @@ -1903,7 +2352,12 @@ GLenum GLTrace_glGetError(void) { rt->set_type(GLMessage::DataType::ENUM); rt->add_intvalue((int)retValue); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); return retValue; @@ -1928,11 +2382,19 @@ void GLTrace_glGetFloatv(GLenum pname, GLfloat* params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetFloatv(pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) params, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -1967,11 +2429,19 @@ void GLTrace_glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachm arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetFramebufferAttachmentParameteriv(target, attachment, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) params, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -1994,11 +2464,19 @@ void GLTrace_glGetIntegerv(GLenum pname, GLint* params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetIntegerv(pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) params, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -2027,11 +2505,19 @@ void GLTrace_glGetProgramiv(GLuint program, GLenum pname, GLint* params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetProgramiv(program, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) params, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -2066,11 +2552,20 @@ void GLTrace_glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* lengt arg_infolog->add_intvalue((int)infolog); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetProgramInfoLog(program, bufsize, length, infolog); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) length, + (void *) infolog, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -2099,11 +2594,19 @@ void GLTrace_glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* pa arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetRenderbufferParameteriv(target, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) params, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -2132,11 +2635,19 @@ void GLTrace_glGetShaderiv(GLuint shader, GLenum pname, GLint* params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetShaderiv(shader, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) params, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -2171,11 +2682,20 @@ void GLTrace_glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, arg_infolog->add_intvalue((int)infolog); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetShaderInfoLog(shader, bufsize, length, infolog); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) length, + (void *) infolog, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -2210,11 +2730,20 @@ void GLTrace_glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, arg_precision->add_intvalue((int)precision); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetShaderPrecisionFormat(shadertype, precisiontype, range, precision); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) range, + (void *) precision, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -2249,11 +2778,20 @@ void GLTrace_glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, arg_source->add_intvalue((int)source); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetShaderSource(shader, bufsize, length, source); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) length, + (void *) source, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -2270,9 +2808,11 @@ const GLubyte* GLTrace_glGetString(GLenum name) { arg_name->add_intvalue((int)name); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); const GLubyte* retValue = glContext->hooks->gl.glGetString(name); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); // set return value GLMessage_DataType *rt = glmsg.mutable_returnvalue(); @@ -2280,7 +2820,13 @@ const GLubyte* GLTrace_glGetString(GLenum name) { rt->set_type(GLMessage::DataType::INT); rt->add_intvalue((int)retValue); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) retValue, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); return retValue; @@ -2311,11 +2857,19 @@ void GLTrace_glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetTexParameterfv(target, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) params, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -2344,11 +2898,19 @@ void GLTrace_glGetTexParameteriv(GLenum target, GLenum pname, GLint* params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetTexParameteriv(target, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) params, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -2377,11 +2939,19 @@ void GLTrace_glGetUniformfv(GLuint program, GLint location, GLfloat* params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetUniformfv(program, location, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) params, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -2410,11 +2980,19 @@ void GLTrace_glGetUniformiv(GLuint program, GLint location, GLint* params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetUniformiv(program, location, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) params, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -2437,9 +3015,11 @@ int GLTrace_glGetUniformLocation(GLuint program, const GLchar* name) { arg_name->add_intvalue((int)name); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); int retValue = glContext->hooks->gl.glGetUniformLocation(program, name); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); // set return value GLMessage_DataType *rt = glmsg.mutable_returnvalue(); @@ -2447,7 +3027,13 @@ int GLTrace_glGetUniformLocation(GLuint program, const GLchar* name) { rt->set_type(GLMessage::DataType::INT); rt->add_intvalue(retValue); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) name, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); return retValue; @@ -2478,11 +3064,19 @@ void GLTrace_glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetVertexAttribfv(index, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) params, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -2511,11 +3105,19 @@ void GLTrace_glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetVertexAttribiv(index, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) params, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -2544,11 +3146,19 @@ void GLTrace_glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** poin arg_pointer->add_intvalue((int)pointer); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetVertexAttribPointerv(index, pname, pointer); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) pointer, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -2571,11 +3181,18 @@ void GLTrace_glHint(GLenum target, GLenum mode) { arg_mode->add_intvalue((int)mode); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glHint(target, mode); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -2592,9 +3209,11 @@ GLboolean GLTrace_glIsBuffer(GLuint buffer) { arg_buffer->add_intvalue(buffer); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); GLboolean retValue = glContext->hooks->gl.glIsBuffer(buffer); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); // set return value GLMessage_DataType *rt = glmsg.mutable_returnvalue(); @@ -2602,7 +3221,12 @@ GLboolean GLTrace_glIsBuffer(GLuint buffer) { rt->set_type(GLMessage::DataType::BOOL); rt->add_boolvalue(retValue); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); return retValue; @@ -2621,9 +3245,11 @@ GLboolean GLTrace_glIsEnabled(GLenum cap) { arg_cap->add_intvalue((int)cap); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); GLboolean retValue = glContext->hooks->gl.glIsEnabled(cap); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); // set return value GLMessage_DataType *rt = glmsg.mutable_returnvalue(); @@ -2631,7 +3257,12 @@ GLboolean GLTrace_glIsEnabled(GLenum cap) { rt->set_type(GLMessage::DataType::BOOL); rt->add_boolvalue(retValue); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); return retValue; @@ -2650,9 +3281,11 @@ GLboolean GLTrace_glIsFramebuffer(GLuint framebuffer) { arg_framebuffer->add_intvalue(framebuffer); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); GLboolean retValue = glContext->hooks->gl.glIsFramebuffer(framebuffer); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); // set return value GLMessage_DataType *rt = glmsg.mutable_returnvalue(); @@ -2660,7 +3293,12 @@ GLboolean GLTrace_glIsFramebuffer(GLuint framebuffer) { rt->set_type(GLMessage::DataType::BOOL); rt->add_boolvalue(retValue); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); return retValue; @@ -2679,9 +3317,11 @@ GLboolean GLTrace_glIsProgram(GLuint program) { arg_program->add_intvalue(program); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); GLboolean retValue = glContext->hooks->gl.glIsProgram(program); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); // set return value GLMessage_DataType *rt = glmsg.mutable_returnvalue(); @@ -2689,7 +3329,12 @@ GLboolean GLTrace_glIsProgram(GLuint program) { rt->set_type(GLMessage::DataType::BOOL); rt->add_boolvalue(retValue); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); return retValue; @@ -2708,9 +3353,11 @@ GLboolean GLTrace_glIsRenderbuffer(GLuint renderbuffer) { arg_renderbuffer->add_intvalue(renderbuffer); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); GLboolean retValue = glContext->hooks->gl.glIsRenderbuffer(renderbuffer); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); // set return value GLMessage_DataType *rt = glmsg.mutable_returnvalue(); @@ -2718,7 +3365,12 @@ GLboolean GLTrace_glIsRenderbuffer(GLuint renderbuffer) { rt->set_type(GLMessage::DataType::BOOL); rt->add_boolvalue(retValue); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); return retValue; @@ -2737,9 +3389,11 @@ GLboolean GLTrace_glIsShader(GLuint shader) { arg_shader->add_intvalue(shader); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); GLboolean retValue = glContext->hooks->gl.glIsShader(shader); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); // set return value GLMessage_DataType *rt = glmsg.mutable_returnvalue(); @@ -2747,7 +3401,12 @@ GLboolean GLTrace_glIsShader(GLuint shader) { rt->set_type(GLMessage::DataType::BOOL); rt->add_boolvalue(retValue); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); return retValue; @@ -2766,9 +3425,11 @@ GLboolean GLTrace_glIsTexture(GLuint texture) { arg_texture->add_intvalue(texture); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); GLboolean retValue = glContext->hooks->gl.glIsTexture(texture); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); // set return value GLMessage_DataType *rt = glmsg.mutable_returnvalue(); @@ -2776,7 +3437,12 @@ GLboolean GLTrace_glIsTexture(GLuint texture) { rt->set_type(GLMessage::DataType::BOOL); rt->add_boolvalue(retValue); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); return retValue; @@ -2795,11 +3461,18 @@ void GLTrace_glLineWidth(GLfloat width) { arg_width->add_floatvalue(width); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glLineWidth(width); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -2816,11 +3489,18 @@ void GLTrace_glLinkProgram(GLuint program) { arg_program->add_intvalue(program); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glLinkProgram(program); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -2843,11 +3523,18 @@ void GLTrace_glPixelStorei(GLenum pname, GLint param) { arg_param->add_intvalue(param); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glPixelStorei(pname, param); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -2870,11 +3557,18 @@ void GLTrace_glPolygonOffset(GLfloat factor, GLfloat units) { arg_units->add_floatvalue(units); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glPolygonOffset(factor, units); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -2927,11 +3621,19 @@ void GLTrace_glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenu arg_pixels->add_intvalue((int)pixels); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glReadPixels(x, y, width, height, format, type, pixels); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) pixels, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -2942,11 +3644,18 @@ void GLTrace_glReleaseShaderCompiler(void) { glmsg.set_function(GLMessage::glReleaseShaderCompiler); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glReleaseShaderCompiler(); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -2981,11 +3690,18 @@ void GLTrace_glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei arg_height->add_intvalue(height); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glRenderbufferStorage(target, internalformat, width, height); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -3008,11 +3724,18 @@ void GLTrace_glSampleCoverage(GLclampf value, GLboolean invert) { arg_invert->add_boolvalue(invert); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glSampleCoverage(value, invert); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -3047,11 +3770,18 @@ void GLTrace_glScissor(GLint x, GLint y, GLsizei width, GLsizei height) { arg_height->add_intvalue(height); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glScissor(x, y, width, height); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -3092,11 +3822,20 @@ void GLTrace_glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryforma arg_length->add_intvalue(length); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glShaderBinary(n, shaders, binaryformat, binary, length); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) shaders, + (void *) binary, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -3131,11 +3870,20 @@ void GLTrace_glShaderSource(GLuint shader, GLsizei count, const GLchar** string, arg_length->add_intvalue((int)length); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glShaderSource(shader, count, string, length); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) string, + (void *) length, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -3164,11 +3912,18 @@ void GLTrace_glStencilFunc(GLenum func, GLint ref, GLuint mask) { arg_mask->add_intvalue(mask); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glStencilFunc(func, ref, mask); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -3203,11 +3958,18 @@ void GLTrace_glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint m arg_mask->add_intvalue(mask); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glStencilFuncSeparate(face, func, ref, mask); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -3224,11 +3986,18 @@ void GLTrace_glStencilMask(GLuint mask) { arg_mask->add_intvalue(mask); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glStencilMask(mask); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -3251,11 +4020,18 @@ void GLTrace_glStencilMaskSeparate(GLenum face, GLuint mask) { arg_mask->add_intvalue(mask); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glStencilMaskSeparate(face, mask); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -3284,11 +4060,18 @@ void GLTrace_glStencilOp(GLenum fail, GLenum zfail, GLenum zpass) { arg_zpass->add_intvalue((int)zpass); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glStencilOp(fail, zfail, zpass); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -3323,11 +4106,18 @@ void GLTrace_glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum arg_zpass->add_intvalue((int)zpass); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glStencilOpSeparate(face, fail, zfail, zpass); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -3392,11 +4182,19 @@ void GLTrace_glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsi arg_pixels->add_intvalue((int)pixels); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) pixels, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -3425,11 +4223,18 @@ void GLTrace_glTexParameterf(GLenum target, GLenum pname, GLfloat param) { arg_param->add_floatvalue(param); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glTexParameterf(target, pname, param); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -3458,11 +4263,19 @@ void GLTrace_glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glTexParameterfv(target, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) params, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -3491,11 +4304,18 @@ void GLTrace_glTexParameteri(GLenum target, GLenum pname, GLint param) { arg_param->add_intvalue(param); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glTexParameteri(target, pname, param); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -3524,11 +4344,19 @@ void GLTrace_glTexParameteriv(GLenum target, GLenum pname, const GLint* params) arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glTexParameteriv(target, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) params, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -3593,11 +4421,19 @@ void GLTrace_glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yo arg_pixels->add_intvalue((int)pixels); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) pixels, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -3620,11 +4456,18 @@ void GLTrace_glUniform1f(GLint location, GLfloat x) { arg_x->add_floatvalue(x); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glUniform1f(location, x); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -3653,11 +4496,19 @@ void GLTrace_glUniform1fv(GLint location, GLsizei count, const GLfloat* v) { arg_v->add_intvalue((int)v); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glUniform1fv(location, count, v); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) v, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -3680,11 +4531,18 @@ void GLTrace_glUniform1i(GLint location, GLint x) { arg_x->add_intvalue(x); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glUniform1i(location, x); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -3713,11 +4571,19 @@ void GLTrace_glUniform1iv(GLint location, GLsizei count, const GLint* v) { arg_v->add_intvalue((int)v); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glUniform1iv(location, count, v); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) v, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -3746,11 +4612,18 @@ void GLTrace_glUniform2f(GLint location, GLfloat x, GLfloat y) { arg_y->add_floatvalue(y); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glUniform2f(location, x, y); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -3779,11 +4652,19 @@ void GLTrace_glUniform2fv(GLint location, GLsizei count, const GLfloat* v) { arg_v->add_intvalue((int)v); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glUniform2fv(location, count, v); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) v, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -3812,11 +4693,18 @@ void GLTrace_glUniform2i(GLint location, GLint x, GLint y) { arg_y->add_intvalue(y); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glUniform2i(location, x, y); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -3845,11 +4733,19 @@ void GLTrace_glUniform2iv(GLint location, GLsizei count, const GLint* v) { arg_v->add_intvalue((int)v); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glUniform2iv(location, count, v); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) v, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -3884,11 +4780,18 @@ void GLTrace_glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z) { arg_z->add_floatvalue(z); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glUniform3f(location, x, y, z); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -3917,11 +4820,19 @@ void GLTrace_glUniform3fv(GLint location, GLsizei count, const GLfloat* v) { arg_v->add_intvalue((int)v); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glUniform3fv(location, count, v); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) v, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -3956,11 +4867,18 @@ void GLTrace_glUniform3i(GLint location, GLint x, GLint y, GLint z) { arg_z->add_intvalue(z); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glUniform3i(location, x, y, z); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -3989,11 +4907,19 @@ void GLTrace_glUniform3iv(GLint location, GLsizei count, const GLint* v) { arg_v->add_intvalue((int)v); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glUniform3iv(location, count, v); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) v, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -4034,11 +4960,18 @@ void GLTrace_glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloa arg_w->add_floatvalue(w); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glUniform4f(location, x, y, z, w); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -4067,11 +5000,19 @@ void GLTrace_glUniform4fv(GLint location, GLsizei count, const GLfloat* v) { arg_v->add_intvalue((int)v); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glUniform4fv(location, count, v); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) v, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -4112,11 +5053,18 @@ void GLTrace_glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w) { arg_w->add_intvalue(w); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glUniform4i(location, x, y, z, w); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -4145,11 +5093,19 @@ void GLTrace_glUniform4iv(GLint location, GLsizei count, const GLint* v) { arg_v->add_intvalue((int)v); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glUniform4iv(location, count, v); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) v, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -4184,11 +5140,19 @@ void GLTrace_glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpo arg_value->add_intvalue((int)value); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glUniformMatrix2fv(location, count, transpose, value); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) value, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -4223,11 +5187,19 @@ void GLTrace_glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpo arg_value->add_intvalue((int)value); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glUniformMatrix3fv(location, count, transpose, value); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) value, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -4262,11 +5234,19 @@ void GLTrace_glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpo arg_value->add_intvalue((int)value); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glUniformMatrix4fv(location, count, transpose, value); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) value, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -4283,11 +5263,18 @@ void GLTrace_glUseProgram(GLuint program) { arg_program->add_intvalue(program); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glUseProgram(program); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -4304,11 +5291,18 @@ void GLTrace_glValidateProgram(GLuint program) { arg_program->add_intvalue(program); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glValidateProgram(program); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -4331,11 +5325,18 @@ void GLTrace_glVertexAttrib1f(GLuint indx, GLfloat x) { arg_x->add_floatvalue(x); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glVertexAttrib1f(indx, x); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -4358,11 +5359,19 @@ void GLTrace_glVertexAttrib1fv(GLuint indx, const GLfloat* values) { arg_values->add_intvalue((int)values); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glVertexAttrib1fv(indx, values); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) values, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -4391,11 +5400,18 @@ void GLTrace_glVertexAttrib2f(GLuint indx, GLfloat x, GLfloat y) { arg_y->add_floatvalue(y); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glVertexAttrib2f(indx, x, y); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -4418,11 +5434,19 @@ void GLTrace_glVertexAttrib2fv(GLuint indx, const GLfloat* values) { arg_values->add_intvalue((int)values); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glVertexAttrib2fv(indx, values); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) values, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -4457,11 +5481,18 @@ void GLTrace_glVertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z) { arg_z->add_floatvalue(z); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glVertexAttrib3f(indx, x, y, z); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -4484,11 +5515,19 @@ void GLTrace_glVertexAttrib3fv(GLuint indx, const GLfloat* values) { arg_values->add_intvalue((int)values); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glVertexAttrib3fv(indx, values); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) values, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -4529,11 +5568,18 @@ void GLTrace_glVertexAttrib4f(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfl arg_w->add_floatvalue(w); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glVertexAttrib4f(indx, x, y, z, w); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -4556,11 +5602,19 @@ void GLTrace_glVertexAttrib4fv(GLuint indx, const GLfloat* values) { arg_values->add_intvalue((int)values); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glVertexAttrib4fv(indx, values); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) values, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -4607,11 +5661,19 @@ void GLTrace_glVertexAttribPointer(GLuint indx, GLint size, GLenum type, GLboole arg_ptr->add_intvalue((int)ptr); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glVertexAttribPointer(indx, size, type, normalized, stride, ptr); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) ptr, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -4646,11 +5708,18 @@ void GLTrace_glViewport(GLint x, GLint y, GLsizei width, GLsizei height) { arg_height->add_intvalue(height); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glViewport(x, y, width, height); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -4676,11 +5745,19 @@ void GLTrace_glEGLImageTargetTexture2DOES(GLenum target, GLeglImageOES image) { arg_image->add_intvalue((int)image); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glEGLImageTargetTexture2DOES(target, image); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) image, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -4703,11 +5780,19 @@ void GLTrace_glEGLImageTargetRenderbufferStorageOES(GLenum target, GLeglImageOES arg_image->add_intvalue((int)image); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glEGLImageTargetRenderbufferStorageOES(target, image); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) image, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -4748,11 +5833,21 @@ void GLTrace_glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *len arg_binary->add_intvalue((int)binary); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetProgramBinaryOES(program, bufSize, length, binaryFormat, binary); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) length, + (void *) binaryFormat, + (void *) binary, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -4787,11 +5882,19 @@ void GLTrace_glProgramBinaryOES(GLuint program, GLenum binaryFormat, const GLvoi arg_length->add_intvalue(length); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glProgramBinaryOES(program, binaryFormat, binary, length); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) binary, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -4814,9 +5917,11 @@ void* GLTrace_glMapBufferOES(GLenum target, GLenum access) { arg_access->add_intvalue((int)access); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); void* retValue = glContext->hooks->gl.glMapBufferOES(target, access); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); // set return value GLMessage_DataType *rt = glmsg.mutable_returnvalue(); @@ -4824,7 +5929,13 @@ void* GLTrace_glMapBufferOES(GLenum target, GLenum access) { rt->set_type(GLMessage::DataType::INT); rt->add_intvalue((int)retValue); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) retValue, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); return retValue; @@ -4843,9 +5954,11 @@ GLboolean GLTrace_glUnmapBufferOES(GLenum target) { arg_target->add_intvalue((int)target); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); GLboolean retValue = glContext->hooks->gl.glUnmapBufferOES(target); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); // set return value GLMessage_DataType *rt = glmsg.mutable_returnvalue(); @@ -4853,7 +5966,12 @@ GLboolean GLTrace_glUnmapBufferOES(GLenum target) { rt->set_type(GLMessage::DataType::BOOL); rt->add_boolvalue(retValue); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); return retValue; @@ -4884,11 +6002,19 @@ void GLTrace_glGetBufferPointervOES(GLenum target, GLenum pname, GLvoid** params arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetBufferPointervOES(target, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) params, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -4959,11 +6085,19 @@ void GLTrace_glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, arg_pixels->add_intvalue((int)pixels); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glTexImage3DOES(target, level, internalformat, width, height, depth, border, format, type, pixels); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) pixels, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -5040,11 +6174,19 @@ void GLTrace_glTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint arg_pixels->add_intvalue((int)pixels); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glTexSubImage3DOES(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) pixels, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -5109,11 +6251,18 @@ void GLTrace_glCopyTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, G arg_height->add_intvalue(height); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glCopyTexSubImage3DOES(target, level, xoffset, yoffset, zoffset, x, y, width, height); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -5178,11 +6327,19 @@ void GLTrace_glCompressedTexImage3DOES(GLenum target, GLint level, GLenum intern arg_data->add_intvalue((int)data); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glCompressedTexImage3DOES(target, level, internalformat, width, height, depth, border, imageSize, data); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) data, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -5259,11 +6416,19 @@ void GLTrace_glCompressedTexSubImage3DOES(GLenum target, GLint level, GLint xoff arg_data->add_intvalue((int)data); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glCompressedTexSubImage3DOES(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) data, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -5310,11 +6475,18 @@ void GLTrace_glFramebufferTexture3DOES(GLenum target, GLenum attachment, GLenum arg_zoffset->add_intvalue(zoffset); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glFramebufferTexture3DOES(target, attachment, textarget, texture, level, zoffset); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -5331,11 +6503,18 @@ void GLTrace_glBindVertexArrayOES(GLuint array) { arg_array->add_intvalue(array); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glBindVertexArrayOES(array); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -5358,11 +6537,19 @@ void GLTrace_glDeleteVertexArraysOES(GLsizei n, const GLuint *arrays) { arg_arrays->add_intvalue((int)arrays); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glDeleteVertexArraysOES(n, arrays); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) arrays, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -5385,11 +6572,19 @@ void GLTrace_glGenVertexArraysOES(GLsizei n, GLuint *arrays) { arg_arrays->add_intvalue((int)arrays); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGenVertexArraysOES(n, arrays); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) arrays, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -5406,9 +6601,11 @@ GLboolean GLTrace_glIsVertexArrayOES(GLuint array) { arg_array->add_intvalue(array); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); GLboolean retValue = glContext->hooks->gl.glIsVertexArrayOES(array); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); // set return value GLMessage_DataType *rt = glmsg.mutable_returnvalue(); @@ -5416,7 +6613,12 @@ GLboolean GLTrace_glIsVertexArrayOES(GLuint array) { rt->set_type(GLMessage::DataType::BOOL); rt->add_boolvalue(retValue); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); return retValue; @@ -5447,11 +6649,20 @@ void GLTrace_glGetPerfMonitorGroupsAMD(GLint *numGroups, GLsizei groupsSize, GLu arg_groups->add_intvalue((int)groups); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetPerfMonitorGroupsAMD(numGroups, groupsSize, groups); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) numGroups, + (void *) groups, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -5492,11 +6703,21 @@ void GLTrace_glGetPerfMonitorCountersAMD(GLuint group, GLint *numCounters, GLint arg_counters->add_intvalue((int)counters); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetPerfMonitorCountersAMD(group, numCounters, maxActiveCounters, counterSize, counters); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) numCounters, + (void *) maxActiveCounters, + (void *) counters, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -5531,11 +6752,20 @@ void GLTrace_glGetPerfMonitorGroupStringAMD(GLuint group, GLsizei bufSize, GLsiz arg_groupString->add_intvalue((int)groupString); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetPerfMonitorGroupStringAMD(group, bufSize, length, groupString); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) length, + (void *) groupString, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -5576,11 +6806,20 @@ void GLTrace_glGetPerfMonitorCounterStringAMD(GLuint group, GLuint counter, GLsi arg_counterString->add_intvalue((int)counterString); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetPerfMonitorCounterStringAMD(group, counter, bufSize, length, counterString); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) length, + (void *) counterString, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -5615,11 +6854,19 @@ void GLTrace_glGetPerfMonitorCounterInfoAMD(GLuint group, GLuint counter, GLenum arg_data->add_intvalue((int)data); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetPerfMonitorCounterInfoAMD(group, counter, pname, data); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) data, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -5642,11 +6889,19 @@ void GLTrace_glGenPerfMonitorsAMD(GLsizei n, GLuint *monitors) { arg_monitors->add_intvalue((int)monitors); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGenPerfMonitorsAMD(n, monitors); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) monitors, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -5669,11 +6924,19 @@ void GLTrace_glDeletePerfMonitorsAMD(GLsizei n, GLuint *monitors) { arg_monitors->add_intvalue((int)monitors); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glDeletePerfMonitorsAMD(n, monitors); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) monitors, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -5714,11 +6977,19 @@ void GLTrace_glSelectPerfMonitorCountersAMD(GLuint monitor, GLboolean enable, GL arg_countersList->add_intvalue((int)countersList); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glSelectPerfMonitorCountersAMD(monitor, enable, group, numCounters, countersList); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) countersList, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -5735,11 +7006,18 @@ void GLTrace_glBeginPerfMonitorAMD(GLuint monitor) { arg_monitor->add_intvalue(monitor); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glBeginPerfMonitorAMD(monitor); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -5756,11 +7034,18 @@ void GLTrace_glEndPerfMonitorAMD(GLuint monitor) { arg_monitor->add_intvalue(monitor); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glEndPerfMonitorAMD(monitor); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -5801,11 +7086,20 @@ void GLTrace_glGetPerfMonitorCounterDataAMD(GLuint monitor, GLenum pname, GLsize arg_bytesWritten->add_intvalue((int)bytesWritten); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetPerfMonitorCounterDataAMD(monitor, pname, dataSize, data, bytesWritten); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) data, + (void *) bytesWritten, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -5876,11 +7170,18 @@ void GLTrace_glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint arg_filter->add_intvalue((int)filter); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glBlitFramebufferANGLE(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -5921,11 +7222,18 @@ void GLTrace_glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei sample arg_height->add_intvalue(height); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glRenderbufferStorageMultisampleANGLE(target, samples, internalformat, width, height); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -5966,11 +7274,18 @@ void GLTrace_glRenderbufferStorageMultisampleAPPLE(GLenum target, GLsizei sample arg_height->add_intvalue(height); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glRenderbufferStorageMultisampleAPPLE(target, samples, internalformat, width, height); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -5981,11 +7296,18 @@ void GLTrace_glResolveMultisampleFramebufferAPPLE(void) { glmsg.set_function(GLMessage::glResolveMultisampleFramebufferAPPLE); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glResolveMultisampleFramebufferAPPLE(); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -6020,11 +7342,19 @@ void GLTrace_glLabelObjectEXT(GLenum type, GLuint object, GLsizei length, const arg_label->add_intvalue((int)label); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glLabelObjectEXT(type, object, length, label); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) label, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -6065,11 +7395,20 @@ void GLTrace_glGetObjectLabelEXT(GLenum type, GLuint object, GLsizei bufSize, GL arg_label->add_intvalue((int)label); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetObjectLabelEXT(type, object, bufSize, length, label); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) length, + (void *) label, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -6092,11 +7431,19 @@ void GLTrace_glInsertEventMarkerEXT(GLsizei length, const GLchar *marker) { arg_marker->add_intvalue((int)marker); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glInsertEventMarkerEXT(length, marker); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) marker, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -6119,11 +7466,19 @@ void GLTrace_glPushGroupMarkerEXT(GLsizei length, const GLchar *marker) { arg_marker->add_intvalue((int)marker); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glPushGroupMarkerEXT(length, marker); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) marker, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -6134,11 +7489,18 @@ void GLTrace_glPopGroupMarkerEXT(void) { glmsg.set_function(GLMessage::glPopGroupMarkerEXT); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glPopGroupMarkerEXT(); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -6167,11 +7529,19 @@ void GLTrace_glDiscardFramebufferEXT(GLenum target, GLsizei numAttachments, cons arg_attachments->add_intvalue((int)attachments); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glDiscardFramebufferEXT(target, numAttachments, attachments); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) attachments, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -6212,11 +7582,18 @@ void GLTrace_glRenderbufferStorageMultisampleEXT(GLenum target, GLsizei samples, arg_height->add_intvalue(height); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glRenderbufferStorageMultisampleEXT(target, samples, internalformat, width, height); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -6263,11 +7640,18 @@ void GLTrace_glFramebufferTexture2DMultisampleEXT(GLenum target, GLenum attachme arg_samples->add_intvalue(samples); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glFramebufferTexture2DMultisampleEXT(target, attachment, textarget, texture, level, samples); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -6302,11 +7686,20 @@ void GLTrace_glMultiDrawArraysEXT(GLenum mode, GLint *first, GLsizei *count, GLs arg_primcount->add_intvalue(primcount); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glMultiDrawArraysEXT(mode, first, count, primcount); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) first, + (void *) count, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -6347,11 +7740,20 @@ void GLTrace_glMultiDrawElementsEXT(GLenum mode, const GLsizei *count, GLenum ty arg_primcount->add_intvalue(primcount); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glMultiDrawElementsEXT(mode, count, type, indices, primcount); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) count, + (void *) indices, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -6374,11 +7776,19 @@ void GLTrace_glGenQueriesEXT(GLsizei n, GLuint *ids) { arg_ids->add_intvalue((int)ids); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGenQueriesEXT(n, ids); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) ids, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -6401,11 +7811,19 @@ void GLTrace_glDeleteQueriesEXT(GLsizei n, const GLuint *ids) { arg_ids->add_intvalue((int)ids); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glDeleteQueriesEXT(n, ids); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) ids, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -6422,9 +7840,11 @@ GLboolean GLTrace_glIsQueryEXT(GLuint id) { arg_id->add_intvalue(id); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); GLboolean retValue = glContext->hooks->gl.glIsQueryEXT(id); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); // set return value GLMessage_DataType *rt = glmsg.mutable_returnvalue(); @@ -6432,7 +7852,12 @@ GLboolean GLTrace_glIsQueryEXT(GLuint id) { rt->set_type(GLMessage::DataType::BOOL); rt->add_boolvalue(retValue); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); return retValue; @@ -6457,11 +7882,18 @@ void GLTrace_glBeginQueryEXT(GLenum target, GLuint id) { arg_id->add_intvalue(id); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glBeginQueryEXT(target, id); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -6478,11 +7910,18 @@ void GLTrace_glEndQueryEXT(GLenum target) { arg_target->add_intvalue((int)target); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glEndQueryEXT(target); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -6511,11 +7950,19 @@ void GLTrace_glGetQueryivEXT(GLenum target, GLenum pname, GLint *params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetQueryivEXT(target, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) params, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -6544,11 +7991,19 @@ void GLTrace_glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetQueryObjectuivEXT(id, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) params, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -6559,9 +8014,11 @@ GLenum GLTrace_glGetGraphicsResetStatusEXT(void) { glmsg.set_function(GLMessage::glGetGraphicsResetStatusEXT); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); GLenum retValue = glContext->hooks->gl.glGetGraphicsResetStatusEXT(); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); // set return value GLMessage_DataType *rt = glmsg.mutable_returnvalue(); @@ -6569,7 +8026,12 @@ GLenum GLTrace_glGetGraphicsResetStatusEXT(void) { rt->set_type(GLMessage::DataType::ENUM); rt->add_intvalue((int)retValue); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); return retValue; @@ -6630,11 +8092,19 @@ void GLTrace_glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height, G arg_data->add_intvalue((int)data); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glReadnPixelsEXT(x, y, width, height, format, type, bufSize, data); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) data, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -6669,11 +8139,19 @@ void GLTrace_glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetnUniformfvEXT(program, location, bufSize, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) params, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -6708,11 +8186,19 @@ void GLTrace_glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetnUniformivEXT(program, location, bufSize, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) params, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -6741,11 +8227,18 @@ void GLTrace_glUseProgramStagesEXT(GLuint pipeline, GLbitfield stages, GLuint pr arg_program->add_intvalue(program); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glUseProgramStagesEXT(pipeline, stages, program); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -6768,11 +8261,18 @@ void GLTrace_glActiveShaderProgramEXT(GLuint pipeline, GLuint program) { arg_program->add_intvalue(program); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glActiveShaderProgramEXT(pipeline, program); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -6801,9 +8301,11 @@ GLuint GLTrace_glCreateShaderProgramvEXT(GLenum type, GLsizei count, const GLcha arg_strings->add_intvalue((int)strings); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); GLuint retValue = glContext->hooks->gl.glCreateShaderProgramvEXT(type, count, strings); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); // set return value GLMessage_DataType *rt = glmsg.mutable_returnvalue(); @@ -6811,7 +8313,13 @@ GLuint GLTrace_glCreateShaderProgramvEXT(GLenum type, GLsizei count, const GLcha rt->set_type(GLMessage::DataType::INT); rt->add_intvalue(retValue); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) strings, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); return retValue; @@ -6830,11 +8338,18 @@ void GLTrace_glBindProgramPipelineEXT(GLuint pipeline) { arg_pipeline->add_intvalue(pipeline); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glBindProgramPipelineEXT(pipeline); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -6857,11 +8372,19 @@ void GLTrace_glDeleteProgramPipelinesEXT(GLsizei n, const GLuint *pipelines) { arg_pipelines->add_intvalue((int)pipelines); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glDeleteProgramPipelinesEXT(n, pipelines); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) pipelines, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -6884,11 +8407,19 @@ void GLTrace_glGenProgramPipelinesEXT(GLsizei n, GLuint *pipelines) { arg_pipelines->add_intvalue((int)pipelines); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGenProgramPipelinesEXT(n, pipelines); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) pipelines, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -6905,9 +8436,11 @@ GLboolean GLTrace_glIsProgramPipelineEXT(GLuint pipeline) { arg_pipeline->add_intvalue(pipeline); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); GLboolean retValue = glContext->hooks->gl.glIsProgramPipelineEXT(pipeline); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); // set return value GLMessage_DataType *rt = glmsg.mutable_returnvalue(); @@ -6915,7 +8448,12 @@ GLboolean GLTrace_glIsProgramPipelineEXT(GLuint pipeline) { rt->set_type(GLMessage::DataType::BOOL); rt->add_boolvalue(retValue); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); return retValue; @@ -6946,11 +8484,18 @@ void GLTrace_glProgramParameteriEXT(GLuint program, GLenum pname, GLint value) { arg_value->add_intvalue(value); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glProgramParameteriEXT(program, pname, value); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -6979,11 +8524,19 @@ void GLTrace_glGetProgramPipelineivEXT(GLuint pipeline, GLenum pname, GLint *par arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetProgramPipelineivEXT(pipeline, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) params, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -7012,11 +8565,18 @@ void GLTrace_glProgramUniform1iEXT(GLuint program, GLint location, GLint x) { arg_x->add_intvalue(x); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glProgramUniform1iEXT(program, location, x); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -7051,11 +8611,18 @@ void GLTrace_glProgramUniform2iEXT(GLuint program, GLint location, GLint x, GLin arg_y->add_intvalue(y); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glProgramUniform2iEXT(program, location, x, y); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -7096,11 +8663,18 @@ void GLTrace_glProgramUniform3iEXT(GLuint program, GLint location, GLint x, GLin arg_z->add_intvalue(z); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glProgramUniform3iEXT(program, location, x, y, z); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -7147,11 +8721,18 @@ void GLTrace_glProgramUniform4iEXT(GLuint program, GLint location, GLint x, GLin arg_w->add_intvalue(w); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glProgramUniform4iEXT(program, location, x, y, z, w); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -7180,11 +8761,18 @@ void GLTrace_glProgramUniform1fEXT(GLuint program, GLint location, GLfloat x) { arg_x->add_floatvalue(x); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glProgramUniform1fEXT(program, location, x); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -7219,11 +8807,18 @@ void GLTrace_glProgramUniform2fEXT(GLuint program, GLint location, GLfloat x, GL arg_y->add_floatvalue(y); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glProgramUniform2fEXT(program, location, x, y); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -7264,11 +8859,18 @@ void GLTrace_glProgramUniform3fEXT(GLuint program, GLint location, GLfloat x, GL arg_z->add_floatvalue(z); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glProgramUniform3fEXT(program, location, x, y, z); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -7315,11 +8917,18 @@ void GLTrace_glProgramUniform4fEXT(GLuint program, GLint location, GLfloat x, GL arg_w->add_floatvalue(w); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glProgramUniform4fEXT(program, location, x, y, z, w); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -7354,11 +8963,19 @@ void GLTrace_glProgramUniform1ivEXT(GLuint program, GLint location, GLsizei coun arg_value->add_intvalue((int)value); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glProgramUniform1ivEXT(program, location, count, value); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) value, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -7393,11 +9010,19 @@ void GLTrace_glProgramUniform2ivEXT(GLuint program, GLint location, GLsizei coun arg_value->add_intvalue((int)value); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glProgramUniform2ivEXT(program, location, count, value); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) value, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -7432,11 +9057,19 @@ void GLTrace_glProgramUniform3ivEXT(GLuint program, GLint location, GLsizei coun arg_value->add_intvalue((int)value); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glProgramUniform3ivEXT(program, location, count, value); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) value, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -7471,11 +9104,19 @@ void GLTrace_glProgramUniform4ivEXT(GLuint program, GLint location, GLsizei coun arg_value->add_intvalue((int)value); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glProgramUniform4ivEXT(program, location, count, value); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) value, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -7510,11 +9151,19 @@ void GLTrace_glProgramUniform1fvEXT(GLuint program, GLint location, GLsizei coun arg_value->add_intvalue((int)value); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glProgramUniform1fvEXT(program, location, count, value); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) value, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -7549,11 +9198,19 @@ void GLTrace_glProgramUniform2fvEXT(GLuint program, GLint location, GLsizei coun arg_value->add_intvalue((int)value); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glProgramUniform2fvEXT(program, location, count, value); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) value, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -7588,11 +9245,19 @@ void GLTrace_glProgramUniform3fvEXT(GLuint program, GLint location, GLsizei coun arg_value->add_intvalue((int)value); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glProgramUniform3fvEXT(program, location, count, value); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) value, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -7627,11 +9292,19 @@ void GLTrace_glProgramUniform4fvEXT(GLuint program, GLint location, GLsizei coun arg_value->add_intvalue((int)value); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glProgramUniform4fvEXT(program, location, count, value); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) value, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -7672,11 +9345,19 @@ void GLTrace_glProgramUniformMatrix2fvEXT(GLuint program, GLint location, GLsize arg_value->add_intvalue((int)value); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glProgramUniformMatrix2fvEXT(program, location, count, transpose, value); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) value, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -7717,11 +9398,19 @@ void GLTrace_glProgramUniformMatrix3fvEXT(GLuint program, GLint location, GLsize arg_value->add_intvalue((int)value); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glProgramUniformMatrix3fvEXT(program, location, count, transpose, value); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) value, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -7762,11 +9451,19 @@ void GLTrace_glProgramUniformMatrix4fvEXT(GLuint program, GLint location, GLsize arg_value->add_intvalue((int)value); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glProgramUniformMatrix4fvEXT(program, location, count, transpose, value); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) value, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -7783,11 +9480,18 @@ void GLTrace_glValidateProgramPipelineEXT(GLuint pipeline) { arg_pipeline->add_intvalue(pipeline); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glValidateProgramPipelineEXT(pipeline); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -7822,11 +9526,20 @@ void GLTrace_glGetProgramPipelineInfoLogEXT(GLuint pipeline, GLsizei bufSize, GL arg_infoLog->add_intvalue((int)infoLog); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetProgramPipelineInfoLogEXT(pipeline, bufSize, length, infoLog); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) length, + (void *) infoLog, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -7861,11 +9574,18 @@ void GLTrace_glTexStorage1DEXT(GLenum target, GLsizei levels, GLenum internalfor arg_width->add_intvalue(width); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glTexStorage1DEXT(target, levels, internalformat, width); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -7906,11 +9626,18 @@ void GLTrace_glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalfor arg_height->add_intvalue(height); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glTexStorage2DEXT(target, levels, internalformat, width, height); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -7957,11 +9684,18 @@ void GLTrace_glTexStorage3DEXT(GLenum target, GLsizei levels, GLenum internalfor arg_depth->add_intvalue(depth); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glTexStorage3DEXT(target, levels, internalformat, width, height, depth); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -8002,11 +9736,18 @@ void GLTrace_glTextureStorage1DEXT(GLuint texture, GLenum target, GLsizei levels arg_width->add_intvalue(width); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glTextureStorage1DEXT(texture, target, levels, internalformat, width); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -8053,11 +9794,18 @@ void GLTrace_glTextureStorage2DEXT(GLuint texture, GLenum target, GLsizei levels arg_height->add_intvalue(height); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glTextureStorage2DEXT(texture, target, levels, internalformat, width, height); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -8110,11 +9858,18 @@ void GLTrace_glTextureStorage3DEXT(GLuint texture, GLenum target, GLsizei levels arg_depth->add_intvalue(depth); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glTextureStorage3DEXT(texture, target, levels, internalformat, width, height, depth); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -8155,11 +9910,18 @@ void GLTrace_glRenderbufferStorageMultisampleIMG(GLenum target, GLsizei samples, arg_height->add_intvalue(height); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glRenderbufferStorageMultisampleIMG(target, samples, internalformat, width, height); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -8206,11 +9968,18 @@ void GLTrace_glFramebufferTexture2DMultisampleIMG(GLenum target, GLenum attachme arg_samples->add_intvalue(samples); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glFramebufferTexture2DMultisampleIMG(target, attachment, textarget, texture, level, samples); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -8227,11 +9996,18 @@ void GLTrace_glCoverageMaskNV(GLboolean mask) { arg_mask->add_boolvalue(mask); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glCoverageMaskNV(mask); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -8248,11 +10024,18 @@ void GLTrace_glCoverageOperationNV(GLenum operation) { arg_operation->add_intvalue((int)operation); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glCoverageOperationNV(operation); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -8275,11 +10058,19 @@ void GLTrace_glDrawBuffersNV(GLsizei n, const GLenum *bufs) { arg_bufs->add_intvalue((int)bufs); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glDrawBuffersNV(n, bufs); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) bufs, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -8302,11 +10093,19 @@ void GLTrace_glDeleteFencesNV(GLsizei n, const GLuint *fences) { arg_fences->add_intvalue((int)fences); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glDeleteFencesNV(n, fences); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) fences, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -8329,11 +10128,19 @@ void GLTrace_glGenFencesNV(GLsizei n, GLuint *fences) { arg_fences->add_intvalue((int)fences); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGenFencesNV(n, fences); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) fences, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -8350,9 +10157,11 @@ GLboolean GLTrace_glIsFenceNV(GLuint fence) { arg_fence->add_intvalue(fence); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); GLboolean retValue = glContext->hooks->gl.glIsFenceNV(fence); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); // set return value GLMessage_DataType *rt = glmsg.mutable_returnvalue(); @@ -8360,7 +10169,12 @@ GLboolean GLTrace_glIsFenceNV(GLuint fence) { rt->set_type(GLMessage::DataType::BOOL); rt->add_boolvalue(retValue); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); return retValue; @@ -8379,9 +10193,11 @@ GLboolean GLTrace_glTestFenceNV(GLuint fence) { arg_fence->add_intvalue(fence); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); GLboolean retValue = glContext->hooks->gl.glTestFenceNV(fence); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); // set return value GLMessage_DataType *rt = glmsg.mutable_returnvalue(); @@ -8389,7 +10205,12 @@ GLboolean GLTrace_glTestFenceNV(GLuint fence) { rt->set_type(GLMessage::DataType::BOOL); rt->add_boolvalue(retValue); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); return retValue; @@ -8420,11 +10241,19 @@ void GLTrace_glGetFenceivNV(GLuint fence, GLenum pname, GLint *params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetFenceivNV(fence, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) params, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -8441,11 +10270,18 @@ void GLTrace_glFinishFenceNV(GLuint fence) { arg_fence->add_intvalue(fence); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glFinishFenceNV(fence); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -8468,11 +10304,18 @@ void GLTrace_glSetFenceNV(GLuint fence, GLenum condition) { arg_condition->add_intvalue((int)condition); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glSetFenceNV(fence, condition); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -8489,11 +10332,18 @@ void GLTrace_glReadBufferNV(GLenum mode) { arg_mode->add_intvalue((int)mode); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glReadBufferNV(mode); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -8516,11 +10366,18 @@ void GLTrace_glAlphaFuncQCOM(GLenum func, GLclampf ref) { arg_ref->add_floatvalue(ref); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glAlphaFuncQCOM(func, ref); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -8549,11 +10406,20 @@ void GLTrace_glGetDriverControlsQCOM(GLint *num, GLsizei size, GLuint *driverCon arg_driverControls->add_intvalue((int)driverControls); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetDriverControlsQCOM(num, size, driverControls); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) num, + (void *) driverControls, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -8588,11 +10454,20 @@ void GLTrace_glGetDriverControlStringQCOM(GLuint driverControl, GLsizei bufSize, arg_driverControlString->add_intvalue((int)driverControlString); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetDriverControlStringQCOM(driverControl, bufSize, length, driverControlString); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) length, + (void *) driverControlString, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -8609,11 +10484,18 @@ void GLTrace_glEnableDriverControlQCOM(GLuint driverControl) { arg_driverControl->add_intvalue(driverControl); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glEnableDriverControlQCOM(driverControl); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -8630,11 +10512,18 @@ void GLTrace_glDisableDriverControlQCOM(GLuint driverControl) { arg_driverControl->add_intvalue(driverControl); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glDisableDriverControlQCOM(driverControl); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -8663,11 +10552,20 @@ void GLTrace_glExtGetTexturesQCOM(GLuint *textures, GLint maxTextures, GLint *nu arg_numTextures->add_intvalue((int)numTextures); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glExtGetTexturesQCOM(textures, maxTextures, numTextures); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) textures, + (void *) numTextures, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -8696,11 +10594,20 @@ void GLTrace_glExtGetBuffersQCOM(GLuint *buffers, GLint maxBuffers, GLint *numBu arg_numBuffers->add_intvalue((int)numBuffers); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glExtGetBuffersQCOM(buffers, maxBuffers, numBuffers); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) buffers, + (void *) numBuffers, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -8729,11 +10636,20 @@ void GLTrace_glExtGetRenderbuffersQCOM(GLuint *renderbuffers, GLint maxRenderbuf arg_numRenderbuffers->add_intvalue((int)numRenderbuffers); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glExtGetRenderbuffersQCOM(renderbuffers, maxRenderbuffers, numRenderbuffers); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) renderbuffers, + (void *) numRenderbuffers, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -8762,11 +10678,20 @@ void GLTrace_glExtGetFramebuffersQCOM(GLuint *framebuffers, GLint maxFramebuffer arg_numFramebuffers->add_intvalue((int)numFramebuffers); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glExtGetFramebuffersQCOM(framebuffers, maxFramebuffers, numFramebuffers); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) framebuffers, + (void *) numFramebuffers, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -8807,11 +10732,19 @@ void GLTrace_glExtGetTexLevelParameterivQCOM(GLuint texture, GLenum face, GLint arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glExtGetTexLevelParameterivQCOM(texture, face, level, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) params, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -8840,11 +10773,18 @@ void GLTrace_glExtTexObjectStateOverrideiQCOM(GLenum target, GLenum pname, GLint arg_param->add_intvalue(param); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glExtTexObjectStateOverrideiQCOM(target, pname, param); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -8921,11 +10861,19 @@ void GLTrace_glExtGetTexSubImageQCOM(GLenum target, GLint level, GLint xoffset, arg_texels->add_intvalue((int)texels); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glExtGetTexSubImageQCOM(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, texels); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) texels, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -8948,11 +10896,19 @@ void GLTrace_glExtGetBufferPointervQCOM(GLenum target, GLvoid **params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glExtGetBufferPointervQCOM(target, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) params, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -8981,11 +10937,20 @@ void GLTrace_glExtGetShadersQCOM(GLuint *shaders, GLint maxShaders, GLint *numSh arg_numShaders->add_intvalue((int)numShaders); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glExtGetShadersQCOM(shaders, maxShaders, numShaders); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) shaders, + (void *) numShaders, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -9014,11 +10979,20 @@ void GLTrace_glExtGetProgramsQCOM(GLuint *programs, GLint maxPrograms, GLint *nu arg_numPrograms->add_intvalue((int)numPrograms); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glExtGetProgramsQCOM(programs, maxPrograms, numPrograms); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) programs, + (void *) numPrograms, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -9035,9 +11009,11 @@ GLboolean GLTrace_glExtIsProgramBinaryQCOM(GLuint program) { arg_program->add_intvalue(program); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); GLboolean retValue = glContext->hooks->gl.glExtIsProgramBinaryQCOM(program); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); // set return value GLMessage_DataType *rt = glmsg.mutable_returnvalue(); @@ -9045,7 +11021,12 @@ GLboolean GLTrace_glExtIsProgramBinaryQCOM(GLuint program) { rt->set_type(GLMessage::DataType::BOOL); rt->add_boolvalue(retValue); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); return retValue; @@ -9082,11 +11063,20 @@ void GLTrace_glExtGetProgramBinarySourceQCOM(GLuint program, GLenum shadertype, arg_length->add_intvalue((int)length); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glExtGetProgramBinarySourceQCOM(program, shadertype, source, length); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) source, + (void *) length, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -9127,11 +11117,18 @@ void GLTrace_glStartTilingQCOM(GLuint x, GLuint y, GLuint width, GLuint height, arg_preserveMask->add_intvalue(preserveMask); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glStartTilingQCOM(x, y, width, height, preserveMask); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -9148,11 +11145,18 @@ void GLTrace_glEndTilingQCOM(GLbitfield preserveMask) { arg_preserveMask->add_intvalue(preserveMask); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glEndTilingQCOM(preserveMask); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -9178,11 +11182,18 @@ void GLTrace_glAlphaFunc(GLenum func, GLclampf ref) { arg_ref->add_floatvalue(ref); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glAlphaFunc(func, ref); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -9205,11 +11216,19 @@ void GLTrace_glClipPlanef(GLenum plane, const GLfloat *equation) { arg_equation->add_intvalue((int)equation); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glClipPlanef(plane, equation); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) equation, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -9244,11 +11263,18 @@ void GLTrace_glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) arg_alpha->add_floatvalue(alpha); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glColor4f(red, green, blue, alpha); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -9271,11 +11297,18 @@ void GLTrace_glFogf(GLenum pname, GLfloat param) { arg_param->add_floatvalue(param); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glFogf(pname, param); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -9298,11 +11331,19 @@ void GLTrace_glFogfv(GLenum pname, const GLfloat *params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glFogfv(pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) params, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -9349,11 +11390,18 @@ void GLTrace_glFrustumf(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top arg_zFar->add_floatvalue(zFar); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glFrustumf(left, right, bottom, top, zNear, zFar); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -9376,11 +11424,19 @@ void GLTrace_glGetClipPlanef(GLenum pname, GLfloat eqn[4]) { arg_eqn->add_intvalue((int)eqn); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetClipPlanef(pname, eqn); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) eqn, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -9409,11 +11465,19 @@ void GLTrace_glGetLightfv(GLenum light, GLenum pname, GLfloat *params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetLightfv(light, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) params, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -9442,11 +11506,19 @@ void GLTrace_glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetMaterialfv(face, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) params, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -9475,11 +11547,19 @@ void GLTrace_glGetTexEnvfv(GLenum env, GLenum pname, GLfloat *params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetTexEnvfv(env, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) params, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -9502,11 +11582,18 @@ void GLTrace_glLightModelf(GLenum pname, GLfloat param) { arg_param->add_floatvalue(param); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glLightModelf(pname, param); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -9529,11 +11616,19 @@ void GLTrace_glLightModelfv(GLenum pname, const GLfloat *params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glLightModelfv(pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) params, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -9562,11 +11657,18 @@ void GLTrace_glLightf(GLenum light, GLenum pname, GLfloat param) { arg_param->add_floatvalue(param); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glLightf(light, pname, param); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -9595,11 +11697,19 @@ void GLTrace_glLightfv(GLenum light, GLenum pname, const GLfloat *params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glLightfv(light, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) params, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -9616,11 +11726,19 @@ void GLTrace_glLoadMatrixf(const GLfloat *m) { arg_m->add_intvalue((int)m); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glLoadMatrixf(m); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) m, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -9649,11 +11767,18 @@ void GLTrace_glMaterialf(GLenum face, GLenum pname, GLfloat param) { arg_param->add_floatvalue(param); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glMaterialf(face, pname, param); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -9682,11 +11807,19 @@ void GLTrace_glMaterialfv(GLenum face, GLenum pname, const GLfloat *params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glMaterialfv(face, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) params, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -9703,11 +11836,19 @@ void GLTrace_glMultMatrixf(const GLfloat *m) { arg_m->add_intvalue((int)m); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glMultMatrixf(m); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) m, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -9748,11 +11889,18 @@ void GLTrace_glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, G arg_q->add_floatvalue(q); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glMultiTexCoord4f(target, s, t, r, q); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -9781,11 +11929,18 @@ void GLTrace_glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz) { arg_nz->add_floatvalue(nz); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glNormal3f(nx, ny, nz); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -9832,11 +11987,18 @@ void GLTrace_glOrthof(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, arg_zFar->add_floatvalue(zFar); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glOrthof(left, right, bottom, top, zNear, zFar); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -9859,11 +12021,18 @@ void GLTrace_glPointParameterf(GLenum pname, GLfloat param) { arg_param->add_floatvalue(param); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glPointParameterf(pname, param); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -9886,11 +12055,19 @@ void GLTrace_glPointParameterfv(GLenum pname, const GLfloat *params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glPointParameterfv(pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) params, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -9907,11 +12084,18 @@ void GLTrace_glPointSize(GLfloat size) { arg_size->add_floatvalue(size); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glPointSize(size); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -9946,11 +12130,18 @@ void GLTrace_glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z) { arg_z->add_floatvalue(z); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glRotatef(angle, x, y, z); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -9979,11 +12170,18 @@ void GLTrace_glScalef(GLfloat x, GLfloat y, GLfloat z) { arg_z->add_floatvalue(z); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glScalef(x, y, z); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -10012,11 +12210,18 @@ void GLTrace_glTexEnvf(GLenum target, GLenum pname, GLfloat param) { arg_param->add_floatvalue(param); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glTexEnvf(target, pname, param); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -10045,11 +12250,19 @@ void GLTrace_glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glTexEnvfv(target, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) params, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -10078,11 +12291,18 @@ void GLTrace_glTranslatef(GLfloat x, GLfloat y, GLfloat z) { arg_z->add_floatvalue(z); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glTranslatef(x, y, z); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -10105,11 +12325,18 @@ void GLTrace_glAlphaFuncx(GLenum func, GLclampx ref) { arg_ref->add_intvalue(ref); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glAlphaFuncx(func, ref); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -10144,11 +12371,18 @@ void GLTrace_glClearColorx(GLclampx red, GLclampx green, GLclampx blue, GLclampx arg_alpha->add_intvalue(alpha); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glClearColorx(red, green, blue, alpha); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -10165,11 +12399,18 @@ void GLTrace_glClearDepthx(GLclampx depth) { arg_depth->add_intvalue(depth); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glClearDepthx(depth); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -10186,11 +12427,18 @@ void GLTrace_glClientActiveTexture(GLenum texture) { arg_texture->add_intvalue((int)texture); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glClientActiveTexture(texture); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -10213,11 +12461,19 @@ void GLTrace_glClipPlanex(GLenum plane, const GLfixed *equation) { arg_equation->add_intvalue((int)equation); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glClipPlanex(plane, equation); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) equation, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -10252,11 +12508,18 @@ void GLTrace_glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha) arg_alpha->add_intvalue((int)alpha); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glColor4ub(red, green, blue, alpha); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -10291,11 +12554,18 @@ void GLTrace_glColor4x(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha) arg_alpha->add_intvalue(alpha); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glColor4x(red, green, blue, alpha); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -10330,11 +12600,19 @@ void GLTrace_glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoi arg_pointer->add_intvalue((int)pointer); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glColorPointer(size, type, stride, pointer); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) pointer, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -10357,11 +12635,18 @@ void GLTrace_glDepthRangex(GLclampx zNear, GLclampx zFar) { arg_zFar->add_intvalue(zFar); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glDepthRangex(zNear, zFar); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -10378,11 +12663,18 @@ void GLTrace_glDisableClientState(GLenum array) { arg_array->add_intvalue((int)array); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glDisableClientState(array); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -10399,11 +12691,18 @@ void GLTrace_glEnableClientState(GLenum array) { arg_array->add_intvalue((int)array); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glEnableClientState(array); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -10426,11 +12725,18 @@ void GLTrace_glFogx(GLenum pname, GLfixed param) { arg_param->add_intvalue(param); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glFogx(pname, param); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -10453,11 +12759,19 @@ void GLTrace_glFogxv(GLenum pname, const GLfixed *params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glFogxv(pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) params, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -10504,11 +12818,18 @@ void GLTrace_glFrustumx(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top arg_zFar->add_intvalue(zFar); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glFrustumx(left, right, bottom, top, zNear, zFar); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -10531,11 +12852,19 @@ void GLTrace_glGetClipPlanex(GLenum pname, GLfixed eqn[4]) { arg_eqn->add_intvalue((int)eqn); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetClipPlanex(pname, eqn); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) eqn, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -10558,11 +12887,19 @@ void GLTrace_glGetFixedv(GLenum pname, GLfixed *params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetFixedv(pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) params, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -10591,11 +12928,19 @@ void GLTrace_glGetLightxv(GLenum light, GLenum pname, GLfixed *params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetLightxv(light, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) params, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -10624,11 +12969,19 @@ void GLTrace_glGetMaterialxv(GLenum face, GLenum pname, GLfixed *params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetMaterialxv(face, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) params, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -10651,11 +13004,19 @@ void GLTrace_glGetPointerv(GLenum pname, GLvoid **params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetPointerv(pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) params, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -10684,11 +13045,19 @@ void GLTrace_glGetTexEnviv(GLenum env, GLenum pname, GLint *params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetTexEnviv(env, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) params, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -10717,11 +13086,19 @@ void GLTrace_glGetTexEnvxv(GLenum env, GLenum pname, GLfixed *params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetTexEnvxv(env, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) params, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -10750,11 +13127,19 @@ void GLTrace_glGetTexParameterxv(GLenum target, GLenum pname, GLfixed *params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetTexParameterxv(target, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) params, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -10777,11 +13162,18 @@ void GLTrace_glLightModelx(GLenum pname, GLfixed param) { arg_param->add_intvalue(param); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glLightModelx(pname, param); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -10804,11 +13196,19 @@ void GLTrace_glLightModelxv(GLenum pname, const GLfixed *params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glLightModelxv(pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) params, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -10837,11 +13237,18 @@ void GLTrace_glLightx(GLenum light, GLenum pname, GLfixed param) { arg_param->add_intvalue(param); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glLightx(light, pname, param); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -10870,11 +13277,19 @@ void GLTrace_glLightxv(GLenum light, GLenum pname, const GLfixed *params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glLightxv(light, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) params, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -10891,11 +13306,18 @@ void GLTrace_glLineWidthx(GLfixed width) { arg_width->add_intvalue(width); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glLineWidthx(width); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -10906,11 +13328,18 @@ void GLTrace_glLoadIdentity(void) { glmsg.set_function(GLMessage::glLoadIdentity); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glLoadIdentity(); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -10927,11 +13356,19 @@ void GLTrace_glLoadMatrixx(const GLfixed *m) { arg_m->add_intvalue((int)m); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glLoadMatrixx(m); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) m, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -10948,11 +13385,18 @@ void GLTrace_glLogicOp(GLenum opcode) { arg_opcode->add_intvalue((int)opcode); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glLogicOp(opcode); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -10981,11 +13425,18 @@ void GLTrace_glMaterialx(GLenum face, GLenum pname, GLfixed param) { arg_param->add_intvalue(param); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glMaterialx(face, pname, param); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -11014,11 +13465,19 @@ void GLTrace_glMaterialxv(GLenum face, GLenum pname, const GLfixed *params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glMaterialxv(face, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) params, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -11035,11 +13494,18 @@ void GLTrace_glMatrixMode(GLenum mode) { arg_mode->add_intvalue((int)mode); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glMatrixMode(mode); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -11056,11 +13522,19 @@ void GLTrace_glMultMatrixx(const GLfixed *m) { arg_m->add_intvalue((int)m); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glMultMatrixx(m); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) m, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -11101,11 +13575,18 @@ void GLTrace_glMultiTexCoord4x(GLenum target, GLfixed s, GLfixed t, GLfixed r, G arg_q->add_intvalue(q); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glMultiTexCoord4x(target, s, t, r, q); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -11134,11 +13615,18 @@ void GLTrace_glNormal3x(GLfixed nx, GLfixed ny, GLfixed nz) { arg_nz->add_intvalue(nz); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glNormal3x(nx, ny, nz); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -11167,11 +13655,19 @@ void GLTrace_glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer) arg_pointer->add_intvalue((int)pointer); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glNormalPointer(type, stride, pointer); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) pointer, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -11218,11 +13714,18 @@ void GLTrace_glOrthox(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, arg_zFar->add_intvalue(zFar); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glOrthox(left, right, bottom, top, zNear, zFar); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -11245,11 +13748,18 @@ void GLTrace_glPointParameterx(GLenum pname, GLfixed param) { arg_param->add_intvalue(param); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glPointParameterx(pname, param); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -11272,11 +13782,19 @@ void GLTrace_glPointParameterxv(GLenum pname, const GLfixed *params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glPointParameterxv(pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) params, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -11293,11 +13811,18 @@ void GLTrace_glPointSizex(GLfixed size) { arg_size->add_intvalue(size); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glPointSizex(size); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -11320,11 +13845,18 @@ void GLTrace_glPolygonOffsetx(GLfixed factor, GLfixed units) { arg_units->add_intvalue(units); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glPolygonOffsetx(factor, units); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -11335,11 +13867,18 @@ void GLTrace_glPopMatrix(void) { glmsg.set_function(GLMessage::glPopMatrix); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glPopMatrix(); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -11350,11 +13889,18 @@ void GLTrace_glPushMatrix(void) { glmsg.set_function(GLMessage::glPushMatrix); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glPushMatrix(); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -11389,11 +13935,18 @@ void GLTrace_glRotatex(GLfixed angle, GLfixed x, GLfixed y, GLfixed z) { arg_z->add_intvalue(z); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glRotatex(angle, x, y, z); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -11416,11 +13969,18 @@ void GLTrace_glSampleCoveragex(GLclampx value, GLboolean invert) { arg_invert->add_boolvalue(invert); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glSampleCoveragex(value, invert); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -11449,11 +14009,18 @@ void GLTrace_glScalex(GLfixed x, GLfixed y, GLfixed z) { arg_z->add_intvalue(z); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glScalex(x, y, z); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -11470,11 +14037,18 @@ void GLTrace_glShadeModel(GLenum mode) { arg_mode->add_intvalue((int)mode); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glShadeModel(mode); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -11509,11 +14083,19 @@ void GLTrace_glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GL arg_pointer->add_intvalue((int)pointer); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glTexCoordPointer(size, type, stride, pointer); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) pointer, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -11542,11 +14124,18 @@ void GLTrace_glTexEnvi(GLenum target, GLenum pname, GLint param) { arg_param->add_intvalue(param); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glTexEnvi(target, pname, param); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -11575,11 +14164,18 @@ void GLTrace_glTexEnvx(GLenum target, GLenum pname, GLfixed param) { arg_param->add_intvalue(param); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glTexEnvx(target, pname, param); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -11608,11 +14204,19 @@ void GLTrace_glTexEnviv(GLenum target, GLenum pname, const GLint *params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glTexEnviv(target, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) params, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -11641,11 +14245,19 @@ void GLTrace_glTexEnvxv(GLenum target, GLenum pname, const GLfixed *params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glTexEnvxv(target, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) params, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -11674,11 +14286,18 @@ void GLTrace_glTexParameterx(GLenum target, GLenum pname, GLfixed param) { arg_param->add_intvalue(param); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glTexParameterx(target, pname, param); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -11707,11 +14326,19 @@ void GLTrace_glTexParameterxv(GLenum target, GLenum pname, const GLfixed *params arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glTexParameterxv(target, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) params, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -11740,11 +14367,18 @@ void GLTrace_glTranslatex(GLfixed x, GLfixed y, GLfixed z) { arg_z->add_intvalue(z); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glTranslatex(x, y, z); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -11779,11 +14413,19 @@ void GLTrace_glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvo arg_pointer->add_intvalue((int)pointer); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glVertexPointer(size, type, stride, pointer); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) pointer, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -11812,11 +14454,19 @@ void GLTrace_glPointSizePointerOES(GLenum type, GLsizei stride, const GLvoid *po arg_pointer->add_intvalue((int)pointer); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glPointSizePointerOES(type, stride, pointer); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) pointer, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -11842,11 +14492,18 @@ void GLTrace_glBlendEquationSeparateOES(GLenum modeRGB, GLenum modeAlpha) { arg_modeAlpha->add_intvalue((int)modeAlpha); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glBlendEquationSeparateOES(modeRGB, modeAlpha); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -11881,11 +14538,18 @@ void GLTrace_glBlendFuncSeparateOES(GLenum srcRGB, GLenum dstRGB, GLenum srcAlph arg_dstAlpha->add_intvalue((int)dstAlpha); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glBlendFuncSeparateOES(srcRGB, dstRGB, srcAlpha, dstAlpha); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -11902,11 +14566,18 @@ void GLTrace_glBlendEquationOES(GLenum mode) { arg_mode->add_intvalue((int)mode); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glBlendEquationOES(mode); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -11947,11 +14618,18 @@ void GLTrace_glDrawTexsOES(GLshort x, GLshort y, GLshort z, GLshort width, GLsho arg_height->add_intvalue(height); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glDrawTexsOES(x, y, z, width, height); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -11992,11 +14670,18 @@ void GLTrace_glDrawTexiOES(GLint x, GLint y, GLint z, GLint width, GLint height) arg_height->add_intvalue(height); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glDrawTexiOES(x, y, z, width, height); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -12037,11 +14722,18 @@ void GLTrace_glDrawTexxOES(GLfixed x, GLfixed y, GLfixed z, GLfixed width, GLfix arg_height->add_intvalue(height); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glDrawTexxOES(x, y, z, width, height); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -12058,11 +14750,19 @@ void GLTrace_glDrawTexsvOES(const GLshort *coords) { arg_coords->add_intvalue((int)coords); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glDrawTexsvOES(coords); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) coords, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -12079,11 +14779,19 @@ void GLTrace_glDrawTexivOES(const GLint *coords) { arg_coords->add_intvalue((int)coords); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glDrawTexivOES(coords); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) coords, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -12100,11 +14808,19 @@ void GLTrace_glDrawTexxvOES(const GLfixed *coords) { arg_coords->add_intvalue((int)coords); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glDrawTexxvOES(coords); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) coords, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -12145,11 +14861,18 @@ void GLTrace_glDrawTexfOES(GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLflo arg_height->add_floatvalue(height); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glDrawTexfOES(x, y, z, width, height); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -12166,11 +14889,19 @@ void GLTrace_glDrawTexfvOES(const GLfloat *coords) { arg_coords->add_intvalue((int)coords); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glDrawTexfvOES(coords); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) coords, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -12193,11 +14924,18 @@ void GLTrace_glAlphaFuncxOES(GLenum func, GLclampx ref) { arg_ref->add_intvalue(ref); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glAlphaFuncxOES(func, ref); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -12232,11 +14970,18 @@ void GLTrace_glClearColorxOES(GLclampx red, GLclampx green, GLclampx blue, GLcla arg_alpha->add_intvalue(alpha); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glClearColorxOES(red, green, blue, alpha); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -12253,11 +14998,18 @@ void GLTrace_glClearDepthxOES(GLclampx depth) { arg_depth->add_intvalue(depth); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glClearDepthxOES(depth); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -12280,11 +15032,19 @@ void GLTrace_glClipPlanexOES(GLenum plane, const GLfixed *equation) { arg_equation->add_intvalue((int)equation); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glClipPlanexOES(plane, equation); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) equation, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -12319,11 +15079,18 @@ void GLTrace_glColor4xOES(GLfixed red, GLfixed green, GLfixed blue, GLfixed alph arg_alpha->add_intvalue(alpha); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glColor4xOES(red, green, blue, alpha); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -12346,11 +15113,18 @@ void GLTrace_glDepthRangexOES(GLclampx zNear, GLclampx zFar) { arg_zFar->add_intvalue(zFar); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glDepthRangexOES(zNear, zFar); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -12373,11 +15147,18 @@ void GLTrace_glFogxOES(GLenum pname, GLfixed param) { arg_param->add_intvalue(param); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glFogxOES(pname, param); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -12400,11 +15181,19 @@ void GLTrace_glFogxvOES(GLenum pname, const GLfixed *params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glFogxvOES(pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) params, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -12451,11 +15240,18 @@ void GLTrace_glFrustumxOES(GLfixed left, GLfixed right, GLfixed bottom, GLfixed arg_zFar->add_intvalue(zFar); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glFrustumxOES(left, right, bottom, top, zNear, zFar); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -12478,11 +15274,19 @@ void GLTrace_glGetClipPlanexOES(GLenum pname, GLfixed eqn[4]) { arg_eqn->add_intvalue((int)eqn); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetClipPlanexOES(pname, eqn); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) eqn, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -12505,11 +15309,19 @@ void GLTrace_glGetFixedvOES(GLenum pname, GLfixed *params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetFixedvOES(pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) params, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -12538,11 +15350,19 @@ void GLTrace_glGetLightxvOES(GLenum light, GLenum pname, GLfixed *params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetLightxvOES(light, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) params, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -12571,11 +15391,19 @@ void GLTrace_glGetMaterialxvOES(GLenum face, GLenum pname, GLfixed *params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetMaterialxvOES(face, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) params, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -12604,11 +15432,19 @@ void GLTrace_glGetTexEnvxvOES(GLenum env, GLenum pname, GLfixed *params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetTexEnvxvOES(env, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) params, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -12637,11 +15473,19 @@ void GLTrace_glGetTexParameterxvOES(GLenum target, GLenum pname, GLfixed *params arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetTexParameterxvOES(target, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) params, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -12664,11 +15508,18 @@ void GLTrace_glLightModelxOES(GLenum pname, GLfixed param) { arg_param->add_intvalue(param); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glLightModelxOES(pname, param); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -12691,11 +15542,19 @@ void GLTrace_glLightModelxvOES(GLenum pname, const GLfixed *params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glLightModelxvOES(pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) params, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -12724,11 +15583,18 @@ void GLTrace_glLightxOES(GLenum light, GLenum pname, GLfixed param) { arg_param->add_intvalue(param); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glLightxOES(light, pname, param); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -12757,11 +15623,19 @@ void GLTrace_glLightxvOES(GLenum light, GLenum pname, const GLfixed *params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glLightxvOES(light, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) params, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -12778,11 +15652,18 @@ void GLTrace_glLineWidthxOES(GLfixed width) { arg_width->add_intvalue(width); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glLineWidthxOES(width); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -12799,11 +15680,19 @@ void GLTrace_glLoadMatrixxOES(const GLfixed *m) { arg_m->add_intvalue((int)m); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glLoadMatrixxOES(m); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) m, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -12832,11 +15721,18 @@ void GLTrace_glMaterialxOES(GLenum face, GLenum pname, GLfixed param) { arg_param->add_intvalue(param); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glMaterialxOES(face, pname, param); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -12865,11 +15761,19 @@ void GLTrace_glMaterialxvOES(GLenum face, GLenum pname, const GLfixed *params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glMaterialxvOES(face, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) params, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -12886,11 +15790,19 @@ void GLTrace_glMultMatrixxOES(const GLfixed *m) { arg_m->add_intvalue((int)m); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glMultMatrixxOES(m); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) m, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -12931,11 +15843,18 @@ void GLTrace_glMultiTexCoord4xOES(GLenum target, GLfixed s, GLfixed t, GLfixed r arg_q->add_intvalue(q); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glMultiTexCoord4xOES(target, s, t, r, q); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -12964,11 +15883,18 @@ void GLTrace_glNormal3xOES(GLfixed nx, GLfixed ny, GLfixed nz) { arg_nz->add_intvalue(nz); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glNormal3xOES(nx, ny, nz); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -13015,11 +15941,18 @@ void GLTrace_glOrthoxOES(GLfixed left, GLfixed right, GLfixed bottom, GLfixed to arg_zFar->add_intvalue(zFar); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glOrthoxOES(left, right, bottom, top, zNear, zFar); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -13042,11 +15975,18 @@ void GLTrace_glPointParameterxOES(GLenum pname, GLfixed param) { arg_param->add_intvalue(param); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glPointParameterxOES(pname, param); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -13069,11 +16009,19 @@ void GLTrace_glPointParameterxvOES(GLenum pname, const GLfixed *params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glPointParameterxvOES(pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) params, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -13090,11 +16038,18 @@ void GLTrace_glPointSizexOES(GLfixed size) { arg_size->add_intvalue(size); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glPointSizexOES(size); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -13117,11 +16072,18 @@ void GLTrace_glPolygonOffsetxOES(GLfixed factor, GLfixed units) { arg_units->add_intvalue(units); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glPolygonOffsetxOES(factor, units); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -13156,11 +16118,18 @@ void GLTrace_glRotatexOES(GLfixed angle, GLfixed x, GLfixed y, GLfixed z) { arg_z->add_intvalue(z); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glRotatexOES(angle, x, y, z); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -13183,11 +16152,18 @@ void GLTrace_glSampleCoveragexOES(GLclampx value, GLboolean invert) { arg_invert->add_boolvalue(invert); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glSampleCoveragexOES(value, invert); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -13216,11 +16192,18 @@ void GLTrace_glScalexOES(GLfixed x, GLfixed y, GLfixed z) { arg_z->add_intvalue(z); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glScalexOES(x, y, z); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -13249,11 +16232,18 @@ void GLTrace_glTexEnvxOES(GLenum target, GLenum pname, GLfixed param) { arg_param->add_intvalue(param); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glTexEnvxOES(target, pname, param); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -13282,11 +16272,19 @@ void GLTrace_glTexEnvxvOES(GLenum target, GLenum pname, const GLfixed *params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glTexEnvxvOES(target, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) params, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -13315,11 +16313,18 @@ void GLTrace_glTexParameterxOES(GLenum target, GLenum pname, GLfixed param) { arg_param->add_intvalue(param); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glTexParameterxOES(target, pname, param); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -13348,11 +16353,19 @@ void GLTrace_glTexParameterxvOES(GLenum target, GLenum pname, const GLfixed *par arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glTexParameterxvOES(target, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) params, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -13381,11 +16394,18 @@ void GLTrace_glTranslatexOES(GLfixed x, GLfixed y, GLfixed z) { arg_z->add_intvalue(z); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glTranslatexOES(x, y, z); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -13402,9 +16422,11 @@ GLboolean GLTrace_glIsRenderbufferOES(GLuint renderbuffer) { arg_renderbuffer->add_intvalue(renderbuffer); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); GLboolean retValue = glContext->hooks->gl.glIsRenderbufferOES(renderbuffer); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); // set return value GLMessage_DataType *rt = glmsg.mutable_returnvalue(); @@ -13412,7 +16434,12 @@ GLboolean GLTrace_glIsRenderbufferOES(GLuint renderbuffer) { rt->set_type(GLMessage::DataType::BOOL); rt->add_boolvalue(retValue); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); return retValue; @@ -13437,11 +16464,18 @@ void GLTrace_glBindRenderbufferOES(GLenum target, GLuint renderbuffer) { arg_renderbuffer->add_intvalue(renderbuffer); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glBindRenderbufferOES(target, renderbuffer); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -13464,11 +16498,19 @@ void GLTrace_glDeleteRenderbuffersOES(GLsizei n, const GLuint* renderbuffers) { arg_renderbuffers->add_intvalue((int)renderbuffers); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glDeleteRenderbuffersOES(n, renderbuffers); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) renderbuffers, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -13491,11 +16533,19 @@ void GLTrace_glGenRenderbuffersOES(GLsizei n, GLuint* renderbuffers) { arg_renderbuffers->add_intvalue((int)renderbuffers); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGenRenderbuffersOES(n, renderbuffers); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) renderbuffers, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -13530,11 +16580,18 @@ void GLTrace_glRenderbufferStorageOES(GLenum target, GLenum internalformat, GLsi arg_height->add_intvalue(height); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glRenderbufferStorageOES(target, internalformat, width, height); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -13563,11 +16620,19 @@ void GLTrace_glGetRenderbufferParameterivOES(GLenum target, GLenum pname, GLint* arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetRenderbufferParameterivOES(target, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) params, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -13584,9 +16649,11 @@ GLboolean GLTrace_glIsFramebufferOES(GLuint framebuffer) { arg_framebuffer->add_intvalue(framebuffer); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); GLboolean retValue = glContext->hooks->gl.glIsFramebufferOES(framebuffer); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); // set return value GLMessage_DataType *rt = glmsg.mutable_returnvalue(); @@ -13594,7 +16661,12 @@ GLboolean GLTrace_glIsFramebufferOES(GLuint framebuffer) { rt->set_type(GLMessage::DataType::BOOL); rt->add_boolvalue(retValue); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); return retValue; @@ -13619,11 +16691,18 @@ void GLTrace_glBindFramebufferOES(GLenum target, GLuint framebuffer) { arg_framebuffer->add_intvalue(framebuffer); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glBindFramebufferOES(target, framebuffer); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -13646,11 +16725,19 @@ void GLTrace_glDeleteFramebuffersOES(GLsizei n, const GLuint* framebuffers) { arg_framebuffers->add_intvalue((int)framebuffers); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glDeleteFramebuffersOES(n, framebuffers); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) framebuffers, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -13673,11 +16760,19 @@ void GLTrace_glGenFramebuffersOES(GLsizei n, GLuint* framebuffers) { arg_framebuffers->add_intvalue((int)framebuffers); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGenFramebuffersOES(n, framebuffers); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) framebuffers, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -13694,9 +16789,11 @@ GLenum GLTrace_glCheckFramebufferStatusOES(GLenum target) { arg_target->add_intvalue((int)target); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); GLenum retValue = glContext->hooks->gl.glCheckFramebufferStatusOES(target); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); // set return value GLMessage_DataType *rt = glmsg.mutable_returnvalue(); @@ -13704,7 +16801,12 @@ GLenum GLTrace_glCheckFramebufferStatusOES(GLenum target) { rt->set_type(GLMessage::DataType::ENUM); rt->add_intvalue((int)retValue); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); return retValue; @@ -13741,11 +16843,18 @@ void GLTrace_glFramebufferRenderbufferOES(GLenum target, GLenum attachment, GLen arg_renderbuffer->add_intvalue(renderbuffer); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glFramebufferRenderbufferOES(target, attachment, renderbuffertarget, renderbuffer); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -13786,11 +16895,18 @@ void GLTrace_glFramebufferTexture2DOES(GLenum target, GLenum attachment, GLenum arg_level->add_intvalue(level); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glFramebufferTexture2DOES(target, attachment, textarget, texture, level); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -13825,11 +16941,19 @@ void GLTrace_glGetFramebufferAttachmentParameterivOES(GLenum target, GLenum atta arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetFramebufferAttachmentParameterivOES(target, attachment, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) params, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -13846,11 +16970,18 @@ void GLTrace_glGenerateMipmapOES(GLenum target) { arg_target->add_intvalue((int)target); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGenerateMipmapOES(target); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -13867,11 +16998,18 @@ void GLTrace_glCurrentPaletteMatrixOES(GLuint matrixpaletteindex) { arg_matrixpaletteindex->add_intvalue(matrixpaletteindex); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glCurrentPaletteMatrixOES(matrixpaletteindex); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -13882,11 +17020,18 @@ void GLTrace_glLoadPaletteFromModelViewMatrixOES(void) { glmsg.set_function(GLMessage::glLoadPaletteFromModelViewMatrixOES); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glLoadPaletteFromModelViewMatrixOES(); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -13921,11 +17066,19 @@ void GLTrace_glMatrixIndexPointerOES(GLint size, GLenum type, GLsizei stride, co arg_pointer->add_intvalue((int)pointer); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glMatrixIndexPointerOES(size, type, stride, pointer); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) pointer, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -13960,11 +17113,19 @@ void GLTrace_glWeightPointerOES(GLint size, GLenum type, GLsizei stride, const G arg_pointer->add_intvalue((int)pointer); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glWeightPointerOES(size, type, stride, pointer); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) pointer, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -13987,9 +17148,11 @@ GLbitfield GLTrace_glQueryMatrixxOES(GLfixed mantissa[16], GLint exponent[16]) { arg_exponent->add_intvalue((int)exponent); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); GLbitfield retValue = glContext->hooks->gl.glQueryMatrixxOES(mantissa, exponent); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); // set return value GLMessage_DataType *rt = glmsg.mutable_returnvalue(); @@ -13997,7 +17160,14 @@ GLbitfield GLTrace_glQueryMatrixxOES(GLfixed mantissa[16], GLint exponent[16]) { rt->set_type(GLMessage::DataType::INT); rt->add_intvalue(retValue); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) mantissa, + (void *) exponent, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); return retValue; @@ -14022,11 +17192,18 @@ void GLTrace_glDepthRangefOES(GLclampf zNear, GLclampf zFar) { arg_zFar->add_floatvalue(zFar); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glDepthRangefOES(zNear, zFar); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -14073,11 +17250,18 @@ void GLTrace_glFrustumfOES(GLfloat left, GLfloat right, GLfloat bottom, GLfloat arg_zFar->add_floatvalue(zFar); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glFrustumfOES(left, right, bottom, top, zNear, zFar); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -14124,11 +17308,18 @@ void GLTrace_glOrthofOES(GLfloat left, GLfloat right, GLfloat bottom, GLfloat to arg_zFar->add_floatvalue(zFar); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glOrthofOES(left, right, bottom, top, zNear, zFar); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -14151,11 +17342,19 @@ void GLTrace_glClipPlanefOES(GLenum plane, const GLfloat *equation) { arg_equation->add_intvalue((int)equation); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glClipPlanefOES(plane, equation); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) equation, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -14178,11 +17377,19 @@ void GLTrace_glGetClipPlanefOES(GLenum pname, GLfloat eqn[4]) { arg_eqn->add_intvalue((int)eqn); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetClipPlanefOES(pname, eqn); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) eqn, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -14199,11 +17406,18 @@ void GLTrace_glClearDepthfOES(GLclampf depth) { arg_depth->add_floatvalue(depth); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glClearDepthfOES(depth); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -14232,11 +17446,18 @@ void GLTrace_glTexGenfOES(GLenum coord, GLenum pname, GLfloat param) { arg_param->add_floatvalue(param); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glTexGenfOES(coord, pname, param); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -14265,11 +17486,19 @@ void GLTrace_glTexGenfvOES(GLenum coord, GLenum pname, const GLfloat *params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glTexGenfvOES(coord, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) params, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -14298,11 +17527,18 @@ void GLTrace_glTexGeniOES(GLenum coord, GLenum pname, GLint param) { arg_param->add_intvalue(param); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glTexGeniOES(coord, pname, param); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -14331,11 +17567,19 @@ void GLTrace_glTexGenivOES(GLenum coord, GLenum pname, const GLint *params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glTexGenivOES(coord, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) params, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -14364,11 +17608,18 @@ void GLTrace_glTexGenxOES(GLenum coord, GLenum pname, GLfixed param) { arg_param->add_intvalue(param); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glTexGenxOES(coord, pname, param); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -14397,11 +17648,19 @@ void GLTrace_glTexGenxvOES(GLenum coord, GLenum pname, const GLfixed *params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glTexGenxvOES(coord, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) params, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -14430,11 +17689,19 @@ void GLTrace_glGetTexGenfvOES(GLenum coord, GLenum pname, GLfloat *params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetTexGenfvOES(coord, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) params, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -14463,11 +17730,19 @@ void GLTrace_glGetTexGenivOES(GLenum coord, GLenum pname, GLint *params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetTexGenivOES(coord, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) params, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -14496,11 +17771,19 @@ void GLTrace_glGetTexGenxvOES(GLenum coord, GLenum pname, GLfixed *params) { arg_params->add_intvalue((int)params); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glGetTexGenxvOES(coord, pname, params); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { + (void *) params, + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -14523,11 +17806,19 @@ void GLTrace_glClipPlanefIMG(GLenum p, const GLfloat *eqn) { arg_eqn->add_intvalue((int)eqn); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glClipPlanefIMG(p, eqn); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) eqn, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } @@ -14550,11 +17841,19 @@ void GLTrace_glClipPlanexIMG(GLenum p, const GLfixed *eqn) { arg_eqn->add_intvalue((int)eqn); // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); glContext->hooks->gl.glClipPlanexIMG(p, eqn); - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); + + void *pointerArgs[] = { + (void *) eqn, + }; - fixupGLMessage(glContext, start_time, end_time, &glmsg); + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); } diff --git a/opengl/libs/GLES_trace/src/gltrace_fixup.cpp b/opengl/libs/GLES_trace/src/gltrace_fixup.cpp index 3e185bc80c..c69ba5e1b4 100644 --- a/opengl/libs/GLES_trace/src/gltrace_fixup.cpp +++ b/opengl/libs/GLES_trace/src/gltrace_fixup.cpp @@ -76,21 +76,64 @@ unsigned getBytesPerTexel(const GLenum format, const GLenum type) { return 1; // in doubt... } +void fixup_GenericFloatArray(int argIndex, int nFloats, GLMessage *glmsg, void *src) { + GLMessage_DataType *arg_floatarray = glmsg->mutable_args(argIndex); + GLfloat *floatp = (GLfloat *)src; + + if (floatp == NULL) { + return; + } + + arg_floatarray->set_type(GLMessage::DataType::FLOAT); + arg_floatarray->set_isarray(true); + arg_floatarray->clear_floatvalue(); + + for (int i = 0; i < nFloats; i++, floatp++) { + arg_floatarray->add_floatvalue(*floatp); + } +} + +void fixup_GenericIntArray(int argIndex, int nInts, GLMessage *glmsg, void *src) { + GLMessage_DataType *arg_intarray = glmsg->mutable_args(argIndex); + GLint *intp = (GLint *)src; + + if (intp == NULL) { + return; + } + + arg_intarray->set_type(GLMessage::DataType::INT); + arg_intarray->set_isarray(true); + arg_intarray->clear_intvalue(); + + for (int i = 0; i < nInts; i++, intp++) { + arg_intarray->add_intvalue(*intp); + } +} + +void fixup_GenericEnumArray(int argIndex, int nEnums, GLMessage *glmsg, void *src) { + // fixup as if they were ints + fixup_GenericIntArray(argIndex, nEnums, glmsg, src); + + // and then set the data type to be enum + GLMessage_DataType *arg_enumarray = glmsg->mutable_args(argIndex); + arg_enumarray->set_type(GLMessage::DataType::ENUM); +} + /** Generic helper function: extract pointer at argIndex and replace it with the C style string at *pointer */ -void fixup_CStringPtr(int argIndex, GLMessage *glmsg) { +void fixup_CStringPtr(int argIndex, GLMessage *glmsg, void *src) { GLMessage_DataType *arg = glmsg->mutable_args(argIndex); - GLchar *ptr = (GLchar *)arg->intvalue(0); + GLchar *ptr = (GLchar *) src; arg->set_type(GLMessage::DataType::CHAR); arg->set_isarray(true); arg->add_charvalue(ptr); } -void fixup_glGetString(GLMessage *glmsg) { +void fixup_glGetString(GLMessage *glmsg, void *pointersToFixup[]) { /* const GLubyte* GLTrace_glGetString(GLenum name) */ GLMessage_DataType *ret = glmsg->mutable_returnvalue(); - GLchar *ptr = (GLchar *)ret->intvalue(0); + GLchar *ptr = (GLchar *) pointersToFixup[0]; if (ptr != NULL) { ret->set_type(GLMessage::DataType::CHAR); @@ -112,7 +155,7 @@ void fixup_addFBContents(GLTraceContext *context, GLMessage *glmsg, FBBinding fb } /** Common fixup routing for glTexImage2D & glTexSubImage2D. */ -void fixup_glTexImage(int widthIndex, int heightIndex, GLMessage *glmsg) { +void fixup_glTexImage(int widthIndex, int heightIndex, GLMessage *glmsg, void *dataSrc) { GLMessage_DataType arg_width = glmsg->args(widthIndex); GLMessage_DataType arg_height = glmsg->args(heightIndex); @@ -124,7 +167,7 @@ void fixup_glTexImage(int widthIndex, int heightIndex, GLMessage *glmsg) { GLsizei height = arg_height.intvalue(0); GLenum format = arg_format.intvalue(0); GLenum type = arg_type.intvalue(0); - void *data = (void *)arg_data->intvalue(0); + void *data = (void *) dataSrc; int bytesPerTexel = getBytesPerTexel(format, type); @@ -141,7 +184,7 @@ void fixup_glTexImage(int widthIndex, int heightIndex, GLMessage *glmsg) { } -void fixup_glTexImage2D(GLMessage *glmsg) { +void fixup_glTexImage2D(GLMessage *glmsg, void *pointersToFixup[]) { /* void glTexImage2D(GLenum target, GLint level, GLint internalformat, @@ -154,10 +197,10 @@ void fixup_glTexImage2D(GLMessage *glmsg) { */ int widthIndex = 3; int heightIndex = 4; - fixup_glTexImage(widthIndex, heightIndex, glmsg); + fixup_glTexImage(widthIndex, heightIndex, glmsg, pointersToFixup[0]); } -void fixup_glTexSubImage2D(GLMessage *glmsg) { +void fixup_glTexSubImage2D(GLMessage *glmsg, void *pointersToFixup[]) { /* void glTexSubImage2D(GLenum target, GLint level, @@ -171,10 +214,10 @@ void fixup_glTexSubImage2D(GLMessage *glmsg) { */ int widthIndex = 4; int heightIndex = 5; - fixup_glTexImage(widthIndex, heightIndex, glmsg); + fixup_glTexImage(widthIndex, heightIndex, glmsg, pointersToFixup[0]); } -void fixup_glShaderSource(GLMessage *glmsg) { +void fixup_glShaderSource(GLMessage *glmsg, void *pointersToFixup[]) { /* void glShaderSource(GLuint shader, GLsizei count, const GLchar** string, const GLint* length) */ GLMessage_DataType arg_count = glmsg->args(1); @@ -182,8 +225,8 @@ void fixup_glShaderSource(GLMessage *glmsg) { GLMessage_DataType *arg_strpp = glmsg->mutable_args(2); GLsizei count = arg_count.intvalue(0); - GLchar **stringpp = (GLchar **)arg_strpp->intvalue(0); - GLint *lengthp = (GLint *)arg_lenp.intvalue(0); + GLchar **stringpp = (GLchar **) pointersToFixup[0]; + GLint *lengthp = (GLint *) pointersToFixup[1]; arg_strpp->set_type(GLMessage::DataType::CHAR); arg_strpp->set_isarray(true); @@ -202,87 +245,64 @@ void fixup_glShaderSource(GLMessage *glmsg) { arg_strpp->add_charvalue(src); } -void fixup_glUniformGenericInteger(int argIndex, int nIntegers, GLMessage *glmsg) { +void fixup_glUniformGenericInteger(int argIndex, int nIntegers, GLMessage *glmsg, + void *pointersToFixup[]) { /* void glUniform?iv(GLint location, GLsizei count, const GLint *value); */ - GLMessage_DataType *arg_values = glmsg->mutable_args(argIndex); - GLint *src = (GLint*)arg_values->intvalue(0); - - arg_values->set_type(GLMessage::DataType::INT); - arg_values->set_isarray(true); - arg_values->clear_intvalue(); - - for (int i = 0; i < nIntegers; i++) { - arg_values->add_intvalue(*src++); - } + fixup_GenericIntArray(argIndex, nIntegers, glmsg, pointersToFixup[0]); } -void fixup_glUniformGeneric(int argIndex, int nFloats, GLMessage *glmsg) { - GLMessage_DataType *arg_values = glmsg->mutable_args(argIndex); - GLfloat *src = (GLfloat*)arg_values->intvalue(0); - - arg_values->set_type(GLMessage::DataType::FLOAT); - arg_values->set_isarray(true); - arg_values->clear_floatvalue(); - - for (int i = 0; i < nFloats; i++) { - arg_values->add_floatvalue(*src++); - } +void fixup_glUniformGeneric(int argIndex, int nFloats, GLMessage *glmsg, void *src) { + fixup_GenericFloatArray(argIndex, nFloats, glmsg, src); } -void fixup_glUniformMatrixGeneric(int matrixSize, GLMessage *glmsg) { +void fixup_glUniformMatrixGeneric(int matrixSize, GLMessage *glmsg, void *pointersToFixup[]) { /* void glUniformMatrix?fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) */ GLMessage_DataType arg_count = glmsg->args(1); int n_matrices = arg_count.intvalue(0); - fixup_glUniformGeneric(3, matrixSize * matrixSize * n_matrices, glmsg); + fixup_glUniformGeneric(3, matrixSize * matrixSize * n_matrices, glmsg, pointersToFixup[0]); } -void fixup_GenericIntArray(int argIndex, int nInts, GLMessage *glmsg) { - GLMessage_DataType *arg_intarray = glmsg->mutable_args(argIndex); - GLint *intp = (GLint *)arg_intarray->intvalue(0); +void fixup_glBufferData(int sizeIndex, int dataIndex, GLMessage *glmsg, void *pointersToFixup[]) { + /* void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data) */ + /* void glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage) */ + GLsizeiptr size = glmsg->args(sizeIndex).intvalue(0); - if (intp == NULL) { - return; - } + GLMessage_DataType *arg_datap = glmsg->mutable_args(dataIndex); + GLvoid *datap = (GLvoid *) pointersToFixup[0]; - arg_intarray->set_type(GLMessage::DataType::INT); - arg_intarray->set_isarray(true); - arg_intarray->clear_intvalue(); - - for (int i = 0; i < nInts; i++, intp++) { - arg_intarray->add_intvalue(*intp); + if (datap == NULL) { + // glBufferData can be called with a NULL data pointer + return; } -} -void fixup_GenericEnumArray(int argIndex, int nEnums, GLMessage *glmsg) { - // fixup as if they were ints - fixup_GenericIntArray(argIndex, nEnums, glmsg); + arg_datap->set_type(GLMessage::DataType::VOID); + arg_datap->set_isarray(true); + arg_datap->clear_intvalue(); - // and then set the data type to be enum - GLMessage_DataType *arg_enumarray = glmsg->mutable_args(argIndex); - arg_enumarray->set_type(GLMessage::DataType::ENUM); + arg_datap->add_rawbytes(datap, size); } -void fixup_glGenGeneric(GLMessage *glmsg) { +void fixup_glGenGeneric(GLMessage *glmsg, void *pointersToFixup[]) { /* void glGen*(GLsizei n, GLuint * buffers); */ GLMessage_DataType arg_n = glmsg->args(0); GLsizei n = arg_n.intvalue(0); - fixup_GenericIntArray(1, n, glmsg); + fixup_GenericIntArray(1, n, glmsg, pointersToFixup[0]); } -void fixup_glDeleteGeneric(GLMessage *glmsg) { +void fixup_glDeleteGeneric(GLMessage *glmsg, void *pointersToFixup[]) { /* void glDelete*(GLsizei n, GLuint *buffers); */ GLMessage_DataType arg_n = glmsg->args(0); GLsizei n = arg_n.intvalue(0); - fixup_GenericIntArray(1, n, glmsg); + fixup_GenericIntArray(1, n, glmsg, pointersToFixup[0]); } -void fixup_glGetBooleanv(GLMessage *glmsg) { +void fixup_glGetBooleanv(GLMessage *glmsg, void *pointersToFixup[]) { /* void glGetBooleanv(GLenum pname, GLboolean *params); */ GLMessage_DataType *arg_params = glmsg->mutable_args(1); - GLboolean *src = (GLboolean*)arg_params->intvalue(0); + GLboolean *src = (GLboolean*) pointersToFixup[0]; arg_params->set_type(GLMessage::DataType::BOOL); arg_params->set_isarray(true); @@ -290,10 +310,10 @@ void fixup_glGetBooleanv(GLMessage *glmsg) { arg_params->add_boolvalue(*src); } -void fixup_glGetFloatv(GLMessage *glmsg) { +void fixup_glGetFloatv(GLMessage *glmsg, void *pointersToFixup[]) { /* void glGetFloatv(GLenum pname, GLfloat *params); */ GLMessage_DataType *arg_params = glmsg->mutable_args(1); - GLfloat *src = (GLfloat*)arg_params->intvalue(0); + GLfloat *src = (GLfloat*) pointersToFixup[0]; arg_params->set_type(GLMessage::DataType::FLOAT); arg_params->set_isarray(true); @@ -338,16 +358,15 @@ void fixup_glLinkProgram(GLMessage *glmsg) { } /** Given a glGetActive[Uniform|Attrib] call, obtain the location - * of the variable in the call. + * of the variable of given name in the call. */ -int getShaderVariableLocation(GLTraceContext *context, GLMessage *glmsg) { +int getShaderVariableLocation(GLTraceContext *context, GLMessage *glmsg, GLchar *name) { GLMessage_Function func = glmsg->function(); if (func != GLMessage::glGetActiveAttrib && func != GLMessage::glGetActiveUniform) { return -1; } int program = glmsg->args(0).intvalue(0); - GLchar *name = (GLchar*) glmsg->args(6).intvalue(0); if (func == GLMessage::glGetActiveAttrib) { return context->hooks->gl.glGetAttribLocation(program, name); @@ -356,16 +375,17 @@ int getShaderVariableLocation(GLTraceContext *context, GLMessage *glmsg) { } } -void fixup_glGetActiveAttribOrUniform(GLMessage *glmsg, int location) { +void fixup_glGetActiveAttribOrUniform(GLTraceContext *context, GLMessage *glmsg, + void *pointersToFixup[]) { /* void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name); */ /* void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name) */ - fixup_GenericIntArray(3, 1, glmsg); // length - fixup_GenericIntArray(4, 1, glmsg); // size - fixup_GenericEnumArray(5, 1, glmsg); // type - fixup_CStringPtr(6, glmsg); // name + fixup_GenericIntArray(3, 1, glmsg, pointersToFixup[0]); // length + fixup_GenericIntArray(4, 1, glmsg, pointersToFixup[1]); // size + fixup_GenericEnumArray(5, 1, glmsg, pointersToFixup[2]); // type + fixup_CStringPtr(6, glmsg, pointersToFixup[3]); // name // The index argument in the glGetActive[Attrib|Uniform] functions // does not correspond to the actual location index as used in @@ -373,19 +393,23 @@ void fixup_glGetActiveAttribOrUniform(GLMessage *glmsg, int location) { // In order to make things simpler for the debugger, we also pass // a hidden location argument that stores the actual location. // append the location value to the end of the argument list + int location = getShaderVariableLocation(context, glmsg, (GLchar*)pointersToFixup[3]); GLMessage_DataType *arg_location = glmsg->add_args(); arg_location->set_isarray(false); arg_location->set_type(GLMessage::DataType::INT); arg_location->add_intvalue(location); } -void fixupGLMessage(GLTraceContext *context, nsecs_t start, nsecs_t end, GLMessage *glmsg) { +void fixupGLMessage(GLTraceContext *context, nsecs_t wallStart, nsecs_t wallEnd, + nsecs_t threadStart, nsecs_t threadEnd, + GLMessage *glmsg, void *pointersToFixup[]) { // for all messages, set the current context id glmsg->set_context_id(context->getId()); // set start time and duration - glmsg->set_start_time(start); - glmsg->set_duration((unsigned)(end - start)); + glmsg->set_start_time(wallStart); + glmsg->set_duration((unsigned)(wallEnd - wallStart)); + glmsg->set_threadtime((unsigned)(threadEnd - threadStart)); // do any custom message dependent processing switch (glmsg->function()) { @@ -393,41 +417,41 @@ void fixupGLMessage(GLTraceContext *context, nsecs_t start, nsecs_t end, GLMessa case GLMessage::glDeleteFramebuffers: /* glDeleteFramebuffers(GLsizei n, GLuint *buffers); */ case GLMessage::glDeleteRenderbuffers:/* glDeleteRenderbuffers(GLsizei n, GLuint *buffers); */ case GLMessage::glDeleteTextures: /* glDeleteTextures(GLsizei n, GLuint *textures); */ - fixup_glDeleteGeneric(glmsg); + fixup_glDeleteGeneric(glmsg, pointersToFixup); break; case GLMessage::glGenBuffers: /* void glGenBuffers(GLsizei n, GLuint *buffers); */ case GLMessage::glGenFramebuffers: /* void glGenFramebuffers(GLsizei n, GLuint *buffers); */ case GLMessage::glGenRenderbuffers: /* void glGenFramebuffers(GLsizei n, GLuint *buffers); */ case GLMessage::glGenTextures: /* void glGenTextures(GLsizei n, GLuint *textures); */ - fixup_glGenGeneric(glmsg); + fixup_glGenGeneric(glmsg, pointersToFixup); break; case GLMessage::glLinkProgram: /* void glLinkProgram(GLuint program); */ fixup_glLinkProgram(glmsg); break; case GLMessage::glGetActiveAttrib: - fixup_glGetActiveAttribOrUniform(glmsg, getShaderVariableLocation(context, glmsg)); + fixup_glGetActiveAttribOrUniform(context, glmsg, pointersToFixup); break; case GLMessage::glGetActiveUniform: - fixup_glGetActiveAttribOrUniform(glmsg, getShaderVariableLocation(context, glmsg)); + fixup_glGetActiveAttribOrUniform(context, glmsg, pointersToFixup); break; case GLMessage::glBindAttribLocation: /* void glBindAttribLocation(GLuint program, GLuint index, const GLchar* name); */ - fixup_CStringPtr(2, glmsg); + fixup_CStringPtr(2, glmsg, pointersToFixup[0]); break; case GLMessage::glGetAttribLocation: case GLMessage::glGetUniformLocation: /* int glGetAttribLocation(GLuint program, const GLchar* name) */ /* int glGetUniformLocation(GLuint program, const GLchar* name) */ - fixup_CStringPtr(1, glmsg); + fixup_CStringPtr(1, glmsg, pointersToFixup[0]); break; case GLMessage::glGetBooleanv: - fixup_glGetBooleanv(glmsg); + fixup_glGetBooleanv(glmsg, pointersToFixup); break; case GLMessage::glGetFloatv: - fixup_glGetFloatv(glmsg); + fixup_glGetFloatv(glmsg, pointersToFixup); break; case GLMessage::glGetIntegerv: /* void glGetIntegerv(GLenum pname, GLint *params); */ - fixup_GenericIntArray(1, 1, glmsg); + fixup_GenericIntArray(1, 1, glmsg, pointersToFixup[0]); break; case GLMessage::glGetProgramiv: case GLMessage::glGetRenderbufferParameteriv: @@ -435,70 +459,78 @@ void fixupGLMessage(GLTraceContext *context, nsecs_t start, nsecs_t end, GLMessa /* void glGetProgramiv(GLuint program, GLenum pname, GLint* params) */ /* void glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params) */ /* void glGetShaderiv(GLuint shader, GLenum pname, GLint* params) */ - fixup_GenericIntArray(2, 1, glmsg); + fixup_GenericIntArray(2, 1, glmsg, pointersToFixup[0]); break; case GLMessage::glGetString: - fixup_glGetString(glmsg); + fixup_glGetString(glmsg, pointersToFixup); break; case GLMessage::glTexImage2D: if (context->getGlobalTraceState()->shouldCollectTextureDataOnGlTexImage()) { - fixup_glTexImage2D(glmsg); + fixup_glTexImage2D(glmsg, pointersToFixup); } break; case GLMessage::glTexSubImage2D: if (context->getGlobalTraceState()->shouldCollectTextureDataOnGlTexImage()) { - fixup_glTexSubImage2D(glmsg); + fixup_glTexSubImage2D(glmsg, pointersToFixup); } break; case GLMessage::glShaderSource: - fixup_glShaderSource(glmsg); + fixup_glShaderSource(glmsg, pointersToFixup); break; case GLMessage::glUniform1iv: /* void glUniform1iv(GLint location, GLsizei count, const GLint *value); */ - fixup_glUniformGenericInteger(2, 1, glmsg); + fixup_glUniformGenericInteger(2, 1, glmsg, pointersToFixup); break; case GLMessage::glUniform2iv: /* void glUniform2iv(GLint location, GLsizei count, const GLint *value); */ - fixup_glUniformGenericInteger(2, 2, glmsg); + fixup_glUniformGenericInteger(2, 2, glmsg, pointersToFixup); break; case GLMessage::glUniform3iv: /* void glUniform3iv(GLint location, GLsizei count, const GLint *value); */ - fixup_glUniformGenericInteger(2, 3, glmsg); + fixup_glUniformGenericInteger(2, 3, glmsg, pointersToFixup); break; case GLMessage::glUniform4iv: /* void glUniform4iv(GLint location, GLsizei count, const GLint *value); */ - fixup_glUniformGenericInteger(2, 4, glmsg); + fixup_glUniformGenericInteger(2, 4, glmsg, pointersToFixup); break; case GLMessage::glUniform1fv: /* void glUniform1fv(GLint location, GLsizei count, const GLfloat *value); */ - fixup_glUniformGeneric(2, 1, glmsg); + fixup_glUniformGeneric(2, 1, glmsg, pointersToFixup[0]); break; case GLMessage::glUniform2fv: /* void glUniform2fv(GLint location, GLsizei count, const GLfloat *value); */ - fixup_glUniformGeneric(2, 2, glmsg); + fixup_glUniformGeneric(2, 2, glmsg, pointersToFixup[0]); break; case GLMessage::glUniform3fv: /* void glUniform3fv(GLint location, GLsizei count, const GLfloat *value); */ - fixup_glUniformGeneric(2, 3, glmsg); + fixup_glUniformGeneric(2, 3, glmsg, pointersToFixup[0]); break; case GLMessage::glUniform4fv: /* void glUniform4fv(GLint location, GLsizei count, const GLfloat *value); */ - fixup_glUniformGeneric(2, 4, glmsg); + fixup_glUniformGeneric(2, 4, glmsg, pointersToFixup[0]); break; case GLMessage::glUniformMatrix2fv: /* void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) */ - fixup_glUniformMatrixGeneric(2, glmsg); + fixup_glUniformMatrixGeneric(2, glmsg, pointersToFixup); break; case GLMessage::glUniformMatrix3fv: /* void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) */ - fixup_glUniformMatrixGeneric(3, glmsg); + fixup_glUniformMatrixGeneric(3, glmsg, pointersToFixup); break; case GLMessage::glUniformMatrix4fv: /* void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) */ - fixup_glUniformMatrixGeneric(4, glmsg); + fixup_glUniformMatrixGeneric(4, glmsg, pointersToFixup); + break; + case GLMessage::glBufferData: + /* void glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage) */ + fixup_glBufferData(1, 2, glmsg, pointersToFixup); + break; + case GLMessage::glBufferSubData: + /* void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data) */ + fixup_glBufferData(2, 3, glmsg, pointersToFixup); break; case GLMessage::glDrawArrays: /* void glDrawArrays(GLenum mode, GLint first, GLsizei count) */ @@ -514,11 +546,11 @@ void fixupGLMessage(GLTraceContext *context, nsecs_t start, nsecs_t end, GLMessa break; case GLMessage::glPushGroupMarkerEXT: /* void PushGroupMarkerEXT(sizei length, const char *marker); */ - fixup_CStringPtr(1, glmsg); + fixup_CStringPtr(1, glmsg, pointersToFixup[0]); break; case GLMessage::glInsertEventMarkerEXT: /* void InsertEventMarkerEXT(sizei length, const char *marker); */ - fixup_CStringPtr(1, glmsg); + fixup_CStringPtr(1, glmsg, pointersToFixup[0]); break; default: break; diff --git a/opengl/libs/GLES_trace/src/gltrace_fixup.h b/opengl/libs/GLES_trace/src/gltrace_fixup.h index 64f75458df..fe301254d6 100644 --- a/opengl/libs/GLES_trace/src/gltrace_fixup.h +++ b/opengl/libs/GLES_trace/src/gltrace_fixup.h @@ -25,7 +25,9 @@ namespace android { namespace gltrace { -void fixupGLMessage(GLTraceContext *curContext, nsecs_t start, nsecs_t end, GLMessage *message); +void fixupGLMessage(GLTraceContext *curContext, nsecs_t wallStart, nsecs_t wallEnd, + nsecs_t threadStart, nsecs_t threadEnd, + GLMessage *message, void *pointersToFixup[]); void fixup_addFBContents(GLTraceContext *curContext, GLMessage *message, FBBinding fbToRead); }; diff --git a/opengl/libs/GLES_trace/tools/genapi.py b/opengl/libs/GLES_trace/tools/genapi.py index 557e4076db..24034c13ec 100755 --- a/opengl/libs/GLES_trace/tools/genapi.py +++ b/opengl/libs/GLES_trace/tools/genapi.py @@ -92,8 +92,8 @@ GL2PROTOBUF_TYPE_MAP = { "GLclampf":DataType.FLOAT, "GLfixed":DataType.INT, "GLclampx":DataType.INT, - "GLsizeiptr":DataType.POINTER, - "GLintptr":DataType.POINTER, + "GLsizeiptr":DataType.INT, + "GLintptr":DataType.INT, "GLeglImageOES":DataType.POINTER, } @@ -162,13 +162,15 @@ TRACE_CALL_TEMPLATE = pyratemp.Template( <!--(end)--> // call function - nsecs_t start_time = systemTime(); + nsecs_t wallStartTime = systemTime(SYSTEM_TIME_MONOTONIC); + nsecs_t threadStartTime = systemTime(SYSTEM_TIME_THREAD); <!--(if retType != "void")--> $!retType!$ retValue = glContext->hooks->gl.$!callsite!$; <!--(else)--> glContext->hooks->gl.$!callsite!$; <!--(end)--> - nsecs_t end_time = systemTime(); + nsecs_t threadEndTime = systemTime(SYSTEM_TIME_THREAD); + nsecs_t wallEndTime = systemTime(SYSTEM_TIME_MONOTONIC); <!--(if retType != "void")--> // set return value @@ -178,7 +180,20 @@ TRACE_CALL_TEMPLATE = pyratemp.Template( rt->$!retDataType.getProtobufCall()!$retValue); <!--(end)--> - fixupGLMessage(glContext, start_time, end_time, &glmsg); + void *pointerArgs[] = { +<!--(for argname, argtype in parsedArgs)--> + <!--(if argtype == DataType.POINTER)--> + (void *) $!argname!$, + <!--(end)--> +<!--(end)--> +<!--(if retDataType == DataType.POINTER)--> + (void *) retValue, +<!--(end)--> + }; + + fixupGLMessage(glContext, wallStartTime, wallEndTime, + threadStartTime, threadEndTime, + &glmsg, pointerArgs); glContext->traceGLMessage(&glmsg); <!--(if retType != "void")--> diff --git a/opengl/tests/angeles/Android.mk b/opengl/tests/angeles/Android.mk index d0c3221cfb..84b754b515 100644 --- a/opengl/tests/angeles/Android.mk +++ b/opengl/tests/angeles/Android.mk @@ -4,14 +4,7 @@ LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES:= app-linux.cpp demo.c.arm LOCAL_SHARED_LIBRARIES := libEGL libGLESv1_CM libui +LOCAL_C_INCLUDES += frameworks/base/opengl/tests/include LOCAL_MODULE:= angeles LOCAL_MODULE_TAGS := optional include $(BUILD_EXECUTABLE) - - -include $(CLEAR_VARS) -LOCAL_SRC_FILES:= gpustate.c -LOCAL_SHARED_LIBRARIES := libEGL libGLESv1_CM -LOCAL_MODULE:= gpustate -LOCAL_MODULE_TAGS := optional -include $(BUILD_EXECUTABLE) diff --git a/opengl/tests/angeles/app-linux.cpp b/opengl/tests/angeles/app-linux.cpp index 4d10ee5099..6ac68a2aee 100644 --- a/opengl/tests/angeles/app-linux.cpp +++ b/opengl/tests/angeles/app-linux.cpp @@ -53,7 +53,7 @@ #include <GLES/gl.h> #include <ui/FramebufferNativeWindow.h> -#include <ui/EGLUtils.h> +#include "EGLUtils.h" using namespace android; diff --git a/opengl/tests/angeles/gpustate.c b/opengl/tests/angeles/gpustate.c deleted file mode 100644 index 3c540c9ca5..0000000000 --- a/opengl/tests/angeles/gpustate.c +++ /dev/null @@ -1,39 +0,0 @@ -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <sys/mman.h> -#include <unistd.h> -#include <fcntl.h> - -static void *map_memory(const char *fn, unsigned base, unsigned size) -{ - int fd; - void *ptr; - - fd = open(fn, O_RDWR | O_SYNC); - if(fd < 0) { - perror("cannot open %s for mapping"); - return MAP_FAILED; - } - - ptr = mmap(0, size, PROT_READ | PROT_WRITE, - MAP_SHARED, fd, base); - close(fd); - - if(ptr == MAP_FAILED) { - fprintf(stderr,"cannot map %s (@%08x,%08x)\n", fn, base, size); - } - return ptr; -} - - -int main(int argc, char** argv) -{ - void *grp_regs = map_memory("/dev/hw3d", 0, 1024 * 1024); - printf("GPU base mapped at %p\n", grp_regs); - int state_offset = 0x10140; - printf("GPU state = %08lx\n", - *((long*)((char*)grp_regs + state_offset)) ); - - return 0; -} diff --git a/opengl/tests/fillrate/Android.mk b/opengl/tests/fillrate/Android.mk index 191c59b5ab..835f858e53 100644 --- a/opengl/tests/fillrate/Android.mk +++ b/opengl/tests/fillrate/Android.mk @@ -11,6 +11,8 @@ LOCAL_SHARED_LIBRARIES := \ libGLESv1_CM \ libui +LOCAL_C_INCLUDES += frameworks/base/opengl/tests/include + LOCAL_MODULE:= test-opengl-fillrate LOCAL_MODULE_TAGS := optional diff --git a/opengl/tests/fillrate/fillrate.cpp b/opengl/tests/fillrate/fillrate.cpp index 911d35469b..a708647a9a 100644 --- a/opengl/tests/fillrate/fillrate.cpp +++ b/opengl/tests/fillrate/fillrate.cpp @@ -26,7 +26,7 @@ #include <utils/StopWatch.h> #include <ui/FramebufferNativeWindow.h> -#include <ui/EGLUtils.h> +#include "EGLUtils.h" using namespace android; diff --git a/opengl/tests/filter/Android.mk b/opengl/tests/filter/Android.mk index a254127e78..d780362b5d 100644 --- a/opengl/tests/filter/Android.mk +++ b/opengl/tests/filter/Android.mk @@ -10,6 +10,8 @@ LOCAL_SHARED_LIBRARIES := \ libGLESv1_CM \ libui +LOCAL_C_INCLUDES += frameworks/base/opengl/tests/include + LOCAL_MODULE:= test-opengl-filter LOCAL_MODULE_TAGS := optional diff --git a/opengl/tests/filter/filter.cpp b/opengl/tests/filter/filter.cpp index 2351909743..0067327550 100644 --- a/opengl/tests/filter/filter.cpp +++ b/opengl/tests/filter/filter.cpp @@ -6,7 +6,7 @@ #include <GLES/glext.h> #include <ui/FramebufferNativeWindow.h> -#include <ui/EGLUtils.h> +#include "EGLUtils.h" using namespace android; diff --git a/opengl/tests/finish/Android.mk b/opengl/tests/finish/Android.mk index aa607c6a27..8f4f9c399f 100644 --- a/opengl/tests/finish/Android.mk +++ b/opengl/tests/finish/Android.mk @@ -11,6 +11,8 @@ LOCAL_SHARED_LIBRARIES := \ libGLESv1_CM \ libui +LOCAL_C_INCLUDES += frameworks/base/opengl/tests/include + LOCAL_MODULE:= test-opengl-finish LOCAL_MODULE_TAGS := optional diff --git a/opengl/tests/finish/finish.cpp b/opengl/tests/finish/finish.cpp index 91f5c45dde..11f0c22c33 100644 --- a/opengl/tests/finish/finish.cpp +++ b/opengl/tests/finish/finish.cpp @@ -27,7 +27,7 @@ #include <utils/Timers.h> #include <ui/FramebufferNativeWindow.h> -#include <ui/EGLUtils.h> +#include "EGLUtils.h" using namespace android; diff --git a/opengl/tests/gl2_basic/Android.mk b/opengl/tests/gl2_basic/Android.mk index a642eafef1..07469a06ed 100644 --- a/opengl/tests/gl2_basic/Android.mk +++ b/opengl/tests/gl2_basic/Android.mk @@ -10,6 +10,8 @@ LOCAL_SHARED_LIBRARIES := \ libGLESv2 \ libui +LOCAL_C_INCLUDES += frameworks/base/opengl/tests/include + LOCAL_MODULE:= test-opengl-gl2_basic LOCAL_MODULE_TAGS := optional diff --git a/opengl/tests/gl2_basic/gl2_basic.cpp b/opengl/tests/gl2_basic/gl2_basic.cpp index f274c7c4ef..7007871dad 100644 --- a/opengl/tests/gl2_basic/gl2_basic.cpp +++ b/opengl/tests/gl2_basic/gl2_basic.cpp @@ -27,7 +27,7 @@ #include <utils/Timers.h> #include <ui/FramebufferNativeWindow.h> -#include <ui/EGLUtils.h> +#include "EGLUtils.h" using namespace android; diff --git a/opengl/tests/gl2_copyTexImage/Android.mk b/opengl/tests/gl2_copyTexImage/Android.mk index bef1f908b1..b6164284a2 100644 --- a/opengl/tests/gl2_copyTexImage/Android.mk +++ b/opengl/tests/gl2_copyTexImage/Android.mk @@ -10,6 +10,8 @@ LOCAL_SHARED_LIBRARIES := \ libGLESv2 \ libui +LOCAL_C_INCLUDES += frameworks/base/opengl/tests/include + LOCAL_MODULE:= test-opengl-gl2_copyTexImage LOCAL_MODULE_TAGS := optional diff --git a/opengl/tests/gl2_copyTexImage/gl2_copyTexImage.cpp b/opengl/tests/gl2_copyTexImage/gl2_copyTexImage.cpp index c2bfdecfca..988d7ac0ff 100644 --- a/opengl/tests/gl2_copyTexImage/gl2_copyTexImage.cpp +++ b/opengl/tests/gl2_copyTexImage/gl2_copyTexImage.cpp @@ -27,7 +27,7 @@ #include <utils/Timers.h> #include <ui/FramebufferNativeWindow.h> -#include <ui/EGLUtils.h> +#include "EGLUtils.h" using namespace android; diff --git a/opengl/tests/gl2_yuvtex/Android.mk b/opengl/tests/gl2_yuvtex/Android.mk index 6304700f17..e36f319c55 100644 --- a/opengl/tests/gl2_yuvtex/Android.mk +++ b/opengl/tests/gl2_yuvtex/Android.mk @@ -10,6 +10,8 @@ LOCAL_SHARED_LIBRARIES := \ libGLESv2 \ libui +LOCAL_C_INCLUDES += frameworks/base/opengl/tests/include + LOCAL_MODULE:= test-opengl-gl2_yuvtex LOCAL_MODULE_TAGS := optional diff --git a/opengl/tests/gl2_yuvtex/gl2_yuvtex.cpp b/opengl/tests/gl2_yuvtex/gl2_yuvtex.cpp index f0b8d1259a..d3e4932634 100644 --- a/opengl/tests/gl2_yuvtex/gl2_yuvtex.cpp +++ b/opengl/tests/gl2_yuvtex/gl2_yuvtex.cpp @@ -29,7 +29,7 @@ #include <ui/FramebufferNativeWindow.h> #include <ui/GraphicBuffer.h> -#include <ui/EGLUtils.h> +#include "EGLUtils.h" using namespace android; diff --git a/opengl/tests/gl_basic/Android.mk b/opengl/tests/gl_basic/Android.mk index 6b6341fc35..2ba327bfe3 100644 --- a/opengl/tests/gl_basic/Android.mk +++ b/opengl/tests/gl_basic/Android.mk @@ -10,6 +10,8 @@ LOCAL_SHARED_LIBRARIES := \ libGLESv1_CM \ libui +LOCAL_C_INCLUDES += frameworks/base/opengl/tests/include + LOCAL_MODULE:= test-opengl-gl_basic LOCAL_MODULE_TAGS := optional diff --git a/opengl/tests/gl_basic/gl_basic.cpp b/opengl/tests/gl_basic/gl_basic.cpp index 0cc8398a4a..23ce93480f 100644 --- a/opengl/tests/gl_basic/gl_basic.cpp +++ b/opengl/tests/gl_basic/gl_basic.cpp @@ -6,7 +6,7 @@ #include <GLES/glext.h> #include <ui/FramebufferNativeWindow.h> -#include <ui/EGLUtils.h> +#include "EGLUtils.h" #include <stdio.h> diff --git a/opengl/tests/gl_perf/Android.mk b/opengl/tests/gl_perf/Android.mk index 37647ca682..f32abd3b5a 100644 --- a/opengl/tests/gl_perf/Android.mk +++ b/opengl/tests/gl_perf/Android.mk @@ -11,6 +11,8 @@ LOCAL_SHARED_LIBRARIES := \ libGLESv2 \ libui +LOCAL_C_INCLUDES += frameworks/base/opengl/tests/include + LOCAL_MODULE:= test-opengl-gl2_perf LOCAL_MODULE_TAGS := optional diff --git a/opengl/tests/gl_perf/gl2_perf.cpp b/opengl/tests/gl_perf/gl2_perf.cpp index 9dfcf1cc0e..224acafa7a 100644 --- a/opengl/tests/gl_perf/gl2_perf.cpp +++ b/opengl/tests/gl_perf/gl2_perf.cpp @@ -27,7 +27,7 @@ #include <utils/Timers.h> #include <ui/FramebufferNativeWindow.h> -#include <ui/EGLUtils.h> +#include "EGLUtils.h" using namespace android; diff --git a/opengl/tests/gl_yuvtex/Android.mk b/opengl/tests/gl_yuvtex/Android.mk index a78db25571..5b87f2ee6e 100644 --- a/opengl/tests/gl_yuvtex/Android.mk +++ b/opengl/tests/gl_yuvtex/Android.mk @@ -10,6 +10,8 @@ LOCAL_SHARED_LIBRARIES := \ libGLESv1_CM \ libui +LOCAL_C_INCLUDES += frameworks/base/opengl/tests/include + LOCAL_MODULE:= test-opengl-gl_yuvtex LOCAL_MODULE_TAGS := optional diff --git a/opengl/tests/gl_yuvtex/gl_yuvtex.cpp b/opengl/tests/gl_yuvtex/gl_yuvtex.cpp index fbe65f12ed..7a00f76f84 100644 --- a/opengl/tests/gl_yuvtex/gl_yuvtex.cpp +++ b/opengl/tests/gl_yuvtex/gl_yuvtex.cpp @@ -29,7 +29,7 @@ #include <ui/FramebufferNativeWindow.h> #include <ui/GraphicBuffer.h> -#include <ui/EGLUtils.h> +#include "EGLUtils.h" using namespace android; diff --git a/opengl/tests/hwc/hwcColorEquiv.cpp b/opengl/tests/hwc/hwcColorEquiv.cpp index 1d039481cf..bb305dcafe 100644 --- a/opengl/tests/hwc/hwcColorEquiv.cpp +++ b/opengl/tests/hwc/hwcColorEquiv.cpp @@ -87,7 +87,6 @@ #include <ui/FramebufferNativeWindow.h> #include <ui/GraphicBuffer.h> -#include <ui/EGLUtils.h> #define LOG_TAG "hwcColorEquivTest" #include <utils/Log.h> diff --git a/opengl/tests/hwc/hwcCommit.cpp b/opengl/tests/hwc/hwcCommit.cpp index 66ccdae709..685dc5d0b8 100644 --- a/opengl/tests/hwc/hwcCommit.cpp +++ b/opengl/tests/hwc/hwcCommit.cpp @@ -98,7 +98,6 @@ #include <ui/FramebufferNativeWindow.h> #include <ui/GraphicBuffer.h> -#include <ui/EGLUtils.h> #define LOG_TAG "hwcCommitTest" #include <utils/Log.h> diff --git a/opengl/tests/hwc/hwcRects.cpp b/opengl/tests/hwc/hwcRects.cpp index 523e3dea78..80cde23a7a 100644 --- a/opengl/tests/hwc/hwcRects.cpp +++ b/opengl/tests/hwc/hwcRects.cpp @@ -106,7 +106,6 @@ #include <ui/FramebufferNativeWindow.h> #include <ui/GraphicBuffer.h> -#include <ui/EGLUtils.h> #define LOG_TAG "hwcRectsTest" #include <utils/Log.h> diff --git a/opengl/tests/hwc/hwcStress.cpp b/opengl/tests/hwc/hwcStress.cpp index 1cefb4b8ff..7d7bc1f9cc 100644 --- a/opengl/tests/hwc/hwcStress.cpp +++ b/opengl/tests/hwc/hwcStress.cpp @@ -103,7 +103,6 @@ #include <ui/FramebufferNativeWindow.h> #include <ui/GraphicBuffer.h> -#include <ui/EGLUtils.h> #define LOG_TAG "hwcStressTest" #include <utils/Log.h> diff --git a/opengl/tests/hwc/hwcTestLib.cpp b/opengl/tests/hwc/hwcTestLib.cpp index 925405e69a..63f42bafc4 100644 --- a/opengl/tests/hwc/hwcTestLib.cpp +++ b/opengl/tests/hwc/hwcTestLib.cpp @@ -27,6 +27,8 @@ #include <hwc/hwcTestLib.h> +#include "EGLUtils.h" + // Defines #define NUMA(a) (sizeof(a) / sizeof(a [0])) diff --git a/opengl/tests/hwc/hwcTestLib.h b/opengl/tests/hwc/hwcTestLib.h index 99ee60867d..b0c3012491 100644 --- a/opengl/tests/hwc/hwcTestLib.h +++ b/opengl/tests/hwc/hwcTestLib.h @@ -29,7 +29,6 @@ #include <ui/FramebufferNativeWindow.h> #include <ui/GraphicBuffer.h> -#include <ui/EGLUtils.h> #include <utils/Log.h> #include <testUtil.h> diff --git a/libs/ui/EGLUtils.cpp b/opengl/tests/include/EGLUtils.h index f24a71d88d..014c2611ae 100644 --- a/libs/ui/EGLUtils.cpp +++ b/opengl/tests/include/EGLUtils.h @@ -15,21 +15,42 @@ */ -#define LOG_TAG "EGLUtils" +#ifndef ANDROID_UI_EGLUTILS_H +#define ANDROID_UI_EGLUTILS_H -#include <cutils/log.h> -#include <utils/Errors.h> - -#include <ui/EGLUtils.h> +#include <stdint.h> +#include <stdlib.h> +#include <system/window.h> +#include <utils/Errors.h> #include <EGL/egl.h> -#include <private/ui/android_natives_priv.h> // ---------------------------------------------------------------------------- namespace android { // ---------------------------------------------------------------------------- +class EGLUtils +{ +public: + + static inline const char *strerror(EGLint err); + + static inline status_t selectConfigForPixelFormat( + EGLDisplay dpy, + EGLint const* attrs, + int32_t format, + EGLConfig* outConfig); + + static inline status_t selectConfigForNativeWindow( + EGLDisplay dpy, + EGLint const* attrs, + EGLNativeWindowType window, + EGLConfig* outConfig); +}; + +// ---------------------------------------------------------------------------- + const char *EGLUtils::strerror(EGLint err) { switch (err){ @@ -55,7 +76,7 @@ const char *EGLUtils::strerror(EGLint err) status_t EGLUtils::selectConfigForPixelFormat( EGLDisplay dpy, EGLint const* attrs, - PixelFormat format, + int32_t format, EGLConfig* outConfig) { EGLint numConfigs = -1, n=0; @@ -65,7 +86,7 @@ status_t EGLUtils::selectConfigForPixelFormat( if (outConfig == NULL) return BAD_VALUE; - + // Get all the "potential match" configs... if (eglGetConfigs(dpy, NULL, 0, &numConfigs) == EGL_FALSE) return BAD_VALUE; @@ -75,7 +96,7 @@ status_t EGLUtils::selectConfigForPixelFormat( free(configs); return BAD_VALUE; } - + int i; EGLConfig config = NULL; for (i=0 ; i<n ; i++) { @@ -88,7 +109,7 @@ status_t EGLUtils::selectConfigForPixelFormat( } free(configs); - + if (i<n) { *outConfig = config; return NO_ERROR; @@ -105,10 +126,10 @@ status_t EGLUtils::selectConfigForNativeWindow( { int err; int format; - + if (!window) return BAD_VALUE; - + if ((err = window->query(window, NATIVE_WINDOW_FORMAT, &format)) < 0) { return err; } @@ -119,3 +140,5 @@ status_t EGLUtils::selectConfigForNativeWindow( // ---------------------------------------------------------------------------- }; // namespace android // ---------------------------------------------------------------------------- + +#endif /* ANDROID_UI_EGLUTILS_H */ diff --git a/opengl/tests/include/glTestLib.h b/opengl/tests/include/glTestLib.h index 06fbf5d549..c91c594882 100644 --- a/opengl/tests/include/glTestLib.h +++ b/opengl/tests/include/glTestLib.h @@ -24,9 +24,7 @@ #include <GLES2/gl2.h> #include <GLES2/gl2ext.h> -//#include <ui/FramebufferNativeWindow.h> -//#include <ui/GraphicBuffer.h> -#include <ui/EGLUtils.h> +#include "EGLUtils.h" void glTestPrintGLString(const char *name, GLenum s); void glTestCheckEglError(const char* op, EGLBoolean returnVal = EGL_TRUE); diff --git a/opengl/tests/lib/glTestLib.cpp b/opengl/tests/lib/glTestLib.cpp index 052cbd75cf..b434fc7efa 100644 --- a/opengl/tests/lib/glTestLib.cpp +++ b/opengl/tests/lib/glTestLib.cpp @@ -26,7 +26,7 @@ #include <GLES2/gl2.h> #include <GLES2/gl2ext.h> -#include <ui/EGLUtils.h> +#include "EGLUtils.h" #include <utils/Log.h> #include <testUtil.h> diff --git a/opengl/tests/linetex/Android.mk b/opengl/tests/linetex/Android.mk index 6ff248dcce..261940e4eb 100644 --- a/opengl/tests/linetex/Android.mk +++ b/opengl/tests/linetex/Android.mk @@ -10,6 +10,8 @@ LOCAL_SHARED_LIBRARIES := \ libGLESv1_CM \ libui +LOCAL_C_INCLUDES += frameworks/base/opengl/tests/include + LOCAL_MODULE:= test-opengl-linetex LOCAL_MODULE_TAGS := optional diff --git a/opengl/tests/linetex/linetex.cpp b/opengl/tests/linetex/linetex.cpp index 6842940940..86694921c3 100644 --- a/opengl/tests/linetex/linetex.cpp +++ b/opengl/tests/linetex/linetex.cpp @@ -27,7 +27,7 @@ #include <utils/StopWatch.h> #include <ui/FramebufferNativeWindow.h> -#include <ui/EGLUtils.h> +#include "EGLUtils.h" using namespace android; diff --git a/opengl/tests/swapinterval/Android.mk b/opengl/tests/swapinterval/Android.mk index 9a4145eb48..d014cc94db 100644 --- a/opengl/tests/swapinterval/Android.mk +++ b/opengl/tests/swapinterval/Android.mk @@ -11,6 +11,8 @@ LOCAL_SHARED_LIBRARIES := \ libGLESv1_CM \ libui +LOCAL_C_INCLUDES += frameworks/base/opengl/tests/include + LOCAL_MODULE:= test-opengl-swapinterval LOCAL_MODULE_TAGS := optional diff --git a/opengl/tests/swapinterval/swapinterval.cpp b/opengl/tests/swapinterval/swapinterval.cpp index 8ca031bef5..a0f4bc4663 100644 --- a/opengl/tests/swapinterval/swapinterval.cpp +++ b/opengl/tests/swapinterval/swapinterval.cpp @@ -24,7 +24,7 @@ #include <utils/StopWatch.h> #include <ui/FramebufferNativeWindow.h> -#include <ui/EGLUtils.h> +#include "EGLUtils.h" using namespace android; diff --git a/opengl/tests/textures/Android.mk b/opengl/tests/textures/Android.mk index b2fa185577..fe9f43c406 100644 --- a/opengl/tests/textures/Android.mk +++ b/opengl/tests/textures/Android.mk @@ -10,6 +10,8 @@ LOCAL_SHARED_LIBRARIES := \ libGLESv1_CM \ libui +LOCAL_C_INCLUDES += frameworks/base/opengl/tests/include + LOCAL_MODULE:= test-opengl-textures LOCAL_MODULE_TAGS := optional diff --git a/opengl/tests/textures/textures.cpp b/opengl/tests/textures/textures.cpp index cbe8ffddc9..5d3d94e7da 100644 --- a/opengl/tests/textures/textures.cpp +++ b/opengl/tests/textures/textures.cpp @@ -23,7 +23,7 @@ #include <GLES/glext.h> #include <ui/FramebufferNativeWindow.h> -#include <ui/EGLUtils.h> +#include "EGLUtils.h" using namespace android; diff --git a/opengl/tests/tritex/Android.mk b/opengl/tests/tritex/Android.mk index 6db3f49a99..fc544e44c9 100644 --- a/opengl/tests/tritex/Android.mk +++ b/opengl/tests/tritex/Android.mk @@ -10,6 +10,8 @@ LOCAL_SHARED_LIBRARIES := \ libGLESv1_CM \ libui +LOCAL_C_INCLUDES += frameworks/base/opengl/tests/include + LOCAL_MODULE:= test-opengl-tritex LOCAL_MODULE_TAGS := optional diff --git a/opengl/tests/tritex/tritex.cpp b/opengl/tests/tritex/tritex.cpp index 3365ab47ef..f18348367d 100644 --- a/opengl/tests/tritex/tritex.cpp +++ b/opengl/tests/tritex/tritex.cpp @@ -9,7 +9,7 @@ #include <GLES/glext.h> #include <ui/FramebufferNativeWindow.h> -#include <ui/EGLUtils.h> +#include "EGLUtils.h" #include <stdio.h>
#include <stdlib.h> diff --git a/services/surfaceflinger/DisplayHardware/DisplayHardware.cpp b/services/surfaceflinger/DisplayHardware/DisplayHardware.cpp index 986aec576a..9baae800ed 100644 --- a/services/surfaceflinger/DisplayHardware/DisplayHardware.cpp +++ b/services/surfaceflinger/DisplayHardware/DisplayHardware.cpp @@ -26,14 +26,11 @@ #include <ui/PixelFormat.h> #include <ui/FramebufferNativeWindow.h> -#include <ui/EGLUtils.h> #include <GLES/gl.h> #include <EGL/egl.h> #include <EGL/eglext.h> -#include <pixelflinger/pixelflinger.h> - #include "DisplayHardware/DisplayHardware.h" #include <hardware/gralloc.h> @@ -60,6 +57,29 @@ void checkGLErrors() static __attribute__((noinline)) void checkEGLErrors(const char* token) { + struct EGLUtils { + static const char *strerror(EGLint err) { + switch (err){ + case EGL_SUCCESS: return "EGL_SUCCESS"; + case EGL_NOT_INITIALIZED: return "EGL_NOT_INITIALIZED"; + case EGL_BAD_ACCESS: return "EGL_BAD_ACCESS"; + case EGL_BAD_ALLOC: return "EGL_BAD_ALLOC"; + case EGL_BAD_ATTRIBUTE: return "EGL_BAD_ATTRIBUTE"; + case EGL_BAD_CONFIG: return "EGL_BAD_CONFIG"; + case EGL_BAD_CONTEXT: return "EGL_BAD_CONTEXT"; + case EGL_BAD_CURRENT_SURFACE: return "EGL_BAD_CURRENT_SURFACE"; + case EGL_BAD_DISPLAY: return "EGL_BAD_DISPLAY"; + case EGL_BAD_MATCH: return "EGL_BAD_MATCH"; + case EGL_BAD_NATIVE_PIXMAP: return "EGL_BAD_NATIVE_PIXMAP"; + case EGL_BAD_NATIVE_WINDOW: return "EGL_BAD_NATIVE_WINDOW"; + case EGL_BAD_PARAMETER: return "EGL_BAD_PARAMETER"; + case EGL_BAD_SURFACE: return "EGL_BAD_SURFACE"; + case EGL_CONTEXT_LOST: return "EGL_CONTEXT_LOST"; + default: return "UNKNOWN"; + } + } + }; + EGLint error = eglGetError(); if (error && error != EGL_SUCCESS) { ALOGE("%s: EGL error 0x%04x (%s)", diff --git a/services/surfaceflinger/DisplayHardware/DisplayHardware.h b/services/surfaceflinger/DisplayHardware/DisplayHardware.h index 02be4dcba7..0a828b3dcf 100644 --- a/services/surfaceflinger/DisplayHardware/DisplayHardware.h +++ b/services/surfaceflinger/DisplayHardware/DisplayHardware.h @@ -27,8 +27,6 @@ #include <EGL/egl.h> #include <EGL/eglext.h> -#include <pixelflinger/pixelflinger.h> - #include "GLExtensions.h" #include "DisplayHardware/DisplayHardwareBase.h" diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index 3e6b872524..c15fdbc1ec 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -17,6 +17,7 @@ #include <stdlib.h> #include <stdint.h> #include <sys/types.h> +#include <math.h> #include <cutils/compiler.h> #include <cutils/native_handle.h> @@ -29,7 +30,7 @@ #include <ui/GraphicBuffer.h> #include <ui/PixelFormat.h> -#include <surfaceflinger/Surface.h> +#include <gui/Surface.h> #include "clz.h" #include "DisplayHardware/DisplayHardware.h" @@ -38,11 +39,9 @@ #include "Layer.h" #include "SurfaceFlinger.h" #include "SurfaceTextureLayer.h" -#include <math.h> #define DEBUG_RESIZE 0 - namespace android { // --------------------------------------------------------------------------- @@ -55,7 +54,7 @@ Layer::Layer(SurfaceFlinger* flinger, mCurrentTransform(0), mCurrentScalingMode(NATIVE_WINDOW_SCALING_MODE_FREEZE), mCurrentOpacity(true), - mRefreshPending(0), + mRefreshPending(false), mFrameLatencyNeeded(false), mFrameLatencyOffset(0), mFormat(PIXEL_FORMAT_NONE), @@ -161,7 +160,10 @@ status_t Layer::setBuffers( uint32_t w, uint32_t h, // this surfaces pixel format PixelFormatInfo info; status_t err = getPixelFormatInfo(format, &info); - if (err) return err; + if (err) { + ALOGE("unsupported pixelformat %d", format); + return err; + } // the display's pixel format const DisplayHardware& hw(graphicPlane(0).displayHardware()); @@ -171,6 +173,7 @@ status_t Layer::setBuffers( uint32_t w, uint32_t h, // never allow a surface larger than what our underlying GL implementation // can handle. if ((uint32_t(w)>maxSurfaceDims) || (uint32_t(h)>maxSurfaceDims)) { + ALOGE("dimensions too large %u x %u", uint32_t(w), uint32_t(h)); return BAD_VALUE; } @@ -408,15 +411,9 @@ bool Layer::isCropped() const { // pageflip handling... // ---------------------------------------------------------------------------- -bool Layer::onPreComposition() -{ - // if there was more than one pending update, request a refresh - if (mRefreshPending >= 2) { - mRefreshPending = 0; - return true; - } - mRefreshPending = 0; - return false; +bool Layer::onPreComposition() { + mRefreshPending = false; + return mQueuedFrames > 0; } void Layer::lockPageFlip(bool& recomputeVisibleRegions) @@ -428,9 +425,11 @@ void Layer::lockPageFlip(bool& recomputeVisibleRegions) // because we cannot call updateTeximage() without a corresponding // compositionComplete() call. // we'll trigger an update in onPreComposition(). - if (mRefreshPending++) { + if (mRefreshPending) { + mPostedDirtyRegion.clear(); return; } + mRefreshPending = true; // Capture the old state of the layer for comparisons later const bool oldOpacity = isOpaque(); @@ -541,25 +540,23 @@ void Layer::lockPageFlip(bool& recomputeVisibleRegions) void Layer::unlockPageFlip( const Transform& planeTransform, Region& outDirtyRegion) { - if (mRefreshPending >= 2) { - return; - } - - Region dirtyRegion(mPostedDirtyRegion); - if (!dirtyRegion.isEmpty()) { + Region postedRegion(mPostedDirtyRegion); + if (!postedRegion.isEmpty()) { mPostedDirtyRegion.clear(); - // The dirty region is given in the layer's coordinate space - // transform the dirty region by the surface's transformation - // and the global transformation. - const Layer::State& s(drawingState()); - const Transform tr(planeTransform * s.transform); - dirtyRegion = tr.transform(dirtyRegion); - - // At this point, the dirty region is in screen space. - // Make sure it's constrained by the visible region (which - // is in screen space as well). - dirtyRegion.andSelf(visibleRegionScreen); - outDirtyRegion.orSelf(dirtyRegion); + if (!visibleRegionScreen.isEmpty()) { + // The dirty region is given in the layer's coordinate space + // transform the dirty region by the surface's transformation + // and the global transformation. + const Layer::State& s(drawingState()); + const Transform tr(planeTransform * s.transform); + postedRegion = tr.transform(postedRegion); + + // At this point, the dirty region is in screen space. + // Make sure it's constrained by the visible region (which + // is in screen space as well). + postedRegion.andSelf(visibleRegionScreen); + outDirtyRegion.orSelf(postedRegion); + } } } diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h index bf30608c97..8d508c2eb6 100644 --- a/services/surfaceflinger/Layer.h +++ b/services/surfaceflinger/Layer.h @@ -22,10 +22,13 @@ #include <gui/SurfaceTexture.h> -#include <pixelflinger/pixelflinger.h> +#include <utils/Timers.h> + #include <ui/GraphicBuffer.h> #include <ui/PixelFormat.h> +#include <gui/ISurfaceComposerClient.h> + #include <EGL/egl.h> #include <EGL/eglext.h> #include <GLES/gl.h> @@ -34,7 +37,6 @@ #include "LayerBase.h" #include "SurfaceTextureLayer.h" #include "Transform.h" -#include <utils/Timers.h> namespace android { @@ -116,7 +118,7 @@ private: uint32_t mCurrentTransform; uint32_t mCurrentScalingMode; bool mCurrentOpacity; - size_t mRefreshPending; + bool mRefreshPending; bool mFrameLatencyNeeded; int mFrameLatencyOffset; diff --git a/services/surfaceflinger/LayerBase.h b/services/surfaceflinger/LayerBase.h index b8f7680b2b..cd6efdd1fc 100644 --- a/services/surfaceflinger/LayerBase.h +++ b/services/surfaceflinger/LayerBase.h @@ -28,10 +28,9 @@ #include <ui/Region.h> -#include <surfaceflinger/ISurfaceComposerClient.h> -#include <private/surfaceflinger/LayerState.h> +#include <gui/ISurfaceComposerClient.h> -#include <pixelflinger/pixelflinger.h> +#include <private/gui/LayerState.h> #include <hardware/hwcomposer.h> diff --git a/services/surfaceflinger/LayerScreenshot.cpp b/services/surfaceflinger/LayerScreenshot.cpp index c127fa621f..c7cf46e53a 100644 --- a/services/surfaceflinger/LayerScreenshot.cpp +++ b/services/surfaceflinger/LayerScreenshot.cpp @@ -70,6 +70,8 @@ void LayerScreenshot::initTexture(GLfloat u, GLfloat v) { glBindTexture(GL_TEXTURE_2D, mTextureName); glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); mTexCoords[0] = 0; mTexCoords[1] = v; mTexCoords[2] = 0; mTexCoords[3] = 0; mTexCoords[4] = u; mTexCoords[5] = 0; diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 40717f4e95..62461bb264 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -43,14 +43,13 @@ #include <ui/GraphicBufferAllocator.h> #include <ui/PixelFormat.h> -#include <pixelflinger/pixelflinger.h> #include <GLES/gl.h> #include "clz.h" +#include "DdmConnection.h" #include "DisplayEventConnection.h" #include "EventThread.h" #include "GLExtensions.h" -#include "DdmConnection.h" #include "Layer.h" #include "LayerDim.h" #include "LayerScreenshot.h" @@ -60,7 +59,7 @@ #include "DisplayHardware/HWComposer.h" #include <private/android_filesystem_config.h> -#include <private/surfaceflinger/SharedBufferStack.h> +#include <private/gui/SharedBufferStack.h> #define EGL_VERSION_HW_ANDROID 0x3143 @@ -1000,6 +999,12 @@ void SurfaceFlinger::composeSurfaces(const Region& dirty) drawWormhole(); } + // FIXME: workaroud for b/6020860 + glEnable(GL_SCISSOR_TEST); + glScissor(0,0,0,0); + glClear(GL_COLOR_BUFFER_BIT); + // end-workaround + /* * and then, render the layers targeted at the framebuffer */ @@ -1279,7 +1284,7 @@ sp<ISurface> SurfaceFlinger::createSurface( return surfaceHandle; } - //ALOGD("createSurface for pid %d (%d x %d)", pid, w, h); + //ALOGD("createSurface for (%d x %d), name=%s", w, h, name.string()); sp<Layer> normalLayer; switch (flags & eFXSurfaceMask) { case eFXSurfaceNormal: @@ -1776,6 +1781,10 @@ status_t SurfaceFlinger::onTransact( setTransactionFlags(eTransactionNeeded|eTraversalNeeded); return NO_ERROR; } + case 1006:{ // send empty update + signalRefresh(); + return NO_ERROR; + } case 1008: // toggle use of hw composer n = data.readInt32(); mDebugDisableHWC = n ? 1 : 0; @@ -1922,6 +1931,8 @@ status_t SurfaceFlinger::electronBeamOffAnimationImplLocked() glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexCoordPointer(2, GL_FLOAT, 0, texCoords); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glVertexPointer(2, GL_FLOAT, 0, vtx); @@ -2094,6 +2105,8 @@ status_t SurfaceFlinger::electronBeamOnAnimationImplLocked() glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexCoordPointer(2, GL_FLOAT, 0, texCoords); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glVertexPointer(2, GL_FLOAT, 0, vtx); diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index fcd93615ff..b507877586 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -33,9 +33,9 @@ #include <binder/IMemory.h> #include <ui/PixelFormat.h> -#include <surfaceflinger/IGraphicBufferAlloc.h> -#include <surfaceflinger/ISurfaceComposer.h> -#include <surfaceflinger/ISurfaceComposerClient.h> +#include <gui/IGraphicBufferAlloc.h> +#include <gui/ISurfaceComposer.h> +#include <gui/ISurfaceComposerClient.h> #include "Barrier.h" #include "Layer.h" diff --git a/services/surfaceflinger/tests/Transaction_test.cpp b/services/surfaceflinger/tests/Transaction_test.cpp index 396a3fdf2b..84ae0d957f 100644 --- a/services/surfaceflinger/tests/Transaction_test.cpp +++ b/services/surfaceflinger/tests/Transaction_test.cpp @@ -17,9 +17,12 @@ #include <gtest/gtest.h> #include <binder/IMemory.h> -#include <surfaceflinger/ISurfaceComposer.h> -#include <surfaceflinger/Surface.h> -#include <surfaceflinger/SurfaceComposerClient.h> + +#include <gui/ISurfaceComposer.h> +#include <gui/Surface.h> +#include <gui/SurfaceComposerClient.h> +#include <private/gui/ComposerService.h> + #include <utils/String8.h> namespace android { diff --git a/services/surfaceflinger/tests/resize/resize.cpp b/services/surfaceflinger/tests/resize/resize.cpp index 56b2a8f1cb..c143b3d68c 100644 --- a/services/surfaceflinger/tests/resize/resize.cpp +++ b/services/surfaceflinger/tests/resize/resize.cpp @@ -22,9 +22,8 @@ #include <binder/ProcessState.h> #include <binder/IServiceManager.h> -#include <surfaceflinger/Surface.h> -#include <surfaceflinger/ISurface.h> -#include <surfaceflinger/SurfaceComposerClient.h> +#include <gui/Surface.h> +#include <gui/SurfaceComposerClient.h> using namespace android; @@ -39,7 +38,7 @@ int main(int argc, char** argv) // create a client to surfaceflinger sp<SurfaceComposerClient> client = new SurfaceComposerClient(); - sp<Surface> surface = client->createSurface(getpid(), 0, 160, 240, + sp<Surface> surface = client->createSurface(0, 160, 240, PIXEL_FORMAT_RGB_565); diff --git a/services/surfaceflinger/tests/screencap/screencap.cpp b/services/surfaceflinger/tests/screencap/screencap.cpp index 6cf1504173..53566e0ff7 100644 --- a/services/surfaceflinger/tests/screencap/screencap.cpp +++ b/services/surfaceflinger/tests/screencap/screencap.cpp @@ -21,7 +21,7 @@ #include <binder/IServiceManager.h> #include <binder/IMemory.h> -#include <surfaceflinger/ISurfaceComposer.h> +#include <gui/ISurfaceComposer.h> #include <SkImageEncoder.h> #include <SkBitmap.h> diff --git a/services/surfaceflinger/tests/surface/surface.cpp b/services/surfaceflinger/tests/surface/surface.cpp index 8e1c3fe322..a8878f7db1 100644 --- a/services/surfaceflinger/tests/surface/surface.cpp +++ b/services/surfaceflinger/tests/surface/surface.cpp @@ -22,9 +22,8 @@ #include <binder/ProcessState.h> #include <binder/IServiceManager.h> -#include <surfaceflinger/Surface.h> -#include <surfaceflinger/ISurface.h> -#include <surfaceflinger/SurfaceComposerClient.h> +#include <gui/Surface.h> +#include <gui/SurfaceComposerClient.h> using namespace android; @@ -38,7 +37,7 @@ int main(int argc, char** argv) sp<SurfaceComposerClient> client = new SurfaceComposerClient(); sp<SurfaceControl> surfaceControl = client->createSurface( - getpid(), 0, 160, 240, PIXEL_FORMAT_RGB_565); + 0, 160, 240, PIXEL_FORMAT_RGB_565); SurfaceComposerClient::openGlobalTransaction(); surfaceControl->setLayer(100000); SurfaceComposerClient::closeGlobalTransaction(); |