branch generate API: generating API and adapters, experimental branch

generate_api
Volker Birk 4 years ago
parent c2f7b08e58
commit eca7cad6e7

@ -0,0 +1,12 @@
all: basic_api.h
%.xml: %.yml2
yml2proc -P $< -o $@
%.h: %.yml2 pEp.yml2 gen_c_header.ysl2 to_c.ysl2
yml2proc -y gen_c_header.ysl2 pEp.yml2
.PHONY: clean
clean:
rm -f *.xml *.h

@ -0,0 +1,109 @@
// p≡p API version 2.0
// Basic API version 0.1
// Copyleft (c) 2019, p≡p foundation
// written by Volker Birk
type ISO639_1 extends string size=2 > a-z
type Hex extends string > a-f0-9
type hash extends hex min=16, max=128,
doc="32bit Key ID to SHA512 in hex";
type TID extends binary size=16,
doc="UUID version 4 variant 1";
enum comm_type {
hex unknown 0;
doc > range 0x01 to 0x09: no encryption, 0x0a to 0x0e: nothing reasonable
hex no_encryption 0x01 doc="generic";
hex no_encrypted_channel 0x02;
hex key_not_found 0x03;
hex key_expired 0x04;
hex key_revoked 0x05;
hex key_b0rken 0x06;
hex key_expired_but_confirmed 0x07
doc="NOT with confirmed bit. Just retaining info here in case of renewal.";
hex my_key_not_included 0x09;
hex security_by_obscurity 0x0a;
hex b0rken_crypto 0x0b;
hex key_too_short 0x0c;
hex compromised 0x0e doc="known compromised connection";
hex compromized 0x0e doc="deprecated misspelling";
hex mistrusted 0x0f doc="known mistrusted key";
doc > range 0x10 to 0x3f: unconfirmed encryption
hex unconfirmed_encryption 0x10 doc="generic";
hex OpenPGP_weak_unconfirmed 0x11 doc="RSA 1024 is weak";
hex to_be_checked 0x20 doc="generic";
hex SMIME_unconfirmed 0x21;
hex CMS_unconfirmed 0x22;
hex strong_but_unconfirmed 0x30 doc="generic";
hex OpenPGP_unconfirmed 0x38 doc="key at least 2048 bit RSA or EC";
hex OTR_unconfirmed 0x3a;
doc > range 0x40 to 0x7f: unconfirmed encryption and anonymization
hex unconfirmed_enc_anon 0x40 doc="generic";
hex pEp_unconfirmed 0x7f
hex confirmed 0x80 doc="this bit decides if trust is confirmed";
doc > range 0x81 to 0x8f: reserved
doc > range 0x90 to 0xbf: confirmed encryption
hex confirmed_encryption 0x90 doc="generic";
hex OpenPGP_weak 0x91 doc="RSA 1024 is weak (unused)";
hex to_be_checked_confirmed 0xa0 doc="generic";
hex SMIME 0xa1;
hex CMS 0xa2;
hex strong_encryption 0xb0 doc="generic";
hex OpenPGP 0xb8 doc="key at least 2048 bit RSA or EC";
hex OTR 0xba;
doc > range 0xc0 to 0xff: confirmed encryption and anonymization
hex confirmed_enc_anon 0xc0 doc="generic";
hex pEp 0xff
} // enum comm_type
struct identity {
field string address;
field hash fpr;
field string user_id;
field string username;
field ISO639_1 lang;
flags {
flag not_for_sync 0x0001
doc="don't use this identity for Sync";
flag list 0x0002
doc="identity of list of persons";
doc | the second octet flags are calculated
flag devicegroup 0x0100
doc="identity of a device group member"
}
} // struct Identity

@ -0,0 +1,80 @@
// p≡p API version 2.0
// C header generator
// Copyleft (c) 2019, p≡p foundation
// written by Volker Birk
include yslt.yml2
tstylesheet {
include ./to_c.ysl2
template "/"
apply "package/package[type='api']", 0;
template "package" document "{@name}_api.h", "text" {
||
// pEp API version 2.0
// «../@name»_api.h
// Copyleft (c) 2019, p≡p foundation
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
||
apply "doc|enum|struct", 0;
||
#ifdef __cplusplus
} // extern "C"
#endif
||
}
template "struct" {
||
typedef struct _«func:name()» {
||
apply "field";
||
} «func:name()»;
||
}
template "field" | «@type» «@name»;
template "enum" {
||
typedef enum _«func:name(false)» {
||
apply "item|doc";
||
} «func:name()»;
||
}
template "doc"
||
// «.»
||
template "item" {
0> «func:name(1)»`if "text()" { " = " value "." }``if "position()!=last()" > ,`
choose {
when "@doc" > /* «@doc» */\n
otherwise > \n
}
}
}

@ -0,0 +1,8 @@
// p≡p API version 2.0
// Keymanagement API version 0.1
// Copyleft (c) 2019, p≡p foundation
// written by Volker Birk

@ -0,0 +1,69 @@
// p≡p API version 2.0
// Message API version 0.1
// Copyleft (c) 2019, p≡p foundation
// written by Volker Birk
api message {
/*
struct message {
typedef enum _PEP_text_format {
PEP_text_format_plain = 0,
PEP_text_format_html,
PEP_text_format_other = 0xff
} PEP_text_format;
typedef enum _PEP_msg_direction {
PEP_dir_incoming = 0,
PEP_dir_outgoing
} PEP_msg_direction;
typedef enum _PEP_enc_format {
PEP_enc_none = 0, // message is not encrypted
PEP_enc_pieces, // inline PGP + PGP extensions
PEP_enc_S_MIME, // RFC5751
PEP_enc_PGP_MIME, // RFC3156
PEP_enc_PEP, // pEp encryption format
PEP_enc_PGP_MIME_Outlook1 // Message B0rken by Outlook type 1
} PEP_enc_format;
struct _message_ref_list;
typedef struct _message {
PEP_msg_direction dir;
char *id; // UTF-8 string of message ID
char *shortmsg; // UTF-8 string of short message
char *longmsg; // UTF-8 string of long message
// (plain)
char *longmsg_formatted; // UTF-8 string of long message
// (formatted)
bloblist_t *attachments; // blobs with attachements
char *rawmsg_ref; // reference to raw message data
size_t rawmsg_size; // size of raw message data
timestamp *sent; // when the message is sent
timestamp *recv; // when the message is received
pEp_identity *from; // whom the message is from
identity_list *to; // whom the message is to
pEp_identity *recv_by; // via which identity the message
// is received
identity_list *cc; // whom a CC is being sent
identity_list *bcc; // whom a BCC is being sent
identity_list *reply_to; // where a reply should go to
stringlist_t *in_reply_to; // list of UTF-8 strings with
// MessageIDs of refering messages
struct _message *refering_msg_ref; // reference to refering message
stringlist_t *references; // list of UTF-8 strings with references
struct _message_ref_list *refered_by; // list of references to messages being
// refered
stringlist_t *keywords; // list of UTF-8 strings with keywords
char *comments; // UTF-8 string with comments
stringpair_list_t *opt_fields; // optional fields
PEP_enc_format enc_format; // format of encrypted data
} message;
}
*/
}

@ -0,0 +1,34 @@
// p≡p API version 2.0
// Copyleft (c) 2019, p≡p foundation
// written by Volker Birk
decl package @name;
decl api @name (type=api) alias package;
decl type @name;
decl extends @type;
decl enum @name;
decl item @name;
decl struct @name;
decl field @type @name;
decl hex is item (output=hex);
decl flag @name;
package pEp {
api transport {
include ./transport_api.yml2
}
api message {
include ./message_api.yml2
}
api keymanagement {
include ./keymanagement_api.yml2
}
api basic {
include ./basic_api.yml2
}
}

@ -0,0 +1,40 @@
// p≡p API version 2.0
// C data types
// Copyleft (c) 2019, p≡p foundation
// written by Volker Birk
function "abbr" {
param "text";
if "$text" {
> «substring($text, 1, 1)»
call "abbr" with "text", "substring-after($text, '_')";
}
}
template "*", mode=name {
param "abbr", "false()";
if ".!=/*" {
apply "..", 0, mode=name;
> _
}
choose {
when "name()='enum' and $abbr"
call "abbr" with "text", "@name";
otherwise
> «@name»
}
}
function "name" {
param "abbr", "false()";
apply ".", mode=name with "abbr", "$abbr";
}
def "func:name" {
param "abbr", "false()";
result call "name" with "abbr", "$abbr";
}

@ -0,0 +1,8 @@
// p≡p API version 2.0
// Transport API version 0.1
// Copyleft (c) 2019, p≡p foundation
// written by Volker Birk
Loading…
Cancel
Save