Browse Source

merge in JNI-106 - Java Interfaces And Project Structure

JNI-119 Release_2.1.0-RC13
heck 5 years ago
parent
commit
bccb7c6c97
  1. 63
      .hgignore
  2. 9
      Makefile
  3. 31
      Makefile.conf
  4. 2
      android/build.gradle
  5. 16
      android/jni/Android.mk
  6. 2
      android/src/foundation/pEp/jniadapter/AndroidHelper.java
  7. 27
      local.conf.example
  8. 278
      src/Makefile
  9. 60
      src/codegen/Makefile
  10. 16
      src/codegen/gen_cpp_Engine.ysl2
  11. 7
      src/codegen/gen_cpp_Message.ysl2
  12. 184
      src/codegen/gen_java_Engine.ysl2
  13. 327
      src/codegen/gen_java_Message.ysl2
  14. 65
      src/codegen/gen_throw_pEp_exception.ysl2
  15. 0
      src/codegen/pEp.yml2
  16. 0
      src/codegen/textutils.ysl2
  17. 0
      src/codegen/types_c.ysl2
  18. 0
      src/codegen/types_java.ysl2
  19. 0
      src/cxx/basic_api.cc
  20. 14
      src/cxx/foundation_pEp_jniadapter_AbstractEngine.cc
  21. 0
      src/cxx/foundation_pEp_jniadapter__Blob.cc
  22. 0
      src/cxx/get_header.cc
  23. 0
      src/cxx/identity_api.cc
  24. 0
      src/cxx/jniutils.cc
  25. 0
      src/cxx/jniutils.hh
  26. 0
      src/cxx/passphrase_callback.hh
  27. 0
      src/cxx/passphrase_callback.hxx
  28. 28
      src/foundation/pEp/jniadapter/Engine.java.target
  29. 218
      src/foundation/pEp/jniadapter/Message.java.target
  30. 11
      src/foundation/pEp/jniadapter/UniquelyIdentifiable.java
  31. 252
      src/gen_java_Message.ysl2
  32. 35
      src/gen_java_exceptions.ysl2
  33. 64
      src/gen_throw_pEp_exception.ysl2
  34. 145
      src/java/foundation/pEp/jniadapter/AbstractEngine.java
  35. 20
      src/java/foundation/pEp/jniadapter/Blob.java
  36. 0
      src/java/foundation/pEp/jniadapter/CommType.java
  37. 26
      src/java/foundation/pEp/jniadapter/Identity.java
  38. 0
      src/java/foundation/pEp/jniadapter/Pair.java
  39. 11
      src/java/foundation/pEp/jniadapter/Sync.java
  40. 12
      src/java/foundation/pEp/jniadapter/UniquelyIdentifiable.java
  41. 115
      src/java/foundation/pEp/jniadapter/Utils.java
  42. 8
      src/java/foundation/pEp/jniadapter/_Blob.java
  43. 10
      src/java/foundation/pEp/jniadapter/_Identity.java
  44. 7
      src/java/foundation/pEp/jniadapter/decrypt_message_Return.java
  45. 30
      src/java/foundation/pEp/jniadapter/interfaces/AbstractEngineInterface.java
  46. 5
      src/java/foundation/pEp/jniadapter/interfaces/BlobInterface.java
  47. 7
      src/java/foundation/pEp/jniadapter/interfaces/IdentityInterface.java
  48. 6
      test/java/foundation/pEp/jniadapter/test/Makefile.conf
  49. 7
      test/java/foundation/pEp/jniadapter/test/basic/TestMain.java
  50. 1
      test/java/foundation/pEp/jniadapter/test/jni111/TestAlice.java
  51. 1
      test/java/foundation/pEp/jniadapter/test/jni114/TestAlice.java
  52. 2
      test/java/foundation/pEp/jniadapter/test/jni88/TestMain.java
  53. 1
      test/java/foundation/pEp/jniadapter/test/jni91/TestMain.java
  54. 5
      test/java/foundation/pEp/jniadapter/test/jni92/TestMain.java
  55. 6
      test/java/foundation/pEp/jniadapter/test/jni98/TestMain.java
  56. 4
      test/java/foundation/pEp/jniadapter/test/templateAliceBob/TestAlice.java
  57. 4
      test/java/foundation/pEp/jniadapter/test/templateAliceBob/TestBob.java

63
.hgignore

@ -3,44 +3,52 @@ syntax: glob
# ignore all of them
*.class
*.jar
*.swp
*.o
*.a
*.dylib
*.so
*.orig
*~
.DS_Store
*.db
*.log
.DS_Store
# ignore generated files
# ignore config files
local.conf
# ignore build and dist dirs
build/*
dist/*
org_pEp_*.h
org_pEp_*.cc
pEp_*.h
pEp_*.cc
org/pEp/jniadapter/pEp*.java
foundation_pEp_*.h
foundation_pEp_*.cc
foundation/pEp/jniadapter/pEp*.java
# ignore generated files
status_list.yml2
passphrase_status_list.yml2
pEp/jniadapter/pEp*.java
foundation_pEp_jniadapter__Blob.h
foundation_pEp_jniadapter_AbstractEngine.h
foundation_pEp_jniadapter_Engine.*
foundation_pEp_jniadapter_Message.*
foundation_pEp_jniadapter_Identity.h
throw_pEp_exception.*
src/java/foundation/pEp/jniadapter/exceptions/*.java
CipherSuite.java
Color.java
DecryptFlags.java
Engine.java
EngineInterface.java
IdentityFlags.java
Message.java
DecryptFlags.java
MessageInterface.java
Rating.java
Status.java
SyncHandshakeResult.java
IdentityFlags.java
SyncHandshakeSignal.java
CipherSuite.java
PassphraseType.java
# ignore pep-homes
test/resources/per-user-dirs/alice/.pEp
test/resources/per-user-dirs/bob/.pEp
test/resources/per-user-dirs/carol/.pEp
# FsMsgQueue data
test/resources/fsmsgqueue-test/Alice
test/resources/fsmsgqueue-test/Bob
test/resources/fsmsgqueue-test/Carol
passphrase_status_list.yml2
status_list.yml2
ndk*/
# ignore vim workspace
@ -78,15 +86,12 @@ android/gradlew.bat
androidTests/gradle/wrapper/gradle-wrapper.properties
androidTests/gradlew
androidTests/gradlew.bat
src/org.tar.gz
src/local.conf
org.tar.gz
*.iml
syntax: regexp
android/external/[^.]*
local.conf
src/local.conf
# Default ignored files
.idea/

9
Makefile

@ -3,7 +3,7 @@
# This file may be used under the terms of the GNU General Public License version 3
# see LICENSE.txt
.PHONY: all src test clean doxy-all doxy-cxx doxy-java doxy-clean
.PHONY: all src test clean doxy-all doxy-cxx doxy-java doxy-clean install uninstall
all: src
@ -29,3 +29,10 @@ doxy-java: src
doxy-clean:
rm -rf doc/doxygen/cxx
rm -rf doc/doxygen/java
install:
$(MAKE) -C src install
uninstall:
$(MAKE) -C src uninstall

31
Makefile.conf

@ -9,14 +9,15 @@ PLATFORM:=$(shell uname | tr A-Z a-z)
# DEV ENV PATHS & CFG
# The dev environment paths and configs are set to a default value which can be overridden by ./local.conf and overridden again by <subdir>/local.conf
######### Build Config Defaults #########
DEBUG=1
YML2_PATH=$(HOME)/yml2
DEBUG=0
PREFIX=$(HOME)
YML2_PATH=$(PREFIX)/src/yml2
YML2_PROC=$(YML2_PATH)/yml2proc $(YML2_OPTS)
YML2_OPTS=--encoding=utf8
ENGINE_LIB_PATH=$(HOME)/lib
ENGINE_INC_PATH=$(HOME)/include
AD_LIB_PATH=$(HOME)/lib
AD_INC_PATH=$(HOME)/include
ENGINE_LIB_PATH=$(PREFIX)/lib
ENGINE_INC_PATH=$(PREFIX)/include
AD_LIB_PATH=$(PREFIX)/lib
AD_INC_PATH=$(PREFIX)/include
### Guessing JAVA_HOME
ifeq ($(PLATFORM),linux)
@ -24,6 +25,12 @@ ifeq ($(PLATFORM),linux)
endif
# Old versions of a Java distribution have a `javah` binary, new versions do not. This checks whether or not `javah` can be found in the Java distribution found in the directory `$JAVA_HOME`.
DUMMY:=$(shell which $(JAVA_HOME)/bin/javah)
ifeq ($(.SHELLSTATUS),0)
OLD_JAVA=true
endif
######### Overrides from the config file(s) #########
ifneq ("$(wildcard $(HERE)local.conf)","")
$(info including: $(HERE)local.conf)
@ -32,19 +39,17 @@ else
$(info Optional build config not found: $(HERE)local.conf)
endif
ifneq ("$(wildcard $(HERE)src/local.conf)","")
$(info including: $(HERE)src/local.conf)
-include $(HERE)src/local.conf
else
$(info Optional build config not found: $(HERE)src/local.conf)
endif
### Apply config
ENGINE_LIB=-L$(ENGINE_LIB_PATH)
ENGINE_INC=-I$(ENGINE_INC_PATH)
AD_LIB=-L$(AD_LIB_PATH)
AD_INC=-I$(AD_INC_PATH)
ifndef JAVA_HOME
$(error JAVA_HOME is not set!)
endif
JAVA_BIN_DIR=$(JAVA_HOME)/bin
######### C and C++ #########
CXXFLAGS+=-O0 -std=c++11 -fpermissive -fPIC -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/$(PLATFORM) $(AD_INC) $(ENGINE_INC)

2
android/build.gradle

@ -94,7 +94,7 @@ android {
// call source generation makefile target
task genSources(type:Exec, dependsOn: 'genpEpEngineAsn1Sources') {
workingDir '../src'
commandLine 'make', "-j${threadsToUse}", 'pEp.jar'
commandLine 'make', "-j${threadsToUse}", 'lib-java'
}
task genpEpEngineSyncSources(type:Exec) {

16
android/jni/Android.mk

@ -47,14 +47,14 @@ LOCAL_STATIC_LIBRARIES := pEpEngine libetpan libiconv libuuid pEpAdapter libsequ
LOCAL_CPP_FEATURES += exceptions
LOCAL_CPPFLAGS += -std=c++11 -DANDROID_STL=c++_shared -DHAVE_PTHREADS -DDISABLE_SYNC -fuse-ld=lld
LOCAL_SRC_FILES := \
../../src/foundation_pEp_jniadapter_AbstractEngine.cc \
../../src/foundation_pEp_jniadapter_Engine.cc \
../../src/foundation_pEp_jniadapter_Message.cc \
../../src/foundation_pEp_jniadapter__Blob.cc \
../../src/throw_pEp_exception.cc \
../../src/basic_api.cc \
../../src/identity_api.cc \
../../src/jniutils.cc
../../src/cxx/foundation_pEp_jniadapter_AbstractEngine.cc \
../../src/cxx/foundation_pEp_jniadapter_Engine.cc \
../../src/cxx/foundation_pEp_jniadapter_Message.cc \
../../src/cxx/foundation_pEp_jniadapter__Blob.cc \
../../src/cxx/throw_pEp_exception.cc \
../../src/cxx/basic_api.cc \
../../src/cxx/identity_api.cc \
../../src/cxx/jniutils.cc
LOCAL_C_INCLUDES += $(GPGBUILD)/$(TARGET_ARCH_ABI)/include
LOCAL_C_INCLUDES += $(LIB_PEP_ADAPTER_PATH)/build-android/include $(SRC_PATH)/libpEpAdapter

2
android/src/foundation/pEp/jniadapter/AndroidHelper.java

@ -10,6 +10,8 @@ import java.io.*;
import java.lang.reflect.Method;
import java.util.Scanner;
import foundation.pEp.jniadapter.exceptions.pEpException;
public class AndroidHelper {
static {
System.loadLibrary("pEpJNIAndroidHelper");

27
local.conf.example

@ -2,23 +2,28 @@
# you might not need this file, but if the defaults dont work for you
# You can override them here.
# Tweak the values to your needs and rename it to local.conf
# These example values here reflect the defaults
############ Install ###########
# PREFIX=$(HOME)
######### C++ Compiler #########
# Should work with clang and g++
# CXX=g++
# DEBUG=1 # DEBUG Build (Default)
# DEBUG=0 # RELEASE Build
# DEBUG=0 # RELEASE Build / set to 1 for DEBUG build
######### JAVA #########
############ JAVA ##############
# JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home
######### YML2 #########
# YML2_PATH=$(HOME)/code/yml2
############ YML2 ##############
# YML2_PATH=$(HOME)/src/yml2
########### Engine #############
# ENGINE_LIB_PATH=$(PREFIX)/lib
# ENGINE_INC_PATH=$(PREFIX)/include
########## libAdapter ##########
# AD_LIB_PATH=$(PREFIX)/lib
# AD_INC_PATH=$(PREFIX)/include
######### Engine #########
# ENGINE_LIB_PATH=$(HOME)/local/lib
# ENGINE_INC_PATH=$(HOME)/local/include
######### libAdapter #########
# AD_LIB_PATH=$(HOME)/local/lib
# AD_INC_PATH=$(HOME)/local/include

278
src/Makefile

@ -5,6 +5,30 @@
include ../Makefile.conf
# Names of the java and c++ libs to be built
LIB_JAVA_NAME=pEp.jar
LIB_CXX_NAME=libpEpJNI
DIST_DIR=../dist/
LIB_CXX_STATIC_NAME=$(addsuffix .a,$(LIB_CXX_NAME))
ifeq ($(PLATFORM),linux)
LIB_CXX_DYN_NAME=$(addsuffix .so,$(LIB_CXX_NAME))
else ifeq ($(PLATFORM),darwin)
LIB_CXX_DYN_NAME=$(addsuffix .dylib,$(LIB_CXX_NAME))
else
$(error I dont know how to build for $(PLATFORM).)
endif
LIB_JAVA=$(DIST_DIR)/$(LIB_JAVA_NAME)
LIB_CXX_STATIC=$(DIST_DIR)/$(LIB_CXX_STATIC_NAME)
LIB_CXX_DYN=$(DIST_DIR)/$(LIB_CXX_DYN_NAME)
$(info ------------------ DIST FILES ---------------------)
$(info LIB_JAVA: $(LIB_JAVA))
$(info LIB_CXX_STATIC: $(LIB_CXX_STATIC))
$(info LIB_CXX_DYN: $(LIB_CXX_DYN))
$(info ------------------ BUILD INFO ---------------------)
$(info PLATFORM: $(PLATFORM))
$(info DEBUG: $(DEBUG))
$(info CXX: $(CXX))
@ -17,133 +41,151 @@ $(info YML2_PATH: $(YML2_PATH))
$(info CXXFLAGS: $(CXXFLAGS))
$(info LDFLAGS: $(LDFLAGS))
$(info LDLIBS: $(LDLIBS))
$(info ---------------------------------------------------)
ifndef JAVA_HOME
$(error JAVA_HOME is not set!)
endif
# Dirs
# relative to "src/"
BUILD_ROOT=../build/
CXX_DIR=cxx/
JAVA_DIR=java/
JAVA_PKG_BASENAME=foundation/pEp/jniadapter/
JP=$(JAVA_HOME)/bin
JAVA_PKG_ROOT=$(JAVA_DIR)/$(JAVA_PKG_BASENAME)
JAVA_BUILD_ROOT=$(BUILD_ROOT)/$(JAVA_DIR)
OBJ_DIR=$(BUILD_ROOT)/$(CXX_DIR)
# Old versions of a Java distribution have a `javah` binary, new versions do not. This checks whether or not `javah` can be found in the Java distribution found in the directory `$JAVA_HOME`.
NOT_USED:=$(shell which $(JAVA_HOME)/bin/javah)
ifeq ($(.SHELLSTATUS),0)
OLD_JAVA=placeholder
endif
LIBRARY=libpEpJNI.a
JAR=pEp.jar
# for "make clean" only
GENERATED_JAVA=\
$(JAVA_PKG_ROOT)/Engine.java \
$(JAVA_PKG_ROOT)/Message.java \
$(JAVA_PKG_ROOT)/CipherSuite.java \
$(JAVA_PKG_ROOT)/Color.java \
$(JAVA_PKG_ROOT)/DecryptFlags.java \
$(JAVA_PKG_ROOT)/IdentityFlags.java \
$(JAVA_PKG_ROOT)/Rating.java \
$(JAVA_PKG_ROOT)/SyncHandshakeResult.java \
$(JAVA_PKG_ROOT)/SyncHandshakeSignal.java \
$(JAVA_PKG_ROOT)/PassphraseType.java \
$(JAVA_PKG_ROOT)/interfaces/EngineInterface.java \
$(JAVA_PKG_ROOT)/interfaces/MessageInterface.java \
$(JAVA_PKG_ROOT)/exceptions/*.java
ifeq ($(PLATFORM),linux)
SHARED=libpEpJNI.so
else ifeq ($(PLATFORM),darwin)
SHARED=libpEpJNI.dylib
else
$(error I dont know how to build for $(PLATFORM).)
endif
# files to compile which will be be generated
GENERATED_CC=\
$(CXX_DIR)/foundation_pEp_jniadapter_Engine.cc \
$(CXX_DIR)/foundation_pEp_jniadapter_Message.cc \
$(CXX_DIR)/throw_pEp_exception.cc
# for "make clean" only
GENERATED_HH=\
$(CXX_DIR)/throw_pEp_exception.hh
# Generated JNI headers (javac -h)
JNI_GENERATED_HH=\
$(CXX_DIR)/foundation_pEp_jniadapter_AbstractEngine.h \
$(CXX_DIR)/foundation_pEp_jniadapter__Blob.h \
$(CXX_DIR)/foundation_pEp_jniadapter_Engine.h \
$(CXX_DIR)/foundation_pEp_jniadapter_Identity.h \
$(CXX_DIR)/foundation_pEp_jniadapter_Message.h
# Auto dependencies using gcc/clang
CXXFLAGS+= -MMD -MP
SOURCES=$(wildcard $(CXX_DIR)/*.cc)
SOURCES+=$(GENERATED_CC)
tmp=$(SOURCES:.cc=.o)
OBJECTS=$(addprefix $(BUILD_ROOT), $(tmp))
DEPENDS=$(OBJECTS:.o=.d)
JAVA_SOURCES=foundation/pEp/jniadapter/AbstractEngine.java \
foundation/pEp/jniadapter/Blob.java \
foundation/pEp/jniadapter/CommType.java \
foundation/pEp/jniadapter/Identity.java \
foundation/pEp/jniadapter/Pair.java \
foundation/pEp/jniadapter/Sync.java \
foundation/pEp/jniadapter/_Blob.java \
foundation/pEp/jniadapter/_Identity.java \
foundation/pEp/jniadapter/pEpException.java \
foundation/pEp/jniadapter/Message.java \
foundation/pEp/jniadapter/Engine.java \
C_SOURCES=foundation_pEp_jniadapter_Engine.cc \
foundation_pEp_jniadapter_Engine.h \
foundation_pEp_jniadapter_Message.cc \
foundation_pEp_jniadapter_Message.h \
throw_pEp_exception.cc \
throw_pEp_exception.hh \
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)
.PHONY: all
all: $(JAR) $(SHARED)
$(JAR): status_list.yml2 passphrase_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 foundation_pEp_jniadapter__Blob.h
$(BLUBB): foundation_pEp_jniadapter_%.h: foundation/pEp/jniadapter/%.java
-include $(DEPENDS)
VPATH = $(CXX_DIR)/
.PHONY: all lib-java lib-cxx compile-java compile-cxx gen-jni-headers codegen clean create-dirs remove-dirs install uninstall
$(info SOURCES: $(SOURCES))
$(info OBJECTS: $(OBJECTS))
$(info DEPENDS: $(DEPENDS))
all: lib-java lib-cxx
# Build only java lib
lib-java: $(LIB_JAVA)
# Build only c++ static/shared lib
lib-cxx: $(LIB_CXX_DYN) $(LIB_CXX_STATIC)
# ---------------- Link -----------------
$(LIB_JAVA): compile-java
$(JAVA_BIN_DIR)/jar cf $@ -C $(JAVA_BUILD_ROOT) foundation
$(LIB_CXX_DYN): compile-cxx
$(CXX) $(OBJ_DIR)*.o $(LDFLAGS) $(LDLIBS) -o $@
$(LIB_CXX_STATIC): compile-cxx
$(AR) -r $@ $(OBJ_DIR)*.o
# -------------- Compile -----------------
compile-java: create-dirs codegen
cd $(JAVA_DIR);$(JAVA_BIN_DIR)/javac -d ../$(JAVA_BUILD_ROOT) $(JAVA_PKG_BASENAME)/*.java
cd $(JAVA_DIR);$(JAVA_BIN_DIR)/javac -d ../$(JAVA_BUILD_ROOT) $(JAVA_PKG_BASENAME)/exceptions/*.java
cd $(JAVA_DIR);$(JAVA_BIN_DIR)/javac -d ../$(JAVA_BUILD_ROOT) $(JAVA_PKG_BASENAME)/interfaces/*.java
compile-cxx: create-dirs gen-jni-headers $(OBJECTS)
$(OBJECTS): $(BUILD_ROOT)%.o: %.cc
$(CXX) $(CXXFLAGS) -c $< -o $@
# --------- Generate JNI headers ----------
gen-jni-headers: codegen $(JNI_GENERATED_HH)
$(JNI_GENERATED_HH):
ifdef OLD_JAVA
$(JP)/javah $(subst /,.,$(subst .java,,$<))
cd $(JAVA_DIR);$(JAVA_BIN_DIR)/javah -d ../$(JAVA_BUILD_ROOT) $(subst /,.,$(subst .java,,$<))
else
$(JP)/javac -h . $<
cd $(JAVA_DIR);$(JAVA_BIN_DIR)/javac -d ../$(JAVA_BUILD_ROOT) -h ../$(CXX_DIR)/ $(JAVA_PKG_BASENAME)/*.java
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 foundation_pEp_jniadapter__Blob.o : %.o: %.cc %.h
$(CXX) $(CXXFLAGS) -c $< -o $@
# ------------- YML2 CodeGen --------------
codegen:
$(MAKE) -C codegen
# ------------- Housekeeping ---------------
create-dirs:
$(MAKE) -C codegen create-dirs
mkdir -p $(JAVA_BUILD_ROOT)/$(JAVA_PKG_BASENAME)
mkdir -p $(JAVA_BUILD_ROOT)/$(JAVA_PKG_BASENAME)/exceptions
mkdir -p $(OBJ_DIR)
mkdir -p $(DIST_DIR)
mkdir -p $(JAVA_PKG_ROOT)/exceptions
#rm -rf is too dangerous for vars
remove-dirs:
$(MAKE) -C codegen remove-dirs
rm -rf ../build
rm -rf ../dist
clean: remove-dirs
$(MAKE) -C codegen clean
rm -f $(GENERATED_JAVA)
rm -f $(GENERATED_CC)
rm -f $(GENERATED_HH)
rm -f $(JNI_GENERATED_HH)
rm -f $(DEPENDS)
rm -f $(OBJECTS)
install: $(LIB_JAVA) $(LIB_CXX_STATIC) $(LIB_CXX_DYN)
mkdir -p $(PREFIX)/lib
cp -v $(LIB_JAVA) $(PREFIX)/lib/
cp -v $(LIB_CXX_STATIC) $(PREFIX)/lib/
cp -v $(LIB_CXX_DYN) $(PREFIX)/lib/
uninstall:
cd $(PREFIX)/lib && rm -vf $(LIB_JAVA_NAME)
cd $(PREFIX)/lib && rm -vf $(LIB_CXX_STATIC_NAME)
cd $(PREFIX)/lib && rm -vf $(LIB_CXX_DYN_NAME)
$(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)
$(CXX) *.o $(LDFLAGS) $(LDLIBS) -o $@
status_list.yml2: pEp.yml2
bash ../utils/extract_pEp_status_codes_from_engine.sh "$(PEP_HEADER)" $@
passphrase_status_list.yml2: status_list.yml2
grep passphrase $< > $@
foundation/pEp/jniadapter/pEpException.java: pEp.yml2 gen_java_exceptions.ysl2 pEp.yml2
$(YML2_PROC) -y gen_java_exceptions.ysl2 $< -o $@
foundation/pEp/jniadapter/Message.java: pEp.yml2 gen_java_Message.ysl2 types_java.ysl2
$(YML2_PROC) -y gen_java_Message.ysl2 $<
foundation/pEp/jniadapter/Engine.java: pEp.yml2 gen_java_Engine.ysl2 types_java.ysl2
$(YML2_PROC) -y gen_java_Engine.ysl2 $<
foundation_pEp_jniadapter_Message.cc: pEp.yml2 gen_cpp_Message.ysl2 types_c.ysl2
$(YML2_PROC) -y gen_cpp_Message.ysl2 $<
foundation_pEp_jniadapter_Engine.cc: pEp.yml2 gen_cpp_Engine.ysl2 types_c.ysl2
$(YML2_PROC) -y gen_cpp_Engine.ysl2 $<
throw_pEp_exception.cc throw_pEp_exception.hh: pEp.yml2 gen_throw_pEp_exception.ysl2 textutils.ysl2
$(YML2_PROC) -y gen_throw_pEp_exception.ysl2 $< -o throw_pEp_exception.cc
throw_pEp_exception.o: throw_pEp_exception.cc throw_pEp_exception.hh
basic_api.o: basic_api.cc jniutils.hh throw_pEp_exception.hh
.PHONY: clean
clean:
rm -f $(JAR) $(LIBRARY) $(SHARED)
rm -f *.so
rm -f *.dylib
rm -f *.o
rm -f *.class
rm -f *.xml *.xsl
rm -f foundation_pEp_jniadapter_*.h
rm -f foundation/pEp/jniadapter/*.class
rm -f foundation/pEp/jniadapter/pEp*.java
rm -f foundation/pEp/jniadapter/Engine.java
rm -f foundation/pEp/jniadapter/Message.java
rm -f foundation/pEp/jniadapter/Color.java
rm -f foundation/pEp/jniadapter/DecryptFlags.java
rm -f foundation/pEp/jniadapter/IdentityFlags.java
rm -f foundation/pEp/jniadapter/Rating.java
rm -f foundation/pEp/jniadapter/Status.java
rm -f foundation/pEp/jniadapter/SyncHandshakeResult.java
rm -f foundation/pEp/jniadapter/SyncHandshakeSignal.java
rm -f foundation/pEp/jniadapter/CipherSuite.java
rm -f foundation/pEp/jniadapter/PassphraseType.java
rm -f throw_pEp_exception.*
rm -f foundation_pEp_jniadapter_Message.cc foundation_pEp_jniadapter_Engine.cc
rm -f status_list.yml2
rm -f passphrase_status_list.yml2

60
src/codegen/Makefile

@ -0,0 +1,60 @@
# Copyright 2018, pEp Foundation
# This file is part of pEp JNI Adapter
# This file may be used under the terms of the GNU General Public License version 3
# see LICENSE.txt
include ../../Makefile.conf
MARKER_DIR=../../build/marker/
PEP_HEADER:=$(shell $(CXX) $(CXXFLAGS) -E -M ../cxx/get_header.cc | grep -oe '[^[:space:]]*pEpEngine\.h' | head -1)
# Every ysl2 file that needs to be "compiled" separately, needs to generate a "marker" file
# The marker serves as the make target.
# If the marker file is older than its corresponding ysl2 file, or not exsiting, the ysl2 file will be "compiled"
# Naming:
# For a ysl2 file called "gen_example_stuff.ysl2", a marker file called "gen_example_stuff.marker" is expected.
YML2_MARKERS= \
$(MARKER_DIR)/gen_java_Engine.marker \
$(MARKER_DIR)/gen_java_Message.marker \
$(MARKER_DIR)/gen_cpp_Engine.marker \
$(MARKER_DIR)/gen_cpp_Message.marker \
$(MARKER_DIR)/gen_throw_pEp_exception.marker
# All code genration will be done upon change of these files
YML2_INCLUDES= \
textutils.ysl2 \
types_c.ysl2 \
types_java.ysl2
.PHONY: all codegen gen-status-codes create-dirs remove-dirs clean
all: codegen
# ------------- YML2 CodeGen --------------
codegen: create-dirs gen-status-codes $(YML2_MARKERS)
$(YML2_MARKERS): $(MARKER_DIR)/%.marker : %.ysl2 pEp.yml2 $(YML2_INCLUDES)
$(YML2_PROC) -y $< pEp.yml2
gen-status-codes: status_list.yml2 passphrase_status_list.yml2
status_list.yml2: pEp.yml2
bash ../../utils/extract_pEp_status_codes_from_engine.sh "$(PEP_HEADER)" $@
passphrase_status_list.yml2: status_list.yml2
grep passphrase $< > $@
# ------------- Housekeeping ---------------
create-dirs:
mkdir -p $(MARKER_DIR)
#rm -rf is too dangerous for vars
remove-dirs:
rm -rf ../../build/marker
clean: remove-dirs
rm -f status_list.yml2
rm -f passphrase_status_list.yml2

16
src/gen_cpp_Engine.ysl2 → src/codegen/gen_cpp_Engine.ysl2

@ -5,9 +5,12 @@ tstylesheet {
include ./types_c.ysl2
include ./types_java.ysl2
template "/namespace[@name='pEp']" apply "interface", 0;
template "/namespace[@name='pEp']" {
apply "interface", 0;
document("../../build/marker/gen_cpp_Engine.marker", "text") > ""
}
template "interface" document("foundation_pEp_jniadapter_{@name}.cc", "text")
template "interface" document("../cxx/foundation_pEp_jniadapter_{@name}.cc", "text")
||
#include <cassert>
#include <pEp/blacklist.h>
@ -310,14 +313,7 @@ tstylesheet {
}
function "mangle" {
const "convert", "count(parm/stringlist|parm/string|parm/identity|parm/identitylist) > 0";
choose {
when "$convert"
> «concat('Java_foundation_pEp_jniadapter_', ../@name, '__1', str:replace(@name, '_', '_1'))»
otherwise
> «concat('Java_foundation_pEp_jniadapter_', ../@name, '_', str:replace(@name, '_', '_1'))»
}
> «concat('Java_foundation_pEp_jniadapter_', ../@name, '__1', str:replace(@name, '_', '_1'))»
}
template "parm", mode=sig {

7
src/gen_cpp_Message.ysl2 → src/codegen/gen_cpp_Message.ysl2

@ -5,12 +5,15 @@ tstylesheet {
include ./textutils.ysl2
include ./types_c.ysl2
template "/namespace[@name='pEp']" apply "struct", 0;
template "/namespace[@name='pEp']" {
apply "struct", 0;
document("../../build/marker/gen_cpp_Message.marker", "text") > ""
}
template "struct" {
const "jname" call "CamelCase" with "text", "@name";
document("foundation_pEp_jniadapter_{$jname}.cc", "text") {
document("../cxx/foundation_pEp_jniadapter_{$jname}.cc", "text") {
||
#include <cassert>
#include <pEp/mime.h>

184
src/gen_java_Engine.ysl2 → src/codegen/gen_java_Engine.ysl2

@ -4,24 +4,41 @@ tstylesheet {
include ./textutils.ysl2
include ./types_java.ysl2
template "/namespace[@name='pEp']" apply "interface", 0;
template "/namespace[@name='pEp']" {
apply "interface", 0;
document("../../build/marker/gen_java_Engine.marker", "text") > ""
}
template "interface" {
const "cname" call "toJava" with "type", "@name";
document("foundation/pEp/jniadapter/{$cname}.java", "text")
document("../java/foundation/pEp/jniadapter/{$cname}.java", "text")
||
package foundation.pEp.jniadapter;
import foundation.pEp.jniadapter.interfaces.*;
import foundation.pEp.jniadapter.exceptions.*;
import java.util.ArrayList;
import java.util.Vector;
final public class «$cname» extends AbstractEngine {
final public class «$cname» extends AbstractEngine implements EngineInterface {
public «$cname»() throws pEpException { }
`` apply "method", mode=plain
`` apply "method"
`` apply "basic"
}
||
document("../java/foundation/pEp/jniadapter/interfaces/{$cname}Interface.java", "text")
||
package foundation.pEp.jniadapter.interfaces;
import foundation.pEp.jniadapter.*;
import java.util.ArrayList;
import java.util.Vector;
public interface «$cname»Interface extends AbstractEngineInterface {
`` apply "method", mode=java_interface
`` apply "basic", mode=java_interface
}
||
}
@ -29,48 +46,47 @@ tstylesheet {
const "itype" call "toIntermediate" with "type", "@type";
const "jtype" call "toJava" with "type", "@type";
choose {
when "name(parm/*[1])='bytearray|identitylist'"
||
public native «$itype» «@name»(`apply "parm/*", mode=basic_iparm`);
||
otherwise {
||
private native «$itype» _«@name»(`apply "parm/*", mode=basic_iparm`);
||
public «$jtype» «@name»(`apply "parm/*", mode=basic_parm`) {
// CodeGen "basic"
public «$jtype» «@name»(`apply "parm/*", mode=basic_parm`) {
||
apply "parm/*", mode=basic_parm_set;
choose {
when "@type = 'void'"
|> _«@name»(`apply "parm/*", mode=basic_parm_name`);
when "@type = 'identity'"
|> return new Identity(_«@name»(`apply "parm/*", mode=basic_parm_name`));
when "@type = 'bool'"
|> return new Boolean(_«@name»(`apply "parm/*", mode=basic_parm_name`));
when "@type = 'identitylist'" {
||
apply "parm/*", mode=basic_parm_set;
choose {
when "@type = 'void'"
|> _«@name»(`apply "parm/*", mode=basic_parm_name`);
when "@type = 'identity'"
|> return new Identity(_«@name»(`apply "parm/*", mode=basic_parm_name`));
when "@type = 'bool'"
|> return new Boolean(_«@name»(`apply "parm/*", mode=basic_parm_name`));
when "@type = 'identitylist'" {
||
Vector<_Identity> glist = _«@name»(`apply "parm/*", mode=basic_parm_name`);
Vector<Identity> ret = new Vector<Identity>();
if(glist != null) {
for (_Identity i : glist) {
ret.add(new Identity(i));
}
Vector<_Identity> glist = _«@name»(`apply "parm/*", mode=basic_parm_name`);
Vector<Identity> ret = new Vector<Identity>();
if(glist != null) {
for (_Identity i : glist) {
ret.add(new Identity(i));
}
return ret;
||
} otherwise
|> return AbstractEngine.toUTF16(_«@name»(`apply "parm/*", mode=basic_parm_name`));
}
||
}
}
return ret;
||
}
} otherwise
|> return Utils.toUTF16(_«@name»(`apply "parm/*", mode=basic_parm_name`));
}
||
}
private native «$itype» _«@name»(`apply "parm/*", mode=basic_iparm`);
||
}
template "basic" mode=java_interface {
const "jtype" call "toJava" with "type", "@type";
||
public «$jtype» «@name»(`apply "parm/*", mode=basic_parm`);
||
}
template "*", mode=basic_parm_name choose {
when "position() mod 2" {
if "position() = 1 and name(.)='int'"
@ -125,7 +141,7 @@ tstylesheet {
if "not(position() mod 2)" choose {
when "$ptype = 'string'"
| «$pitype» _«$pname» = AbstractEngine.toUTF8(«$pname»);
| «$pitype» _«$pname» = Utils.toUTF8(«$pname»);
when "$ptype = 'bool'"
| «$pitype» _«$pname» = «$pname».booleanValue();
when "$ptype = 'bytearray'"
@ -161,59 +177,47 @@ tstylesheet {
}
}
template "method", mode=plain {
const "convert", "count(parm/stringlist|parm/stringpairlist|parm/string|parm/identity|parm/identitylist) > 0";
template "method" {
const "singlereturn", "count(parm/creates|parm/returns|parm/inout[../int]) = 1";
const "multireturn", "count(parm/creates|parm/returns|parm/inout[../int]) > 1";
||
//CodeGen "method"
||
if "$multireturn" {
if "$convert"
||
//CodeGen "mutlireturn" - class for return type
private class _«@name»_Return {
`` apply "parm[creates|returns|inout[../int]]", 1, mode=intermediate with "public", 1;
}
||
||
public class «@name»_Return {
`` apply "parm[creates|returns|inout[../int]]", 1, mode=java with "public", 1;
}
||
}
if "$convert"
||
private native `call "returnInter"` _«@name»(
`` apply "parm[in|inout]", 2, mode=intermediate
) throws pEpException;
||
||
public `if "not($convert)" > native ``call "returnJava"` «@name»(
public `call "returnJava"` «@name»(
`` apply "parm[in|inout]", 2, mode=java
) throws pEpException`if "not($convert)" > ;`
) throws pEpException
{
||
if "$convert" {
| {
apply "parm", mode=convertIn;
if "$singlereturn" choose {
// TODO factorize type conversion with multireturn and gen_java_message.java
apply "parm", mode=convertIn;
if "$singlereturn" {
choose {
when "count(parm[returns][stringlist|string|sstring]) > 0"
|> return AbstractEngine.toUTF16(_«@name»(`apply "parm[in]", mode=call;`));
|> return Utils.toUTF16(_«@name»(`apply "parm[in]", mode=call;`));
when "count(parm[returns]/stringpairlist) > 0"
||
ArrayList<Pair<byte[], byte[]>> glist = _«@name»(`apply "parm[in]", mode=call;`);
if(glist != null){
ArrayList<Pair<String, String>> list = new ArrayList<Pair<String, String>>();
for (Pair<byte[],byte[]> i : glist)
list.add(new Pair<String, String>(AbstractEngine.toUTF16(i.first), AbstractEngine.toUTF16(i.second)));
for (Pair<byte[],byte[]> i : glist) {
list.add(new Pair<String, String>(Utils.toUTF16(i.first), Utils.toUTF16(i.second)));
}
return list;
}
return null;
@ -221,40 +225,53 @@ tstylesheet {
when "count(parm[returns]/identity) > 0"
|> return new Identity(_«@name»(`apply "parm[in]", mode=call;`));
when "count(parm[returns]/identitylist) > 0"
||
Vector<_Identity> glist = _«@name»(`apply "parm[in]", mode=call;`);
if(glist != null){
Vector<Identity> list = new Vector<Identity>();
for (_Identity i : glist)
for (_Identity i : glist) {
list.add(new Identity(i));
}
return list;
}
return null;
||
otherwise
|> return _«@name»(`apply "parm[in]", mode=call;`);
}
}
if "$multireturn"
if "$multireturn" {
||
_«@name»_Return _result = _«@name»(`apply "parm[in|inout]", mode=call;`);
«@name»_Return result = new «@name»_Return();
`` apply "parm[creates|returns|inout[../int]]", mode=convertOut;
return result;
||
}
if "not($singlereturn) and not($multireturn)"
if "not($singlereturn) and not($multireturn)" {
||
_«@name»(`apply "parm[in]", mode=call;`);
return;
||
||
}
||
}
||
}
private native `call "returnInter"` _«@name»(
`` apply "parm[in|inout]", 2, mode=intermediate
) throws pEpException;
||
}
template "method", mode=java_interface {
||
public `call "returnJava"` «@name»(
`` apply "parm[in|inout]", 2, mode=java
);
||
}
@ -302,7 +319,7 @@ tstylesheet {
if "$dir = 'in' or $dir = 'inout'" choose {
when "$type = 'string' or $type = 'stringlist'"
| ¡$type _«$name» = AbstractEngine.toUTF8(«$name»);
| ¡$type _«$name» = Utils.toUTF8(«$name»);
when "$type = 'identity'"
||
_Identity _«$name» = null;
@ -313,8 +330,9 @@ tstylesheet {
when "$type = 'identitylist'"
||
Vector<_Identity> _«$name» = new Vector<_Identity>();
for (Identity i : «$name»)
for (Identity i : «$name») {
_«$name».add(new _Identity(i));
}
||
}
}
@ -326,7 +344,7 @@ tstylesheet {
if "$dir != 'in'" choose {
when "$type = 'string' or $type = 'stringlist'"
| result.«$name» = AbstractEngine.toUTF16(_result.«$name»);
| result.«$name» = Utils.toUTF16(_result.«$name»);
when "$type = 'identity'"
| result.«$name» = Identity(«$name»);
otherwise

327
src/codegen/gen_java_Message.ysl2

@ -0,0 +1,327 @@
include yslt.yml2
tstylesheet {
include ./textutils.ysl2
include ./types_java.ysl2
template "/namespace[@name='pEp']" {
apply "struct|enum|exception", 0;
document "../java/foundation/pEp/jniadapter/exceptions/pEpException.java", "text" {
||
package foundation.pEp.jniadapter.exceptions;
public class pEpException extends RuntimeException {
public pEpException(String message) {
super(message);
}
}
||
}
document("../../build/marker/gen_java_Message.marker", "text") > ""
}
template "struct" {
const "cname" call "toJava" with "type", "@name";
document("../java/foundation/pEp/jniadapter/{$cname}.java", "text")
||
package foundation.pEp.jniadapter;
import foundation.pEp.jniadapter.interfaces.*;
import foundation.pEp.jniadapter.exceptions.*;
import java.util.ArrayList;
import java.util.Vector;
import java.util.Date;
import java.util.HashMap;
import java.io.Serializable;
public class «$cname» implements MessageInterface, AutoCloseable, Serializable {
private static final long serialVersionUID = 2119420428331150924L;
private long handle;
native long init();
native void release(long handle);
public «$cname»() {
handle = init();
}
private native long _«$cname»(
byte[] mime_text
) throws pEpException;
public «$cname»(String mime_text) {
byte[] _mime_text = Utils.toUTF8(mime_text);
handle = _«$cname»(_mime_text);
}
private native byte[] _encodeMIME() throws pEpException;
public String encodeMIME() {
return Utils.toUTF16(_encodeMIME());
}
private «$cname»(long h) {
handle = h;
}
public final void close() {
release(handle);
}
final protected long getHandle() {
return handle;
}
`` apply "enum", mode=inner
`` apply "*[name(.)!='enum']", mode=entry
}
||
document("../java/foundation/pEp/jniadapter/interfaces/{$cname}Interface.java", "text")
||
package foundation.pEp.jniadapter.interfaces;
import foundation.pEp.jniadapter.*;
import foundation.pEp.jniadapter.Message.*;
import java.util.Date;
import java.util.Vector;
import java.util.ArrayList;
public interface «$cname»Interface {
public String encodeMIME();
`` apply "*[name(.)!='enum']", mode=interface
}
||
}
template "enum" {
const "jname" call "toJava" with "type", "@name";
document("../java/foundation/pEp/jniadapter/{$jname}.java", "text")
||
// CodeGen template enum
package foundation.pEp.jniadapter;
import java.util.HashMap;
`` apply ".", 0, mode=inner
||
}
template "enum", mode=inner {
const "jname" call "CamelCase" with "text", "@name";
||
// CodeGen template enum, mode=inner
public enum «$jname» {
`` apply "*", mode=value
;
public final int value;
private static HashMap<Integer, «$jname»> intMap;
private «$jname»(int value) {
this.value = value;
}
public static «$jname» getByInt(int value){
if (intMap == null) {
intMap = new HashMap<Integer, «$jname»>();
for («$jname» s : «$jname».values()) {
intMap.put(s.value, s);
}
}
if (intMap.containsKey(value)) {
return intMap.get(value);
}
return null;
}
}
||
}
function "exception" {
param "name";
document "../java/foundation/pEp/jniadapter/exceptions/{$name}.java", "text" {
| package foundation.pEp.jniadapter.exceptions;
|
| public class «$name» extends pEpException {
| public «$name»(String message) {
| super(message);
| }
| }
}
}
template "exception" for "*[text()!=0]" call "exception"
with "name" call "CamelCase" with "text", "name(.)";
template "*", mode=entry {
const "ctype", "name(.)";
const "type" call "toJava" with "type", "name(.)";
const "itype" call "toIntermediate" with "type", "name(.)";
const "name" call "toJava" with "type", "name(*[position()=1])";
||
// CodeGen template * mode=entry
||
choose {
when "$ctype = 'identity'" {
||
// Property type: Identity. [java: «$type», intermediate: «$itype», ctype: «$ctype»]
public «$type» get«$name»() {
«$itype» res = _get«$name»();
if (res != null) {
return new «$type»(_get«$name»());
} else {
return null;
}
}
private native «$itype» _get«$name»();
public void set«$name»(«$type» value) {
if (value != null) {
_set«$name»(new «$itype»(value));
} else {
_set«$name»(null);
}
}
private native void _set«$name»(«$itype» value);
||
}
when "$ctype = 'identitylist' or $ctype = 'bloblist' or $ctype = 'stringlist' or $ctype = 'stringpairlist'" {
const "ename", "substring-after(substring($type,1,string-length($type)-1), '<')";
const "iename" choose {
when "$ctype = 'stringlist'" > byte[]
when "$ctype = 'stringpairlist'" > Pair<byte[],byte[]>
otherwise > _«$ename»
}
const "convget" choose {
when "$ctype = 'stringlist'" > Utils.toUTF16(i)
when "$ctype = 'stringpairlist'" > new Pair<String, String>(Utils.toUTF16(i.first), Utils.toUTF16(i.second))
otherwise > new «$ename»(i)
}
const "convset" choose {
when "$ctype = 'stringlist'" > Utils.toUTF8(i)
when "$ctype = 'stringpairlist'" > new Pair<byte[],byte[]>(Utils.toUTF8(i.first), Utils.toUTF8(i.second))
otherwise > new _«$ename»(i)
}
||
// Property type: list type. [java: «$type», intermediate: «$itype», ctype: «$ctype»]
public «$type» get«$name»() {
«$itype» glist = _get«$name»();
if (glist != null) {
«$type» list = new «$type»();
for («$iename» i : glist) {
list.add(«$convget»);
}
return list;
}
return null;
}
private native «$itype» _get«$name»();
public void set«$name»(«$type» value) {
if (value != null) {
«$itype» list = new «$itype»();
for («$ename» i : value) {
list.add(«$convset»);
}
_set«$name»(list);
} else {
_set«$name»(null);
}
}
private native void _set«$name»(«$itype» value);
||
}
when "$itype != $type" {
||
// Property type: differs from intermediate. [java: «$type», intermediate: «$itype», ctype: «$ctype»]
public «$type» get«$name»() {
«$itype» res = _get«$name»();
if (res != null) {
return Utils.toUTF16(res);
} else {
return null;
}
}
private native «$itype» _get«$name»();
public void set«$name»(«$type» value) {
if (value != null) {
_set«$name»(Utils.toUTF8(value));
} else {
_set«$name»(new byte[0]);
}
}
private native void _set«$name»(«$itype» value);
||
}
when "../enum[@name=$ctype]" {
||
// Property type: enum type. [java: «$type», intermediate: «$itype», ctype: «$ctype»]
public «$type» get«$name»() {
return «$type».getByInt(_get«$name»());
}
private native int _get«$name»();
public void set«$name»(«$type» value) {
if(value != null)
_set«$name»(value.value);
else
_set«$name»(0);
}
private native void _set«$name»(int value);
||
}
otherwise {
||
// Property type: no intermediate type [java: «$type», intermediate: «$itype», ctype: «$ctype»]
public «$type» get«$name»() {
return get«$name»();
}
private native «$type» _get«$name»();
public void set«$name»(«$type» value) {
_set«$name»(value);
}
private native void _set«$name»(«$type» value);
||
}
}
}
template "*", mode=interface {
const "type" call "toJava" with "type", "name(.)";
const "name" call "toJava" with "type", "name(*[position()=1])";
||
public «$type» get«$name»();
public void set«$name»(«$type» value);
||
}
template "*", mode=value {
const "name" call "toJava" with "type", "name(.)";
| «$name» («.»)`if "position()!=last()" > , `
}
}

65
src/codegen/gen_throw_pEp_exception.ysl2

@ -0,0 +1,65 @@
include yslt.yml2
tstylesheet {
include ./textutils.ysl2
template "/" {
apply "namespace", 0;
document "../cxx/throw_pEp_exception.hh", "text"
||
#pragma once
#include <jni.h>
namespace pEp {
namespace JNIAdapter {
jint throw_pEp_Exception(JNIEnv *env, PEP_STATUS status);
};
};
||
document("../../build/marker/gen_throw_pEp_exception.marker", "text") > ""
}
template "namespace"
document("../cxx/throw_pEp_exception.cc", "text")
||
#include <assert.h>
#include <pEp/pEpEngine.h>
#include "throw_pEp_exception.hh"
namespace pEp {
namespace JNIAdapter {
jint throw_pEp_Exception(JNIEnv *env, PEP_STATUS status)
{
jclass ex;
const char *ex_name;
switch (status) {
`` apply "exception/*[text()!=0]", 4, mode=case
default:
assert(0);
ex_name = "Exception";
}
ex = env->FindClass(ex_name);
assert(ex);
if (ex == NULL) {
ex = env->FindClass("java/lang/NoClassDefFoundError");
assert(ex);
}
return env->ThrowNew(ex, ex_name);
}
};
};
||
template "*", mode=case {
| case `call "UCASE" with "text", "name(.)"`:
| ex_name = "foundation/pEp/jniadapter/exceptions/`call "CamelCase" with "text", "name(.)"`";
| break;
}
}

0
src/pEp.yml2 → src/codegen/pEp.yml2

0
src/textutils.ysl2 → src/codegen/textutils.ysl2

0
src/types_c.ysl2 → src/codegen/types_c.ysl2

0
src/types_java.ysl2 → src/codegen/types_java.ysl2

0
src/basic_api.cc → src/cxx/basic_api.cc

14
src/foundation_pEp_jniadapter_AbstractEngine.cc → src/cxx/foundation_pEp_jniadapter_AbstractEngine.cc

@ -264,7 +264,7 @@ JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine_release(
Adapter::session(pEp::Adapter::release);
}
JNIEXPORT jstring JNICALL Java_foundation_pEp_jniadapter_AbstractEngine_getVersion(
JNIEXPORT jstring JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1getVersion(
JNIEnv *env,
jobject obj
)
@ -280,7 +280,7 @@ JNIEXPORT jstring JNICALL Java_foundation_pEp_jniadapter_AbstractEngine_getVersi
return env->NewStringUTF(::get_engine_version());
}
JNIEXPORT jstring JNICALL Java_foundation_pEp_jniadapter_AbstractEngine_getProtocolVersion(
JNIEXPORT jstring JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1getProtocolVersion(
JNIEnv *env,
jobject obj
)
@ -331,7 +331,7 @@ static void *keyserver_thread_routine(void *arg)
return (void *) status;
}
JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine_startKeyserverLookup(
JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1startKeyserverLookup(
JNIEnv *env,
jobject obj
)
@ -375,7 +375,7 @@ JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine_startKeyser
pthread_create(thread, nullptr, keyserver_thread_routine, (void *) queue);
}
JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine_stopKeyserverLookup(
JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1stopKeyserverLookup(
JNIEnv *env,
jobject obj
)
@ -419,7 +419,7 @@ JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine_stopKeyserv
free(thread);
}
JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine_startSync(
JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1startSync(
JNIEnv *env,
jobject obj
)
@ -441,7 +441,7 @@ JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine_startSync(
}
}
JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine_stopSync(
JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1stopSync(
JNIEnv *env,
jobject obj
)
@ -458,7 +458,7 @@ JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_AbstractEngine_stopSync(
// Adapter::shutdown();
}
JNIEXPORT jboolean JNICALL Java_foundation_pEp_jniadapter_AbstractEngine_isSyncRunning(
JNIEXPORT jboolean JNICALL Java_foundation_pEp_jniadapter_AbstractEngine__1isSyncRunning(
JNIEnv *env,
jobject obj
)

0
src/foundation_pEp_jniadapter__Blob.cc → src/cxx/foundation_pEp_jniadapter__Blob.cc

0
src/get_header.cc → src/cxx/get_header.cc

0
src/identity_api.cc → src/cxx/identity_api.cc

0
src/jniutils.cc → src/cxx/jniutils.cc

0
src/jniutils.hh → src/cxx/jniutils.hh

0
src/passphrase_callback.hh → src/cxx/passphrase_callback.hh

0
src/passphrase_callback.hxx → src/cxx/passphrase_callback.hxx

28
src/foundation/pEp/jniadapter/Engine.java.target

@ -1,28 +0,0 @@
package foundation.pEp.jniadapter;
import java.util.ArrayList;
import java.util.Vector;
final public class Engine extends AbstractEngine {
public Engine() throws pEpException { }
public native Message encrypt_message(
Message src,
ArrayList<String> extra,
Message.EncFormat enc_format
) throws pEpException;
public class DecryptResult {
public Message dst;
public Color color;
}
public native DecryptResult decrypt_message(
Message src,
ArrayList<String> keylist
) throws pEpException;
public native Color outgoing_message_color(
Message msg
) throws pEpException;
}

218
src/foundation/pEp/jniadapter/Message.java.target

@ -1,218 +0,0 @@
package foundation.pEp.jniadapter;
import java.util.ArrayList;
import java.util.Vector;
import java.util.Date;
import java.util.HashMap;
public class Message implements AutoCloseable {
private final long handle;
native long init();
native void release(long handle);
public Message() {
handle = init();
}
public final void close() {
release(handle);
}
public enum TextFormat {
Plain (0),
Html (1),
Other (255)
;
static class Management {
public static final HashMap<Integer, TextFormat> tag =
new HashMap<Integer, TextFormat>();
}
public final int value;
TextFormat(int value) {
this.value = value;
fill(value);
}
private void fill(int value) {
Management.tag.put(value, this);
}
}
public enum Direction {
Incoming (0),
Outgoing (1)
;
static class Management {
public static final HashMap<Integer, Direction> tag =
new HashMap<Integer, Direction>();
}
public final int value;
Direction(int value) {
this.value = value;
fill(value);
}
private void fill(int value) {
Management.tag.put(value, this);
}
}
public enum EncFormat {
None (0),
Pieces (1),
SMIME (2),
PGPMIME (3),
PEP (4)
;
static class Management {
public static final HashMap<Integer, EncFormat> tag =
new HashMap<Integer, EncFormat>();
}
public final int value;
EncFormat(int value) {
this.value = value;
fill(value);
}
private void fill(int value) {
Management.tag.put(value, this);
}
}
private native int _getDir();
private native void _setDir(int value);
public Direction getDir() {
return Direction.tag.get(_getDir());
}
public void setDir(Direction value) {
_setDir(value.value);
}
private native byte[] _getId();
private native void _setId(byte[] value);
public String getId() {
return AbstractEngine.toUTF16(_getId());
}
public void setId(String value) {
_setId(AbstractEngine.toUTF8(value));
}
private native byte[] _getShortmsg();
private native void _setShortmsg(byte[] value);
public String getShortmsg() {
return AbstractEngine.toUTF16(_getShortmsg());
}
public void setShortmsg(String value) {
_setShortmsg(AbstractEngine.toUTF8(value));
}
private native byte[] _getLongmsg();
private native void _setLongmsg(byte[] value);
public String getLongmsg() {
return AbstractEngine.toUTF16(_getLongmsg());
}
public void setLongmsg(String value) {
_setLongmsg(AbstractEngine.toUTF8(value));
}
private native byte[] _getLongmsgFormatted();
private native void _setLongmsgFormatted(byte[] value);
public String getLongmsgFormatted() {
return AbstractEngine.toUTF16(_getLongmsgFormatted());
}
public void setLongmsgFormatted(String value) {
_setLongmsgFormatted(AbstractEngine.toUTF8(value));
}
public native ArrayList<Blob> getAttachments();
public native void setAttachments(ArrayList<Blob> value);
public native Date getSent();
public native void setSent(Date value);
public native Date getRecv();
public native void setRecv(Date value);
private native AbstractEngine._Identity _getFrom();
private native void _setFrom(AbstractEngine._Identity value);
public Identity getFrom() {
return new _getFrom().getIdentity();
}
public void setFrom(Identity value) {
_setFrom(new AbstractEngine._Identity(value));
}
public native ArrayList<Identity> getTo();
public native void setTo(ArrayList<Identity> value);
public native Identity getRecvBy();
public native void setRecvBy(Identity value);
public native ArrayList<Identity> getCc();
public native void setCc(ArrayList<Identity> value);
public native ArrayList<Identity> getBcc();
public native void setBcc(ArrayList<Identity> value);
public native ArrayList<Identity> getReplyTo();
public native void setReplyTo(ArrayList<Identity> value);
private native ArrayList<byte[]> _getInReplyTo();
private native void _setInReplyTo(ArrayList<byte[]> value);
public ArrayList<String> getInReplyTo() {
return AbstractEngine.toUTF16(_getInReplyTo());
}
public void setInReplyTo(ArrayList<String> value) {
_setInReplyTo(AbstractEngine.toUTF8(value));
}
private native ArrayList<byte[]> _getReferences();
private native void _setReferences(ArrayList<byte[]> value);
public ArrayList<String> getReferences() {
return AbstractEngine.toUTF16(_getReferences());
}
public void setReferences(ArrayList<String> value) {
_setReferences(AbstractEngine.toUTF8(value));
}
private native ArrayList<byte[]> _getKeywords();
private native void _setKeywords(ArrayList<byte[]> value);
public ArrayList<String> getKeywords() {
return AbstractEngine.toUTF16(_getKeywords());
}
public void setKeywords(ArrayList<String> value) {
_setKeywords(AbstractEngine.toUTF8(value));
}
private native byte[] _getComments();
private native void _setComments(byte[] value);
public String getComments() {
return AbstractEngine.toUTF16(_getComments());
}
public void setComments(String value) {
_setComments(AbstractEngine.toUTF8(value));
}
private native Vector<Pair<byte[], byte[]>> _getOptFields();
private native void _setOptFields(Vector<Pair<byte[], byte[]>> value);
public Vector<Pair<String, String>> getOptFields() {
return AbstractEngine.toUTF16(_getOptFields());
}
public void setOptFields(Vector<Pair<String, String>> value) {
_setOptFields(AbstractEngine.toUTF8(value));
}
public native Message.EncFormat getEncFormat();
public native void setEncFormat(Message.EncFormat value);
}

11
src/foundation/pEp/jniadapter/UniquelyIdentifiable.java

@ -1,11 +0,0 @@
package foundation.pEp.jniadapter;
import java.util.concurrent.atomic.AtomicLong;
abstract class UniquelyIdentifiable {
static final AtomicLong NEXT_ID = new AtomicLong(1);
final long id = NEXT_ID.getAndIncrement();
public long getId() {
return id;
}
}

252
src/gen_java_Message.ysl2

@ -1,252 +0,0 @@
include yslt.yml2
tstylesheet {
include ./textutils.ysl2
include ./types_java.ysl2
template "/namespace[@name='pEp']" apply "struct|enum|exception", 0;
template "struct" {
const "cname" call "toJava" with "type", "@name";
document("foundation/pEp/jniadapter/{$cname}.java", "text")
||
package foundation.pEp.jniadapter;
import java.util.ArrayList;
import java.util.Vector;
import java.util.Date;
import java.util.HashMap;
import java.io.Serializable;
public class «$cname» implements AutoCloseable, Serializable {
private static final long serialVersionUID = 2119420428331150924L;
private long handle;
native long init();
native void release(long handle);
public «$cname»() {
handle = init();
}
private native long _«$cname»(
byte[] mime_text
) throws pEpException;
public «$cname»(String mime_text) {
byte[] _mime_text = AbstractEngine.toUTF8(mime_text);
handle = _«$cname»(_mime_text);
}
public native byte[] _encodeMIME() throws pEpException;
public String encodeMIME() {
return AbstractEngine.toUTF16(_encodeMIME());
}
private «$cname»(long h) {
handle = h;
}
public final void close() {
release(handle);
}
final protected long getHandle() {
return handle;
}
`` apply "enum", mode=inner
`` apply "*[name(.)!='enum']", mode=entry
}
||
}
template "enum|exception" {
const "jname" call "toJava" with "type", "@name";
document("foundation/pEp/jniadapter/{$jname}.java", "text")
||
package foundation.pEp.jniadapter;
import java.util.HashMap;
`` apply ".", 0, mode=inner
||
}
template "enum|exception", mode=inner {
const "jname" call "CamelCase" with "text", "@name";
||
public enum «$jname» {
`` apply "*", mode=value
;
public final int value;
private static HashMap<Integer, «$jname»> intMap;
private «$jname»(int value) {
this.value = value;
}
public static «$jname» getByInt(int value){
if (intMap == null) {
intMap = new HashMap<Integer, «$jname»>();
for («$jname» s : «$jname».values()) {
intMap.put(s.value, s);
}
}
if (intMap.containsKey(value)) {
return intMap.get(value);
}
return null;
}
}
||
}
template "*", mode=entry {
const "ctype", "name(.)";
const "type" call "toJava" with "type", "name(.)";
const "itype" call "toIntermediate" with "type", "name(.)";
const "name" call "toJava" with "type", "name(*[position()=1])";
choose {
when "$ctype = 'identity'"
||
private native «$itype» _get«$name»();
private native void _set«$name»(«$itype» value);
public «$type» get«$name»() {
«$itype» res = _get«$name»();
if(res != null){
return new «$type»(_get«$name»());
}else{
return null;
}
}
public void set«$name»(«$type» value) {
if(value != null)
_set«$name»(new «$itype»(value));
else
_set«$name»(null);
}
||
when "$ctype = 'identitylist' or $ctype = 'bloblist' or $ctype = 'stringlist' or $ctype = 'stringpairlist'"
{
const "ename", "substring-after(substring($type,1,string-length($type)-1), '<')";
const "iename" choose {
when "$ctype = 'stringlist'" > byte[]
when "$ctype = 'stringpairlist'" > Pair<byte[],byte[]>
otherwise > _«$ename»
}
const "convget" choose {
when "$ctype = 'stringlist'" > AbstractEngine.toUTF16(i)
when "$ctype = 'stringpairlist'" > new Pair<String, String>(AbstractEngine.toUTF16(i.first), AbstractEngine.toUTF16(i.second))
otherwise > new «$ename»(i)
}
const "convset" choose {
when "$ctype = 'stringlist'" > AbstractEngine.toUTF8(i)
when "$ctype = 'stringpairlist'" > new Pair<byte[],byte[]>(AbstractEngine.toUTF8(i.first), AbstractEngine.toUTF8(i.second))
otherwise > new _«$ename»(i)
}
||
private native «$itype» _get«$name»();
private native void _set«$name»(«$itype» value);
public «$type» get«$name»() {
«$itype» glist = _get«$name»();
if(glist != null){
«$type» list = new «$type»();
for («$iename» i : glist)
list.add(«$convget»);
return list;
}
return null;
}
public void set«$name»(«$type» value) {
if(value != null){
«$itype» list = new «$itype»();
for («$ename» i : value)
list.add(«$convset»);
_set«$name»(list);
}else{
_set«$name»(null);
}
}
||
}
when "$itype != $type"
||
private native «$itype» _get«$name»();
private native void _set«$name»(«$itype» value);
public «$type» get«$name»() {
«$itype» res = _get«$name»();
if(res != null)
return AbstractEngine.toUTF16(res);
else
return null;
}
public void set«$name»(«$type» value) {
if(value != null)
_set«$name»(AbstractEngine.toUTF8(value));
else
_set«$name»(new byte[0]);
}
||
when "$itype != $type"
||
private native «$itype» _get«$name»();
private native void _set«$name»(«$itype» value);
public «$type» get«$name»() {
«$itype» res = _get«$name»();
if(res != null)
return AbstractEngine.toUTF16(res);
else
return null;
}
public void set«$name»(«$type» value) {
if(value != null)
_set«$name»(AbstractEngine.toUTF8(value));
else
_set«$name»(null);
}
||
when "../enum[@name=$ctype]"
||
private native int _get«$name»();
public «$itype» get«$name»() {
return «$itype».getByInt(_get«$name»());
}
private native void _set«$name»(int value);
public void set«$name»(«$itype» value) {
if(value != null)
_set«$name»(value.value);
else
_set«$name»(0);
}
||
otherwise
||
public native «$itype» get«$name»();
public native void set«$name»(«$itype» value);
||
}
}
template "*", mode=value {
const "name" call "toJava" with "type", "name(.)";
| «$name» («.»)`if "position()!=last()" > , `
}
}

35
src/gen_java_exceptions.ysl2

@ -1,35 +0,0 @@
include yslt.yml2
tstylesheet {
include ./textutils.ysl2
template "/" {
| package foundation.pEp.jniadapter;
|
| public class pEpException extends RuntimeException {
| public pEpException(String message) {
| super(message);
| }
| }
apply "namespace/exception[@name='Status']", 0;
}
function "exception" {
param "name";
document "foundation/pEp/jniadapter/{$name}.java", "text" {
| package foundation.pEp.jniadapter;
|
| public class «$name» extends pEpException {
| public «$name»(String message) {
| super(message);
| }
| }
}
}
template "exception" for "*[text()!=0]" call "exception"
with "name" call "CamelCase" with "text", "name(.)";
}

64
src/gen_throw_pEp_exception.ysl2

@ -1,64 +0,0 @@
include yslt.yml2
tstylesheet {
include ./textutils.ysl2
template "/" {
apply "namespace", 0;
document "throw_pEp_exception.hh", "text"
||
#pragma once
#include <jni.h>
namespace pEp {
namespace JNIAdapter {
jint throw_pEp_Exception(JNIEnv *env, PEP_STATUS status);
};
};
||
}
template "namespace"
||
#include <assert.h>
#include <pEp/pEpEngine.h>
#include "throw_pEp_exception.hh"
namespace pEp {
namespace JNIAdapter {
jint throw_pEp_Exception(JNIEnv *env, PEP_STATUS status)
{
jclass ex;
const char *ex_name;
switch (status) {
`` apply "exception/*[text()!=0]", 4, mode=case
default:
assert(0);
ex_name = "Exception";
}
ex = env->FindClass(ex_name);
assert(ex);
if (ex == NULL) {
ex = env->FindClass("java/lang/NoClassDefFoundError");
assert(ex);
}
return env->ThrowNew(ex, ex_name);
}
};
};
||
template "*", mode=case {
| case `call "UCASE" with "text", "name(.)"`:
| ex_name = "foundation/pEp/jniadapter/`call "CamelCase" with "text", "name(.)"`";
| break;
}
}

145
src/foundation/pEp/jniadapter/AbstractEngine.java → src/java/foundation/pEp/jniadapter/AbstractEngine.java

@ -4,11 +4,11 @@ import java.util.ArrayList;
import java.util.Vector;
import foundation.pEp.jniadapter.Sync.DefaultCallback;
import foundation.pEp.jniadapter.interfaces.*;
import foundation.pEp.jniadapter.exceptions.*;
import java.io.UnsupportedEncodingException;
import java.text.Normalizer;
abstract class AbstractEngine extends UniquelyIdentifiable implements AutoCloseable {
abstract class AbstractEngine extends UniquelyIdentifiable implements AbstractEngineInterface {
static {
System.loadLibrary("pEpJNI");
}
@ -23,6 +23,9 @@ abstract class AbstractEngine extends UniquelyIdentifiable implements AutoClosea
private native void init();
private native void release();
private long keyserverThread;
private long keyserverQueue;
public AbstractEngine() throws pEpException {
synchronized (AbstractEngine.class) {
init();
@ -35,124 +38,52 @@ abstract class AbstractEngine extends UniquelyIdentifiable implements AutoClosea
}
}
public native String getVersion();
public native String getProtocolVersion();
private long keyserverThread;
private long keyserverQueue;
public native void startKeyserverLookup();
public native void stopKeyserverLookup();
public native void startSync();
public native void stopSync();
public native boolean isSyncRunning();
public static byte[] toUTF8(String str) {
if (str == null)
return null;
try {
String _str = Normalizer.normalize(str, Normalizer.Form.NFC);
byte _buf[] = _str.getBytes("UTF-8");
byte _cpy[] = new byte[_buf.length];
System.arraycopy(_buf,0,_cpy,0,_buf.length);
return _cpy;
}
catch (UnsupportedEncodingException e) {
assert false;
return new byte[0];
}
public String getVersion() {
return _getVersion();
}
public static Vector<byte[]> toUTF8(Vector<String> list) {
if (list == null)
return null;
private native String _getVersion();
Vector<byte[]> result = new Vector<byte[]>(list.size());
for (int i=0; i<list.size(); i++)
result.add(toUTF8(list.get(i)));
return result;
public String getProtocolVersion() {
return _getProtocolVersion();
}
public static Pair<byte[], byte[]> toUTF8(Pair<String, String> pair) {
if (pair == null)
return null;
Pair<byte[], byte[]> result = new Pair<byte[], byte[]>();
private native String _getProtocolVersion();
result.first = toUTF8(pair.first);
result.second = toUTF8(pair.second);
return result;
public void startKeyserverLookup() {
_startKeyserverLookup();
}
public static ArrayList<Pair<byte[], byte[]>> toUTF8(ArrayList<Pair<String, String>> list) {
if (list == null)
return null;
ArrayList<Pair<byte[], byte[]>> result = new ArrayList<Pair<byte[], byte[]>>(list.size());
private native void _startKeyserverLookup();
for (int i=0; i<list.size(); i++)
result.set(i, toUTF8(list.get(i)));
return result;
public void stopKeyserverLookup() {
_startKeyserverLookup();
}
public static String toUTF16(byte[] utf8) {
if (utf8 == null)
return null;
private native void _stopKeyserverLookup();
try {
byte newUtf8[] = new byte[utf8.length];
System.arraycopy(utf8,0,newUtf8,0,utf8.length);
return new String(newUtf8, "UTF-8");
}
catch (UnsupportedEncodingException e) {
assert false;
return new String();
}
public void startSync() {
_startSync();
}
public static Vector<String> toUTF16(Vector<byte[]> list) {
if (list == null)
return null;
Vector<String> result = new Vector<String>(list.size());
private native void _startSync();
for (int i=0; i<list.size(); i++)
result.add(toUTF16(list.get(i)));
return result;
public void stopSync() {
_stopSync();
}
public static Pair<String, String> toUTF16(Pair<byte[], byte[]> pair) {
if (pair == null)
return null;
Pair<String, String> result = new Pair<String,String>();
result.first = toUTF16(pair.first);
result.second = toUTF16(pair.second);
private native void _stopSync();
return result;
public boolean isSyncRunning() {
return _isSyncRunning();
}
public static ArrayList<Pair<String, String>> toUTF16(ArrayList<Pair<byte[], byte[]>> list) {
if (list == null)
return null;
ArrayList<Pair<String, String>> result = new ArrayList<Pair<String, String>>(list.size());
for (int i=0; i<list.size(); i++)
result.set(i, toUTF16(list.get(i)));
return result;
}
private native boolean _isSyncRunning();
// Callbacks
public void setMessageToSendCallback(Sync.MessageToSendCallback messageToSendCallback) {
this.messageToSendCallback = messageToSendCallback;
}
@ -171,7 +102,7 @@ abstract class AbstractEngine extends UniquelyIdentifiable implements AutoClosea
this.passphraseRequiredCallback = passphraseRequiredCallback;
}
public int needsFastPollCallFromC(boolean fast_poll_needed) {
private int needsFastPollCallFromC(boolean fast_poll_needed) {
if (needsFastPollCallback != null) {
needsFastPollCallback.needsFastPollCallFromC(fast_poll_needed);
} else {
@ -180,7 +111,7 @@ abstract class AbstractEngine extends UniquelyIdentifiable implements AutoClosea
return 0;
}
public int notifyHandshakeCallFromC(_Identity _myself, _Identity _partner, SyncHandshakeSignal _signal) {
private int notifyHandshakeCallFromC(_Identity _myself, _Identity _partner, SyncHandshakeSignal _signal) {
Identity myself = new Identity(_myself);
Identity partner = (_partner != null) ? new Identity(_partner) : null;
@ -193,7 +124,7 @@ abstract class AbstractEngine extends UniquelyIdentifiable implements AutoClosea
return 0;
}
public byte[] passphraseRequiredFromC(final PassphraseType passphraseType) {
private byte[] passphraseRequiredFromC(final PassphraseType passphraseType) {
String ret = "";
if (passphraseRequiredCallback != null) {
System.out.println("calling passphraseRequiredCallback on engine ObjID:" + getId());
@ -206,10 +137,10 @@ abstract class AbstractEngine extends UniquelyIdentifiable implements AutoClosea
// this repeats MaxRetries times (currentluy hardcoded to 3)
// Then the orig call will return with the PEP_STATUS (most likely PEP_PASSPHRASE_REQUIRED)
}
return toUTF8(ret);
return Utils.toUTF8(ret);
}
public int messageToSendCallFromC (Message message) {
private int messageToSendCallFromC (Message message) {
System.out.println("pEpSync" + "messageToSendCallFromC: " + messageToSendCallback );
if (messageToSendCallback != null) {
messageToSendCallback.messageToSend(message);
@ -228,11 +159,11 @@ abstract class AbstractEngine extends UniquelyIdentifiable implements AutoClosea
ArrayList<Pair<String, String>> opts = new ArrayList<>();
Pair<String, String> xpEp = new Pair<>();
xpEp.first = "X-pEp-Version";
xpEp.second = this.getProtocolVersion();;
xpEp.second = this.getProtocolVersion();
opts.add(xpEp);
msg.setOptFields(opts);
if(encFormat == Message.EncFormat.PEP) {
if (encFormat == Message.EncFormat.PEP) {
// For EncFormat.PEP
// The pgpText goes into the attachment index 1
msg.setShortmsg("p≡p");
@ -253,14 +184,12 @@ abstract class AbstractEngine extends UniquelyIdentifiable implements AutoClosea
attachments.add(att0);
attachments.add(att1);
msg.setAttachments(attachments);
}
else if (encFormat == Message.EncFormat.PEPEncInlineEA) {
} else if (encFormat == Message.EncFormat.PEPEncInlineEA) {
// For EncFormat.PEPEncInlineEA
// The pgpText goes into the longMessage
msg.setShortmsg("");
msg.setLongmsg(pgpText);
}
else {
} else {
throw new pEpCannotEncode("Message.Encformat not supported: " + encFormat.toString());
}

20
src/foundation/pEp/jniadapter/Blob.java → src/java/foundation/pEp/jniadapter/Blob.java

@ -1,8 +1,9 @@
package foundation.pEp.jniadapter;
import foundation.pEp.jniadapter.interfaces.*;
import java.io.Serializable;
public class Blob implements Serializable {
public class Blob implements BlobInterface, Serializable {
public byte[] data;
public String mime_type;
public String filename;
@ -11,10 +12,18 @@ public class Blob implements Serializable {
mime_type = "application/octet-stream";
}
/** Human readable string representation of Blob.
Blob(_Blob b) {
data = b.data;
mime_type = Utils.toUTF16(b.mime_type);
filename = Utils.toUTF16(b.filename);
}
/**
* 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() {
@ -22,15 +31,10 @@ public class Blob implements Serializable {
String ret = "";
ret += "mime_type: \"" + mime_type + "\"\n";
ret += "filename: \"" + filename + "\"\n";
ret += "data plain: \"" + AbstractEngine.toUTF16(data) + "\"\n";
ret += "data plain: \"" + Utils.toUTF16(data) + "\"\n";
ret += "data decoded: \"" + _b.dataToXER() + "\"\n";
return ret;
}
Blob(_Blob b) {
data = b.data;
mime_type = AbstractEngine.toUTF16(b.mime_type);
filename = AbstractEngine.toUTF16(b.filename);
}
}

0
src/foundation/pEp/jniadapter/CommType.java → src/java/foundation/pEp/jniadapter/CommType.java

26
src/foundation/pEp/jniadapter/Identity.java → src/java/foundation/pEp/jniadapter/Identity.java

@ -1,8 +1,9 @@
package foundation.pEp.jniadapter;
import foundation.pEp.jniadapter.interfaces.*;
import java.io.Serializable;
public class Identity implements Serializable{
public class Identity implements IdentityInterface, Serializable {
public String address;
public String fpr;
public String user_id;
@ -23,27 +24,26 @@ public class Identity implements Serializable{
}
public Identity(_Identity i) {
address = AbstractEngine.toUTF16(i.address);
fpr = AbstractEngine.toUTF16(i.fpr);
user_id = AbstractEngine.toUTF16(i.user_id);
username = AbstractEngine.toUTF16(i.username);
address = Utils.toUTF16(i.address);
fpr = Utils.toUTF16(i.fpr);
user_id = Utils.toUTF16(i.user_id);
username = Utils.toUTF16(i.username);
comm_type = CommType.Management.tag.get(i.comm_type);
lang = AbstractEngine.toUTF16(i.lang);
lang = Utils.toUTF16(i.lang);
me = i.me;
flags = i.flags;
}
@Override
public String toString() {
return address + "::" + username + "\n" +
user_id + "::" + fpr;
public Rating getRating() {
return Rating.getByInt(_getRating(comm_type.value));
}
// Native
private native int _getRating(int commType);
public Rating getRating() {
return Rating.getByInt(_getRating(comm_type.value));
@Override
public String toString() {
return address + "::" + username + "\n" +
user_id + "::" + fpr;
}
}

0
src/foundation/pEp/jniadapter/Pair.java → src/java/foundation/pEp/jniadapter/Pair.java

11
src/foundation/pEp/jniadapter/Sync.java → src/java/foundation/pEp/jniadapter/Sync.java

@ -1,12 +1,8 @@
package foundation.pEp.jniadapter;
import foundation.pEp.jniadapter.Identity;
import foundation.pEp.jniadapter.Message;
import foundation.pEp.jniadapter.pEpException;
public interface Sync {
interface NeedsFastPollCallback {
void needsFastPollCallFromC(Boolean fast_poll_needed);
}
@ -23,8 +19,7 @@ public interface Sync {
String passphraseRequired(final PassphraseType pEpStatus);
}
public class DefaultCallback
implements Sync.MessageToSendCallback, Sync.NotifyHandshakeCallback, Sync.NeedsFastPollCallback {
public class DefaultCallback implements Sync.MessageToSendCallback, Sync.NotifyHandshakeCallback, Sync.NeedsFastPollCallback {
@Override
public void needsFastPollCallFromC(Boolean fast_poll_needed) {
System.out.println("Need fast Poll");
@ -34,7 +29,7 @@ public interface Sync {
public void messageToSend(Message message) {
System.out.println("messageToSend Defualt Callback");
}
@Override
public void notifyHandshake(Identity myself, Identity partner, SyncHandshakeSignal signal) {
System.out.println("notifyHandshake Default Callback");

12
src/java/foundation/pEp/jniadapter/UniquelyIdentifiable.java

@ -0,0 +1,12 @@
package foundation.pEp.jniadapter;
import java.util.concurrent.atomic.AtomicLong;
// Abstract here so you can only inherit from, but not instantiate
abstract public class UniquelyIdentifiable {
private static final AtomicLong NEXT_ID = new AtomicLong(1);
private final long id = NEXT_ID.getAndIncrement();
protected long getId() {
return id;
}
}

115
src/java/foundation/pEp/jniadapter/Utils.java

@ -0,0 +1,115 @@
package foundation.pEp.jniadapter;
import java.io.UnsupportedEncodingException;
import java.text.Normalizer;
import java.util.ArrayList;
import java.util.Vector;
public class Utils {
private Utils() { }
public static byte[] toUTF8(String str) {
if (str == null)
return null;
try {
String _str = Normalizer.normalize(str, Normalizer.Form.NFC);
byte _buf[] = _str.getBytes("UTF-8");
byte _cpy[] = new byte[_buf.length];
System.arraycopy(_buf,0,_cpy,0,_buf.length);
return _cpy;
}
catch (UnsupportedEncodingException e) {
assert false;
return new byte[0];
}
}
public static Vector<byte[]> toUTF8(Vector<String> list) {
if (list == null)
return null;
Vector<byte[]> result = new Vector<byte[]>(list.size());
for (int i=0; i<list.size(); i++)
result.add(toUTF8(list.get(i)));
return result;
}
public static Pair<byte[], byte[]> toUTF8(Pair<String, String> pair) {
if (pair == null)
return null;
Pair<byte[], byte[]> result = new Pair<byte[], byte[]>();
result.first = toUTF8(pair.first);
result.second = toUTF8(pair.second);
return result;
}
public static ArrayList<Pair<byte[], byte[]>> toUTF8(ArrayList<Pair<String, String>> list) {
if (list == null)
return null;
ArrayList<Pair<byte[], byte[]>> result = new ArrayList<Pair<byte[], byte[]>>(list.size());
for (int i=0; i<list.size(); i++)
result.set(i, toUTF8(list.get(i)));
return result;
}
public static String toUTF16(byte[] utf8) {
if (utf8 == null)
return null;
try {
byte newUtf8[] = new byte[utf8.length];
System.arraycopy(utf8,0,newUtf8,0,utf8.length);
return new String(newUtf8, "UTF-8");
}
catch (UnsupportedEncodingException e) {
assert false;
return new String();
}
}
public static Vector<String> toUTF16(Vector<byte[]> list) {
if (list == null)
return null;
Vector<String> result = new Vector<String>(list.size());
for (int i=0; i<list.size(); i++)
result.add(toUTF16(list.get(i)));
return result;
}
public static Pair<String, String> toUTF16(Pair<byte[], byte[]> pair) {
if (pair == null)
return null;
Pair<String, String> result = new Pair<String,String>();
result.first = toUTF16(pair.first);
result.second = toUTF16(pair.second);
return result;
}
public static ArrayList<Pair<String, String>> toUTF16(ArrayList<Pair<byte[], byte[]>> list) {
if (list == null)
return null;
ArrayList<Pair<String, String>> result = new ArrayList<Pair<String, String>>(list.size());
for (int i=0; i<list.size(); i++)
result.set(i, toUTF16(list.get(i)));
return result;
}
}

8
src/foundation/pEp/jniadapter/_Blob.java → src/java/foundation/pEp/jniadapter/_Blob.java

@ -1,5 +1,7 @@
package foundation.pEp.jniadapter;
import foundation.pEp.jniadapter.exceptions.*;
public class _Blob {
public byte[] data;
public byte[] mime_type;
@ -9,13 +11,13 @@ public class _Blob {
private native byte[] _dataToXER() throws pEpException;;
public String dataToXER() {
return AbstractEngine.toUTF16(_dataToXER());
return Utils.toUTF16(_dataToXER());
}
_Blob(Blob b) {
data = b.data;
mime_type = AbstractEngine.toUTF8(b.mime_type);
filename = AbstractEngine.toUTF8(b.filename);
mime_type = Utils.toUTF8(b.mime_type);
filename = Utils.toUTF8(b.filename);
}
}

10
src/foundation/pEp/jniadapter/_Identity.java → src/java/foundation/pEp/jniadapter/_Identity.java

@ -19,12 +19,12 @@ public class _Identity {
}
public _Identity(Identity i) {
address = AbstractEngine.toUTF8(i.address);
fpr = AbstractEngine.toUTF8(i.fpr);
user_id = AbstractEngine.toUTF8(i.user_id);
username = AbstractEngine.toUTF8(i.username);
address = Utils.toUTF8(i.address);
fpr = Utils.toUTF8(i.fpr);
user_id = Utils.toUTF8(i.user_id);
username = Utils.toUTF8(i.username);
comm_type = i.comm_type.value;
lang = AbstractEngine.toUTF8(i.lang);
lang = Utils.toUTF8(i.lang);
me = i.me;
flags = i.flags;
}

7
src/java/foundation/pEp/jniadapter/decrypt_message_Return.java

@ -0,0 +1,7 @@
package foundation.pEp.jniadapter;
public class decrypt_message_Return {
public Message dst;
public Rating rating;
public int flags;
}

30
src/java/foundation/pEp/jniadapter/interfaces/AbstractEngineInterface.java

@ -0,0 +1,30 @@
package foundation.pEp.jniadapter.interfaces;
import foundation.pEp.jniadapter.Message;
import foundation.pEp.jniadapter.Sync;
public interface AbstractEngineInterface extends AutoCloseable {
public String getVersion();
public String getProtocolVersion();
public void startKeyserverLookup();
public void stopKeyserverLookup();
public void startSync();
public void stopSync();
public boolean isSyncRunning();
public void setMessageToSendCallback(Sync.MessageToSendCallback messageToSendCallback);
public void setNotifyHandshakeCallback(Sync.NotifyHandshakeCallback notifyHandshakeCallback);
public void setNeedsFastPollCallback(Sync.NeedsFastPollCallback needsFastPollCallback);
public void setPassphraseRequiredCallback(Sync.PassphraseRequiredCallback passphraseRequiredCallback);
public Message incomingMessageFromPGPText(String pgpText, Message.EncFormat encFormat);
}

5
src/java/foundation/pEp/jniadapter/interfaces/BlobInterface.java

@ -0,0 +1,5 @@
package foundation.pEp.jniadapter.interfaces;
public interface BlobInterface {
}

7
src/java/foundation/pEp/jniadapter/interfaces/IdentityInterface.java

@ -0,0 +1,7 @@
package foundation.pEp.jniadapter.interfaces;
import foundation.pEp.jniadapter.Rating;
public interface IdentityInterface {
public Rating getRating();
}

6
test/java/foundation/pEp/jniadapter/test/Makefile.conf

@ -1,6 +1,7 @@
JAVA_PKG_BASENAME=foundation.pEp.jniadapter.test
JAVA_PKG_BASEPATH=foundation/pEp/jniadapter/test
REPOROOT=../..
DIST_DIR=$(REPOROOT)/dist
JAVA_CWD=../../../../../
JAVA_RESOURCES_DIR=../resources
@ -14,9 +15,10 @@ PEP_HOME_DIR_BOB=$(JAVA_CWD)$(JAVA_PEP_HOME_DIR_BOB)
PEP_HOME_DIR_CAROL=$(JAVA_CWD)$(JAVA_PEP_HOME_DIR_CAROL)
PEP_HOME_DIR=$(PEP_HOME_DIR_ALICE)
CLASSPATH=.:$(REPOROOT)/src
CLASSPATH=.:$(DIST_DIR)/pEp.jar
LD_LIB_PATH=.:$(DIST_DIR)
JAVA=java -enableassertions -Xcheck:jni -cp $(CLASSPATH) -Djava.library.path=$(CLASSPATH)
JAVA=java -enableassertions -Xcheck:jni -cp $(CLASSPATH) -Djava.library.path=$(LD_LIB_PATH)
PITYTEST_DIR=../../../pitytest

7
test/java/foundation/pEp/jniadapter/test/basic/TestMain.java

@ -1,9 +1,6 @@
package foundation.pEp.jniadapter.test.basic;
import foundation.pEp.jniadapter.Blob;
import foundation.pEp.jniadapter.Engine;
import foundation.pEp.jniadapter.Identity;
import foundation.pEp.jniadapter.Message;
import foundation.pEp.jniadapter.*;
import foundation.pEp.pitytest.TestSuite;
import foundation.pEp.pitytest.TestUnit;
import foundation.pEp.jniadapter.test.utils.AdapterBaseTestContext;
@ -15,7 +12,7 @@ import static foundation.pEp.pitytest.TestLogger.log;
class BasicTestContext extends AdapterBaseTestContext {
Message enc;
Engine.decrypt_message_Return result;
decrypt_message_Return result;
public BasicTestContext() {
setTestContextName("BasicTestContext");

1
test/java/foundation/pEp/jniadapter/test/jni111/TestAlice.java

@ -4,6 +4,7 @@ import static foundation.pEp.pitytest.TestLogger.*;
import static foundation.pEp.pitytest.utils.TestUtils.readKey;
import foundation.pEp.jniadapter.*;
import foundation.pEp.jniadapter.exceptions.*;
import foundation.pEp.pitytest.*;
import foundation.pEp.pitytest.utils.TestUtils;
import foundation.pEp.jniadapter.test.utils.*;

1
test/java/foundation/pEp/jniadapter/test/jni114/TestAlice.java

@ -5,6 +5,7 @@ import static foundation.pEp.pitytest.utils.TestUtils.readKey;
import static foundation.pEp.pitytest.utils.TestUtils.sleep;
import foundation.pEp.jniadapter.*;
import foundation.pEp.jniadapter.exceptions.*;
import foundation.pEp.pitytest.*;
import foundation.pEp.pitytest.utils.TestUtils;
import foundation.pEp.jniadapter.test.utils.*;

2
test/java/foundation/pEp/jniadapter/test/jni88/TestMain.java

@ -1,5 +1,7 @@
package foundation.pEp.jniadapter.test.jni88;
import foundation.pEp.jniadapter.*;
import foundation.pEp.jniadapter.exceptions.*;
import java.util.Vector;
import java.lang.Thread;

1
test/java/foundation/pEp/jniadapter/test/jni91/TestMain.java

@ -1,5 +1,6 @@
package foundation.pEp.jniadapter.test.jni91;
import foundation.pEp.jniadapter.*;
import foundation.pEp.jniadapter.exceptions.*;
import java.lang.Thread;

5
test/java/foundation/pEp/jniadapter/test/jni92/TestMain.java

@ -1,4 +1,5 @@
package foundation.pEp.jniadapter.test.jni92;
import foundation.pEp.jniadapter.exceptions.*;
import foundation.pEp.jniadapter.test.utils.*;
import foundation.pEp.pitytest.*;
import foundation.pEp.jniadapter.*;
@ -38,7 +39,7 @@ class TestMain {
Engine e;
TestLogger.logH2("Creating new Engine");
e = new Engine();
TestLogger.log("Engine created with java object ID: " + e.getId());
// TestLogger.log("Engine created with java object ID: " + e.getId());
return e;
}
@ -52,7 +53,7 @@ class TestMain {
public static void engineConsumer(Vector<Engine> ev, Consumer<Engine> ec) {
ev.forEach(e -> {
TestLogger.logH2("engineConsumer: on engine java object ID: " + e.getId());
// TestLogger.logH2("engineConsumer: on engine java object ID: " + e.getId());
ec.accept(e);
});
}

6
test/java/foundation/pEp/jniadapter/test/jni98/TestMain.java

@ -1,6 +1,6 @@
package foundation.pEp.jniadapter.test.jni98;
import foundation.pEp.jniadapter.Engine;
import foundation.pEp.jniadapter.*;
import foundation.pEp.jniadapter.Message;
import foundation.pEp.pitytest.TestUnit;
import foundation.pEp.jniadapter.test.utils.AdapterBaseTestContext;
@ -34,7 +34,7 @@ class TestMain {
log("\n" + msgToString(msg1, false));
// Lets get the pgpText of the msg1, and the EncFormat
String pgpText = Engine.toUTF16(msg1.getAttachments().elementAt(1).data);
String pgpText = Utils.toUTF16(msg1.getAttachments().elementAt(1).data);
Message.EncFormat ef = msg1.getEncFormat();
//TODO: setting encformat to 4 (PEP) but getting back 3 (PGPMIME)
@ -44,7 +44,7 @@ class TestMain {
log("\n" + msgToString(msg2, false));
logH2("Verify msg2");
Engine.decrypt_message_Return result = null;
decrypt_message_Return result = null;
result = ctx.engine.decrypt_message(msg2, ctx.vStr, 0);
log("\n" + msgToString(result.dst, false));
}).run();

4
test/java/foundation/pEp/jniadapter/test/templateAliceBob/TestAlice.java

@ -2,7 +2,7 @@ package foundation.pEp.jniadapter.test.templateAliceBob;
import static foundation.pEp.pitytest.TestLogger.*;
import foundation.pEp.jniadapter.Engine;
import foundation.pEp.jniadapter.*;
import foundation.pEp.jniadapter.Message;
import foundation.pEp.jniadapter.test.utils.transport.fsmqmanager.FsMQMessage;
import foundation.pEp.pitytest.*;
@ -59,7 +59,7 @@ class TestAlice {
Message msgRx = Utils.deserializepEpMessage(ctx, msgRxSerialized, Message.EncFormat.PEPEncInlineEA);
log("ENCRYPTED IN: \n" + AdapterTestUtils.msgToString(msgRx, false));
Engine.decrypt_message_Return result = ctx.engine.decrypt_message(msgRx, null, 0);
decrypt_message_Return result = ctx.engine.decrypt_message(msgRx, null, 0);
log("DECRYPTED msg: \n" + AdapterTestUtils.msgToString(result.dst, false));
log("DECRYPTED rating:" + result.rating.toString());
log("DECRYPTED flags:" + result.flags);

4
test/java/foundation/pEp/jniadapter/test/templateAliceBob/TestBob.java

@ -2,7 +2,7 @@ package foundation.pEp.jniadapter.test.templateAliceBob;
import static foundation.pEp.pitytest.TestLogger.*;
import foundation.pEp.jniadapter.Engine;
import foundation.pEp.jniadapter.*;
import foundation.pEp.jniadapter.Message;
import foundation.pEp.jniadapter.test.utils.transport.fsmqmanager.FsMQMessage;
import foundation.pEp.pitytest.*;
@ -39,7 +39,7 @@ class TestBob {
Message msgRx = Utils.deserializepEpMessage(ctx, msgRxSerialized, Message.EncFormat.PEPEncInlineEA);
log("ENCRYPTED IN: \n" + AdapterTestUtils.msgToString(msgRx, false));
Engine.decrypt_message_Return result = ctx.engine.decrypt_message(msgRx, null, 0);
decrypt_message_Return result = ctx.engine.decrypt_message(msgRx, null, 0);
log("DECRYPTED msg: \n" + AdapterTestUtils.msgToString(result.dst, false));
log("DECRYPTED rating:" + result.rating.toString());
log("DECRYPTED flags:" + result.flags);

Loading…
Cancel
Save