From e774036922e06efc60d99e66695d931c93ab78d2 Mon Sep 17 00:00:00 2001 From: heck Date: Tue, 18 Feb 2020 00:54:34 +0100 Subject: [PATCH] Added feature Blob.toString() - Human readable string representation of Blob. The data field is ASN.1 XER decoded for mime_types: "application/pEp.sync" "application/pEp.keyreset" --- src/Makefile | 10 +++++---- src/foundation/pEp/jniadapter/Blob.java | 15 +++++++++++++ src/foundation/pEp/jniadapter/_Blob.java | 5 +++++ src/jniutils.cc | 27 ++++++++++++++++++++++++ src/jniutils.hh | 1 + test/Basic/SyncCallbacks.java | 1 + 6 files changed, 55 insertions(+), 4 deletions(-) diff --git a/src/Makefile b/src/Makefile index 38404ab..d9c6645 100644 --- a/src/Makefile +++ b/src/Makefile @@ -46,7 +46,9 @@ C_SOURCES=foundation_pEp_jniadapter_Engine.cc \ foundation_pEp_jniadapter_Message.h \ throw_pEp_exception.cc \ throw_pEp_exception.hh \ - foundation_pEp_jniadapter_AbstractEngine.h + foundation_pEp_jniadapter_AbstractEngine.h \ + foundation_pEp_jniadapter__Blob.cc \ + foundation_pEp_jniadapter__Blob.h PEP_HEADER:=$(shell $(CXX) $(CXXFLAGS) -E -M get_header.cc | grep -oe '[^[:space:]]*pEpEngine\.h' | head -1) @@ -58,7 +60,7 @@ $(JAR): status_list.yml2 $(JAVA_SOURCES) $(C_SOURCES) $(JP)/javac foundation/pEp/jniadapter/*.java $(JP)/jar cf $@ foundation/pEp/jniadapter/*.class -BLUBB=foundation_pEp_jniadapter_AbstractEngine.h foundation_pEp_jniadapter_Engine.h foundation_pEp_jniadapter_Message.h +BLUBB=foundation_pEp_jniadapter_AbstractEngine.h foundation_pEp_jniadapter_Engine.h foundation_pEp_jniadapter_Message.h foundation_pEp_jniadapter__Blob.h $(BLUBB): foundation_pEp_jniadapter_%.h: foundation/pEp/jniadapter/%.java ifdef OLD_JAVA $(JP)/javah $(subst /,.,$(subst .java,,$<)) @@ -69,10 +71,10 @@ endif foundation_pEp_jniadapter_AbstractEngine.o: %.o: %.cc %.h throw_pEp_exception.hh jniutils.hh $(CXX) $(CXXFLAGS) -c $< -o $@ -foundation_pEp_jniadapter_Engine.o foundation_pEp_jniadapter_Message.o: %.o: %.cc %.h +foundation_pEp_jniadapter_Engine.o foundation_pEp_jniadapter_Message.o foundation_pEp_jniadapter__Blob.o : %.o: %.cc %.h $(CXX) $(CXXFLAGS) -c $< -o $@ -$(LIBRARY): foundation_pEp_jniadapter_AbstractEngine.o foundation_pEp_jniadapter_Engine.o foundation_pEp_jniadapter_Message.o throw_pEp_exception.o jniutils.o basic_api.o +$(LIBRARY): foundation_pEp_jniadapter_AbstractEngine.o foundation_pEp_jniadapter_Engine.o foundation_pEp_jniadapter_Message.o throw_pEp_exception.o jniutils.o basic_api.o foundation_pEp_jniadapter__Blob.o ar -r $@ *.o $(SHARED): $(LIBRARY) diff --git a/src/foundation/pEp/jniadapter/Blob.java b/src/foundation/pEp/jniadapter/Blob.java index cd4d962..4b37839 100644 --- a/src/foundation/pEp/jniadapter/Blob.java +++ b/src/foundation/pEp/jniadapter/Blob.java @@ -9,6 +9,21 @@ public class Blob { mime_type = "application/octet-stream"; } + /** Human readable string representation of Blob. + * The data field is ASN.1 XER decoded for mime_types: + * "application/pEp.sync" + * "application/pEp.keyreset" + * @return String Blob as String + */ + public String toString() { + _Blob _b = new _Blob(this); + String ret = ""; + ret += "mime_type: \"" + mime_type + "\"\n"; + ret += "filename: \"" + filename + "\"\n"; + ret += "data: \"" + _b.toString() + "\"\n"; + return ret; + } + Blob(_Blob b) { data = b.data; mime_type = AbstractEngine.toUTF16(b.mime_type); diff --git a/src/foundation/pEp/jniadapter/_Blob.java b/src/foundation/pEp/jniadapter/_Blob.java index 406d032..4f238f9 100644 --- a/src/foundation/pEp/jniadapter/_Blob.java +++ b/src/foundation/pEp/jniadapter/_Blob.java @@ -7,6 +7,11 @@ public class _Blob { _Blob() { } + private native byte[] _toString() throws pEpException;; + public String toString() { + return AbstractEngine.toUTF16(_toString()); + } + _Blob(Blob b) { data = b.data; mime_type = AbstractEngine.toUTF8(b.mime_type); diff --git a/src/jniutils.cc b/src/jniutils.cc index f7a4e10..4a24d6b 100644 --- a/src/jniutils.cc +++ b/src/jniutils.cc @@ -644,6 +644,33 @@ namespace pEp { return obj; } + bloblist_t *to_blob(JNIEnv *env, jobject obj) + { + if (!obj) + return NULL; + + static const char *classname = "foundation/pEp/jniadapter/_Blob"; + jclass clazz = findClass(env, classname); + + char *mime_type = _getStringField(env, classname, obj, "mime_type"); + char *filename = _getStringField(env, classname, obj, "filename"); + + jfieldID data_id = getFieldID(env, classname, "data", "[B"); + jbyteArray _data = reinterpret_cast(env->GetObjectField(obj, data_id)); + size_t size = (size_t) env->GetArrayLength(_data); + char *b = (char *) malloc(size); + assert(b); + + env->GetByteArrayRegion(_data, 0, size, (jbyte*)b); + bloblist_t *bl = new_bloblist( b, size, mime_type, filename); + + free(mime_type); + free(filename); + return bl; + } + + + // TODO: Use to_blob() inside the loop bloblist_t *to_bloblist(JNIEnv *env, jobject obj) { if (!obj) diff --git a/src/jniutils.hh b/src/jniutils.hh index 7fb2b04..88597de 100644 --- a/src/jniutils.hh +++ b/src/jniutils.hh @@ -88,6 +88,7 @@ namespace pEp { identity_list *to_identitylist(JNIEnv *env, jobject obj); jobject from_bloblist(JNIEnv *env, bloblist_t *bl); + bloblist_t *to_blob(JNIEnv *env, jobject obj); bloblist_t *to_bloblist(JNIEnv *env, jobject obj); PEP_enc_format to_EncFormat(JNIEnv *env, jobject obj); diff --git a/test/Basic/SyncCallbacks.java b/test/Basic/SyncCallbacks.java index 3436291..16c74a9 100644 --- a/test/Basic/SyncCallbacks.java +++ b/test/Basic/SyncCallbacks.java @@ -8,6 +8,7 @@ class SyncCallbacks implements Sync.MessageToSendCallback, Sync.NotifyHandshakeC System.out.println("From: " + message.getFrom()); System.out.println("To: " + message.getTo()); System.out.println("Subject: " + message.getShortmsg()); + System.out.println("Attachement[0]: " + message.getAttachments().get(0).toString()); System.out.println("================================"); }