Merge change 4709 into donut

* changes:
  backup stuff
This commit is contained in:
Android (Google) Code Review
2009-06-18 19:02:39 -07:00
5 changed files with 65 additions and 44 deletions

View File

@ -80,28 +80,35 @@ public class LocalTransport extends IBackupTransport.Stub {
byte[] buf = new byte[bufSize]; byte[] buf = new byte[bufSize];
while (changeSet.readNextHeader()) { while (changeSet.readNextHeader()) {
String key = changeSet.getKey(); String key = changeSet.getKey();
String base64Key = new String(Base64.encode(key.getBytes()));
File entityFile = new File(packageDir, base64Key);
int dataSize = changeSet.getDataSize(); int dataSize = changeSet.getDataSize();
String base64Key = new String(Base64.encode(key.getBytes()));
if (DEBUG) Log.v(TAG, "Got change set key=" + key + " size=" + dataSize if (DEBUG) Log.v(TAG, "Got change set key=" + key + " size=" + dataSize
+ " key64=" + base64Key); + " key64=" + base64Key);
if (dataSize > bufSize) {
bufSize = dataSize;
buf = new byte[bufSize];
}
changeSet.readEntityData(buf, 0, dataSize);
if (DEBUG) Log.v(TAG, " + data size " + dataSize);
File entityFile = new File(packageDir, base64Key); if (dataSize >= 0) {
FileOutputStream entity = new FileOutputStream(entityFile); FileOutputStream entity = new FileOutputStream(entityFile);
try {
entity.write(buf, 0, dataSize); if (dataSize > bufSize) {
} catch (IOException e) { bufSize = dataSize;
Log.e(TAG, "Unable to update key file " buf = new byte[bufSize];
+ entityFile.getAbsolutePath()); }
err = -1; changeSet.readEntityData(buf, 0, dataSize);
} finally { if (DEBUG) Log.v(TAG, " data size " + dataSize);
entity.close();
try {
entity.write(buf, 0, dataSize);
} catch (IOException e) {
Log.e(TAG, "Unable to update key file "
+ entityFile.getAbsolutePath());
err = -1;
} finally {
entity.close();
}
} else {
entityFile.delete();
} }
} }
} catch (IOException e) { } catch (IOException e) {
@ -172,7 +179,8 @@ public class LocalTransport extends IBackupTransport.Stub {
int size = (int) f.length(); int size = (int) f.length();
byte[] buf = new byte[size]; byte[] buf = new byte[size];
in.read(buf); in.read(buf);
out.writeEntityHeader(f.getName(), size); String key = new String(Base64.decode(f.getName()));
out.writeEntityHeader(key, size);
out.writeEntityData(buf, size); out.writeEntityData(buf, size);
} }
} catch (Exception e) { } catch (Exception e) {

View File

@ -116,6 +116,7 @@ private:
int type; int type;
entity_header_v1 entity; entity_header_v1 entity;
} m_header; } m_header;
String8 m_key;
}; };
int back_up_files(int oldSnapshotFD, BackupDataWriter* dataStream, int newSnapshotFD, int back_up_files(int oldSnapshotFD, BackupDataWriter* dataStream, int newSnapshotFD,

View File

@ -205,12 +205,17 @@ BackupDataReader::ReadNextHeader(bool* done, int* type)
amt = read(m_fd, &m_header, sizeof(m_header)); amt = read(m_fd, &m_header, sizeof(m_header));
*done = m_done = (amt == 0); *done = m_done = (amt == 0);
CHECK_SIZE(amt, sizeof(m_header)); CHECK_SIZE(amt, sizeof(m_header));
m_pos += sizeof(m_header);
if (type) {
*type = m_header.type;
}
// validate and fix up the fields. // validate and fix up the fields.
m_header.type = fromlel(m_header.type); m_header.type = fromlel(m_header.type);
switch (m_header.type) switch (m_header.type)
{ {
case BACKUP_HEADER_ENTITY_V1: case BACKUP_HEADER_ENTITY_V1:
{
m_header.entity.keyLen = fromlel(m_header.entity.keyLen); m_header.entity.keyLen = fromlel(m_header.entity.keyLen);
if (m_header.entity.keyLen <= 0) { if (m_header.entity.keyLen <= 0) {
LOGD("Entity header at %d has keyLen<=0: 0x%08x\n", (int)m_pos, LOGD("Entity header at %d has keyLen<=0: 0x%08x\n", (int)m_pos,
@ -219,15 +224,27 @@ BackupDataReader::ReadNextHeader(bool* done, int* type)
} }
m_header.entity.dataSize = fromlel(m_header.entity.dataSize); m_header.entity.dataSize = fromlel(m_header.entity.dataSize);
m_entityCount++; 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; break;
}
default: default:
LOGD("Chunk header at %d has invalid type: 0x%08x", (int)m_pos, (int)m_header.type); LOGD("Chunk header at %d has invalid type: 0x%08x", (int)m_pos, (int)m_header.type);
m_status = EINVAL; m_status = EINVAL;
} }
m_pos += sizeof(m_header);
if (type) {
*type = m_header.type;
}
return m_status; return m_status;
} }
@ -247,20 +264,8 @@ BackupDataReader::ReadEntityHeader(String8* key, size_t* dataSize)
if (m_header.type != BACKUP_HEADER_ENTITY_V1) { if (m_header.type != BACKUP_HEADER_ENTITY_V1) {
return EINVAL; return EINVAL;
} }
size_t size = m_header.entity.keyLen; *key = m_key;
char* buf = key->lockBuffer(size);
if (key == NULL) {
key->unlockBuffer();
m_status = ENOMEM;
return m_status;
}
int amt = read(m_fd, buf, size+1);
CHECK_SIZE(amt, (int)size+1);
key->unlockBuffer(size);
m_pos += size+1;
*dataSize = m_header.entity.dataSize; *dataSize = m_header.entity.dataSize;
SKIP_PADDING();
m_dataEndPos = m_pos + *dataSize;
return NO_ERROR; return NO_ERROR;
} }
@ -285,20 +290,24 @@ ssize_t
BackupDataReader::ReadEntityData(void* data, size_t size) BackupDataReader::ReadEntityData(void* data, size_t size)
{ {
if (m_status != NO_ERROR) { if (m_status != NO_ERROR) {
return m_status; return -1;
} }
int remaining = m_dataEndPos - m_pos; int remaining = m_dataEndPos - m_pos;
//LOGD("ReadEntityData size=%d m_pos=0x%x m_dataEndPos=0x%x remaining=%d\n", //LOGD("ReadEntityData size=%d m_pos=0x%x m_dataEndPos=0x%x remaining=%d\n",
// size, m_pos, m_dataEndPos, remaining); // size, m_pos, m_dataEndPos, remaining);
if (size > remaining) {
size = remaining;
}
if (remaining <= 0) { if (remaining <= 0) {
return 0; return 0;
} }
if (size > remaining) {
size = remaining;
}
//LOGD(" reading %d bytes", size);
int amt = read(m_fd, data, size); int amt = read(m_fd, data, size);
CHECK_SIZE(amt, (int)size); if (amt < 0) {
m_pos += size; m_status = errno;
return -1;
}
m_pos += amt;
return amt; return amt;
} }

View File

@ -420,8 +420,9 @@ RestoreHelperBase::WriteFile(const String8& filename, BackupDataReader* in)
// Write the file and compute the crc // Write the file and compute the crc
crc = crc32(0L, Z_NULL, 0); crc = crc32(0L, Z_NULL, 0);
fd = open(filename.string(), O_CREAT|O_RDWR, mode); fd = open(filename.string(), O_CREAT|O_RDWR|O_TRUNC, mode);
if (fd != -1) { if (fd == -1) {
LOGW("Could not open file %s -- %s", filename.string(), strerror(errno));
return errno; return errno;
} }
@ -429,6 +430,7 @@ RestoreHelperBase::WriteFile(const String8& filename, BackupDataReader* in)
err = write(fd, buf, amt); err = write(fd, buf, amt);
if (err != amt) { if (err != amt) {
close(fd); close(fd);
LOGW("Error '%s' writing '%s'", strerror(errno), filename.string());
return errno; return errno;
} }
crc = crc32(crc, (Bytef*)buf, amt); crc = crc32(crc, (Bytef*)buf, amt);

View File

@ -164,6 +164,7 @@ class BackupManagerService extends IBackupManager.Stub {
// Set up our transport options and initialize the default transport // Set up our transport options and initialize the default transport
// TODO: Have transports register themselves somehow? // TODO: Have transports register themselves somehow?
// TODO: Don't create transports that we don't need to? // TODO: Don't create transports that we don't need to?
//mTransportId = BackupManager.TRANSPORT_LOCAL;
mTransportId = BackupManager.TRANSPORT_GOOGLE; mTransportId = BackupManager.TRANSPORT_GOOGLE;
mLocalTransport = new LocalTransport(context); // This is actually pretty cheap mLocalTransport = new LocalTransport(context); // This is actually pretty cheap
mGoogleTransport = null; mGoogleTransport = null;