1 package net.osdn.gokigen.pkremote.camera.vendor.visionkids.wrapper.playback
3 import android.content.Context
4 import android.net.ConnectivityManager
5 import android.net.RouteInfo
6 import android.os.Build
7 import android.util.Log
8 import androidx.appcompat.app.AppCompatActivity
9 import androidx.preference.PreferenceManager
10 import net.osdn.gokigen.pkremote.camera.interfaces.playback.ICameraContent
11 import net.osdn.gokigen.pkremote.camera.interfaces.playback.ICameraContentListCallback
12 import net.osdn.gokigen.pkremote.preference.IPreferencePropertyAccessor
13 import java.net.Inet6Address
15 class VisionKidsCameraContentProvider(private val context: AppCompatActivity) : IFtpServiceCallback
17 private val ftpClient = MyFtpClient(this)
18 private val preferences = PreferenceManager.getDefaultSharedPreferences(context)
19 private val cameraContentList = ArrayList<ICameraContent>()
20 private lateinit var callback : ICameraContentListCallback
22 fun getCameraContent(name: String) : ICameraContent?
26 for (cameraContent in cameraContentList)
28 if (cameraContent.contentName == name)
30 return (cameraContent)
45 ftpClient.enqueueCommand(FtpCommand("quit", "QUIT\r\n"))
54 ftpClient.disconnect()
62 fun getHostAddress() : String
64 val autoHost = preferences.getBoolean(IPreferencePropertyAccessor.VISIONKIDS_AUTO_SET_HOST_IP, true)
65 var address = preferences.getString(IPreferencePropertyAccessor.VISIONKIDS_HOST_IP, IPreferencePropertyAccessor.VISIONKIDS_HOST_IP_DEFAULT_VALUE)?: IPreferencePropertyAccessor.VISIONKIDS_HOST_IP_DEFAULT_VALUE
68 if ((autoHost)&&(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M))
70 val connectivityManager = context.applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
71 val activeNetwork = connectivityManager.activeNetwork?: return (address)
72 val routes: List<RouteInfo> = connectivityManager.getLinkProperties(activeNetwork)?.routes ?: return (address)
75 val gateway = route.gateway
76 if ((route.isDefaultRoute) && (!(gateway is Inet6Address))&&(gateway != null))
78 address = gateway.toString().replace("/","")
79 Log.v(TAG, " --------- default Gateway : $address --------- ")
92 fun getContentList(callback: ICameraContentListCallback)
96 val address = getHostAddress()
97 this.callback = callback
98 ftpClient.connect(address)
106 // IFtpServiceCallback
107 override fun onReceivedFtpResponse(command: String, code: Int, response: String)
113 // 成功の応答の場合... FTPのシーケンスを進める
116 "connect" -> inputUser(response)
117 "user" -> inputPass(response)
118 "pass" -> changeCurrentWorkingDirectory(response)
119 "cwd" -> setAsciiTransferMode(response)
120 "ascii" -> setPassiveMode(response)
121 "passive" -> checkPassivePort(response)
122 "data_port" -> getFileList(response)
123 "list" -> checkListCommand(response)
124 "data" -> parseFileList(response)
125 "quit" -> checkQuitResponse(response)
130 Log.v(TAG, " onReceivedFtpResponse($command/$code) [${response.length}] $response")
133 "receiveFromDevice(data)" -> onReceivedDataError(response)
143 private fun onReceivedDataError(response: String)
147 // Occurs data receive timeout, so disconnect ftp
148 ftpClient.enqueueCommand(FtpCommand("quit", "QUIT\r\n"))
156 private fun inputUser(response: String)
160 if (response.startsWith("220"))
162 val user = preferences.getString(IPreferencePropertyAccessor.VISIONKIDS_FTP_USER, IPreferencePropertyAccessor.VISIONKIDS_FTP_USER_DEFAULT_VALUE)?: IPreferencePropertyAccessor.VISIONKIDS_FTP_USER_DEFAULT_VALUE
164 ftpClient.enqueueCommand(FtpCommand("user", "USER $user\r\n"))
173 private fun inputPass(response: String)
177 if (response.startsWith("331"))
179 val pass = preferences.getString(IPreferencePropertyAccessor.VISIONKIDS_FTP_PASS, IPreferencePropertyAccessor.VISIONKIDS_FTP_PASS_DEFAULT_VALUE)?: IPreferencePropertyAccessor.VISIONKIDS_FTP_PASS_DEFAULT_VALUE
180 ftpClient.enqueueCommand(FtpCommand("pass", "PASS $pass\r\n"))
189 private fun changeCurrentWorkingDirectory(response: String)
193 if (response.startsWith("230"))
195 ftpClient.enqueueCommand(FtpCommand("cwd", "CWD /1/DCIM\r\n"))
204 private fun setAsciiTransferMode(response: String)
208 if (response.startsWith("250"))
210 ftpClient.enqueueCommand(FtpCommand("ascii", "TYPE A\r\n"))
219 private fun setPassiveMode(response: String)
223 if (response.startsWith("200"))
225 ftpClient.enqueueCommand(FtpCommand("passive", "PASV\r\n"))
234 private fun checkPassivePort(response: String)
238 if (response.startsWith("227"))
240 ftpClient.decidePassivePort(response)
248 private fun getFileList(response: String)
252 ftpClient.openPassivePort(response)
253 ftpClient.enqueueCommand(FtpCommand("list", "LIST\r\n"))
260 private fun checkListCommand(response: String)
264 Log.v(TAG, "RESPONSE: $response")
265 if ((response.startsWith("226"))||((response.startsWith("150"))&&(response.contains("226"))))
267 ftpClient.enqueueCommand(FtpCommand("quit", "QUIT\r\n"))
269 else if (response.startsWith("150"))
271 Log.v(TAG, "RESP. 150")
280 private fun parseFileList(response: String)
284 cameraContentList.clear()
285 val fileList = response.split("\r\n")
286 for (files in fileList)
288 val fileData = files.split(Regex("\\s+"))
289 if (fileData.size > 8)
291 val imageFile = fileData[8]
293 val imageDate = "${fileData[5]} ${fileData[6]} ${fileData[7]}" // MM DD YYYY
294 cameraContentList.add(VisionKidsCameraContent(imageFile, imagePath, imageDate))
304 private fun checkQuitResponse(response: String)
308 Log.v(TAG, "RESPONSE: $response")
309 ftpClient.disconnect()
312 callback.onCompleted(cameraContentList)
322 private val TAG = VisionKidsCameraContentProvider::class.java.simpleName