--- /dev/null
+package net.osdn.gokigen.pkremote.camera.vendor.pixpro.wrapper.playback;
+
+import net.osdn.gokigen.pkremote.camera.interfaces.playback.ICameraContent;
+
+import java.util.Date;
+
+public class PixproCameraContent implements ICameraContent
+{
+ private final String pathRoot;
+ private String name;
+ private String fPath;
+ private String size;
+ private String dateTime;
+ private String dcfIndex;
+ private String attr;
+
+ PixproCameraContent(String pathRoot)
+ {
+ this.pathRoot = pathRoot;
+
+ }
+
+ public void setObjName(String name)
+ {
+ this.name = name;
+ }
+
+ public void setFilePath(String fPath)
+ {
+ this.fPath = fPath;
+ }
+
+ public void setObjSize(String size)
+ {
+ this.size = size;
+ }
+
+ public void setDateTime(String dateTime)
+ {
+ this.dateTime = dateTime;
+ }
+
+ public void setDcfIndex(String dcfIndex)
+ {
+ this.dcfIndex = dcfIndex;
+ }
+
+ public void setAttr(String attr)
+ {
+ this.attr = attr;
+ }
+
+ @Override
+ public String getCameraId()
+ {
+ return ("");
+ }
+
+ @Override
+ public String getCardId()
+ {
+ return ("");
+ }
+
+ @Override
+ public String getContentPath()
+ {
+ try
+ {
+ int index = fPath.lastIndexOf("/");
+ return (fPath.substring(0, index));
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ return (fPath);
+ }
+
+ @Override
+ public String getContentName()
+ {
+ return (name);
+ }
+
+ @Override
+ public String getOriginalName()
+ {
+ return (name);
+ }
+
+ @Override
+ public boolean isRaw()
+ {
+ return (false);
+ }
+
+ @Override
+ public boolean isMovie()
+ {
+ return (false);
+ }
+
+ @Override
+ public boolean isDateValid()
+ {
+ return (false);
+ }
+
+ @Override
+ public boolean isContentNameValid()
+ {
+ return (false);
+ }
+
+ @Override
+ public Date getCapturedDate()
+ {
+ // 2020年7月11日、 8:32:30 が 1357595663 (100_0001.JPG)
+ // 2020年7月11日、 8:33:44 が 1357595702 (100_0002.JPG)
+ // 2020年7月11日、 8:34:34 が 1357595729 (100_0003.JPG)
+ // 2020年8月10日、20:43:32 が 1359652208
+
+ return (new Date());
+ }
+
+ @Override
+ public void setCapturedDate(Date date)
+ {
+
+ }
+}
--- /dev/null
+package net.osdn.gokigen.pkremote.camera.vendor.pixpro.wrapper.playback;
+
+
+import android.util.Log;
+import android.util.Xml;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import net.osdn.gokigen.pkremote.camera.interfaces.playback.ICameraContent;
+
+import org.xmlpull.v1.XmlPullParser;
+
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.List;
+
+class PixproContentListParser
+{
+ private final String TAG = toString();
+ private static final String CAMERACONTENT_TAG = "File";
+ private static final String PATHROOT_TAG = "PATHROOT";
+ private static final String NAME_TAG = "NAME";
+ private static final String FPATH_TAG = "FPATH";
+ private static final String SIZE_TAG = "SIZE";
+ private static final String TIMECODE_TAG = "TIMECODE";
+ private static final String DCFINDEX_TAG = "DCFINDEX";
+ private static final String ATTR_TAG = "ATTR";
+
+ private List<PixproCameraContent> contentList;
+ private String pathRoot;
+
+ PixproContentListParser()
+ {
+ contentList = new ArrayList<>();
+ }
+
+ public List<ICameraContent> parseContentList(@NonNull String receivedMessage)
+ {
+ // 受信したボディを解析して、画像一覧を cameraContentList に入れる
+ List<ICameraContent> cameraContentList = new ArrayList<>();
+ PixproCameraContent cameraContent = null;
+ contentList.clear();
+ try
+ {
+ String tagName = null;
+ XmlPullParser parser = Xml.newPullParser();
+ parser.setInput(new StringReader(receivedMessage));
+ int eventType = parser.getEventType();
+ while (eventType != XmlPullParser.END_DOCUMENT)
+ {
+ if(eventType == XmlPullParser.START_DOCUMENT)
+ {
+ System.out.println("Start document");
+ }
+ else if(eventType == XmlPullParser.START_TAG)
+ {
+ tagName = parser.getName();
+ }
+ else if(eventType == XmlPullParser.END_TAG)
+ {
+ String tag = parser.getName();
+ if (tag != null)
+ {
+ if (tag.matches(CAMERACONTENT_TAG))
+ {
+ cameraContentList.add(cameraContent);
+ contentList.add(cameraContent);
+ cameraContent = null;
+ }
+ Log.v(TAG, " ----- END TAG : " + tag + " ------ ");
+ }
+ tagName = null; // parser.getName();
+ }
+ else if(eventType == XmlPullParser.TEXT)
+ {
+ String content = parser.getText();
+ if (tagName != null)
+ {
+ if (tagName.matches(CAMERACONTENT_TAG))
+ {
+ cameraContent = new PixproCameraContent(pathRoot);
+ }
+ else
+ parseData(tagName, content, cameraContent);
+ }
+ }
+ eventType = parser.next();
+ }
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ return (cameraContentList);
+ }
+
+ private void parseData(@NonNull String tagName, @Nullable String content, @Nullable PixproCameraContent cameraContent)
+ {
+ Log.v(TAG, " ----- " + tagName + " : " + content + " ------ ");
+ try
+ {
+ if (tagName.matches(PATHROOT_TAG))
+ {
+ pathRoot = content;
+ }
+ if (cameraContent != null)
+ {
+ if (tagName.matches(NAME_TAG))
+ {
+ cameraContent.setObjName(content);
+ }
+ else if (tagName.matches(FPATH_TAG))
+ {
+ cameraContent.setFilePath(content);
+ }
+ else if (tagName.matches(SIZE_TAG))
+ {
+ cameraContent.setObjSize(content);
+ }
+ else if (tagName.matches(TIMECODE_TAG))
+ {
+ cameraContent.setDateTime(content);
+ }
+ else if (tagName.matches(DCFINDEX_TAG))
+ {
+ cameraContent.setDcfIndex(content);
+ }
+ else if (tagName.matches(ATTR_TAG))
+ {
+ cameraContent.setAttr(content);
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+}
\ No newline at end of file
package net.osdn.gokigen.pkremote.camera.vendor.pixpro.wrapper.playback;
+import android.graphics.Bitmap;
import android.util.Log;
import androidx.annotation.NonNull;
import net.osdn.gokigen.pkremote.camera.interfaces.playback.IDownloadContentListCallback;
import net.osdn.gokigen.pkremote.camera.interfaces.playback.IDownloadThumbnailImageCallback;
import net.osdn.gokigen.pkremote.camera.interfaces.playback.IPlaybackControl;
+import net.osdn.gokigen.pkremote.camera.playback.ProgressEvent;
import net.osdn.gokigen.pkremote.camera.utils.SimpleHttpClient;
import net.osdn.gokigen.pkremote.camera.vendor.pixpro.wrapper.IConnectionKeyProvider;
-import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
public class PixproPlaybackControl implements IPlaybackControl
private final IConnectionKeyProvider keyProvider;
private final int timeoutValue;
- private List<ICameraContent> cameraContentList;
+ private PixproContentListParser contentListParser;
public PixproPlaybackControl(@NonNull String ipAddress, int timeoutMs, @NonNull IConnectionKeyProvider keyProvider)
{
this.ipAddress = ipAddress;
this.keyProvider = keyProvider;
this.timeoutValue = Math.max(timeoutMs, DEFAULT_TIMEOUT);
- cameraContentList = new ArrayList<>();
-
+ contentListParser = new PixproContentListParser();
}
@Override
public void downloadContentList(IDownloadContentListCallback callback)
{
-
+ Log.v(TAG, " downloadContentList()");
}
@Override
public void getContentInfo(String path, String name, IContentInfoCallback callback)
{
-
+ Log.v(TAG, " getContentInfo() : " + path + " / " + name);
}
@Override
public void updateCameraFileInfo(ICameraFileInfo info)
{
-
+ Log.v(TAG, " updateCameraFileInfo() : " + info.getFilename());
}
@Override
public void downloadContentScreennail(String path, IDownloadThumbnailImageCallback callback)
{
-
+ downloadContentThumbnail(path, callback);
+/*
+ try
+ {
+ int index = path.indexOf(".");
+ String urlToGet = "http://" + ipAddress + path.substring(0, index) + ".scn?" + getConnectionString();
+ Log.v(TAG, "downloadContentThumbnail() : " + urlToGet);
+
+ Bitmap bmp = SimpleHttpClient.httpGetBitmap(urlToGet, null, timeoutValue);
+ HashMap<String, Object> map = new HashMap<>();
+ map.put("Orientation", 0);
+ callback.onCompleted(bmp, map);
+ }
+ catch (Throwable e)
+ {
+ e.printStackTrace();
+ callback.onErrorOccurred(new NullPointerException());
+ }
+*/
}
@Override
public void downloadContentThumbnail(String path, IDownloadThumbnailImageCallback callback)
{
-
+ try
+ {
+ int index = path.indexOf(".");
+ String urlToGet = "http://" + ipAddress + path.substring(0, index) + ".thm?" + getConnectionString();
+ Log.v(TAG, "downloadContentThumbnail() : " + urlToGet);
+
+ Bitmap bmp = SimpleHttpClient.httpGetBitmap(urlToGet, null, timeoutValue);
+ HashMap<String, Object> map = new HashMap<>();
+ map.put("Orientation", 0);
+ callback.onCompleted(bmp, map);
+ }
+ catch (Throwable e)
+ {
+ e.printStackTrace();
+ callback.onErrorOccurred(new NullPointerException());
+ }
}
@Override
- public void downloadContent(String path, boolean isSmallSize, IDownloadContentCallback callback)
+ public void downloadContent(String path, boolean isSmallSize, final IDownloadContentCallback callback)
{
-
+ try
+ {
+ String urlToGet = "http://" + ipAddress + path + "?" + getConnectionString();
+ if (isSmallSize)
+ {
+ int index = path.indexOf(".");
+ urlToGet = "http://" + ipAddress + path.substring(0, index) + ".scn?" + getConnectionString();
+ urlToGet = urlToGet.toLowerCase();
+ urlToGet = urlToGet.replace("dcim", "scn");
+ }
+ SimpleHttpClient.httpGetBytes(urlToGet, null, timeoutValue, new SimpleHttpClient.IReceivedMessageCallback() {
+ @Override
+ public void onCompleted() {
+ callback.onCompleted();
+ }
+
+ @Override
+ public void onErrorOccurred(Exception e) {
+ callback.onErrorOccurred(e);
+ }
+
+ @Override
+ public void onReceive(int readBytes, int length, int size, byte[] data) {
+ float percent = (length == 0) ? 0.0f : ((float) readBytes / (float) length);
+ //Log.v(TAG, " onReceive : " + readBytes + " " + length + " " + size);
+ ProgressEvent event = new ProgressEvent(percent, null);
+ callback.onProgress(data, size, event);
+ }
+ });
+ }
+ catch (Throwable e)
+ {
+ e.printStackTrace();
+ callback.onErrorOccurred(new NullPointerException());
+ }
}
@Override
{
// ぬるぽ発行
callback.onErrorOccurred(new NullPointerException());
- cameraContentList.clear();
return;
}
- // 応答を受信した場合...
+ // 応答を受信した場合...受信データを parseして応答する。
Log.v(TAG, " RECEIVED CONTENT REPLY : " + receivedMessage.length());
- parseContentList(receivedMessage);
+ List<ICameraContent> cameraContentList = contentListParser.parseContentList(receivedMessage);
callback.onCompleted(cameraContentList);
}
catch (Exception e)
}
}
- private void parseContentList(@NonNull String receivedMessage)
- {
- // 受信したボディを解析して、画像一覧を cameraContentList に入れる
-
-
- }
-
-
@Override
public void showPictureStarted()
{
public ThetaPlaybackControl(@NonNull Activity activity, int timeoutMs, int maxCount)
{
- this.timeoutValue = (timeoutMs < DEFAULT_TIMEOUT) ? DEFAULT_TIMEOUT : timeoutMs;
- this.maxCount = (maxCount < DEFAULT_MAX_COUNT) ? DEFAULT_MAX_COUNT : maxCount;
+ this.timeoutValue = Math.max(DEFAULT_TIMEOUT, timeoutMs);
+ this.maxCount = Math.max(maxCount, DEFAULT_MAX_COUNT);
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(activity);
useThetaV21 = preferences.getBoolean(IPreferencePropertyAccessor.USE_OSC_THETA_V21, false);
cameraContentList = new ArrayList<>();
catch (Exception e)
{
e.printStackTrace();
+ callback.onErrorOccurred(new NullPointerException());
}
}
catch (Throwable e)
{
e.printStackTrace();
+ callback.onErrorOccurred(new NullPointerException());
}
}
catch (Throwable e)
{
e.printStackTrace();
+ callback.onErrorOccurred(new NullPointerException());
}
}