Small refactoring code

This commit is contained in:
J-Jamet
2021-02-09 18:23:48 +01:00
parent 3719bf3593
commit 6bd5b2345c
4 changed files with 73 additions and 77 deletions

View File

@@ -215,10 +215,10 @@ class DatabaseOutputKDB(private val mDatabaseKDB: DatabaseKDB,
mDatabaseKDB.doForEachGroupInIndex { group ->
GroupOutputKDB.write(outputStream, group)
}
val binaryCipherKey = mDatabaseKDB.loadedCipherKey
?: throw DatabaseOutputException("Unable to retrieve cipher key to write binaries")
mDatabaseKDB.doForEachEntryInIndex { entry ->
val binaryCipherKey = mDatabaseKDB.loadedCipherKey
?: throw DatabaseOutputException("Unable to retrieve cipher key to write binaries")
EntryOutputKDB.writeEntry(outputStream, entry, binaryCipherKey)
EntryOutputKDB.write(outputStream, entry, binaryCipherKey)
}
}

View File

@@ -36,81 +36,80 @@ class EntryOutputKDB {
companion object {
@Throws(DatabaseOutputException::class)
fun writeEntry(mOutputStream: OutputStream,
mEntry: EntryKDB,
binaryCipherKey: Database.LoadedKey) {
fun write(outputStream: OutputStream,
entry: EntryKDB,
binaryCipherKey: Database.LoadedKey) {
//NOTE: Need be to careful about using ints. The actual type written to file is a unsigned int
try {
// UUID
mOutputStream.write(UUID_FIELD_TYPE)
mOutputStream.write(UUID_FIELD_SIZE)
mOutputStream.write(uuidTo16Bytes(mEntry.id))
outputStream.write(UUID_FIELD_TYPE)
outputStream.write(UUID_FIELD_SIZE)
outputStream.write(uuidTo16Bytes(entry.id))
// Group ID
mOutputStream.write(GROUPID_FIELD_TYPE)
mOutputStream.write(GROUPID_FIELD_SIZE)
mOutputStream.write(uIntTo4Bytes(UnsignedInt(mEntry.parent!!.id)))
outputStream.write(GROUPID_FIELD_TYPE)
outputStream.write(GROUPID_FIELD_SIZE)
outputStream.write(uIntTo4Bytes(UnsignedInt(entry.parent!!.id)))
// Image ID
mOutputStream.write(IMAGEID_FIELD_TYPE)
mOutputStream.write(IMAGEID_FIELD_SIZE)
mOutputStream.write(uIntTo4Bytes(UnsignedInt(mEntry.icon.iconId)))
outputStream.write(IMAGEID_FIELD_TYPE)
outputStream.write(IMAGEID_FIELD_SIZE)
outputStream.write(uIntTo4Bytes(UnsignedInt(entry.icon.iconId)))
// Title
//byte[] title = mEntry.title.getBytes("UTF-8");
mOutputStream.write(TITLE_FIELD_TYPE)
StringDatabaseKDBUtils.writeStringToBytes(mEntry.title, mOutputStream)
outputStream.write(TITLE_FIELD_TYPE)
StringDatabaseKDBUtils.writeStringToStream(outputStream, entry.title)
// URL
mOutputStream.write(URL_FIELD_TYPE)
StringDatabaseKDBUtils.writeStringToBytes(mEntry.url, mOutputStream)
outputStream.write(URL_FIELD_TYPE)
StringDatabaseKDBUtils.writeStringToStream(outputStream, entry.url)
// Username
mOutputStream.write(USERNAME_FIELD_TYPE)
StringDatabaseKDBUtils.writeStringToBytes(mEntry.username, mOutputStream)
outputStream.write(USERNAME_FIELD_TYPE)
StringDatabaseKDBUtils.writeStringToStream(outputStream, entry.username)
// Password
mOutputStream.write(PASSWORD_FIELD_TYPE)
writePassword(mOutputStream, mEntry.password)
outputStream.write(PASSWORD_FIELD_TYPE)
writePassword(outputStream, entry.password)
// Additional
mOutputStream.write(ADDITIONAL_FIELD_TYPE)
StringDatabaseKDBUtils.writeStringToBytes(mEntry.notes, mOutputStream)
outputStream.write(ADDITIONAL_FIELD_TYPE)
StringDatabaseKDBUtils.writeStringToStream(outputStream, entry.notes)
// Create date
writeDate(mOutputStream, CREATE_FIELD_TYPE, dateTo5Bytes(mEntry.creationTime.date))
writeDate(outputStream, CREATE_FIELD_TYPE, dateTo5Bytes(entry.creationTime.date))
// Modification date
writeDate(mOutputStream, MOD_FIELD_TYPE, dateTo5Bytes(mEntry.lastModificationTime.date))
writeDate(outputStream, MOD_FIELD_TYPE, dateTo5Bytes(entry.lastModificationTime.date))
// Access date
writeDate(mOutputStream, ACCESS_FIELD_TYPE, dateTo5Bytes(mEntry.lastAccessTime.date))
writeDate(outputStream, ACCESS_FIELD_TYPE, dateTo5Bytes(entry.lastAccessTime.date))
// Expiration date
writeDate(mOutputStream, EXPIRE_FIELD_TYPE, dateTo5Bytes(mEntry.expiryTime.date))
writeDate(outputStream, EXPIRE_FIELD_TYPE, dateTo5Bytes(entry.expiryTime.date))
// Binary description
mOutputStream.write(BINARY_DESC_FIELD_TYPE)
StringDatabaseKDBUtils.writeStringToBytes(mEntry.binaryDescription, mOutputStream)
outputStream.write(BINARY_DESC_FIELD_TYPE)
StringDatabaseKDBUtils.writeStringToStream(outputStream, entry.binaryDescription)
// Binary
mOutputStream.write(BINARY_DATA_FIELD_TYPE)
val binaryData = mEntry.binaryData
outputStream.write(BINARY_DATA_FIELD_TYPE)
val binaryData = entry.binaryData
val binaryDataLength = binaryData?.length ?: 0L
// Write data length
mOutputStream.write(uIntTo4Bytes(UnsignedInt.fromKotlinLong(binaryDataLength)))
outputStream.write(uIntTo4Bytes(UnsignedInt.fromKotlinLong(binaryDataLength)))
// Write data
if (binaryDataLength > 0) {
binaryData?.getInputDataStream(binaryCipherKey).use { inputStream ->
inputStream?.readAllBytes { buffer ->
mOutputStream.write(buffer)
outputStream.write(buffer)
}
}
}
// End
mOutputStream.write(END_FIELD_TYPE)
mOutputStream.write(ZERO_FIELD_SIZE)
outputStream.write(END_FIELD_TYPE)
outputStream.write(ZERO_FIELD_SIZE)
} catch (e: IOException) {
throw DatabaseOutputException("Failed to output an entry.", e)
}
@@ -156,13 +155,10 @@ class EntryOutputKDB {
private val BINARY_DATA_FIELD_TYPE:ByteArray = uShortTo2Bytes(14)
private val END_FIELD_TYPE:ByteArray = uShortTo2Bytes(0xFFFF)
private val LONG_FOUR:ByteArray = uIntTo4Bytes(UnsignedInt(4))
private val UUID_FIELD_SIZE:ByteArray = uIntTo4Bytes(UnsignedInt(16))
private val GROUPID_FIELD_SIZE:ByteArray = uIntTo4Bytes(UnsignedInt(4))
private val DATE_FIELD_SIZE:ByteArray = uIntTo4Bytes(UnsignedInt(5))
private val IMAGEID_FIELD_SIZE:ByteArray = uIntTo4Bytes(UnsignedInt(4))
private val LEVEL_FIELD_SIZE:ByteArray = uIntTo4Bytes(UnsignedInt(4))
private val FLAGS_FIELD_SIZE:ByteArray = uIntTo4Bytes(UnsignedInt(4))
private val ZERO_FIELD_SIZE:ByteArray = uIntTo4Bytes(UnsignedInt(0))
private val ZERO_FIVE:ByteArray = byteArrayOf(0x00, 0x00, 0x00, 0x00, 0x00)
}

View File

@@ -36,57 +36,57 @@ class GroupOutputKDB {
companion object {
@Throws(DatabaseOutputException::class)
fun write(mOutputStream: OutputStream,
mGroup: GroupKDB) {
fun write(outputStream: OutputStream,
group: GroupKDB) {
//NOTE: Need be to careful about using ints. The actual type written to file is a unsigned int, but most values can't be greater than 2^31, so it probably doesn't matter.
try {
// Group ID
mOutputStream.write(GROUPID_FIELD_TYPE)
mOutputStream.write(GROUPID_FIELD_SIZE)
mOutputStream.write(uIntTo4Bytes(UnsignedInt(mGroup.id)))
outputStream.write(GROUPID_FIELD_TYPE)
outputStream.write(GROUPID_FIELD_SIZE)
outputStream.write(uIntTo4Bytes(UnsignedInt(group.id)))
// Name
mOutputStream.write(NAME_FIELD_TYPE)
StringDatabaseKDBUtils.writeStringToBytes(mGroup.title, mOutputStream)
outputStream.write(NAME_FIELD_TYPE)
StringDatabaseKDBUtils.writeStringToStream(outputStream, group.title)
// Create date
mOutputStream.write(CREATE_FIELD_TYPE)
mOutputStream.write(DATE_FIELD_SIZE)
mOutputStream.write(dateTo5Bytes(mGroup.creationTime.date))
outputStream.write(CREATE_FIELD_TYPE)
outputStream.write(DATE_FIELD_SIZE)
outputStream.write(dateTo5Bytes(group.creationTime.date))
// Modification date
mOutputStream.write(MOD_FIELD_TYPE)
mOutputStream.write(DATE_FIELD_SIZE)
mOutputStream.write(dateTo5Bytes(mGroup.lastModificationTime.date))
outputStream.write(MOD_FIELD_TYPE)
outputStream.write(DATE_FIELD_SIZE)
outputStream.write(dateTo5Bytes(group.lastModificationTime.date))
// Access date
mOutputStream.write(ACCESS_FIELD_TYPE)
mOutputStream.write(DATE_FIELD_SIZE)
mOutputStream.write(dateTo5Bytes(mGroup.lastAccessTime.date))
outputStream.write(ACCESS_FIELD_TYPE)
outputStream.write(DATE_FIELD_SIZE)
outputStream.write(dateTo5Bytes(group.lastAccessTime.date))
// Expiration date
mOutputStream.write(EXPIRE_FIELD_TYPE)
mOutputStream.write(DATE_FIELD_SIZE)
mOutputStream.write(dateTo5Bytes(mGroup.expiryTime.date))
outputStream.write(EXPIRE_FIELD_TYPE)
outputStream.write(DATE_FIELD_SIZE)
outputStream.write(dateTo5Bytes(group.expiryTime.date))
// Image ID
mOutputStream.write(IMAGEID_FIELD_TYPE)
mOutputStream.write(IMAGEID_FIELD_SIZE)
mOutputStream.write(uIntTo4Bytes(UnsignedInt(mGroup.icon.iconId)))
outputStream.write(IMAGEID_FIELD_TYPE)
outputStream.write(IMAGEID_FIELD_SIZE)
outputStream.write(uIntTo4Bytes(UnsignedInt(group.icon.iconId)))
// Level
mOutputStream.write(LEVEL_FIELD_TYPE)
mOutputStream.write(LEVEL_FIELD_SIZE)
mOutputStream.write(uShortTo2Bytes(mGroup.level))
outputStream.write(LEVEL_FIELD_TYPE)
outputStream.write(LEVEL_FIELD_SIZE)
outputStream.write(uShortTo2Bytes(group.level))
// Flags
mOutputStream.write(FLAGS_FIELD_TYPE)
mOutputStream.write(FLAGS_FIELD_SIZE)
mOutputStream.write(uIntTo4Bytes(UnsignedInt(mGroup.groupFlags)))
outputStream.write(FLAGS_FIELD_TYPE)
outputStream.write(FLAGS_FIELD_SIZE)
outputStream.write(uIntTo4Bytes(UnsignedInt(group.groupFlags)))
// End
mOutputStream.write(END_FIELD_TYPE)
mOutputStream.write(ZERO_FIELD_SIZE)
outputStream.write(END_FIELD_TYPE)
outputStream.write(ZERO_FIELD_SIZE)
} catch (e: IOException) {
throw DatabaseOutputException("Failed to output a group", e)
}

View File

@@ -53,12 +53,12 @@ object StringDatabaseKDBUtils {
}
@Throws(IOException::class)
fun writeStringToBytes(string: String?, os: OutputStream): Int {
fun writeStringToStream(outputStream: OutputStream, string: String?): Int {
var str = string
if (str == null) {
// Write out a null character
os.write(uIntTo4Bytes(UnsignedInt(1)))
os.write(0x00)
outputStream.write(uIntTo4Bytes(UnsignedInt(1)))
outputStream.write(0x00)
return 0
}
@@ -69,9 +69,9 @@ object StringDatabaseKDBUtils {
val initial = str.toByteArray(defaultCharset)
val length = initial.size + 1
os.write(uIntTo4Bytes(UnsignedInt(length)))
os.write(initial)
os.write(0x00)
outputStream.write(uIntTo4Bytes(UnsignedInt(length)))
outputStream.write(initial)
outputStream.write(0x00)
return length
}