Hook up the backup data writer, and add a utility to read the backup data files.
diff --git a/libs/utils/backup_data.cpp b/libs/utils/backup_data.cpp
index dd04449..95c05b7 100644
--- a/libs/utils/backup_data.cpp
+++ b/libs/utils/backup_data.cpp
@@ -39,10 +39,6 @@
  *      - The value, padded to 4 byte boundary
  */
 
-#define APP_MAGIC_V1 0x31707041 // App1 (little endian)
-#define ENTITY_MAGIC_V1 0x61746144 // Data (little endian)
-#define FOOTER_MAGIC_V1 0x746f6f46 // Foot (little endian)
-
 const static int ROUND_UP[4] = { 0, 3, 2, 1 };
 
 static inline size_t
@@ -108,7 +104,7 @@
 
     nameLen = packageName.length();
 
-    header.type = tolel(APP_MAGIC_V1);
+    header.type = tolel(BACKUP_HEADER_APP_V1);
     header.packageLen = tolel(nameLen);
     header.cookie = cookie;
 
@@ -148,7 +144,7 @@
 
     keyLen = key.length();
 
-    header.type = tolel(ENTITY_MAGIC_V1);
+    header.type = tolel(BACKUP_HEADER_ENTITY_V1);
     header.keyLen = tolel(keyLen);
     header.dataSize = tolel(dataSize);
 
@@ -209,7 +205,7 @@
     app_footer_v1 footer;
     ssize_t nameLen;
 
-    footer.type = tolel(FOOTER_MAGIC_V1);
+    footer.type = tolel(BACKUP_FOOTER_APP_V1);
     footer.entityCount = tolel(m_entityCount);
     footer.cookie = cookie;
 
@@ -264,7 +260,7 @@
     } while(0)
 
 status_t
-BackupDataReader::ReadNextHeader()
+BackupDataReader::ReadNextHeader(int* type)
 {
     if (m_status != NO_ERROR) {
         return m_status;
@@ -280,7 +276,7 @@
     m_header.type = fromlel(m_header.type);
     switch (m_header.type)
     {
-        case APP_MAGIC_V1:
+        case BACKUP_HEADER_APP_V1:
             m_header.app.packageLen = fromlel(m_header.app.packageLen);
             if (m_header.app.packageLen < 0) {
                 LOGD("App header at %d has packageLen<0: 0x%08x\n", (int)m_pos,
@@ -289,7 +285,7 @@
             }
             m_header.app.cookie = m_header.app.cookie;
             break;
-        case ENTITY_MAGIC_V1:
+        case BACKUP_HEADER_ENTITY_V1:
             m_header.entity.keyLen = fromlel(m_header.entity.keyLen);
             if (m_header.entity.keyLen <= 0) {
                 LOGD("Entity header at %d has keyLen<=0: 0x%08x\n", (int)m_pos,
@@ -297,14 +293,9 @@
                 m_status = EINVAL;
             }
             m_header.entity.dataSize = fromlel(m_header.entity.dataSize);
-            if (m_header.entity.dataSize < 0) {
-                LOGD("Entity header at %d has dataSize<0: 0x%08x\n", (int)m_pos,
-                        (int)m_header.entity.dataSize);
-                m_status = EINVAL;
-            }
             m_entityCount++;
             break;
-        case FOOTER_MAGIC_V1:
+        case BACKUP_FOOTER_APP_V1:
             m_header.footer.entityCount = fromlel(m_header.footer.entityCount);
             if (m_header.footer.entityCount < 0) {
                 LOGD("Entity header at %d has entityCount<0: 0x%08x\n", (int)m_pos,
@@ -318,6 +309,9 @@
             m_status = EINVAL;
     }
     m_pos += sizeof(m_header);
+    if (type) {
+        *type = m_header.type;
+    }
     
     return m_status;
 }
@@ -328,7 +322,7 @@
     if (m_status != NO_ERROR) {
         return m_status;
     }
-    if (m_header.type != APP_MAGIC_V1) {
+    if (m_header.type != BACKUP_HEADER_APP_V1) {
         return EINVAL;
     }
     size_t size = m_header.app.packageLen;
@@ -349,7 +343,7 @@
 bool
 BackupDataReader::HasEntities()
 {
-    return m_status == NO_ERROR && m_header.type == ENTITY_MAGIC_V1;
+    return m_status == NO_ERROR && m_header.type == BACKUP_HEADER_ENTITY_V1;
 }
 
 status_t
@@ -358,10 +352,10 @@
     if (m_status != NO_ERROR) {
         return m_status;
     }
-    if (m_header.type != ENTITY_MAGIC_V1) {
+    if (m_header.type != BACKUP_HEADER_ENTITY_V1) {
         return EINVAL;
     }
-    size_t size = m_header.app.packageLen;
+    size_t size = m_header.entity.keyLen;
     char* buf = key->lockBuffer(size);
     if (key == NULL) {
         key->unlockBuffer();
@@ -378,6 +372,23 @@
 }
 
 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_header.entity.dataSize, SEEK_CUR);
+        return pos == -1 ? (int)errno : (int)NO_ERROR;
+    } else {
+        return NO_ERROR;
+    }
+}
+
+status_t
 BackupDataReader::ReadEntityData(void* data, size_t size)
 {
     if (m_status != NO_ERROR) {
@@ -395,7 +406,7 @@
     if (m_status != NO_ERROR) {
         return m_status;
     }
-    if (m_header.type != FOOTER_MAGIC_V1) {
+    if (m_header.type != BACKUP_FOOTER_APP_V1) {
         return EINVAL;
     }
     if (m_header.footer.entityCount != m_entityCount) {