OSDN Git Service

Panasonicの一覧表示を入れてみた。
[gokigen/PKRemote.git] / app / src / main / java / net / osdn / gokigen / pkremote / camera / vendor / panasonic / wrapper / playback / PanasonicPlaybackControl.java
1 package net.osdn.gokigen.pkremote.camera.vendor.panasonic.wrapper.playback;
2
3 import android.graphics.Bitmap;
4 import android.util.Log;
5
6 import androidx.annotation.NonNull;
7
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;
18
19 import java.util.ArrayList;
20 import java.util.HashMap;
21 import java.util.List;
22
23 public class PanasonicPlaybackControl implements IPlaybackControl
24 {
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;
30
31     public PanasonicPlaybackControl()
32     {
33         contentList = new ArrayList<>();
34     }
35
36     public void setCamera(IPanasonicCamera panasonicCamera, int timeoutMs)
37     {
38         Log.v(TAG, "setCamera() " + panasonicCamera.getFriendlyName());
39         this.panasonicCamera = panasonicCamera;
40         this.timeoutMs = timeoutMs;
41     }
42
43     public void preprocessPlaymode()
44     {
45         // PLAYBACKモードに切り替わった直後に実行する処理をここに書く。
46         Log.v(TAG, "  preprocessPlaymode() : " + panasonicCamera.getObjUrl());
47
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>";
53
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");
59     }
60
61     @Override
62     public String getRawFileSuffix()
63     {
64         Log.v(TAG, "getRawFileSuffix()");
65         return ("RW2");
66     }
67
68     @Override
69     public void downloadContentList(IDownloadContentListCallback callback)
70     {
71         Log.v(TAG, "downloadContentList()");
72
73     }
74
75     @Override
76     public void getContentInfo(String path, String name, IContentInfoCallback callback)
77     {
78         Log.v(TAG, "getContentInfo() : " + path + " / " + name);
79
80
81     }
82
83     @Override
84     public void updateCameraFileInfo(@NonNull ICameraFileInfo info)
85     {
86         Log.v(TAG, "updateCameraFileInfo() : " + info.getFilename());
87
88
89     }
90
91     @Override
92     public void downloadContentScreennail(String path, IDownloadThumbnailImageCallback callback)
93     {
94         if (path.startsWith("/"))
95         {
96             path = path.substring(1);
97         }
98         String requestUrl =  panasonicCamera.getPictureUrl() + "DL" + path.substring(2);
99         Log.v(TAG, " downloadContentScreennail() : " + requestUrl + "  ");
100         try
101         {
102             Bitmap bmp = SimpleHttpClient.httpGetBitmap(requestUrl, timeoutMs);
103             HashMap<String, Object> map = new HashMap<>();
104             map.put("Orientation", 0);
105             callback.onCompleted(bmp, map);
106         }
107         catch (Throwable e)
108         {
109             e.printStackTrace();
110             callback.onErrorOccurred(new NullPointerException());
111         }
112     }
113
114     @Override
115     public void downloadContentThumbnail(String path, IDownloadThumbnailImageCallback callback)
116     {
117         if (path.startsWith("/"))
118         {
119             path = path.substring(1);
120         }
121         String requestUrl =  panasonicCamera.getPictureUrl() + "DT" + path.substring(2);
122         Log.v(TAG, " downloadContentThumbnail() : " + path + "  [" +  requestUrl + "]");
123         try
124         {
125             Bitmap bmp = SimpleHttpClient.httpGetBitmap(requestUrl, timeoutMs);
126             HashMap<String, Object> map = new HashMap<>();
127             map.put("Orientation", 0);
128             callback.onCompleted(bmp, map);
129         }
130         catch (Throwable e)
131         {
132             e.printStackTrace();
133             callback.onErrorOccurred(new NullPointerException());
134         }
135     }
136
137     @Override
138     public void downloadContent(String path, boolean isSmallSize, IDownloadContentCallback callback)
139     {
140         Log.v(TAG, "downloadContent() : " + path + "  [" + isSmallSize + "]");
141
142
143     }
144
145     @Override
146     public void getCameraContentList(ICameraContentListCallback callback)
147     {
148         Log.v(TAG, "  getCameraContentList()");
149         contentList.clear();
150         try
151         {
152             String checkUrl = panasonicCamera.getPictureUrl();
153             int maxIndex = getObjectLists.length() - checkUrl.length();
154             int index = 0;
155
156             // データを解析してリストを作る
157             while ((index >= 0) && (index < maxIndex))
158             {
159                 index = getObjectLists.indexOf(checkUrl, index);
160                 if (index > 0)
161                 {
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"))
166                     {
167                         // DO(オリジナル), DL(スクリーンネイル?), DT(サムネイル?)
168                         PanasonicImageContentInfo contentInfo = new PanasonicImageContentInfo(picUrl);
169                         contentList.add(contentInfo);
170                     }
171                     index = lastIndex;
172                 }
173             }
174
175             if (callback != null)
176             {
177                 callback.onCompleted(contentList);
178             }
179
180         }
181         catch (Exception e)
182         {
183             e.printStackTrace();
184             if (callback != null)
185             {
186                 callback.onErrorOccurred(e);
187             }
188         }
189     }
190 }