diff --git a/.hgignore b/.hgignore index e81e918..dbbd3a4 100644 --- a/.hgignore +++ b/.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/ diff --git a/Makefile b/Makefile index 45acece..4acf87e 100644 --- a/Makefile +++ b/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 + diff --git a/Makefile.conf b/Makefile.conf index e9f2627..2166eac 100644 --- a/Makefile.conf +++ b/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 /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) diff --git a/android/build.gradle b/android/build.gradle index f058512..c5f0960 100644 --- a/android/build.gradle +++ b/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) { diff --git a/android/jni/Android.mk b/android/jni/Android.mk index 24a635b..abc0209 100644 --- a/android/jni/Android.mk +++ b/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 diff --git a/android/src/foundation/pEp/jniadapter/AndroidHelper.java b/android/src/foundation/pEp/jniadapter/AndroidHelper.java index f9e71b8..eaa52b0 100644 --- a/android/src/foundation/pEp/jniadapter/AndroidHelper.java +++ b/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"); diff --git a/local.conf.example b/local.conf.example index 8de0aa8..310de4b 100644 --- a/local.conf.example +++ b/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 diff --git a/src/Makefile b/src/Makefile index e1a412b..325fee2 100644 --- a/src/Makefile +++ b/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 diff --git a/src/codegen/Makefile b/src/codegen/Makefile new file mode 100644 index 0000000..556aae4 --- /dev/null +++ b/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 + diff --git a/src/gen_cpp_Engine.ysl2 b/src/codegen/gen_cpp_Engine.ysl2 similarity index 95% rename from src/gen_cpp_Engine.ysl2 rename to src/codegen/gen_cpp_Engine.ysl2 index 466e0db..50a4d0f 100644 --- a/src/gen_cpp_Engine.ysl2 +++ b/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 #include @@ -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 { diff --git a/src/gen_cpp_Message.ysl2 b/src/codegen/gen_cpp_Message.ysl2 similarity index 96% rename from src/gen_cpp_Message.ysl2 rename to src/codegen/gen_cpp_Message.ysl2 index a5f4496..10672ef 100644 --- a/src/gen_cpp_Message.ysl2 +++ b/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 #include diff --git a/src/gen_java_Engine.ysl2 b/src/codegen/gen_java_Engine.ysl2 similarity index 71% rename from src/gen_java_Engine.ysl2 rename to src/codegen/gen_java_Engine.ysl2 index b3b07c3..10efac1 100644 --- a/src/gen_java_Engine.ysl2 +++ b/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 ret = new Vector(); - if(glist != null) { - for (_Identity i : glist) { - ret.add(new Identity(i)); - } + Vector<_Identity> glist = _«@name»(`apply "parm/*", mode=basic_parm_name`); + Vector ret = new Vector(); + 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> glist = _«@name»(`apply "parm[in]", mode=call;`); if(glist != null){ ArrayList> list = new ArrayList>(); - for (Pair i : glist) - list.add(new Pair(AbstractEngine.toUTF16(i.first), AbstractEngine.toUTF16(i.second))); + for (Pair i : glist) { + list.add(new Pair(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 list = new Vector(); - 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 diff --git a/src/codegen/gen_java_Message.ysl2 b/src/codegen/gen_java_Message.ysl2 new file mode 100644 index 0000000..7007f6f --- /dev/null +++ b/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 intMap; + + private «$jname»(int value) { + this.value = value; + } + + public static «$jname» getByInt(int value){ + if (intMap == null) { + intMap = new HashMap(); + 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 + otherwise > _«$ename» + } + const "convget" choose { + when "$ctype = 'stringlist'" > Utils.toUTF16(i) + when "$ctype = 'stringpairlist'" > new Pair(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(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()" > , ` + } +} + diff --git a/src/codegen/gen_throw_pEp_exception.ysl2 b/src/codegen/gen_throw_pEp_exception.ysl2 new file mode 100644 index 0000000..42d99ec --- /dev/null +++ b/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 + + 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 + #include + #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; + } +} + diff --git a/src/pEp.yml2 b/src/codegen/pEp.yml2 similarity index 100% rename from src/pEp.yml2 rename to src/codegen/pEp.yml2 diff --git a/src/textutils.ysl2 b/src/codegen/textutils.ysl2 similarity index 100% rename from src/textutils.ysl2 rename to src/codegen/textutils.ysl2 diff --git a/src/types_c.ysl2 b/src/codegen/types_c.ysl2 similarity index 100% rename from src/types_c.ysl2 rename to src/codegen/types_c.ysl2 diff --git a/src/types_java.ysl2 b/src/codegen/types_java.ysl2 similarity index 100% rename from src/types_java.ysl2 rename to src/codegen/types_java.ysl2 diff --git a/src/basic_api.cc b/src/cxx/basic_api.cc similarity index 100% rename from src/basic_api.cc rename to src/cxx/basic_api.cc diff --git a/src/foundation_pEp_jniadapter_AbstractEngine.cc b/src/cxx/foundation_pEp_jniadapter_AbstractEngine.cc similarity index 98% rename from src/foundation_pEp_jniadapter_AbstractEngine.cc rename to src/cxx/foundation_pEp_jniadapter_AbstractEngine.cc index 624b233..bdbf80e 100644 --- a/src/foundation_pEp_jniadapter_AbstractEngine.cc +++ b/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 ) diff --git a/src/foundation_pEp_jniadapter__Blob.cc b/src/cxx/foundation_pEp_jniadapter__Blob.cc similarity index 100% rename from src/foundation_pEp_jniadapter__Blob.cc rename to src/cxx/foundation_pEp_jniadapter__Blob.cc diff --git a/src/get_header.cc b/src/cxx/get_header.cc similarity index 100% rename from src/get_header.cc rename to src/cxx/get_header.cc diff --git a/src/identity_api.cc b/src/cxx/identity_api.cc similarity index 100% rename from src/identity_api.cc rename to src/cxx/identity_api.cc diff --git a/src/jniutils.cc b/src/cxx/jniutils.cc similarity index 100% rename from src/jniutils.cc rename to src/cxx/jniutils.cc diff --git a/src/jniutils.hh b/src/cxx/jniutils.hh similarity index 100% rename from src/jniutils.hh rename to src/cxx/jniutils.hh diff --git a/src/passphrase_callback.hh b/src/cxx/passphrase_callback.hh similarity index 100% rename from src/passphrase_callback.hh rename to src/cxx/passphrase_callback.hh diff --git a/src/passphrase_callback.hxx b/src/cxx/passphrase_callback.hxx similarity index 100% rename from src/passphrase_callback.hxx rename to src/cxx/passphrase_callback.hxx diff --git a/src/foundation/pEp/jniadapter/Engine.java.target b/src/foundation/pEp/jniadapter/Engine.java.target deleted file mode 100644 index 7708586..0000000 --- a/src/foundation/pEp/jniadapter/Engine.java.target +++ /dev/null @@ -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 extra, - Message.EncFormat enc_format - ) throws pEpException; - - public class DecryptResult { - public Message dst; - public Color color; - } - - public native DecryptResult decrypt_message( - Message src, - ArrayList keylist - ) throws pEpException; - - public native Color outgoing_message_color( - Message msg - ) throws pEpException; -} diff --git a/src/foundation/pEp/jniadapter/Message.java.target b/src/foundation/pEp/jniadapter/Message.java.target deleted file mode 100644 index 6cdc3e6..0000000 --- a/src/foundation/pEp/jniadapter/Message.java.target +++ /dev/null @@ -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 tag = - new HashMap(); - } - - 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 tag = - new HashMap(); - } - - 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 tag = - new HashMap(); - } - - 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 getAttachments(); - public native void setAttachments(ArrayList 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 getTo(); - public native void setTo(ArrayList value); - - public native Identity getRecvBy(); - public native void setRecvBy(Identity value); - - public native ArrayList getCc(); - public native void setCc(ArrayList value); - - public native ArrayList getBcc(); - public native void setBcc(ArrayList value); - - public native ArrayList getReplyTo(); - public native void setReplyTo(ArrayList value); - - private native ArrayList _getInReplyTo(); - private native void _setInReplyTo(ArrayList value); - public ArrayList getInReplyTo() { - return AbstractEngine.toUTF16(_getInReplyTo()); - } - public void setInReplyTo(ArrayList value) { - _setInReplyTo(AbstractEngine.toUTF8(value)); - } - - private native ArrayList _getReferences(); - private native void _setReferences(ArrayList value); - public ArrayList getReferences() { - return AbstractEngine.toUTF16(_getReferences()); - } - public void setReferences(ArrayList value) { - _setReferences(AbstractEngine.toUTF8(value)); - } - - private native ArrayList _getKeywords(); - private native void _setKeywords(ArrayList value); - public ArrayList getKeywords() { - return AbstractEngine.toUTF16(_getKeywords()); - } - public void setKeywords(ArrayList 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> _getOptFields(); - private native void _setOptFields(Vector> value); - public Vector> getOptFields() { - return AbstractEngine.toUTF16(_getOptFields()); - } - public void setOptFields(Vector> value) { - _setOptFields(AbstractEngine.toUTF8(value)); - } - - public native Message.EncFormat getEncFormat(); - public native void setEncFormat(Message.EncFormat value); - -} diff --git a/src/foundation/pEp/jniadapter/UniquelyIdentifiable.java b/src/foundation/pEp/jniadapter/UniquelyIdentifiable.java deleted file mode 100644 index d599e9c..0000000 --- a/src/foundation/pEp/jniadapter/UniquelyIdentifiable.java +++ /dev/null @@ -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; - } -} diff --git a/src/gen_java_Message.ysl2 b/src/gen_java_Message.ysl2 deleted file mode 100644 index a16658a..0000000 --- a/src/gen_java_Message.ysl2 +++ /dev/null @@ -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 intMap; - - private «$jname»(int value) { - this.value = value; - } - - public static «$jname» getByInt(int value){ - if (intMap == null) { - intMap = new HashMap(); - 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 - otherwise > _«$ename» - } - const "convget" choose { - when "$ctype = 'stringlist'" > AbstractEngine.toUTF16(i) - when "$ctype = 'stringpairlist'" > new Pair(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(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()" > , ` - } -} - diff --git a/src/gen_java_exceptions.ysl2 b/src/gen_java_exceptions.ysl2 deleted file mode 100644 index ecdca21..0000000 --- a/src/gen_java_exceptions.ysl2 +++ /dev/null @@ -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(.)"; -} - diff --git a/src/gen_throw_pEp_exception.ysl2 b/src/gen_throw_pEp_exception.ysl2 deleted file mode 100644 index 3c9d3ad..0000000 --- a/src/gen_throw_pEp_exception.ysl2 +++ /dev/null @@ -1,64 +0,0 @@ -include yslt.yml2 - -tstylesheet { - include ./textutils.ysl2 - - template "/" { - apply "namespace", 0; - document "throw_pEp_exception.hh", "text" - || - #pragma once - - #include - - namespace pEp { - namespace JNIAdapter { - jint throw_pEp_Exception(JNIEnv *env, PEP_STATUS status); - }; - }; - - || - - } - - template "namespace" - || - #include - #include - #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; - } -} - diff --git a/src/foundation/pEp/jniadapter/AbstractEngine.java b/src/java/foundation/pEp/jniadapter/AbstractEngine.java similarity index 57% rename from src/foundation/pEp/jniadapter/AbstractEngine.java rename to src/java/foundation/pEp/jniadapter/AbstractEngine.java index cb56de8..b7aba8b 100644 --- a/src/foundation/pEp/jniadapter/AbstractEngine.java +++ b/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 toUTF8(Vector list) { - if (list == null) - return null; + private native String _getVersion(); - Vector result = new Vector(list.size()); - for (int i=0; i toUTF8(Pair pair) { - if (pair == null) - return null; - - Pair result = new Pair(); + private native String _getProtocolVersion(); - result.first = toUTF8(pair.first); - result.second = toUTF8(pair.second); - return result; + public void startKeyserverLookup() { + _startKeyserverLookup(); } - public static ArrayList> toUTF8(ArrayList> list) { - if (list == null) - return null; - - ArrayList> result = new ArrayList>(list.size()); + private native void _startKeyserverLookup(); - for (int i=0; i toUTF16(Vector list) { - if (list == null) - return null; - - Vector result = new Vector(list.size()); + private native void _startSync(); - for (int i=0; i toUTF16(Pair pair) { - if (pair == null) - return null; - - Pair result = new Pair(); - - result.first = toUTF16(pair.first); - result.second = toUTF16(pair.second); + private native void _stopSync(); - return result; + public boolean isSyncRunning() { + return _isSyncRunning(); } - public static ArrayList> toUTF16(ArrayList> list) { - if (list == null) - return null; - - ArrayList> result = new ArrayList>(list.size()); - - for (int i=0; i> opts = new ArrayList<>(); Pair 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()); } diff --git a/src/foundation/pEp/jniadapter/Blob.java b/src/java/foundation/pEp/jniadapter/Blob.java similarity index 68% rename from src/foundation/pEp/jniadapter/Blob.java rename to src/java/foundation/pEp/jniadapter/Blob.java index f246e0c..4fdffa4 100644 --- a/src/foundation/pEp/jniadapter/Blob.java +++ b/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); - } } diff --git a/src/foundation/pEp/jniadapter/CommType.java b/src/java/foundation/pEp/jniadapter/CommType.java similarity index 100% rename from src/foundation/pEp/jniadapter/CommType.java rename to src/java/foundation/pEp/jniadapter/CommType.java diff --git a/src/foundation/pEp/jniadapter/Identity.java b/src/java/foundation/pEp/jniadapter/Identity.java similarity index 74% rename from src/foundation/pEp/jniadapter/Identity.java rename to src/java/foundation/pEp/jniadapter/Identity.java index 756102c..2b0cdde 100644 --- a/src/foundation/pEp/jniadapter/Identity.java +++ b/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; } } diff --git a/src/foundation/pEp/jniadapter/Pair.java b/src/java/foundation/pEp/jniadapter/Pair.java similarity index 100% rename from src/foundation/pEp/jniadapter/Pair.java rename to src/java/foundation/pEp/jniadapter/Pair.java diff --git a/src/foundation/pEp/jniadapter/Sync.java b/src/java/foundation/pEp/jniadapter/Sync.java similarity index 77% rename from src/foundation/pEp/jniadapter/Sync.java rename to src/java/foundation/pEp/jniadapter/Sync.java index 7593477..21f28e0 100644 --- a/src/foundation/pEp/jniadapter/Sync.java +++ b/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"); diff --git a/src/java/foundation/pEp/jniadapter/UniquelyIdentifiable.java b/src/java/foundation/pEp/jniadapter/UniquelyIdentifiable.java new file mode 100644 index 0000000..39d8004 --- /dev/null +++ b/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; + } +} diff --git a/src/java/foundation/pEp/jniadapter/Utils.java b/src/java/foundation/pEp/jniadapter/Utils.java new file mode 100644 index 0000000..709998f --- /dev/null +++ b/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 toUTF8(Vector list) { + if (list == null) + return null; + + Vector result = new Vector(list.size()); + + for (int i=0; i toUTF8(Pair pair) { + if (pair == null) + return null; + + Pair result = new Pair(); + + result.first = toUTF8(pair.first); + result.second = toUTF8(pair.second); + + return result; + } + + public static ArrayList> toUTF8(ArrayList> list) { + if (list == null) + return null; + + ArrayList> result = new ArrayList>(list.size()); + + for (int i=0; i toUTF16(Vector list) { + if (list == null) + return null; + + Vector result = new Vector(list.size()); + + for (int i=0; i toUTF16(Pair pair) { + if (pair == null) + return null; + + Pair result = new Pair(); + + result.first = toUTF16(pair.first); + result.second = toUTF16(pair.second); + + return result; + } + + public static ArrayList> toUTF16(ArrayList> list) { + if (list == null) + return null; + + ArrayList> result = new ArrayList>(list.size()); + + for (int i=0; i ev, Consumer 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); }); } diff --git a/test/java/foundation/pEp/jniadapter/test/jni98/TestMain.java b/test/java/foundation/pEp/jniadapter/test/jni98/TestMain.java index a8327e1..aad0166 100644 --- a/test/java/foundation/pEp/jniadapter/test/jni98/TestMain.java +++ b/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(); diff --git a/test/java/foundation/pEp/jniadapter/test/templateAliceBob/TestAlice.java b/test/java/foundation/pEp/jniadapter/test/templateAliceBob/TestAlice.java index 1cb6358..f872423 100644 --- a/test/java/foundation/pEp/jniadapter/test/templateAliceBob/TestAlice.java +++ b/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); diff --git a/test/java/foundation/pEp/jniadapter/test/templateAliceBob/TestBob.java b/test/java/foundation/pEp/jniadapter/test/templateAliceBob/TestBob.java index c8b7afc..d5e477e 100644 --- a/test/java/foundation/pEp/jniadapter/test/templateAliceBob/TestBob.java +++ b/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);