summaryrefslogtreecommitdiffstats
path: root/core/jni/android_backup_BackupDataInput.cpp
diff options
context:
space:
mode:
authorChristopher Tate <ctate@google.com>2009-06-12 15:20:04 -0700
committerChristopher Tate <ctate@google.com>2009-06-14 19:39:29 -0700
commit2fdd428e0f18384160f7c38ce3a2cd9ba7e7b2c2 (patch)
tree985ee68d951d7c141e296aa4fec60d41f667538a /core/jni/android_backup_BackupDataInput.cpp
parent31390c752828dce0a33d0adeacdf10a49ff847ce (diff)
downloadframeworks_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.cpp81
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;