Add name to custom icons #956

This commit is contained in:
J-Jamet
2021-04-30 12:49:36 +02:00
parent 1b4ccaed91
commit 2e4ebecf67
10 changed files with 37 additions and 9 deletions

View File

@@ -316,9 +316,10 @@ class DatabaseKDBX : DatabaseVersioned<UUID, UUID, GroupKDBX, EntryKDBX> {
}
fun addCustomIcon(customIconId: UUID? = null,
name: String,
smallSize: Boolean,
result: (IconImageCustom, BinaryData?) -> Unit) {
iconsManager.addCustomIcon(customIconId, smallSize, result)
iconsManager.addCustomIcon(customIconId, name, smallSize, result)
}
fun isCustomIconBinaryDuplicate(binary: BinaryData): Boolean {

View File

@@ -327,6 +327,10 @@ class EntryKDBX : EntryVersioned<UUID, UUID, GroupKDBX, EntryKDBX>, NodeKDBXInte
return customData.isNotEmpty()
}
override fun containsCustomIconWithName(): Boolean {
return icon.custom.name.isNotEmpty()
}
fun addEntryToHistory(entry: EntryKDBX) {
history.add(entry)
}

View File

@@ -125,6 +125,10 @@ class GroupKDBX : GroupVersioned<UUID, UUID, GroupKDBX, EntryKDBX>, NodeKDBXInte
return customData.isNotEmpty()
}
override fun containsCustomIconWithName(): Boolean {
return icon.custom.name.isNotEmpty()
}
companion object {
@JvmField

View File

@@ -27,22 +27,27 @@ import java.util.*
class IconImageCustom : IconImageDraw {
var uuid: UUID
val uuid: UUID
var name: String = ""
constructor() {
uuid = DatabaseVersioned.UUID_ZERO
constructor(name: String = "") {
this.uuid = DatabaseVersioned.UUID_ZERO
this.name = name
}
constructor(uuid: UUID) {
constructor(uuid: UUID, name: String = "") {
this.uuid = uuid
this.name = name
}
constructor(parcel: Parcel) {
uuid = parcel.readParcelable<ParcelUuid>(ParcelUuid::class.java.classLoader)?.uuid ?: DatabaseVersioned.UUID_ZERO
name = parcel.readString() ?: name
}
override fun writeToParcel(dest: Parcel, flags: Int) {
dest.writeParcelable(ParcelUuid(uuid), flags)
dest.writeString(name)
}
override fun describeContents(): Int {

View File

@@ -52,17 +52,18 @@ class IconsManager(private val binaryCache: BinaryCache) {
fun buildNewCustomIcon(key: UUID? = null,
result: (IconImageCustom, BinaryData?) -> Unit) {
// Create a binary file for a brand new custom icon
addCustomIcon(key, false, result)
addCustomIcon(key, "", false, result)
}
fun addCustomIcon(key: UUID? = null,
name: String,
smallSize: Boolean,
result: (IconImageCustom, BinaryData?) -> Unit) {
val keyBinary = customCache.put(key) { uniqueBinaryId ->
// Create a byte array for better performance with small data
binaryCache.getBinaryData(uniqueBinaryId, smallSize)
}
result.invoke(IconImageCustom(keyBinary.keys.first()), keyBinary.binary)
result.invoke(IconImageCustom(keyBinary.keys.first(), name), keyBinary.binary)
}
fun getIcon(iconUuid: UUID): IconImageCustom {

View File

@@ -32,4 +32,6 @@ interface NodeKDBXInterface : NodeTimeInterface {
fun containsCustomData(): Boolean
fun containsCustomIconWithName() : Boolean
}

View File

@@ -97,10 +97,12 @@ class DatabaseHeaderKDBX(private val databaseV4: DatabaseKDBX) : DatabaseHeader(
var containsCustomData = false
var containsCustomDataWithLastModificationTime = false
override fun operate(node: T): Boolean {
if (node.containsCustomIconWithName()) {
containsCustomIconWithName = true
}
if (node.containsCustomData()) {
containsCustomData = true
}
// TODO Custom Icon name
// TODO Custom Icon modification time
return true
}

View File

@@ -67,6 +67,7 @@ object DatabaseKDBXXML {
const val ElemCustomIconItem = "Icon"
const val ElemCustomIconItemID = "UUID"
const val ElemCustomIconItemData = "Data"
const val ElemCustomIconName = "Name"
const val ElemAutoType = "AutoType"
const val ElemHistory = "History"

View File

@@ -89,6 +89,7 @@ class DatabaseInputKDBX(cacheDirectory: File,
private var ctxHistoryBase: EntryKDBX? = null
private var ctxDeletedObject: DeletedObject? = null
private var customIconID = DatabaseVersioned.UUID_ZERO
private var customIconName: String = ""
private var customIconData: ByteArray? = null
private var customDataKey: String? = null
private var customDataValue: String? = null
@@ -469,6 +470,8 @@ class DatabaseInputKDBX(cacheDirectory: File,
if (strData.isNotEmpty()) {
customIconData = Base64.decode(strData, BASE_64_FLAG)
}
} else if (name.equals(DatabaseKDBXXML.ElemCustomIconName, ignoreCase = true)) {
customIconName = readString(xpp)
} else {
readUnknown(xpp)
}
@@ -719,7 +722,9 @@ class DatabaseInputKDBX(cacheDirectory: File,
} else if (ctx == KdbContext.CustomIcon && name.equals(DatabaseKDBXXML.ElemCustomIconItem, ignoreCase = true)) {
val iconData = customIconData
if (customIconID != DatabaseVersioned.UUID_ZERO && iconData != null) {
mDatabase.addCustomIcon(customIconID, isRAMSufficient.invoke(iconData.size.toLong())) { _, binary ->
mDatabase.addCustomIcon(customIconID,
customIconName,
isRAMSufficient.invoke(iconData.size.toLong())) { _, binary ->
binary?.getOutputDataStream(mDatabase.binaryCache)?.use { outputStream ->
outputStream.write(iconData)
}

View File

@@ -724,6 +724,9 @@ class DatabaseOutputKDBX(private val mDatabaseKDBX: DatabaseKDBX,
writeObject(DatabaseKDBXXML.ElemCustomIconItemData,
String(Base64.encode(customImageData, BASE_64_FLAG)))
}
if (iconCustom.name.isNotEmpty()) {
writeObject(DatabaseKDBXXML.ElemCustomIconName, iconCustom.name)
}
xml.endTag(null, DatabaseKDBXXML.ElemCustomIconItem)
}