1 package net.osdn.gokigen.pkremote.camera.vendor.panasonic.wrapper.playback;
3 import android.graphics.Bitmap;
4 import android.util.Log;
6 import androidx.annotation.NonNull;
8 import net.osdn.gokigen.pkremote.camera.interfaces.playback.ICameraContent;
9 import net.osdn.gokigen.pkremote.camera.interfaces.playback.ICameraContentListCallback;
10 import net.osdn.gokigen.pkremote.camera.interfaces.playback.ICameraFileInfo;
11 import net.osdn.gokigen.pkremote.camera.interfaces.playback.IContentInfoCallback;
12 import net.osdn.gokigen.pkremote.camera.interfaces.playback.IDownloadContentCallback;
13 import net.osdn.gokigen.pkremote.camera.interfaces.playback.IDownloadContentListCallback;
14 import net.osdn.gokigen.pkremote.camera.interfaces.playback.IDownloadThumbnailImageCallback;
15 import net.osdn.gokigen.pkremote.camera.interfaces.playback.IPlaybackControl;
16 import net.osdn.gokigen.pkremote.camera.utils.SimpleHttpClient;
17 import net.osdn.gokigen.pkremote.camera.vendor.panasonic.wrapper.IPanasonicCamera;
19 import java.util.ArrayList;
20 import java.util.HashMap;
21 import java.util.List;
23 public class PanasonicPlaybackControl implements IPlaybackControl
25 private final String TAG = toString();
26 private IPanasonicCamera panasonicCamera = null;
27 private int timeoutMs = 50000;
28 private String getObjectLists;
29 private List<ICameraContent> contentList;
31 public PanasonicPlaybackControl()
33 contentList = new ArrayList<>();
36 public void setCamera(IPanasonicCamera panasonicCamera, int timeoutMs)
38 Log.v(TAG, "setCamera() " + panasonicCamera.getFriendlyName());
39 this.panasonicCamera = panasonicCamera;
40 this.timeoutMs = timeoutMs;
43 public void preprocessPlaymode()
45 // PLAYBACKモードに切り替わった直後に実行する処理をここに書く。
46 Log.v(TAG, " preprocessPlaymode() : " + panasonicCamera.getObjUrl());
48 String url = panasonicCamera.getObjUrl() + "Server0/CDS_control";
49 String postData = "<?xml version=\"1.0\" encoding=\"utf-8\" ?><s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"><s:Body>" +
50 "<u:Browse xmlns:u=\"urn:schemas-upnp-org:service:ContentDirectory:1\" xmlns:pana=\"urn:schemas-panasonic-com:pana\">" +
51 "<ObjectID>0</ObjectID><BrowseFlag>BrowseDirectChildren</BrowseFlag><Filter>*</Filter><StartingIndex>0</StartingIndex><RequestedCount>1500</RequestedCount><SortCriteria></SortCriteria>" +
52 "<pana:X_FromCP>LumixLink2.0</pana:X_FromCP></u:Browse></s:Body></s:Envelope>";
54 String reply = SimpleHttpClient.httpPostWithHeader(url, postData, "SOAPACTION", "urn:schemas-upnp-org:service:ContentDirectory:1#Browse", "text/xml; charset=\"utf-8\"", timeoutMs);
55 getObjectLists = reply;
56 String matches = reply.substring(reply.indexOf("<TotalMatches>") + 14, reply.indexOf("</TotalMatches>"));
57 String returned = reply.substring(reply.indexOf("<NumberReturned>") + 16, reply.indexOf("</NumberReturned>"));;
58 Log.v(TAG, "REPLY DATA : (" + matches + ") [" + returned + "] " + " " + reply.length() + "bytes");
62 public String getRawFileSuffix()
64 Log.v(TAG, "getRawFileSuffix()");
69 public void downloadContentList(IDownloadContentListCallback callback)
71 Log.v(TAG, "downloadContentList()");
76 public void getContentInfo(String path, String name, IContentInfoCallback callback)
78 Log.v(TAG, "getContentInfo() : " + path + " / " + name);
84 public void updateCameraFileInfo(@NonNull ICameraFileInfo info)
86 Log.v(TAG, "updateCameraFileInfo() : " + info.getFilename());
92 public void downloadContentScreennail(String path, IDownloadThumbnailImageCallback callback)
94 if (path.startsWith("/"))
96 path = path.substring(1);
98 String requestUrl = panasonicCamera.getPictureUrl() + "DL" + path.substring(2);
99 Log.v(TAG, " downloadContentScreennail() : " + requestUrl + " ");
102 Bitmap bmp = SimpleHttpClient.httpGetBitmap(requestUrl, timeoutMs);
103 HashMap<String, Object> map = new HashMap<>();
104 map.put("Orientation", 0);
105 callback.onCompleted(bmp, map);
110 callback.onErrorOccurred(new NullPointerException());
115 public void downloadContentThumbnail(String path, IDownloadThumbnailImageCallback callback)
117 if (path.startsWith("/"))
119 path = path.substring(1);
121 String requestUrl = panasonicCamera.getPictureUrl() + "DT" + path.substring(2);
122 Log.v(TAG, " downloadContentThumbnail() : " + path + " [" + requestUrl + "]");
125 Bitmap bmp = SimpleHttpClient.httpGetBitmap(requestUrl, timeoutMs);
126 HashMap<String, Object> map = new HashMap<>();
127 map.put("Orientation", 0);
128 callback.onCompleted(bmp, map);
133 callback.onErrorOccurred(new NullPointerException());
138 public void downloadContent(String path, boolean isSmallSize, IDownloadContentCallback callback)
140 Log.v(TAG, "downloadContent() : " + path + " [" + isSmallSize + "]");
146 public void getCameraContentList(ICameraContentListCallback callback)
148 Log.v(TAG, " getCameraContentList()");
152 String checkUrl = panasonicCamera.getPictureUrl();
153 int maxIndex = getObjectLists.length() - checkUrl.length();
157 while ((index >= 0) && (index < maxIndex))
159 index = getObjectLists.indexOf(checkUrl, index);
162 int lastIndex = getObjectLists.indexOf("&", index);
163 String picUrl = getObjectLists.substring(index + checkUrl.length(), lastIndex);
164 // Log.v(TAG, " pic : " + picUrl);
165 if (picUrl.startsWith("DO"))
167 // DO(オリジナル), DL(スクリーンネイル?), DT(サムネイル?)
168 PanasonicImageContentInfo contentInfo = new PanasonicImageContentInfo(picUrl);
169 contentList.add(contentInfo);
175 if (callback != null)
177 callback.onCompleted(contentList);
184 if (callback != null)
186 callback.onErrorOccurred(e);