@ -30,44 +30,39 @@ class AttachmentUploadJob(val attachmentID: Long, val threadID: String, val mess
// Settings
override val maxFailureCount : Int = 20
companion object {
val TAG = AttachmentUploadJob :: class . simpleName
val KEY : String = " AttachmentUploadJob "
// Keys used for database storage
private val KEY_ ATTACHMENT_ID = " attachment_id "
private val KEY_ THREAD_ID = " thread_id "
private val KEY_ MESSAGE = " message "
private val KEY_ MESSAGE_SEND _JOB _ID = " message_send_job_id "
private val ATTACHMENT_ID _KEY = " attachment_id "
private val THREAD_ID _KEY = " thread_id "
private val MESSAGE_KEY = " message "
private val MESSAGE_SEND _JOB _ID _KEY = " message_send_job_id "
}
override fun execute ( ) {
try {
val attachment = MessagingModuleConfiguration . shared . messageDataProvider . getScaledSignalAttachmentStream ( attachmentID )
?: return handleFailure ( Error . NoAttachment )
val usePadding = false
val openGroupV2 = MessagingModuleConfiguration . shared . storage . getV2OpenGroup ( threadID )
val openGroup = MessagingModuleConfiguration . shared . storage . getOpenGroup ( threadID )
val server = openGroup ?. let {
it . server
} ?: openGroupV2 ?. let {
it . server
} ?: FileServerAPI . shared . server
val server = openGroupV2 ?. server ?: openGroup ?. server ?: FileServerAPI . shared . server
val shouldEncrypt = ( openGroup == null && openGroupV2 == null ) // Encrypt if this isn't an open group
val attachmentKey = Util . getSecretBytes ( 64 )
val paddedLength = if ( usePadding ) PaddingInputStream . getPaddedSize ( attachment . length ) else attachment . length
val dataStream = if ( usePadding ) PaddingInputStream ( attachment . inputStream , attachment . length ) else attachment . inputStream
val ciphertextLength = if ( shouldEncrypt ) AttachmentCipherOutputStream . getCiphertextLength ( paddedLength ) else attachment . length
val outputStreamFactory = if ( shouldEncrypt ) AttachmentCipherOutputStreamFactory ( attachmentKey ) else PlaintextOutputStreamFactory ( )
val attachmentData = PushAttachmentData ( attachment . contentType , dataStream , ciphertextLength , outputStreamFactory , attachment . listener )
val uploadResult = if ( openGroupV2 == null ) FileServerAPI . shared . uploadAttachment ( server , attachmentData ) else {
val uploadResult = if ( openGroupV2 != null ) {
val dataBytes = attachmentData . data . readBytes ( )
val result = OpenGroupAPIV2 . upload ( dataBytes , openGroupV2 . room , openGroupV2 . server ) . get ( )
DotNetAPI . UploadResult ( result , " ${openGroupV2.server} /files/ $result " , byteArrayOf ( ) )
} else {
FileServerAPI . shared . uploadAttachment ( server , attachmentData )
}
handleSuccess ( attachment , attachmentKey , uploadResult )
} catch ( e : java . lang . Exception ) {
@ -82,7 +77,7 @@ class AttachmentUploadJob(val attachmentID: Long, val threadID: String, val mess
}
private fun handleSuccess ( attachment : SignalServiceAttachmentStream , attachmentKey : ByteArray , uploadResult : DotNetAPI . UploadResult ) {
Log . w ( TAG , " Attachment uploaded successfully. " )
Log . d ( TAG , " Attachment uploaded successfully. " )
delegate ?. handleJobSucceeded ( this )
MessagingModuleConfiguration . shared . messageDataProvider . updateAttachmentAfterUploadSucceeded ( attachmentID , attachment , attachmentKey , uploadResult )
MessagingModuleConfiguration . shared . storage . resumeMessageSendJobIfNeeded ( messageSendJobID )
@ -119,10 +114,11 @@ class AttachmentUploadJob(val attachmentID: Long, val threadID: String, val mess
val output = Output ( serializedMessage )
kryo . writeObject ( output , message )
output . close ( )
return Data . Builder ( ) . putLong ( KEY _ATTACHMENT _ID , attachmentID )
. putString ( KEY _THREAD _ID , threadID )
. putByteArray ( KEY _MESSAGE , serializedMessage )
. putString ( KEY _MESSAGE _SEND _JOB _ID , messageSendJobID )
return Data . Builder ( )
. putLong ( ATTACHMENT _ID _KEY , attachmentID )
. putString ( THREAD _ID _KEY , threadID )
. putByteArray ( MESSAGE _KEY , serializedMessage )
. putString ( MESSAGE _SEND _JOB _ID _KEY , messageSendJobID )
. build ( ) ;
}
@ -133,12 +129,17 @@ class AttachmentUploadJob(val attachmentID: Long, val threadID: String, val mess
class Factory : Job . Factory < AttachmentUploadJob > {
override fun create ( data : Data ) : AttachmentUploadJob {
val serializedMessage = data . getByteArray ( KEY_ MESSAGE)
val serializedMessage = data . getByteArray ( MESSAGE_KEY )
val kryo = Kryo ( )
val input = Input ( serializedMessage )
val message : Message = kryo . readObject ( input , Message :: class . java )
input . close ( )
return AttachmentUploadJob ( data . getLong ( KEY _ATTACHMENT _ID ) , data . getString ( KEY _THREAD _ID ) !! , message , data . getString ( KEY _MESSAGE _SEND _JOB _ID ) !! )
return AttachmentUploadJob (
data . getLong ( ATTACHMENT _ID _KEY ) ,
data . getString ( THREAD _ID _KEY ) !! ,
message ,
data . getString ( MESSAGE _SEND _JOB _ID _KEY ) !!
)
}
}
}