1 package net.osdn.gokigen.a01d.camera.nikon.wrapper.liveview
3 import android.util.Log
4 import net.osdn.gokigen.a01d.camera.ptpip.wrapper.command.IPtpIpCommandCallback
5 import net.osdn.gokigen.a01d.camera.ptpip.wrapper.liveview.IPtpIpLiveViewImageCallback
6 import net.osdn.gokigen.a01d.camera.utils.SimpleLogDumper
7 import java.io.ByteArrayOutputStream
9 class NikonLiveViewImageReceiver(private var callback: IPtpIpLiveViewImageCallback) : IPtpIpCommandCallback
11 private val isDumpLog = true
12 private var receivedTotalBytes = 0
13 private var receivedRemainBytes = 0
14 private var receivedFirstData = false
15 private var byteStream = ByteArrayOutputStream()
17 override fun receivedMessage(id: Int, rx_body: ByteArray?)
21 Log.v(TAG, " NikonLiveViewImageReceiver: MSG BODY IS NULL. (ID:$id)")
22 callback.onCompleted(rx_body, null)
27 receivedMessageMulti(id, rx_body)
31 receivedMessageSingle(id, rx_body)
35 override fun onReceiveProgress(currentBytes: Int, totalBytes: Int, rx_body: ByteArray?)
39 Log.v(TAG, " NikonLiveViewImageReceiver: MSG BODY IS NULL.")
42 Log.v(TAG, " onReceiveProgress() $currentBytes/$totalBytes LENGTH: ${rx_body.size} bytes.")
43 if ((currentBytes > totalBytes)&&((currentBytes - totalBytes) < (32 + 14)))
45 // Operation Response Packet を受信していないとき...
46 Log.v(TAG, " ===== DO NOT RECEIVE RESPONSE MESSAGE YET. =====")
49 // 受信したデータから、通信のヘッダ部分を削除する
53 private fun receivedMessageSingle(id: Int, rx_body: ByteArray)
57 Log.v(TAG, "receivedMessage_single() : " + rx_body.size + " bytes. id:$id")
58 if ((isDumpLog)&&(rx_body.size > 64))
60 SimpleLogDumper.dump_bytes(" LV (FIRST) : ", rx_body.copyOfRange(0, 64))
61 SimpleLogDumper.dump_bytes(" LV (-END-) : ", rx_body.copyOfRange(rx_body.size - 64, rx_body.size))
63 callback.onCompleted(rx_body, null)
71 private fun receivedMessageMulti(id: Int, rx_body: ByteArray)
75 Log.v(TAG, " receivedMessage_multi() id[$id] size : ${rx_body.size} id:$id")
77 callback.onCompleted(byteStream.toByteArray(), null)
78 receivedFirstData = false
79 receivedRemainBytes = 0
80 receivedTotalBytes = 0
86 run { callback.onErrorOccurred(e) }
90 private fun cutHeader(rx_body: ByteArray)
92 val length = rx_body.size
94 if (!receivedFirstData)
96 // データを最初に読んだとき。ヘッダ部分を読み飛ばす
97 receivedFirstData = true
98 dataPosition = rx_body[0].toUByte().toInt()
101 Log.v(TAG, " FIRST DATA POS. : $dataPosition len: $length ");
102 SimpleLogDumper.dump_bytes(" [1stData]", rx_body.copyOfRange(0, (32)))
108 if (receivedRemainBytes > 0)
110 // データの読み込みが途中だった場合...
111 if (length < receivedRemainBytes)
113 // 全部コピーする、足りないバイト数は残す
114 receivedRemainBytes -= length
115 receivedTotalBytes += rx_body.size
116 byteStream.write(rx_body, 0, rx_body.size)
121 byteStream.write(rx_body, dataPosition, receivedRemainBytes)
122 dataPosition = receivedRemainBytes
123 receivedRemainBytes = 0
127 while (dataPosition <= length - 12)
129 val body_size = (rx_body[dataPosition].toUByte()).toInt() + ((rx_body[dataPosition + 1].toUByte()).toInt() * 256) + ((rx_body[dataPosition + 2].toUByte()).toInt() * 256 * 256) + ((rx_body[dataPosition + 3].toUByte()).toInt() * 256 * 256 * 256)
130 //Log.v(TAG, " <> body_size : ${body_size} [$dataPosition] ($length) aa: ${rx_body[dataPosition].toUByte().toInt()} ${rx_body[dataPosition + 1].toUByte().toInt()} + ${rx_body[dataPosition + 2].toUByte().toInt()}")
133 Log.v(TAG, " ----- BODY SIZE IS SMALL : " + dataPosition + " (" + body_size + ") [" + receivedRemainBytes + "] " + rx_body.size + " ")
137 //Log.v(TAG, " RX DATA : " + dataPosition + " (" + body_size + ") [" + receivedRemainBytes + "] (" + receivedTotalBytes + ")");
138 if (dataPosition + body_size > length)
140 // データがすべてバッファ内になかったときは、バッファすべてコピーして残ったサイズを記憶しておく。
141 val copysize = length - (dataPosition + 12)
142 byteStream.write(rx_body, dataPosition + 12, copysize)
143 receivedRemainBytes = body_size - copysize - 12 // マイナス12は、ヘッダ分
144 receivedTotalBytes += copysize
145 //Log.v(TAG, " ----- copy : " + (data_position + (12)) + " " + copysize + " remain : " + received_remain_bytes + " body size : " + body_size);
150 byteStream.write(rx_body, dataPosition + 12, body_size - 12)
151 dataPosition += body_size
152 receivedTotalBytes += 12
153 //Log.v(TAG, " --- COPY : " + (data_position + 12) + " " + (body_size - (12)) + " remain : " + received_remain_bytes);
157 Log.v(TAG, " pos : $dataPosition size : $body_size length : $length")
163 override fun isReceiveMulti(): Boolean
170 private val TAG = "NikonLiveViewImageReceiver"