diff options
author | Christopher Tate <ctate@google.com> | 2009-06-12 15:20:04 -0700 |
---|---|---|
committer | Christopher Tate <ctate@google.com> | 2009-06-14 19:39:29 -0700 |
commit | 2fdd428e0f18384160f7c38ce3a2cd9ba7e7b2c2 (patch) | |
tree | 985ee68d951d7c141e296aa4fec60d41f667538a /core/jni/android_backup_BackupDataInput.cpp | |
parent | 31390c752828dce0a33d0adeacdf10a49ff847ce (diff) | |
download | frameworks_base-2fdd428e0f18384160f7c38ce3a2cd9ba7e7b2c2.zip frameworks_base-2fdd428e0f18384160f7c38ce3a2cd9ba7e7b2c2.tar.gz frameworks_base-2fdd428e0f18384160f7c38ce3a2cd9ba7e7b2c2.tar.bz2 |
Fix some backup reader/writer issues; make local transport do backup
As of this change, LocalTransport is successfully propagating data changes from
the backup data format into a repository stored in /cache/backup/[packagename].
Each backup key gets a separate file there for ease of manipulation and testing.
The general semantics of BackupDataReader have been tweaked, too; it now just
returns simple "we're done with the data" when it hits the end, even if no
footer has been found, because on the writing side the footer isn't being
written. Also, reading an entity now merely requires a "big enough" buffer, not
an exactly-sized one.
This is all a work in progress, but this is at least working now for purposes of
this local transport.
Still to do: proper change vs deletion detection, as well as expanding the data
format itself to include necessary metadata etc.
Diffstat (limited to 'core/jni/android_backup_BackupDataInput.cpp')
-rw-r--r-- | core/jni/android_backup_BackupDataInput.cpp | 81 |
1 files changed, 46 insertions, 35 deletions
diff --git a/core/jni/android_backup_BackupDataInput.cpp b/core/jni/android_backup_BackupDataInput.cpp index d8c2535..5b2fb73 100644 --- a/core/jni/android_backup_BackupDataInput.cpp +++ b/core/jni/android_backup_BackupDataInput.cpp @@ -62,43 +62,54 @@ readNextHeader_native(JNIEnv* env, jobject clazz, int r, jobject entity) return err < 0 ? err : -1; } - while (reader->HasEntities()) { - int type; + int type = 0; - err = reader->ReadNextHeader(&type); + err = reader->ReadNextHeader(&type); + if (err == EIO) { + // Clean EOF with no footer block; just claim we're done + return 1; + } + + if (err != 0) { + return err < 0 ? err : -1; + } + + switch (type) { + case BACKUP_HEADER_APP_V1: + { + String8 packageName; + int cookie; + err = reader->ReadAppHeader(&packageName, &cookie); if (err != 0) { + LOGD("ReadAppHeader() returned %d; aborting", err); return err < 0 ? err : -1; } - - switch (type) { - case BACKUP_HEADER_APP_V1: - { - String8 packageName; - int cookie; - err = reader->ReadAppHeader(&packageName, &cookie); - if (err != 0) { - return err < 0 ? err : -1; - } - break; - } - case BACKUP_HEADER_ENTITY_V1: - { - String8 key; - size_t dataSize; - err = reader->ReadEntityHeader(&key, &dataSize); - if (err != 0) { - return err < 0 ? err : -1; - } - // TODO: Set the fields in the entity object - return 0; - } - case BACKUP_FOOTER_APP_V1: - break; - default: - LOGD("Unknown header type: 0x%08x\n", type); - return -1; + break; + } + case BACKUP_HEADER_ENTITY_V1: + { + String8 key; + size_t dataSize; + err = reader->ReadEntityHeader(&key, &dataSize); + if (err != 0) { + LOGD("ReadEntityHeader(); aborting", err); + return err < 0 ? err : -1; } + // TODO: Set the fields in the entity object + jstring keyStr = env->NewStringUTF(key.string()); + env->SetObjectField(entity, s_keyField, keyStr); + env->SetIntField(entity, s_dataSizeField, dataSize); + return 0; + } + case BACKUP_FOOTER_APP_V1: + { + break; } + default: + LOGD("Unknown header type: 0x%08x\n", type); + return -1; + } + // done return 1; } @@ -109,17 +120,17 @@ readEntityData_native(JNIEnv* env, jobject clazz, int r, jbyteArray data, int si int err; BackupDataReader* reader = (BackupDataReader*)r; - if (env->GetArrayLength(data) > size) { + if (env->GetArrayLength(data) < size) { // size mismatch return -1; } jbyte* dataBytes = env->GetByteArrayElements(data, NULL); if (dataBytes == NULL) { - return -1; + return -2; } - err = reader->ReadEntityData(dataBytes, size); + err = reader->ReadEntityData(dataBytes, size); env->ReleaseByteArrayElements(data, dataBytes, 0); @@ -136,7 +147,7 @@ static const JNINativeMethod g_methods[] = { int register_android_backup_BackupDataInput(JNIEnv* env) { - LOGD("register_android_backup_BackupDataInput"); + //LOGD("register_android_backup_BackupDataInput"); jclass clazz; |