diff options
author | Tai Vuong <tvuong@audiokinetic.com> | 2017-11-02 16:31:15 -0400 |
---|---|---|
committer | Tai Vuong <tvuong@audiokinetic.com> | 2017-11-02 16:31:15 -0400 |
commit | 5d2ee4455d95771d12cc6058bc19c0d6f7fe43d1 (patch) | |
tree | b4cbc2be7475641edf71ae42c6ce117dba27b91d | |
parent | e92aade201ec131c3eb7430305f60a0a4c9c44c1 (diff) | |
parent | ab6e470190f2cc410b1f6fa8f146317a3c3b08b5 (diff) |
merge dev branch with master
92 files changed, 764 insertions, 6042 deletions
diff --git a/.gitmodules b/.gitmodules index e69de29..501cfbb 100644 --- a/.gitmodules +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "conf.d/app-templates"] + path = conf.d/app-templates + url = https://gerrit.automotivelinux.org/gerrit/p/apps/app-templates.git +[submodule "afb-utilities"] + path = afb-utilities + url = https://github.com/iotbzh/afb-utilities.git diff --git a/afb-utilities b/afb-utilities new file mode 160000 +Subproject 77c12fc3a44ce4fd1f4a83019547190d0f44549 diff --git a/afb-utilities/LICENSE b/afb-utilities/LICENSE deleted file mode 100644 index 8dada3e..0000000 --- a/afb-utilities/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/afb-utilities/README.md b/afb-utilities/README.md deleted file mode 100644 index 03a0bcc..0000000 --- a/afb-utilities/README.md +++ /dev/null @@ -1,11 +0,0 @@ -AFB Utilities -============= - -You should find useful utilities to integrates as submodule in your bindings -development. - -From your AFB apps repository do the following to integrates this repo: - -```bash -git submodule add git@github.com:iotbzh/afb-utilities -``` diff --git a/afb-utilities/filescan-utils.c b/afb-utilities/filescan-utils.c deleted file mode 100644 index 46e461b..0000000 --- a/afb-utilities/filescan-utils.c +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright (C) 2016 "IoT.bzh" - * Author Fulup Ar Foll <fulup@iot.bzh> - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#define _GNU_SOURCE -#include <stdio.h> -#include <string.h> -#include <time.h> -#include <sys/prctl.h> -#include <dirent.h> - -#include "filescan-utils.h" - -// List Avaliable Configuration Files -PUBLIC json_object* ScanForConfig (const char* searchPath, CtlScanDirModeT mode, const char *pre, const char *ext) { - json_object *responseJ; - char *dirPath; - char* dirList= strdup(searchPath); - size_t extLen=0; - - void ScanDir (char *searchPath) { - DIR *dirHandle; - struct dirent *dirEnt; - dirHandle = opendir (searchPath); - if (!dirHandle) { - AFB_DEBUG ("CONFIG-SCANNING dir=%s not readable", searchPath); - return; - } - - //AFB_NOTICE ("CONFIG-SCANNING:ctl_listconfig scanning: %s", searchPath); - while ((dirEnt = readdir(dirHandle)) != NULL) { - - // recursively search embedded directories ignoring any directory starting by '.' or '_' - if (dirEnt->d_type == DT_DIR && mode == CTL_SCAN_RECURSIVE) { - char newpath[CONTROL_MAXPATH_LEN]; - if (dirEnt->d_name[0]=='.' || dirEnt->d_name[0]=='_') continue; - - strncpy(newpath, searchPath, sizeof(newpath)); - strncat(newpath, "/", sizeof(newpath)); - strncat(newpath, dirEnt->d_name, sizeof(newpath)); - ScanDir(newpath); - continue; - } - - // Unknown type is accepted to support dump filesystems - if (dirEnt->d_type == DT_REG || dirEnt->d_type == DT_UNKNOWN) { - - // check prefix and extention - size_t extIdx=strlen(dirEnt->d_name)-extLen; - if (extIdx <= 0) continue; - if (pre && !strcasestr (dirEnt->d_name, pre)) continue; - if (ext && strcasecmp (ext, &dirEnt->d_name[extIdx])) continue; - - struct json_object *pathJ = json_object_new_object(); - json_object_object_add(pathJ, "fullpath", json_object_new_string(searchPath)); - json_object_object_add(pathJ, "filename", json_object_new_string(dirEnt->d_name)); - json_object_array_add(responseJ, pathJ); - } - } - closedir(dirHandle); - } - - if (ext) extLen=strlen(ext); - responseJ = json_object_new_array(); - - // loop recursively on dir - for (dirPath= strtok(dirList, ":"); dirPath && *dirPath; dirPath=strtok(NULL,":")) { - ScanDir (dirPath); - } - - free (dirList); - return (responseJ); -} - -PUBLIC const char *GetMidleName(const char*name) { - char *fullname = strdup(name); - - for (int idx = 0; fullname[idx] != '\0'; idx++) { - int start; - if (fullname[idx] == '-') { - start = idx + 1; - for (int jdx = start; ; jdx++) { - if (fullname[jdx] == '-' || fullname[jdx] == '.' || fullname[jdx] == '\0') { - fullname[jdx] = '\0'; - return &fullname[start]; - break; - } - } - break; - } - } - return ""; -} - -PUBLIC const char *GetBinderName() { - char psName[17]; - static char *binderName=NULL; - - if (binderName) return binderName; - - binderName= getenv("AFB_BINDER_NAME"); - if (!binderName) { - // retrieve binder name from process name afb-name-trailer - prctl(PR_GET_NAME, psName,NULL,NULL,NULL); - binderName=(char*)GetMidleName(psName); - } - - return binderName; -} diff --git a/afb-utilities/filescan-utils.h b/afb-utilities/filescan-utils.h deleted file mode 100644 index a97d030..0000000 --- a/afb-utilities/filescan-utils.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2016 "IoT.bzh" - * Author Fulup Ar Foll <fulup@iot.bzh> - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * reference: - * amixer contents; amixer controls; - * http://www.tldp.org/HOWTO/Alsa-sound-6.html - */ - -#ifndef FILESCAN_UTILS_H -#define FILESCAN_UTILS_H - -#define AFB_BINDING_VERSION 2 -#include <afb/afb-binding.h> -#include <json-c/json.h> - -#ifndef PUBLIC - #define PUBLIC -#endif -#define STATIC static - -// ctl-misc.c -typedef enum { - CTL_SCAN_FLAT=0, - CTL_SCAN_RECURSIVE=1, -} CtlScanDirModeT; - -PUBLIC const char *GetMidleName(const char*name); -PUBLIC const char *GetBinderName(); -PUBLIC json_object* ScanForConfig (const char* searchPath, CtlScanDirModeT mode, const char *pre, const char *ext); - -#endif /* FILESCAN_UTILS_H */ - diff --git a/afb-utilities/wrap-json.c b/afb-utilities/wrap-json.c deleted file mode 100644 index 164e127..0000000 --- a/afb-utilities/wrap-json.c +++ /dev/null @@ -1,939 +0,0 @@ -/* - Copyright (C) 2016, 2017 "IoT.bzh" - - author: José Bollo <jose.bollo@iot.bzh> - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include <string.h> - -#include "wrap-json.h" - -#define STACKCOUNT 32 -#define STRCOUNT 8 - -enum { - wrap_json_error_none, - wrap_json_error_null_object, - wrap_json_error_truncated, - wrap_json_error_internal_error, - wrap_json_error_out_of_memory, - wrap_json_error_invalid_character, - wrap_json_error_too_long, - wrap_json_error_too_deep, - wrap_json_error_null_spec, - wrap_json_error_null_key, - wrap_json_error_null_string, - wrap_json_error_out_of_range, - wrap_json_error_incomplete, - wrap_json_error_missfit_type, - wrap_json_error_key_not_found, - _wrap_json_error_count_ -}; - -static const char ignore_all[] = " \t\n\r,:"; -static const char pack_accept_arr[] = "][{snbiIfoO"; -static const char pack_accept_key[] = "s}"; -#define pack_accept_any (&pack_accept_arr[1]) - -static const char unpack_accept_arr[] = "*!][{snbiIfFoO"; -static const char unpack_accept_key[] = "*!s}"; -#define unpack_accept_any (&unpack_accept_arr[3]) - -static const char *pack_errors[_wrap_json_error_count_] = -{ - [wrap_json_error_none] = "unknown error", - [wrap_json_error_null_object] = "null object", - [wrap_json_error_truncated] = "truncated", - [wrap_json_error_internal_error] = "internal error", - [wrap_json_error_out_of_memory] = "out of memory", - [wrap_json_error_invalid_character] = "invalid character", - [wrap_json_error_too_long] = "too long", - [wrap_json_error_too_deep] = "too deep", - [wrap_json_error_null_spec] = "spec is NULL", - [wrap_json_error_null_key] = "key is NULL", - [wrap_json_error_null_string] = "string is NULL", - [wrap_json_error_out_of_range] = "array too small", - [wrap_json_error_incomplete] = "incomplete container", - [wrap_json_error_missfit_type] = "missfit of type", - [wrap_json_error_key_not_found] = "key not found" -}; - -int wrap_json_get_error_position(int rc) -{ - if (rc < 0) - rc = -rc; - return (rc >> 4) + 1; -} - -int wrap_json_get_error_code(int rc) -{ - if (rc < 0) - rc = -rc; - return rc & 15; -} - -const char *wrap_json_get_error_string(int rc) -{ - rc = wrap_json_get_error_code(rc); - if (rc >= sizeof pack_errors / sizeof *pack_errors) - rc = 0; - return pack_errors[rc]; -} - - - -static inline const char *skip(const char *d) -{ - while (*d && strchr(ignore_all, *d)) - d++; - return d; -} - -int wrap_json_vpack(struct json_object **result, const char *desc, va_list args) -{ - /* TODO: the case of structs with key being single char should be optimized */ - int nstr, notnull, nullable, rc; - size_t sz, dsz, ssz; - char *s; - char c; - const char *d; - char buffer[256]; - struct { const char *str; size_t sz; } strs[STRCOUNT]; - struct { struct json_object *cont, *key; const char *acc; char type; } stack[STACKCOUNT], *top; - struct json_object *obj; - - ssz = sizeof buffer; - s = buffer; - top = stack; - top->key = NULL; - top->cont = NULL; - top->acc = pack_accept_any; - top->type = 0; - d = desc; - if (!d) - goto null_spec; - d = skip(d); - for(;;) { - c = *d; - if (!c) - goto truncated; - if (!strchr(top->acc, c)) - goto invalid_character; - d = skip(++d); - switch(c) { - case 's': - nullable = 0; - notnull = 0; - nstr = 0; - sz = 0; - for (;;) { - strs[nstr].str = va_arg(args, const char*); - if (strs[nstr].str) - notnull = 1; - if (*d == '?') { - d = skip(++d); - nullable = 1; - } - switch(*d) { - case '%': strs[nstr].sz = va_arg(args, size_t); d = skip(++d); break; - case '#': strs[nstr].sz = (size_t)va_arg(args, int); d = skip(++d); break; - default: strs[nstr].sz = strs[nstr].str ? strlen(strs[nstr].str) : 0; break; - } - sz += strs[nstr++].sz; - if (*d == '?') { - d = skip(++d); - nullable = 1; - } - if (*d != '+') - break; - if (nstr >= STRCOUNT) - goto too_long; - d = skip(++d); - } - if (*d == '*') - nullable = 1; - if (notnull) { - if (sz > ssz) { - ssz += ssz; - if (ssz < sz) - ssz = sz; - s = alloca(sz); - } - dsz = sz; - while (nstr) { - nstr--; - dsz -= strs[nstr].sz; - memcpy(&s[dsz], strs[nstr].str, strs[nstr].sz); - } - obj = json_object_new_string_len(s, (int)sz); - if (!obj) - goto out_of_memory; - } else if (nullable) - obj = NULL; - else - goto null_string; - break; - case 'n': - obj = NULL; - break; - case 'b': - obj = json_object_new_boolean(va_arg(args, int)); - if (!obj) - goto out_of_memory; - break; - case 'i': - obj = json_object_new_int(va_arg(args, int)); - if (!obj) - goto out_of_memory; - break; - case 'I': - obj = json_object_new_int64(va_arg(args, int64_t)); - if (!obj) - goto out_of_memory; - break; - case 'f': - obj = json_object_new_double(va_arg(args, double)); - if (!obj) - goto out_of_memory; - break; - case 'o': - case 'O': - obj = va_arg(args, struct json_object*); - if (*d == '?') - d = skip(++d); - else if (*d != '*' && !obj) - goto null_object; - if (c == 'O') - json_object_get(obj); - break; - case '[': - case '{': - if (++top >= &stack[STACKCOUNT]) - goto too_deep; - top->key = NULL; - if (c == '[') { - top->type = ']'; - top->acc = pack_accept_arr; - top->cont = json_object_new_array(); - } else { - top->type = '}'; - top->acc = pack_accept_key; - top->cont = json_object_new_object(); - } - if (!top->cont) - goto out_of_memory; - continue; - case '}': - case ']': - if (c != top->type || top <= stack) - goto internal_error; - obj = (top--)->cont; - if (*d == '*' && !(c == '}' ? json_object_object_length(obj) : json_object_array_length(obj))) { - json_object_put(obj); - obj = NULL; - } - break; - default: - goto internal_error; - } - switch (top->type) { - case 0: - if (top != stack) - goto internal_error; - if (*d) - goto invalid_character; - *result = obj; - return 0; - case ']': - if (obj || *d != '*') - json_object_array_add(top->cont, obj); - if (*d == '*') - d = skip(++d); - break; - case '}': - if (!obj) - goto null_key; - top->key = obj; - top->acc = pack_accept_any; - top->type = ':'; - break; - case ':': - if (obj || *d != '*') - json_object_object_add(top->cont, json_object_get_string(top->key), obj); - if (*d == '*') - d = skip(++d); - json_object_put(top->key); - top->key = NULL; - top->acc = pack_accept_key; - top->type = '}'; - break; - default: - goto internal_error; - } - } - -null_object: - rc = wrap_json_error_null_object; - goto error; -truncated: - rc = wrap_json_error_truncated; - goto error; -internal_error: - rc = wrap_json_error_internal_error; - goto error; -out_of_memory: - rc = wrap_json_error_out_of_memory; - goto error; -invalid_character: - rc = wrap_json_error_invalid_character; - goto error; -too_long: - rc = wrap_json_error_too_long; - goto error; -too_deep: - rc = wrap_json_error_too_deep; - goto error; -null_spec: - rc = wrap_json_error_null_spec; - goto error; -null_key: - rc = wrap_json_error_null_key; - goto error; -null_string: - rc = wrap_json_error_null_string; - goto error; -error: - do { - json_object_put(top->key); - json_object_put(top->cont); - } while (--top >= stack); - *result = NULL; - rc = rc | (int)((d - desc) << 4); - return -rc; -} - -int wrap_json_pack(struct json_object **result, const char *desc, ...) -{ - int rc; - va_list args; - - va_start(args, desc); - rc = wrap_json_vpack(result, desc, args); - va_end(args); - return rc; -} - -static int vunpack(struct json_object *object, const char *desc, va_list args, int store) -{ - int rc = 0, optionnal, ignore; - char c, xacc[2] = { 0, 0 }; - const char *acc; - const char *d, *fit = NULL; - const char *key = NULL; - const char **ps = NULL; - double *pf = NULL; - int *pi = NULL; - int64_t *pI = NULL; - size_t *pz = NULL; - struct { struct json_object *parent; const char *acc; int index, count; char type; } stack[STACKCOUNT], *top; - struct json_object *obj; - struct json_object **po; - - xacc[0] = 0; - ignore = 0; - top = NULL; - acc = unpack_accept_any; - d = desc; - if (!d) - goto null_spec; - d = skip(d); - obj = object; - for(;;) { - fit = d; - c = *d; - if (!c) - goto truncated; - if (!strchr(acc, c)) - goto invalid_character; - d = skip(++d); - switch(c) { - case 's': - if (xacc[0] == '}') { - /* expects a key */ - key = va_arg(args, const char *); - if (!key) - goto null_key; - if (*d != '?') - optionnal = 0; - else { - optionnal = 1; - d = skip(++d); - } - if (ignore) - ignore++; - else { - if (json_object_object_get_ex(top->parent, key, &obj)) { - /* found */ - top->index++; - } else { - /* not found */ - if (!optionnal) - goto key_not_found; - ignore = 1; - obj = NULL; - } - } - xacc[0] = ':'; - acc = unpack_accept_any; - continue; - } - /* get a string */ - if (store) - ps = va_arg(args, const char **); - if (!ignore) { - if (!json_object_is_type(obj, json_type_string)) - goto missfit; - if (store && ps) - *ps = json_object_get_string(obj); - } - if (*d == '%') { - d = skip(++d); - if (store) { - pz = va_arg(args, size_t *); - if (!ignore && pz) - *pz = (size_t)json_object_get_string_len(obj); - } - } - break; - case 'n': - if (!ignore && !json_object_is_type(obj, json_type_null)) - goto missfit; - break; - case 'b': - if (store) - pi = va_arg(args, int *); - - if (!ignore) { - if (!json_object_is_type(obj, json_type_boolean)) - goto missfit; - if (store && pi) - *pi = json_object_get_boolean(obj); - } - break; - case 'i': - if (store) - pi = va_arg(args, int *); - - if (!ignore) { - if (!json_object_is_type(obj, json_type_int)) - goto missfit; - if (store && pi) - *pi = json_object_get_int(obj); - } - break; - case 'I': - if (store) - pI = va_arg(args, int64_t *); - - if (!ignore) { - if (!json_object_is_type(obj, json_type_int)) - goto missfit; - if (store && pI) - *pI = json_object_get_int64(obj); - } - break; - case 'f': - case 'F': - if (store) - pf = va_arg(args, double *); - - if (!ignore) { - if (!(json_object_is_type(obj, json_type_double) || (c == 'F' && json_object_is_type(obj, json_type_int)))) - goto missfit; - if (store && pf) - *pf = json_object_get_double(obj); - } - break; - case 'o': - case 'O': - if (store) { - po = va_arg(args, struct json_object **); - if (!ignore && po) { - if (c == 'O') - obj = json_object_get(obj); - *po = obj; - } - } - break; - - case '[': - case '{': - if (!top) - top = stack; - else if (++top >= &stack[STACKCOUNT]) - goto too_deep; - - top->acc = acc; - top->type = xacc[0]; - top->index = 0; - top->parent = obj; - if (ignore) - ignore++; - if (c == '[') { - if (!ignore) { - if (!json_object_is_type(obj, json_type_array)) - goto missfit; - top->count = json_object_array_length(obj); - } - xacc[0] = ']'; - acc = unpack_accept_arr; - } else { - if (!ignore) { - if (!json_object_is_type(obj, json_type_object)) - goto missfit; - top->count = json_object_object_length(obj); - } - xacc[0] = '}'; - acc = unpack_accept_key; - continue; - } - break; - case '}': - case ']': - if (!top || c != xacc[0]) - goto internal_error; - acc = top->acc; - xacc[0] = top->type; - top = top == stack ? NULL : top - 1; - if (ignore) - ignore--; - break; - case '!': - if (*d != xacc[0]) - goto invalid_character; - if (!ignore && top->index != top->count) - goto incomplete; - /*@fallthrough@*/ - case '*': - acc = xacc; - continue; - default: - goto internal_error; - } - switch (xacc[0]) { - case 0: - if (top) - goto internal_error; - if (*d) - goto invalid_character; - return 0; - case ']': - if (!ignore) { - key = strchr(unpack_accept_arr, *d); - if (key && key >= unpack_accept_any) { - if (top->index >= top->count) - goto out_of_range; - obj = json_object_array_get_idx(top->parent, top->index++); - } - } - break; - case ':': - acc = unpack_accept_key; - xacc[0] = '}'; - if (ignore) - ignore--; - break; - default: - goto internal_error; - } - } -truncated: - rc = wrap_json_error_truncated; - goto error; -internal_error: - rc = wrap_json_error_internal_error; - goto error; -invalid_character: - rc = wrap_json_error_invalid_character; - goto error; -too_deep: - rc = wrap_json_error_too_deep; - goto error; -null_spec: - rc = wrap_json_error_null_spec; - goto error; -null_key: - rc = wrap_json_error_null_key; - goto error; -out_of_range: - rc = wrap_json_error_out_of_range; - goto error; -incomplete: - rc = wrap_json_error_incomplete; - goto error; -missfit: - rc = wrap_json_error_missfit_type; - goto errorfit; -key_not_found: - rc = wrap_json_error_key_not_found; - goto error; -errorfit: - d = fit; -error: - rc = rc | (int)((d - desc) << 4); - return -rc; -} - -int wrap_json_vcheck(struct json_object *object, const char *desc, va_list args) -{ - return vunpack(object, desc, args, 0); -} - -int wrap_json_check(struct json_object *object, const char *desc, ...) -{ - int rc; - va_list args; - - va_start(args, desc); - rc = vunpack(object, desc, args, 0); - va_end(args); - return rc; -} - -int wrap_json_vmatch(struct json_object *object, const char *desc, va_list args) -{ - return !vunpack(object, desc, args, 0); -} - -int wrap_json_match(struct json_object *object, const char *desc, ...) -{ - int rc; - va_list args; - - va_start(args, desc); - rc = vunpack(object, desc, args, 0); - va_end(args); - return !rc; -} - -int wrap_json_vunpack(struct json_object *object, const char *desc, va_list args) -{ - return vunpack(object, desc, args, 1); -} - -int wrap_json_unpack(struct json_object *object, const char *desc, ...) -{ - int rc; - va_list args; - - va_start(args, desc); - rc = vunpack(object, desc, args, 1); - va_end(args); - return rc; -} - -static void object_for_all(struct json_object *object, void (*callback)(void*,struct json_object*,const char*), void *closure) -{ - struct json_object_iterator it = json_object_iter_begin(object); - struct json_object_iterator end = json_object_iter_end(object); - while (!json_object_iter_equal(&it, &end)) { - callback(closure, json_object_iter_peek_value(&it), json_object_iter_peek_name(&it)); - json_object_iter_next(&it); - } -} - -static void array_for_all(struct json_object *object, void (*callback)(void*,struct json_object*), void *closure) -{ - int n = json_object_array_length(object); - int i = 0; - while(i < n) - callback(closure, json_object_array_get_idx(object, i++)); -} - -void wrap_json_optarray_for_all(struct json_object *object, void (*callback)(void*,struct json_object*), void *closure) -{ - if (json_object_is_type(object, json_type_array)) - array_for_all(object, callback, closure); - else - callback(closure, object); -} - -void wrap_json_array_for_all(struct json_object *object, void (*callback)(void*,struct json_object*), void *closure) -{ - if (json_object_is_type(object, json_type_array)) - array_for_all(object, callback, closure); -} - -void wrap_json_object_for_all(struct json_object *object, void (*callback)(void*,struct json_object*,const char*), void *closure) -{ - if (json_object_is_type(object, json_type_object)) - object_for_all(object, callback, closure); -} - -void wrap_json_optobject_for_all(struct json_object *object, void (*callback)(void*,struct json_object*,const char*), void *closure) -{ - if (json_object_is_type(object, json_type_object)) - object_for_all(object, callback, closure); - else - callback(closure, object, NULL); -} - -void wrap_json_for_all(struct json_object *object, void (*callback)(void*,struct json_object*,const char*), void *closure) -{ - if (!object) - /* do nothing */; - else if (json_object_is_type(object, json_type_object)) - object_for_all(object, callback, closure); - else if (!json_object_is_type(object, json_type_array)) - callback(closure, object, NULL); - else { - int n = json_object_array_length(object); - int i = 0; - while(i < n) - callback(closure, json_object_array_get_idx(object, i++), NULL); - } -} - -#if defined(WRAP_JSON_TEST) -#include <stdio.h> - -void p(const char *desc, ...) -{ - int rc; - va_list args; - struct json_object *result; - - va_start(args, desc); - rc = wrap_json_vpack(&result, desc, args); - va_end(args); - if (!rc) - printf(" SUCCESS %s\n\n", json_object_to_json_string(result)); - else - printf(" ERROR[char %d err %d] %s\n\n", wrap_json_get_error_position(rc), wrap_json_get_error_code(rc), wrap_json_get_error_string(rc)); - json_object_put(result); -} - -const char *xs[10]; -int *xi[10]; -int64_t *xI[10]; -double *xf[10]; -struct json_object *xo[10]; -size_t xz[10]; - -void u(const char *value, const char *desc, ...) -{ - unsigned m, k; - int rc; - va_list args; - struct json_object *obj, *o; - - memset(xs, 0, sizeof xs); - memset(xi, 0, sizeof xi); - memset(xI, 0, sizeof xI); - memset(xf, 0, sizeof xf); - memset(xo, 0, sizeof xo); - memset(xz, 0, sizeof xz); - obj = json_tokener_parse(value); - va_start(args, desc); - rc = wrap_json_vunpack(obj, desc, args); - va_end(args); - if (rc) - printf(" ERROR[char %d err %d] %s\n\n", wrap_json_get_error_position(rc), wrap_json_get_error_code(rc), wrap_json_get_error_string(rc)); - else { - value = NULL; - printf(" SUCCESS"); - va_start(args, desc); - k = m = 0; - while(*desc) { - switch(*desc) { - case '{': m = (m << 1) | 1; k = 1; break; - case '}': m = m >> 1; k = m&1; break; - case '[': m = m << 1; k = 0; break; - case ']': m = m >> 1; k = m&1; break; - case 's': printf(" s:%s", k ? va_arg(args, const char*) : *(va_arg(args, const char**)?:&value)); k ^= m&1; break; - case '%': printf(" %%:%zu", *va_arg(args, size_t*)); k = m&1; break; - case 'n': printf(" n"); k = m&1; break; - case 'b': printf(" b:%d", *va_arg(args, int*)); k = m&1; break; - case 'i': printf(" i:%d", *va_arg(args, int*)); k = m&1; break; - case 'I': printf(" I:%lld", *va_arg(args, int64_t*)); k = m&1; break; - case 'f': printf(" f:%f", *va_arg(args, double*)); k = m&1; break; - case 'F': printf(" F:%f", *va_arg(args, double*)); k = m&1; break; - case 'o': printf(" o:%s", json_object_to_json_string(*va_arg(args, struct json_object**))); k = m&1; break; - case 'O': o = *va_arg(args, struct json_object**); printf(" O:%s", json_object_to_json_string(o)); json_object_put(o); k = m&1; break; - default: break; - } - desc++; - } - va_end(args); - printf("\n\n"); - } - json_object_put(obj); -} - -#define P(...) do{ printf("pack(%s)\n",#__VA_ARGS__); p(__VA_ARGS__); } while(0) -#define U(...) do{ printf("unpack(%s)\n",#__VA_ARGS__); u(__VA_ARGS__); } while(0) - -int main() -{ - char buffer[4] = {'t', 'e', 's', 't'}; - - P("n"); - P("b", 1); - P("b", 0); - P("i", 1); - P("I", (uint64_t)0x123456789abcdef); - P("f", 3.14); - P("s", "test"); - P("s?", "test"); - P("s?", NULL); - P("s#", "test asdf", 4); - P("s%", "test asdf", (size_t)4); - P("s#", buffer, 4); - P("s%", buffer, (size_t)4); - P("s++", "te", "st", "ing"); - P("s#+#+", "test", 1, "test", 2, "test"); - P("s%+%+", "test", (size_t)1, "test", (size_t)2, "test"); - P("{}", 1.0); - P("[]", 1.0); - P("o", json_object_new_int(1)); - P("o?", json_object_new_int(1)); - P("o?", NULL); - P("O", json_object_new_int(1)); - P("O?", json_object_new_int(1)); - P("O?", NULL); - P("{s:[]}", "foo"); - P("{s+#+: []}", "foo", "barbar", 3, "baz"); - P("{s:s,s:o,s:O}", "a", NULL, "b", NULL, "c", NULL); - P("{s:**}", "a", NULL); - P("{s:s*,s:o*,s:O*}", "a", NULL, "b", NULL, "c", NULL); - P("[i,i,i]", 0, 1, 2); - P("[s,o,O]", NULL, NULL, NULL); - P("[**]", NULL); - P("[s*,o*,O*]", NULL, NULL, NULL); - P(" s ", "test"); - P("[ ]"); - P("[ i , i, i ] ", 1, 2, 3); - P("{\n\n1"); - P("[}"); - P("{]"); - P("["); - P("{"); - P("[i]a", 42); - P("ia", 42); - P("s", NULL); - P("+", NULL); - P(NULL); - P("{s:i}", NULL, 1); - P("{ {}: s }", "foo"); - P("{ s: {}, s:[ii{} }", "foo", "bar", 12, 13); - P("[[[[[ [[[[[ [[[[ }]]]] ]]]] ]]]]]"); - - U("true", "b", &xi[0]); - U("false", "b", &xi[0]); - U("null", "n"); - U("42", "i", &xi[0]); - U("123456789", "I", &xI[0]); - U("3.14", "f", &xf[0]); - U("12345", "F", &xf[0]); - U("3.14", "F", &xf[0]); - U("\"foo\"", "s", &xs[0]); - U("\"foo\"", "s%", &xs[0], &xz[0]); - U("{}", "{}"); - U("[]", "[]"); - U("{}", "o", &xo[0]); - U("{}", "O", &xo[0]); - U("{\"foo\":42}", "{si}", "foo", &xi[0]); - U("[1,2,3]", "[i,i,i]", &xi[0], &xi[1], &xi[2]); - U("{\"a\":1,\"b\":2,\"c\":3}", "{s:i, s:i, s:i}", "a", &xi[0], "b", &xi[1], "c", &xi[2]); - U("42", "z"); - U("null", "[i]"); - U("[]", "[}"); - U("{}", "{]"); - U("[]", "["); - U("{}", "{"); - U("[42]", "[i]a", &xi[0]); - U("42", "ia", &xi[0]); - U("[]", NULL); - U("\"foo\"", "s", NULL); - U("42", "s", NULL); - U("42", "n"); - U("42", "b", NULL); - U("42", "f", NULL); - U("42", "[i]", NULL); - U("42", "{si}", "foo", NULL); - U("\"foo\"", "n"); - U("\"foo\"", "b", NULL); - U("\"foo\"", "i", NULL); - U("\"foo\"", "I", NULL); - U("\"foo\"", "f", NULL); - U("\"foo\"", "F", NULL); - U("true", "s", NULL); - U("true", "n"); - U("true", "i", NULL); - U("true", "I", NULL); - U("true", "f", NULL); - U("true", "F", NULL); - U("[42]", "[ii]", &xi[0], &xi[1]); - U("{\"foo\":42}", "{si}", NULL, &xi[0]); - U("{\"foo\":42}", "{si}", "baz", &xi[0]); - U("[1,2,3]", "[iii!]", &xi[0], &xi[1], &xi[2]); - U("[1,2,3]", "[ii!]", &xi[0], &xi[1]); - U("[1,2,3]", "[ii]", &xi[0], &xi[1]); - U("[1,2,3]", "[ii*]", &xi[0], &xi[1]); - U("{\"foo\":42,\"baz\":45}", "{sisi}", "baz", &xi[0], "foo", &xi[1]); - U("{\"foo\":42,\"baz\":45}", "{sisi*}", "baz", &xi[0], "foo", &xi[1]); - U("{\"foo\":42,\"baz\":45}", "{sisi!}", "baz", &xi[0], "foo", &xi[1]); - U("{\"foo\":42,\"baz\":45}", "{si}", "baz", &xi[0], "foo", &xi[1]); - U("{\"foo\":42,\"baz\":45}", "{si*}", "baz", &xi[0], "foo", &xi[1]); - U("{\"foo\":42,\"baz\":45}", "{si!}", "baz", &xi[0], "foo", &xi[1]); - U("[1,{\"foo\":2,\"bar\":null},[3,4]]", "[i{sisn}[ii]]", &xi[0], "foo", &xi[1], "bar", &xi[2], &xi[3]); - U("[1,2,3]", "[ii!i]", &xi[0], &xi[1], &xi[2]); - U("[1,2,3]", "[ii*i]", &xi[0], &xi[1], &xi[2]); - U("{\"foo\":1,\"bar\":2}", "{si!si}", "foo", &xi[1], "bar", &xi[2]); - U("{\"foo\":1,\"bar\":2}", "{si*si}", "foo", &xi[1], "bar", &xi[2]); - U("{\"foo\":{\"baz\":null,\"bar\":null}}", "{s{sn!}}", "foo", "bar"); - U("[[1,2,3]]", "[[ii!]]", &xi[0], &xi[1]); - U("{}", "{s?i}", "foo", &xi[0]); - U("{\"foo\":1}", "{s?i}", "foo", &xi[0]); - U("{}", "{s?[ii]s?{s{si!}}}", "foo", &xi[0], &xi[1], "bar", "baz", "quux", &xi[2]); - U("{\"foo\":[1,2]}", "{s?[ii]s?{s{si!}}}", "foo", &xi[0], &xi[1], "bar", "baz", "quux", &xi[2]); - U("{\"bar\":{\"baz\":{\"quux\":15}}}", "{s?[ii]s?{s{si!}}}", "foo", &xi[0], &xi[1], "bar", "baz", "quux", &xi[2]); - U("{\"foo\":{\"bar\":4}}", "{s?{s?i}}", "foo", "bar", &xi[0]); - U("{\"foo\":{}}", "{s?{s?i}}", "foo", "bar", &xi[0]); - U("{}", "{s?{s?i}}", "foo", "bar", &xi[0]); - U("{\"foo\":42,\"baz\":45}", "{s?isi!}", "baz", &xi[0], "foo", &xi[1]); - U("{\"foo\":42}", "{s?isi!}", "baz", &xi[0], "foo", &xi[1]); - return 0; -} - -#endif - -#if 0 - - - /* Unpack the same item twice */ - j = json_pack("{s:s, s:i, s:b}", "foo", "bar", "baz", 42, "quux", 1); - if(!json_unpack_ex(j, &error, 0, "{s:s,s:s!}", "foo", &s, "foo", &s)) - fail("json_unpack object with strict validation failed"); - { - const char *possible_errors[] = { - "2 object item(s) left unpacked: baz, quux", - "2 object item(s) left unpacked: quux, baz" - }; - check_errors(possible_errors, 2, "<validation>", 1, 10, 10); - } - json_decref(j); - -#endif diff --git a/afb-utilities/wrap-json.h b/afb-utilities/wrap-json.h deleted file mode 100644 index cb2d0bf..0000000 --- a/afb-utilities/wrap-json.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - Copyright (C) 2016, 2017 "IoT.bzh" - - author: José Bollo <jose.bollo@iot.bzh> - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#pragma once - -#include <stdarg.h> -#include <json-c/json.h> - -extern int wrap_json_get_error_position(int rc); -extern int wrap_json_get_error_code(int rc); -extern const char *wrap_json_get_error_string(int rc); - -extern int wrap_json_vpack(struct json_object **result, const char *desc, va_list args); -extern int wrap_json_pack(struct json_object **result, const char *desc, ...); - -extern int wrap_json_vunpack(struct json_object *object, const char *desc, va_list args); -extern int wrap_json_unpack(struct json_object *object, const char *desc, ...); -extern int wrap_json_vcheck(struct json_object *object, const char *desc, va_list args); -extern int wrap_json_check(struct json_object *object, const char *desc, ...); -extern int wrap_json_vmatch(struct json_object *object, const char *desc, va_list args); -extern int wrap_json_match(struct json_object *object, const char *desc, ...); - -extern void wrap_json_optarray_for_all(struct json_object *object, void (*callback)(void*,struct json_object*), void *closure); -extern void wrap_json_array_for_all(struct json_object *object, void (*callback)(void*,struct json_object*), void *closure); - -extern void wrap_json_optarray_for_all(struct json_object *object, void (*callback)(void*,struct json_object*), void *closure); -extern void wrap_json_array_for_all(struct json_object *object, void (*callback)(void*,struct json_object*), void *closure); -extern void wrap_json_object_for_all(struct json_object *object, void (*callback)(void*,struct json_object*,const char*), void *closure); -extern void wrap_json_optobject_for_all(struct json_object *object, void (*callback)(void*,struct json_object*,const char*), void *closure); -extern void wrap_json_for_all(struct json_object *object, void (*callback)(void*,struct json_object*,const char*), void *closure); - diff --git a/afb-utilities/wrap-json.md b/afb-utilities/wrap-json.md deleted file mode 100644 index 92940f1..0000000 --- a/afb-utilities/wrap-json.md +++ /dev/null @@ -1,305 +0,0 @@ -WRAP-JSON facility -================== - -The facility wrap-json is based on the pack/unpack API on the -libray jansson. The two chapters below are copied from the -documentation of jansson library copyrighted by Petri Lehtinen -(see at end). - -Building Values ---------------- - -This section describes functions that help to create, or *pack*, complex -JSON values, especially nested objects and arrays. Value building is -based on a *format string* that is used to tell the functions about the -expected arguments. - -For example, the format string `"i"` specifies a single integer value, -while the format string `"[ssb]"` or the equivalent `"[s, s, b]"` -specifies an array value with two strings and a boolean as its items: - - /* Create the JSON integer 42 */ - wrap_json_pack(&result, "i", 42); - - /* Create the JSON array ["foo", "bar", true] */ - wrap_json_pack(&result, "[ssb]", "foo", "bar", 1); - -Here's the full list of format specifiers. The type in parentheses -denotes the resulting JSON type, and the type in brackets (if any) -denotes the C type that is expected as the corresponding argument or -arguments. - -`s` (string) \[const char \*\] - -: Convert a null terminated UTF-8 string to a JSON string. - -`s?` (string) \[const char \*\] - -: Like `s`, but if the argument is *NULL*, output a JSON null value. - -`s*` (string) \[const char \*\] - -: Like `s`, but if the argument is *NULL*, do not output any value. - This format can only be used inside an object or an array. If used - inside an object, the corresponding key is additionally suppressed - when the value is omitted. See below for an example. - -`s#` (string) \[const char \*, int\] - -: Convert a UTF-8 buffer of a given length to a JSON string. - -`s%` (string) \[const char \*, size\_t\] - -: Like `s#` but the length argument is of type size\_t. - -`+` \[const char \*\] - -: Like `s`, but concatenate to the previous string. Only valid after - `s`, `s#`, `+` or `+#`. - -`+#` \[const char \*, int\] - -: Like `s#`, but concatenate to the previous string. Only valid after - `s`, `s#`, `+` or `+#`. - -`+%` (string) \[const char \*, size\_t\] - -: Like `+#` but the length argument is of type size\_t. - -`n` (null) - -: Output a JSON null value. No argument is consumed. - -`b` (boolean) \[int\] - -: Convert a C int to JSON boolean value. Zero is converted to `false` - and non-zero to `true`. - -`i` (integer) \[int\] - -: Convert a C int to JSON integer. - -`I` (integer) \[json\_int\_t\] - -: Convert a C json\_int\_t to JSON integer. - -`f` (real) \[double\] - -: Convert a C double to JSON real. - -`o` (any value) \[json\_t \*\] - -: Output any given JSON value as-is. If the value is added to an array - or object, the reference to the value passed to `o` is stolen by the - container. - -`O` (any value) \[json\_t \*\] - -: Like `o`, but the argument's reference count is incremented. This is - useful if you pack into an array or object and want to keep the - reference for the JSON value consumed by `O` to yourself. - -`o?`, `O?` (any value) \[json\_t \*\] - -: Like `o` and `O`, respectively, but if the argument is *NULL*, - output a JSON null value. - -`o*`, `O*` (any value) \[json\_t \*\] - -: Like `o` and `O`, respectively, but if the argument is *NULL*, do - not output any value. This format can only be used inside an object - or an array. If used inside an object, the corresponding key is - additionally suppressed. See below for an example. - -`[fmt]` (array) - -: Build an array with contents from the inner format string. `fmt` may - contain objects and arrays, i.e. recursive value building is - supported. - -`{fmt}` (object) - -: Build an object with contents from the inner format string `fmt`. - The first, third, etc. format specifier represent a key, and must be - a string (see `s`, `s#`, `+` and `+#` above), as object keys are - always strings. The second, fourth, etc. format specifier represent - a value. Any value may be an object or array, i.e. recursive value - building is supported. - -Whitespace, `:` and `,` are ignored. - -More examples: - - /* Build an empty JSON object */ - wrap_json_pack(&result, "{}"); - - /* Build the JSON object {"foo": 42, "bar": 7} */ - wrap_json_pack(&result, "{sisi}", "foo", 42, "bar", 7); - - /* Like above, ':', ',' and whitespace are ignored */ - wrap_json_pack(&result, "{s:i, s:i}", "foo", 42, "bar", 7); - - /* Build the JSON array [[1, 2], {"cool": true}] */ - wrap_json_pack(&result, "[[i,i],{s:b}]", 1, 2, "cool", 1); - - /* Build a string from a non-null terminated buffer */ - char buffer[4] = {'t', 'e', 's', 't'}; - wrap_json_pack(&result, "s#", buffer, 4); - - /* Concatenate strings together to build the JSON string "foobarbaz" */ - wrap_json_pack(&result, "s++", "foo", "bar", "baz"); - - /* Create an empty object or array when optional members are missing */ - wrap_json_pack(&result, "{s:s*,s:o*,s:O*}", "foo", NULL, "bar", NULL, "baz", NULL); - wrap_json_pack(&result, "[s*,o*,O*]", NULL, NULL, NULL); - -Parsing and Validating Values ------------------------------ - -This section describes functions that help to validate complex values -and extract, or *unpack*, data from them. Like building values -<apiref-pack>, this is also based on format strings. - -While a JSON value is unpacked, the type specified in the format string -is checked to match that of the JSON value. This is the validation part -of the process. In addition to this, the unpacking functions can also -check that all items of arrays and objects are unpacked. This check be -enabled with the format specifier `!` or by using the flag -`JSON_STRICT`. See below for details. - -Here's the full list of format specifiers. The type in parentheses -denotes the JSON type, and the type in brackets (if any) denotes the C -type whose address should be passed. - -`s` (string) \[const char \*\] - -: Convert a JSON string to a pointer to a null terminated UTF-8 - string. The resulting string is extracted by using - json\_string\_value() internally, so it exists as long as there are - still references to the corresponding JSON string. - -`s%` (string) \[const char \*, size\_t \*\] - -: Convert a JSON string to a pointer to a null terminated UTF-8 string - and its length. - -`n` (null) - -: Expect a JSON null value. Nothing is extracted. - -`b` (boolean) \[int\] - -: Convert a JSON boolean value to a C int, so that `true` is converted - to 1 and `false` to 0. - -`i` (integer) \[int\] - -: Convert a JSON integer to C int. - -`I` (integer) \[json\_int\_t\] - -: Convert a JSON integer to C json\_int\_t. - -`f` (real) \[double\] - -: Convert a JSON real to C double. - -`F` (integer or real) \[double\] - -: Convert a JSON number (integer or real) to C double. - -`o` (any value) \[json\_t \*\] - -: Store a JSON value with no conversion to a json\_t pointer. - -`O` (any value) \[json\_t \*\] - -: Like `O`, but the JSON value's reference count is incremented. - -`[fmt]` (array) - -: Convert each item in the JSON array according to the inner format - string. `fmt` may contain objects and arrays, i.e. recursive value - extraction is supported. - -`{fmt}` (object) - -: Convert each item in the JSON object according to the inner format - string `fmt`. The first, third, etc. format specifier represent a - key, and must be `s`. The corresponding argument to unpack functions - is read as the object key. The second fourth, etc. format specifier - represent a value and is written to the address given as the - corresponding argument. **Note** that every other argument is read - from and every other is written to. - - `fmt` may contain objects and arrays as values, i.e. recursive value - extraction is supported. - -`!` - -: This special format specifier is used to enable the check that all - object and array items are accessed, on a per-value basis. It must - appear inside an array or object as the last format specifier before - the closing bracket or brace. - -`*` - -: This special format specifier is the opposite of `!`. This is the default. - It must appear inside an array or object as the last format specifier - before the closing bracket or brace. - -Whitespace, `:` and `,` are ignored. - -Examples: - - /* root is the JSON integer 42 */ - int myint; - wrap_json_unpack(root, "i", &myint); - assert(myint == 42); - - /* root is the JSON object {"foo": "bar", "quux": true} */ - const char *str; - int boolean; - wrap_json_unpack(root, "{s:s, s:b}", "foo", &str, "quux", &boolean); - assert(strcmp(str, "bar") == 0 && boolean == 1); - - /* root is the JSON array [[1, 2], {"baz": null} */ - wrap_json_check(root, "[[i,i], {s:n}]", "baz"); - /* returns 0 for validation success, nothing is extracted */ - - /* root is the JSON array [1, 2, 3, 4, 5] */ - int myint1, myint2; - wrap_json_unpack(root, "[ii!]", &myint1, &myint2); - /* returns -1 for failed validation */ - - /* root is an empty JSON object */ - int myint = 0, myint2 = 0, myint3 = 0; - wrap_json_unpack(root, "{s?i, s?[ii]}", - "foo", &myint1, - "bar", &myint2, &myint3); - /* myint1, myint2 or myint3 is no touched as "foo" and "bar" don't exist */ - - -Copyright ---------- - -Copyright (c) 2009-2016 Petri Lehtinen <petri@digip.org> - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - diff --git a/src/CMakeLists.txt b/ahl-binding/CMakeLists.txt index 0bb3986..0dee304 100644 --- a/src/CMakeLists.txt +++ b/ahl-binding/CMakeLists.txt @@ -15,43 +15,24 @@ # See the License for the specific language governing permissions and # limitations under the License. ########################################################################### -# Generate API-v2 hat from OpenAPI json definition -macro(SET_TARGET_GENSKEL TARGET_NAME API_DEF_NAME) - add_custom_command(OUTPUT ${API_DEF_NAME}.h - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - DEPENDS ${API_DEF_NAME}.json - COMMAND afb-genskel ${API_DEF_NAME}.json >${API_DEF_NAME}.h - ) - add_custom_target(${API_DEF_NAME}_OPENAPI DEPENDS ${API_DEF_NAME}.h) - add_dependencies(${TARGET_NAME} ${API_DEF_NAME}_OPENAPI) - -endmacro(SET_TARGET_GENSKEL) - -FIND_PACKAGE(PkgConfig REQUIRED) -PKG_CHECK_MODULES(GLIB_PKG REQUIRED glib-2.0) - -# get_cmake_property(_variableNames VARIABLES) -# foreach (_variableName ${_variableNames}) -# message(STATUS "${_variableName}=${${_variableName}}") -# endforeach() # Add target to project dependency list PROJECT_TARGET_ADD(audiohighlevel) # Define project Targets - ADD_LIBRARY(${TARGET_NAME} MODULE ahl-binding.c ahl-deviceenum.c ahl-config.c ahl-policy-utils.c ahl-policy.c ahl-json.c) - - # Generate API-v2 hat from OpenAPI json definition - SET_TARGET_GENSKEL(${TARGET_NAME} ahl-apidef) + ADD_LIBRARY(${TARGET_NAME} MODULE ahl-binding.c ahl-deviceenum.c ahl-config.c ahl-json.c) # Binder exposes a unique public entry point SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES PREFIX "afb-" - LABELS "BINDING" + LABELS "BINDINGV2" LINK_FLAGS ${BINDINGS_LINK_FLAG} OUTPUT_NAME ${TARGET_NAME} ) + # Change default OPenAPI file + SET_OPENAPI_FILENAME("ahl-apidef") + # Define target includes TARGET_INCLUDE_DIRECTORIES(${TARGET_NAME} PUBLIC ${GLIB_PKG_INCLUDE_DIRS} @@ -60,6 +41,8 @@ PROJECT_TARGET_ADD(audiohighlevel) # Library dependencies (include updates automatically) # Find package for GLIB does not seem to export TARGET_LINK_LIBRARIES(${TARGET_NAME} + ahl-policy + ahl-utilities afb-utilities ${GLIB_PKG_LIBRARIES} ${link_libraries} diff --git a/ahl-binding/ahl-apidef.h b/ahl-binding/ahl-apidef.h new file mode 100644 index 0000000..2c77827 --- /dev/null +++ b/ahl-binding/ahl-apidef.h @@ -0,0 +1,237 @@ + +static const char _afb_description_v2_ahl_4a[] = + "{\"openapi\":\"3.0.0\",\"info\":{\"description\":\"Audio high level API " + "for AGL applications\",\"title\":\"audiohighlevel\",\"version\":\"1.0\"," + "\"x-binding-c-generator\":{\"api\":\"ahl-4a\",\"version\":2,\"prefix\":\"" + "audiohlapi_\",\"postfix\":\"\",\"start\":null,\"onevent\":\"AhlOnEvent\"" + ",\"init\":\"AhlBindingInit\",\"scope\":\"\",\"private\":false}},\"server" + "s\":[{\"url\":\"ws://{host}:{port}/api/audiohl\",\"description\":\"Audio" + " high level API for AGL applications.\",\"variables\":{\"host\":{\"defau" + "lt\":\"localhost\"},\"port\":{\"default\":\"1234\"}},\"x-afb-events\":[{" + "\"$ref\":\"#/components/schemas/afb-event\"}]}],\"components\":{\"schema" + "s\":{\"afb-reply\":{\"$ref\":\"#/components/schemas/afb-reply-v2\"},\"af" + "b-event\":{\"$ref\":\"#/components/schemas/afb-event-v2\"},\"afb-reply-v" + "2\":{\"title\":\"Generic response.\",\"type\":\"object\",\"required\":[\"" + "jtype\",\"request\"],\"properties\":{\"jtype\":{\"type\":\"string\",\"co" + "nst\":\"afb-reply\"},\"request\":{\"type\":\"object\",\"required\":[\"st" + "atus\"],\"properties\":{\"status\":{\"type\":\"string\"},\"info\":{\"typ" + "e\":\"string\"},\"token\":{\"type\":\"string\"},\"uuid\":{\"type\":\"str" + "ing\"},\"reqid\":{\"type\":\"string\"}}},\"response\":{\"type\":\"object" + "\"}}},\"afb-event-v2\":{\"type\":\"object\",\"required\":[\"jtype\",\"ev" + "ent\"],\"properties\":{\"jtype\":{\"type\":\"string\",\"const\":\"afb-ev" + "ent\"},\"event\":{\"type\":\"string\"},\"data\":{\"type\":\"object\"}}}," + "\"endpoint_info\":{\"type\":\"object\",\"required\":[\"endpoint_id\",\"t" + "ype\",\"device_name\",\"device_uri\"],\"properties\":{\"endpoint_id\":{\"" + "type\":\"int\"},\"type\":{\"type\":\"enum\"},\"device_name\":{\"type\":\"" + "string\"},\"device_uri_type\":{\"type\":\"string\"}}},\"stream_info\":{\"" + "type\":\"object\",\"required\":[\"stream_id\",\"state\",\"mute\",\"endpo" + "int_info\"],\"properties\":{\"stream_id\":{\"type\":\"int\"},\"state\":{" + "\"type\":\"int\"},\"mute\":{\"type\":\"int\"},\"device_uri\":{\"type\":\"" + "string\"},\"$ref\":\"#/components/schemas/endpoint_info\"}}},\"x-permiss" + "ions\":{\"streamcontrol\":{\"permission\":\"urn:AGL:permission:audio:pub" + "lic:streamcontrol\"},\"endpointcontrol\":{\"permission\":\"urn:AGL:permi" + "ssion:audio:public:endpointcontrol\"},\"audiostream\":{\"permission\":\"" + "urn:AGL:permission:audio:public:audiostream\"},\"soundevent\":{\"permiss" + "ion\":\"urn:AGL:permission:audio:public:soundevent\"}},\"responses\":{\"" + "200\":{\"description\":\"A complex object array response\",\"content\":{" + "\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/afb-re" + "ply\"}}}},\"400\":{\"description\":\"Invalid arguments\"}}},\"paths\":{\"" + "/get_endpoints\":{\"description\":\"Retrieve array of available audio en" + "dpoints\",\"get\":{\"parameters\":[{\"in\":\"query\",\"name\":\"audio_ro" + "le\",\"required\":true,\"schema\":{\"type\":\"string\"}},{\"in\":\"query" + "\",\"name\":\"endpoint_type\",\"required\":true,\"schema\":{\"type\":\"e" + "num\"}}],\"responses\":{\"200\":{\"$ref\":\"#/components/responses/200\"" + ",\"response\":{\"description\":\"Array of endpoint info structures\",\"t" + "ype\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/endpoint_info" + "\"}}},\"400\":{\"$ref\":\"#/components/responses/400\"}}}},\"/stream_ope" + "n\":{\"description\":\"Request opening a stream\",\"get\":{\"x-permissio" + "ns\":{\"$ref\":\"#/components/x-permissions/audiostream\"},\"parameters\"" + ":[{\"in\":\"query\",\"name\":\"audio_role\",\"required\":true,\"schema\"" + ":{\"type\":\"string\"}},{\"in\":\"query\",\"name\":\"endpoint_type\",\"r" + "equired\":true,\"schema\":{\"type\":\"enum\"}},{\"in\":\"query\",\"name\"" + ":\"endpoint_id\",\"required\":false,\"schema\":{\"type\":\"int\"}}],\"re" + "sponses\":{\"200\":{\"$ref\":\"#/components/responses/200\",\"response\"" + ":{\"description\":\"Stream information structure\",\"$ref\":\"#/componen" + "ts/schemas/stream_info\"}},\"400\":{\"$ref\":\"#/components/responses/40" + "0\"}}}},\"/stream_close\":{\"description\":\"Request closing a stream\"," + "\"get\":{\"x-permissions\":{\"$ref\":\"#/components/x-permissions/audios" + "tream\"},\"parameters\":[{\"in\":\"query\",\"name\":\"stream_id\",\"requ" + "ired\":false,\"schema\":{\"type\":\"int\"}}],\"responses\":{\"200\":{\"$" + "ref\":\"#/components/responses/200\"},\"400\":{\"$ref\":\"#/components/r" + "esponses/400\"}}}},\"/set_stream_state\":{\"description\":\"Change strea" + "m active and/or mute state\",\"get\":{\"x-permissions\":{\"$ref\":\"#/co" + "mponents/x-permissions/streamcontrol\"},\"parameters\":[{\"in\":\"query\"" + ",\"name\":\"stream_id\",\"required\":false,\"schema\":{\"type\":\"int\"}" + "},{\"in\":\"query\",\"name\":\"state\",\"required\":false,\"schema\":{\"" + "type\":\"int\"}},{\"in\":\"query\",\"name\":\"mute\",\"required\":false," + "\"schema\":{\"type\":\"int\"}}],\"responses\":{\"200\":{\"$ref\":\"#/com" + "ponents/responses/200\"},\"400\":{\"$ref\":\"#/components/responses/400\"" + "}}}},\"/get_stream_info\":{\"description\":\"Retrieve stream information" + "\",\"get\":{\"parameters\":[{\"in\":\"query\",\"name\":\"stream_id\",\"r" + "equired\":true,\"schema\":{\"type\":\"int\"}}],\"responses\":{\"200\":{\"" + "$ref\":\"#/components/responses/200\",\"response\":{\"description\":\"St" + "ream information structure\",\"$ref\":\"#/components/schemas/stream_info" + "\"}},\"400\":{\"$ref\":\"#/components/responses/400\"}}}},\"/volume\":{\"" + "description\":\"Set or get volume on endpoint\",\"get\":{\"x-permissions" + "\":{\"$ref\":\"#/components/x-permissions/endpointcontrol\"},\"parameter" + "s\":[{\"in\":\"query\",\"name\":\"endpoint_type\",\"required\":true,\"sc" + "hema\":{\"type\":\"enum\"}},{\"in\":\"query\",\"name\":\"endpoint_id\",\"" + "required\":true,\"schema\":{\"type\":\"int\"}},{\"in\":\"query\",\"name\"" + ":\"volume\",\"required\":false,\"schema\":{\"type\":\"string\"}}],\"resp" + "onses\":{\"200\":{\"$ref\":\"#/components/responses/200\"},\"400\":{\"$r" + "ef\":\"#/components/responses/400\"}}}},\"/get_endpoint_info\":{\"descri" + "ption\":\"Retrieve endpoint information including its properties\",\"get" + "\":{\"parameters\":[{\"in\":\"query\",\"name\":\"endpoint_type\",\"requi" + "red\":true,\"schema\":{\"type\":\"enum\"}},{\"in\":\"query\",\"name\":\"" + "endpoint_id\",\"required\":true,\"schema\":{\"type\":\"int\"}}],\"respon" + "ses\":{\"200\":{\"$ref\":\"#/components/responses/200\"},\"400\":{\"$ref" + "\":\"#/components/responses/400\"}}}},\"/property\":{\"description\":\"S" + "et/get endpoint property value\",\"get\":{\"x-permissions\":{\"$ref\":\"" + "#/components/x-permissions/endpointcontrol\"},\"parameters\":[{\"in\":\"" + "query\",\"name\":\"endpoint_type\",\"required\":true,\"schema\":{\"type\"" + ":\"enum\"}},{\"in\":\"query\",\"name\":\"endpoint_id\",\"required\":true" + ",\"schema\":{\"type\":\"int\"}},{\"in\":\"query\",\"name\":\"property_na" + "me\",\"required\":true,\"schema\":{\"type\":\"string\"}},{\"in\":\"query" + "\",\"name\":\"value\",\"required\":false,\"schema\":{\"type\":\"string\"" + "}}],\"responses\":{\"200\":{\"$ref\":\"#/components/responses/200\"},\"4" + "00\":{\"$ref\":\"#/components/responses/400\"}}}},\"/get_list_actions\":" + "{\"description\":\"Retrieve a list of supported actions for a particular" + " audio role\",\"get\":{\"parameters\":[{\"in\":\"query\",\"name\":\"audi" + "o_role\",\"required\":true,\"schema\":{\"type\":\"string\"}}],\"response" + "s\":{\"200\":{\"$ref\":\"#/components/responses/200\"},\"400\":{\"$ref\"" + ":\"#/components/responses/400\"}}}},\"/post_action\":{\"description\":\"" + "Post sound or audio device related action event (extendable mechanism)\"" + ",\"get\":{\"x-permissions\":{\"$ref\":\"#/components/x-permissions/sound" + "event\"},\"parameters\":[{\"in\":\"query\",\"name\":\"action_name\",\"re" + "quired\":true,\"schema\":{\"type\":\"string\"}},{\"in\":\"query\",\"name" + "\":\"audio_role\",\"required\":true,\"schema\":{\"type\":\"string\"}},{\"" + "in\":\"query\",\"name\":\"media_name\",\"required\":false,\"schema\":{\"" + "type\":\"string\"}},{\"in\":\"query\",\"name\":\"action_context\",\"requ" + "ired\":false,\"schema\":{\"type\":\"object\"}}],\"responses\":{\"200\":{" + "\"$ref\":\"#/components/responses/200\"},\"400\":{\"$ref\":\"#/component" + "s/responses/400\"}}}},\"/event_subscription\":{\"description\":\"Subscri" + "be to audio high level events\",\"get\":{\"parameters\":[{\"in\":\"query" + "\",\"name\":\"events\",\"required\":true,\"schema\":{\"type\":\"array\"," + "\"items\":{\"type\":\"string\"}}},{\"in\":\"query\",\"name\":\"subscribe" + "\",\"required\":true,\"schema\":{\"type\":\"int\"}}],\"responses\":{\"20" + "0\":{\"$ref\":\"#/components/responses/200\"},\"400\":{\"$ref\":\"#/comp" + "onents/responses/400\"}}}}}}" +; + +static const struct afb_auth _afb_auths_v2_ahl_4a[] = { + { .type = afb_auth_Permission, .text = "urn:AGL:permission:audio:public:audiostream" }, + { .type = afb_auth_Permission, .text = "urn:AGL:permission:audio:public:streamcontrol" }, + { .type = afb_auth_Permission, .text = "urn:AGL:permission:audio:public:endpointcontrol" }, + { .type = afb_auth_Permission, .text = "urn:AGL:permission:audio:public:soundevent" } +}; + + void audiohlapi_get_endpoints(struct afb_req req); + void audiohlapi_stream_open(struct afb_req req); + void audiohlapi_stream_close(struct afb_req req); + void audiohlapi_set_stream_state(struct afb_req req); + void audiohlapi_get_stream_info(struct afb_req req); + void audiohlapi_volume(struct afb_req req); + void audiohlapi_get_endpoint_info(struct afb_req req); + void audiohlapi_property(struct afb_req req); + void audiohlapi_get_list_actions(struct afb_req req); + void audiohlapi_post_action(struct afb_req req); + void audiohlapi_event_subscription(struct afb_req req); + +static const struct afb_verb_v2 _afb_verbs_v2_ahl_4a[] = { + { + .verb = "get_endpoints", + .callback = audiohlapi_get_endpoints, + .auth = NULL, + .info = "Retrieve array of available audio endpoints", + .session = AFB_SESSION_NONE_V2 + }, + { + .verb = "stream_open", + .callback = audiohlapi_stream_open, + .auth = &_afb_auths_v2_ahl_4a[0], + .info = "Request opening a stream", + .session = AFB_SESSION_NONE_V2 + }, + { + .verb = "stream_close", + .callback = audiohlapi_stream_close, + .auth = &_afb_auths_v2_ahl_4a[0], + .info = "Request closing a stream", + .session = AFB_SESSION_NONE_V2 + }, + { + .verb = "set_stream_state", + .callback = audiohlapi_set_stream_state, + .auth = &_afb_auths_v2_ahl_4a[1], + .info = "Change stream active and/or mute state", + .session = AFB_SESSION_NONE_V2 + }, + { + .verb = "get_stream_info", + .callback = audiohlapi_get_stream_info, + .auth = NULL, + .info = "Retrieve stream information", + .session = AFB_SESSION_NONE_V2 + }, + { + .verb = "volume", + .callback = audiohlapi_volume, + .auth = &_afb_auths_v2_ahl_4a[2], + .info = "Set or get volume on endpoint", + .session = AFB_SESSION_NONE_V2 + }, + { + .verb = "get_endpoint_info", + .callback = audiohlapi_get_endpoint_info, + .auth = NULL, + .info = "Retrieve endpoint information including its properties", + .session = AFB_SESSION_NONE_V2 + }, + { + .verb = "property", + .callback = audiohlapi_property, + .auth = &_afb_auths_v2_ahl_4a[2], + .info = "Set/get endpoint property value", + .session = AFB_SESSION_NONE_V2 + }, + { + .verb = "get_list_actions", + .callback = audiohlapi_get_list_actions, + .auth = NULL, + .info = "Retrieve a list of supported actions for a particular audio role", + .session = AFB_SESSION_NONE_V2 + }, + { + .verb = "post_action", + .callback = audiohlapi_post_action, + .auth = &_afb_auths_v2_ahl_4a[3], + .info = "Post sound or audio device related action event (extendable mechanism)", + .session = AFB_SESSION_NONE_V2 + }, + { + .verb = "event_subscription", + .callback = audiohlapi_event_subscription, + .auth = NULL, + .info = "Subscribe to audio high level events", + .session = AFB_SESSION_NONE_V2 + }, + { + .verb = NULL, + .callback = NULL, + .auth = NULL, + .info = NULL, + .session = 0 + } +}; + +const struct afb_binding_v2 afbBindingV2 = { + .api = "ahl-4a", + .specification = _afb_description_v2_ahl_4a, + .info = "Audio high level API for AGL applications", + .verbs = _afb_verbs_v2_ahl_4a, + .preinit = NULL, + .init = AhlBindingInit, + .onevent = AhlOnEvent, + .noconcurrency = 0 +}; + diff --git a/src/ahl-apidef.json b/ahl-binding/ahl-apidef.json index 15ee186..59f7a32 100644 --- a/src/ahl-apidef.json +++ b/ahl-binding/ahl-apidef.json @@ -5,7 +5,7 @@ "title": "audiohighlevel", "version": "1.0", "x-binding-c-generator": { - "api": "audiohl", + "api": "ahl-4a", "version": 2, "prefix": "audiohlapi_", "postfix": "", diff --git a/src/ahl-binding.c b/ahl-binding/ahl-binding.c index c205c8e..c205c8e 100644 --- a/src/ahl-binding.c +++ b/ahl-binding/ahl-binding.c diff --git a/src/ahl-binding.h b/ahl-binding/ahl-binding.h index 405144d..405144d 100644 --- a/src/ahl-binding.h +++ b/ahl-binding/ahl-binding.h diff --git a/src/ahl-config.c b/ahl-binding/ahl-config.c index f076d14..c60cb9c 100644 --- a/src/ahl-config.c +++ b/ahl-binding/ahl-config.c @@ -18,6 +18,8 @@ #include <string.h> #include <json-c/json.h> #include "wrap-json.h" +#include "filescan-utils.h" + #include "ahl-binding.h" extern AHLCtxT g_AHLCtx; @@ -38,21 +40,63 @@ static InterruptBehaviorT InterruptBehaviorToEnum(char * in_pInterruptBehaviorSt return INTERRUPTBEHAVIOR_MAXVALUE; } +static json_object* CtlConfigScan(const char *dirList, const char *prefix) { + char controlFile [CONTROL_MAXPATH_LEN]; + strncpy(controlFile, prefix, CONTROL_MAXPATH_LEN); + strncat(controlFile, GetBinderName(), CONTROL_MAXPATH_LEN); + + // search for default dispatch config file + json_object* responseJ = ScanForConfig(dirList, CTL_SCAN_RECURSIVE, controlFile, ".json"); + + return responseJ; +} + +static char* CtlConfigSearch(const char *dirList, const char *prefix) { + int index, err; + + // search for default dispatch config file + json_object* responseJ = CtlConfigScan (dirList, prefix); + if (!responseJ) return NULL; + + // We load 1st file others are just warnings + for (index = 0; index < json_object_array_length(responseJ); index++) { + json_object *entryJ = json_object_array_get_idx(responseJ, index); + + char *filename; + char*fullpath; + err = wrap_json_unpack(entryJ, "{s:s, s:s !}", "fullpath", &fullpath, "filename", &filename); + if (err) { + AFB_ERROR("CTL-INIT HOOPs invalid JSON entry= %s", json_object_get_string(entryJ)); + return NULL; + } + + if (index == 0) { + char filepath[CONTROL_MAXPATH_LEN]; + strncpy(filepath, fullpath, sizeof (filepath)); + strncat(filepath, "/", sizeof (filepath)); + strncat(filepath, filename, sizeof (filepath)); + return (strdup(filepath)); + } + } + // no config found + return NULL; +} + int ParseHLBConfig() { char * versionStr = NULL; - json_object * jAudioRoles = NULL; + json_object * jAudioRoles = NUL L; json_object * jHALList = NULL; char * policyModule = NULL; - // TODO: This should be retrieved from binding startup arguments - char configfile_path[256]; - if(getenv("AHL_CONFIG_FILE") == NULL) - { - AFB_ERROR("Please Set Environnement Variable AHL_CONFIG_FILE"); - return AHL_FAIL; - } + const char *dirList=getenv("AAAA_CONFIG_PATH"); + if (!dirList) dirList=CONTROL_CONFIG_PATH; - sprintf(configfile_path, "%s", getenv("AHL_CONFIG_FILE")); + const char *configfile_path =CtlConfigSearch(dirList, "ahl-"); + if (!configfile_path) { + AFB_ERROR("Error: No control-* config found invalid JSON %s ", dirList); + return 1; + } + AFB_INFO("High-level config file -> %s\n", configfile_path); // Open configuration file diff --git a/src/ahl-deviceenum.c b/ahl-binding/ahl-deviceenum.c index 763b2ca..763b2ca 100644 --- a/src/ahl-deviceenum.c +++ b/ahl-binding/ahl-deviceenum.c diff --git a/src/ahl-json.c b/ahl-binding/ahl-json.c index 5e8bf97..5e8bf97 100644 --- a/src/ahl-json.c +++ b/ahl-binding/ahl-json.c diff --git a/src/ahl-json.h b/ahl-binding/ahl-json.h index ffd683a..ffd683a 100644 --- a/src/ahl-json.h +++ b/ahl-binding/ahl-json.h diff --git a/conf.d/app-templates/samples.d/CMakeLists.txt.sample b/ahl-policy/CMakeLists.txt index b485097..aa3ab9c 100644 --- a/conf.d/app-templates/samples.d/CMakeLists.txt.sample +++ b/ahl-policy/CMakeLists.txt @@ -1,7 +1,7 @@ ########################################################################### # Copyright 2015, 2016, 2017 IoT.bzh # -# author: Romain Forlot <romain.forlot@iot.bzh> +# author: Fulup Ar Foll <fulup@iot.bzh> # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -16,6 +16,25 @@ # limitations under the License. ########################################################################### -CMAKE_MINIMUM_REQUIRED(VERSION 3.3) -include(${CMAKE_CURRENT_SOURCE_DIR}/conf.d/cmake/config.cmake) +# Add target to project dependency list +PROJECT_TARGET_ADD(ahl-policy) + + # Define project Targets + ADD_LIBRARY(${TARGET_NAME} STATIC ahl-policy.c) + + # Define target includes + TARGET_INCLUDE_DIRECTORIES(${TARGET_NAME} + PUBLIC ${GLIB_PKG_INCLUDE_DIRS} + ) + + # Library dependencies (include updates automatically) + TARGET_LINK_LIBRARIES(${TARGET_NAME} + ahl-utilities + afb-utilities + ) + + # Define target includes for this target client + TARGET_INCLUDE_DIRECTORIES(${TARGET_NAME} + PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} + ) diff --git a/src/ahl-interface.h b/ahl-policy/ahl-interface.h index fc0ac68..fc0ac68 100644 --- a/src/ahl-interface.h +++ b/ahl-policy/ahl-interface.h diff --git a/src/ahl-policy.c b/ahl-policy/ahl-policy.c index 4a34ed8..4a34ed8 100644 --- a/src/ahl-policy.c +++ b/ahl-policy/ahl-policy.c diff --git a/src/ahl-policy.h b/ahl-policy/ahl-policy.h index 0200973..0200973 100644 --- a/src/ahl-policy.h +++ b/ahl-policy/ahl-policy.h diff --git a/afb-utilities/CMakeLists.txt b/ahl-utilities/CMakeLists.txt index fe260fa..1ef3bfa 100644 --- a/afb-utilities/CMakeLists.txt +++ b/ahl-utilities/CMakeLists.txt @@ -1,7 +1,7 @@ ########################################################################### # Copyright 2015, 2016, 2017 IoT.bzh # -# author: Fulup Ar Foll <rfulup@iot.bzh> +# author: Fulup Ar Foll <fulup@iot.bzh> # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -16,22 +16,24 @@ # limitations under the License. ########################################################################### -# This is a CMakeLists.txt file meant to be included as submodule into an AGL -# app using app-templates subdmodules # Add target to project dependency list -PROJECT_TARGET_ADD(afb-utilities) +PROJECT_TARGET_ADD(ahl-utilities) - # Define targets - ADD_LIBRARY(${TARGET_NAME} STATIC wrap-json.c filescan-utils.c) + # Define project Targets + ADD_LIBRARY(${TARGET_NAME} STATIC ahl-policy-utils.c) - # Library properties - SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES - OUTPUT_NAME ${TARGET_NAME} + # Define target includes + TARGET_INCLUDE_DIRECTORIES(${TARGET_NAME} + PUBLIC ${GLIB_PKG_INCLUDE_DIRS} ) - # Define target includes + # Library dependencies (include updates automatically) + TARGET_LINK_LIBRARIES(${TARGET_NAME} + afb-utilities + ) + + # Define target includes for this target client TARGET_INCLUDE_DIRECTORIES(${TARGET_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ) - diff --git a/src/ahl-policy-utils.c b/ahl-utilities/ahl-policy-utils.c index 195c591..195c591 100755 --- a/src/ahl-policy-utils.c +++ b/ahl-utilities/ahl-policy-utils.c diff --git a/src/ahl-policy-utils.h b/ahl-utilities/ahl-policy-utils.h index 3c20020..3c20020 100755 --- a/src/ahl-policy-utils.h +++ b/ahl-utilities/ahl-policy-utils.h diff --git a/conf.d/app-templates b/conf.d/app-templates new file mode 160000 +Subproject c881d86fc8852a2b2215856d3503aba192c0f4e diff --git a/conf.d/app-templates/LICENSE b/conf.d/app-templates/LICENSE deleted file mode 100644 index 93b07d3..0000000 --- a/conf.d/app-templates/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2017 claneys - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/conf.d/app-templates/README.md b/conf.d/app-templates/README.md deleted file mode 100644 index 96dfb3c..0000000 --- a/conf.d/app-templates/README.md +++ /dev/null @@ -1,382 +0,0 @@ -# AGL CMake template - -Files used to build an application, or binding, project with the -AGL Application Framework. - -To build your AGL project using these templates, you have to install -them within your project and adjust compilation option in `config.cmake`. -For technical reasons, you also have to specify **cmake** target in -sub CMakeLists.txt installed. Make a globbing search to find source files -isn't recommended now to handle project build especially in a multiuser -project because CMake will not be aware of new or removed source files. - -You'll find usage samples here: - -- [helloworld-service](https://github.com/iotbzh/helloworld-service) -- [low-level-can-service](https://gerrit.automotivelinux.org/gerrit/apps/low-level-can-service) -- [high-level-viwi-service](https://github.com/iotbzh/high-level-viwi-service) -- [audio-binding](https://github.com/iotbzh/audio-binding) -- [unicens2-binding](https://github.com/iotbzh/unicens2-binding) - -## Quickstart - -### Initialization - -To use these templates files on your project just install the reference files using -**git submodule** then use `config.cmake` file to configure your project specificities : - -```bash -git submodule add https://gerrit.automotivelinux.org/gerrit/p/apps/app-templates.git conf.d/app-templates -mkdir conf.d/cmake -cp conf.d/app-templates/cmake/config.cmake.sample conf.d/cmake/config.cmake -``` - -Edit the copied config.cmake file to fit your needs. - -Now, create your top CMakeLists.txt file which include `config.cmake` file. - -An example is available in **app-templates** submodule that you can copy and -use: - -```bash -cp conf.d/app-templates/cmake/CMakeLists.txt.sample CMakeLists.txt -``` - -### Create your CMake targets - -For each target part of your project, you need to use ***PROJECT_TARGET_ADD*** -to include this target to your project. - -Using it, make available the cmake variable ***TARGET_NAME*** until the next -***PROJECT_TARGET_ADD*** is invoked with a new target name. - -So, typical usage defining a target is: - -```cmake -PROJECT_TARGET_ADD(SuperExampleName) --> Adding target to your project - -add_executable/add_library(${TARGET_NAME}.... --> defining your target sources - -SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES.... --> fit target properties -for macros usage - -INSTALL(TARGETS ${TARGET_NAME}.... -``` - -### Targets PROPERTIES - -You should set properties on your targets that will be used to package your -apps in a widget file that could be installed on an AGL system. - -Specify what is the type of your targets that you want to be included in the -widget package with the property **LABELS**: - -Choose between: - -- **BINDING**: Shared library that be loaded by the AGL Application Framework -- **BINDINGV2**: Shared library that be loaded by the AGL Application Framework. - This has to be accompagnied with a JSON file named like the *${OUTPUT_NAME}-apidef* of - the target that describe the API with OpenAPI syntax (e.g: *mybinding-apidef*). - Or you can choose the name by setting the *CACHE* cmake variable *OPENAPI_DEF* - (***CAUTION***: setting a CACHE variable is needed, or set a normal variable - with the *PARENT_SCOPE* option to make it visible for the parent scope - where the target is defined) JSON file will be used to generate header file - using `afb-genskel` tool. -- **HTDOCS**: Root directory of a web app. This target has to build its - directory and puts its files in the ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME} -- **DATA**: Resources used by your application. This target has to build its - directory and puts its files in the ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME} -- **EXECUTABLE**: Entry point of your application executed by the AGL - Application Framework - -```cmake -SET_TARGET_PROPERTIES(${TARGET_NAME} - PREFIX "afb-" - LABELS "BINDING" - OUTPUT_NAME "file_output_name") -``` - -> **TIP** you should use the prefix _afb-_ with your **BINDING* targets which -> stand for **Application Framework Binding**. - -## More details: Typical project architecture - -A typical project architecture would be : - -```tree -<project-root-path> -│ -├── conf.d/ -│ ├── autobuild/ -│ │ ├── agl -│ │ │ └── autobuild -│ │ ├── linux -│ │ │ └── autobuild -│ │ └── windows -│ │ └── autobuild -│ ├── app-templates/ -│ │ ├── README.md -│ │ ├── autobuild/ -│ │ │ ├── agl -│ │ │ │ └── autobuild.in -│ │ │ ├── linux -│ │ │ │ └── autobuild.in -│ │ │ └── windows -│ │ │ └── autobuild.in -│ │ ├── cmake/ -│ │ │ ├── config.cmake.sample -│ │ │ ├── export.map -│ │ │ └── macros.cmake -│ │ ├── deb/ -│ │ │ └── config.deb.in -│ │ ├── rpm/ -│ │ │ └── config.spec.in -│ │ └── wgt/ -│ │ ├── config.xml.in -│ │ ├── config.xml.in.sample -│ │ ├── icon-default.png -│ │ ├── icon-html5.png -│ │ ├── icon-native.png -│ │ ├── icon-qml.png -│ │ └── icon-service.png -│ ├── packaging/ -│ │ ├── config.spec -│ │ └── config.deb -│ ├── cmake -│ │ └── config.cmake -│ └── wgt -│ └── config.xml.in -├── <libs> -├── <target> -│ └── <files> -├── <target> -│ └── <file> -└── <target> - └── <files> -``` - -| # | Parent | Description | -| - | -------| ----------- | -| \<root-path\> | - | Path to your project. Hold master CMakeLists.txt and general files of your projects. | -| conf.d | \<root-path\> | Holds needed files to build, install, debug, package an AGL app project | -| app-templates | conf.d | Git submodule to app-templates AGL repository which provides CMake helpers macros library, and build scripts. config.cmake is a copy of config.cmake.sample configured for the projects. SHOULD NOT BE MODIFIED MANUALLY !| -| autobuild | conf.d | Scripts generated from app-templates to build packages the same way for differents platforms.| -| cmake | conf.d | Contains at least config.cmake file modified from the sample provided in app-templates submodule. | -| wgt | conf.d | Contains at least config.xml.in template file modified from the sample provided in app-templates submodule for the needs of project (See config.xml.in.sample file for more details). | -| packaging | conf.d | Contains output files used to build packages. | -| \<libs\> | \<root-path\> | External dependencies libraries. This isn't to be used to include header file but build and link statically specifics libraries. | Library sources files. Can be a decompressed library archive file or project fork. | -| \<target\> | \<root-path\> | A target to build, typically library, executable, etc. | - -### Update app-templates submodule - -You may have some news bug fixes or features available from app-templates -repository that you want. To update your submodule proceed like the following: - -```bash -git submodule update --remote -git commit -s conf.d/app-templates -``` - -This will update the submodule to the HEAD of master branch repository. - -You could just want to update at a specified repository tag or branch or commit -, here are the method to do so: - -```bash -cd conf.d/app-templates -# Choose one of the following depending what you want -git checkout <tag_name> -git checkout --detach <branch_name> -git checkout --detach <commit_id> -# Then commit -cd ../.. -git commit -s conf.d/app-templates -``` - -### Build a widget - -#### config.xml.in file - -To build a widget you need a _config.xml_ file describing what is your apps and -how Application Framework would launch it. This repo provide a simple default -file _config.xml.in_ that should work for simple application without -interactions with others bindings. - -It is recommanded that you use the sample one which is more complete. You can -find it at the same location under the name _config.xml.in.sample_ (stunning -isn't it). Just copy the sample file to your _conf.d/wgt_ directory and name it -_config.xml.in_, then edit it to fit your needs. - -> ***CAUTION*** : The default file is only meant to be use for a -> simple widget app, more complicated ones which needed to export -> their api, or ship several app in one widget need to use the provided -> _config.xml.in.sample_ which had all new Application Framework -> features explained and examples. - -#### Using cmake template macros - -To leverage all cmake templates features, you have to specify ***properties*** -on your targets. Some macros will not works without specifying which is the -target type. - -As the type is not always specified for some custom targets, like an ***HTML5*** -application, macros make the difference using ***LABELS*** property. - -Choose between: - -- **BINDING**: Shared library that be loaded by the AGL Application Framework -- **BINDINGV2**: Shared library that be loaded by the AGL Application Framework. - This has to be accompagnied with a JSON file named like the *${OUTPUT_NAME}-apidef* of - the target that describe the API with OpenAPI syntax (e.g: *mybinding-apidef*). - Or you can choose the name by setting the *CACHE* cmake variable *OPENAPI_DEF* - (***CAUTION***: setting a CACHE variable is needed, or set a normal variable - with the *PARENT_SCOPE* option to make it visible for the parent scope - where the target is defined) JSON file will be used to generate header file - using `afb-genskel` tool. -- **HTDOCS**: Root directory of a web app. This target has to build its - directory and puts its files in the ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME} -- **DATA**: Resources used by your application. This target has to build its - directory and puts its files in the ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME} -- **EXECUTABLE**: Entry point of your application executed by the AGL - Application Framework - -Example: - -```cmake -SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES - LABELS "HTDOCS" - OUTPUT_NAME dist.prod - ) -``` - -If your target output is not named as the ***TARGET_NAME***, you need to specify -***OUTPUT_NAME*** property that will be used by the ***populate_widget*** macro. - -Use the ***populate_widget*** macro as latest statement of your target -definition. Then at the end of your project definition you should use the macro -***build_widget*** that make an archive from the populated widget tree using the -`wgtpkg-pack` Application Framework tools. - -## Macro reference - -### PROJECT_TARGET_ADD - -Typical usage would be to add the target to your project using macro -`PROJECT_TARGET_ADD` with the name of your target as parameter. - -Example: - -```cmake -PROJECT_TARGET_ADD(low-can-demo) -``` - -> ***NOTE***: This will make available the variable `${TARGET_NAME}` -> set with the specificied name. This variable will change at the next call -> to this macros. - -### project_subdirs_add - -This macro will search in all subfolder any `CMakeLists.txt` file. If found then -it will be added to your project. This could be use in an hybrid application by -example where the binding lay in a sub directory. - -Usage : - -```cmake -project_subdirs_add() -``` - -You also can specify a globbing pattern as argument to filter which folders -will be looked for. - -To filter all directories that begin with a number followed by a dash the -anything: - -```cmake -project_subdirs_add("[0-9]-*") -``` - -## Advanced customization - -### Including additionnals cmake files - -Advanced tuning is possible using addionnals cmake files that are included -automatically from some specifics locations. They are included in that order: - -- Project CMake files normaly located in _<project-root-path>/conf.d/app-templates/cmake/cmake.d_ -- Home CMake files located in _$HOME/.config/app-templates/cmake.d_ -- System CMake files located in _/etc/app-templates/cmake.d_ - -CMake files has to be named using the following convention: `XX-common-*.cmake` -or `XX-${PROJECT_NAME}-*.cmake`, where `XX` are numbers, `*` file name -(ie. `99-common-my_customs.cmake`). - -> **NOTE** You need to specify after numbers that indicate include order, to -which project that file applies, if it applies to all project then use keyword -`common`. - -So, saying that you should be aware that every normal cmake variables used at -project level could be overwrited by home or system located cmake files if -variables got the same name. Exceptions are cached variables set using -**CACHE** keyword: - -Example: - -```cmake -set(VARIABLE_NAME 'value string random' CACHE STRING 'docstring') -``` - -### Include customs templated scripts - -As well as for additionnals cmake files you can include your own templated -scripts that will be passed to cmake command `configure_file`. - -Just create your own script to the following directories: - -- Home location in _$HOME/.config/app-templates/scripts_ -- System location in _/etc/app-templates/scripts_ - -Scripts only needs to use the extension `.in` to be parsed and configured by -CMake command. - -## Autobuild script usage - -### Generation - -To be integrated in the Yocto build workflow you have to generate `autobuild` -scripts using _autobuild_ target. - -To generate those scripts proceeds: - -```bash -mkdir -p build -cd build -cmake .. && make autobuild -``` - -You should see _conf.d/autobuild/agl/autobuild_ file now. - -### Available targets - -Here are the available targets available from _autobuild_ scripts: - -- **clean** : clean build directory from object file and targets results. -- **distclean** : delete build directory -- **configure** : generate project Makefile from CMakeLists.txt files. -- **build** : compile all project targets. -- **package** : build and output a wgt package. - -You can specify variables that modify the behavior of compilation using -the following variables: - -- **CONFIGURE_ARGS** : Variable used at **configure** time. -- **BUILD_ARGS** : Variable used at **build** time. -- **DEST** : Directory where to output ***wgt*** file. - -Variable as to be in CMake format. (ie: BUILD_ARGS="-DC_FLAGS='-g -O2'") - -Usage example: - -```bash -./conf.d/autobuild/wgt/autobuild package DEST=/tmp -``` diff --git a/conf.d/app-templates/book.json b/conf.d/app-templates/book.json deleted file mode 100644 index dafc6ae..0000000 --- a/conf.d/app-templates/book.json +++ /dev/null @@ -1,94 +0,0 @@ -{ - "title": "CMake Application templates", - "subtitle": "Developer Documentation", - "description": "CMake templates used to build an AGL apps and widget", - "keywords": "AGL, Development, Iotbzh", - "author": "IoT.Bzh Team", - "website": "http://iot.bzh", - "published": "July 2017", - "version": "1.0", - - "gitbook": "3.2.2", - "root": "docs", - "pdf": { - "fontFamily": "Verdana", - "fontSize": 12, - "paperSize": "a4", - "pageBreaksBefore": "//h:div[@class=\"page-break\"]" - }, - "styles": { - "website": "resources/ebook.css", - "ebook": "resources/ebook.css", - "pdf": "resources/ebook.css" - }, - - "hidepageheaders": [2, 3], - "hidepagefooters": [2, 3], - - "plugins": [ - "regexplace" - ], - "pluginsConfig": { - "regexplace": { - "removeFirstPartsInSectionNumber": true, - "substitutes": [{ - "pattern": "<!-- pagebreak -->", - "flags": "g", - "substitute": "<div class=\"page-break\"></div>" - }, - { - "pattern": "<!-- clear -->", - "flags": "g", - "substitute": "<div class=\"clear\"></div>" - }, - { - "pattern": "<!-- nopagebreak -->", - "flags": "g", - "substitute": "<div class=\"nopb\">" - }, - { - "pattern": "<!-- endnopagebreak -->", - "flags": "g", - "substitute": "</div>" - }, - { - "pattern": "<!-- note -->", - "flags": "g", - "substitute": "<div class=\"note\">" - }, - { - "pattern": "<!-- endnote -->", - "flags": "g", - "substitute": "</div>" - }, - { - "pattern": "!\\[(.*?)\\]\\((.*?)(?:\\s+\"(.*)\")?\\){0,}{caption=1([^\\}]*)}", - "flags": "gmi", - "substitute": "<figure id=\"fig_PAGE_LEVEL_._INDEX_\"><img $3 alt=\"$1\" title=\"$1\" href=\"$2\"><figcaption></figcaption></figure>", - "decode": true - }, - { - "pattern": "<img ([^>]*) {0,}\/{0,}> {0,}{caption=1([^\\}]*)}", - "flags": "g", - "substitute": "<figure id=\"fig_PAGE_LEVEL_._INDEX_\"><img $2 $1><figcaption></figcaption></figure>", - "decode": true - }, - { - "pattern": "<img (.*)alt=\"([^\"]*)\"(.*) {0,1}\/{0,1}><figcaption></figcaption>", - "flags": "g", - "substitute": "<img$1alt=\"$2\"$3><figcaption><span>Picture _PAGE_LEVEL_._INDEX_</span>: $2</figcaption>", - "store": { - "substitute": "<a href=\"_PAGE_PATH_#fig_PAGE_LEVEL_._INDEX_\">Pic. _PAGE_LEVEL_._INDEX_</a> <span>$2</span>", - "variable_name": "pictures" - } - }, - { - "pattern": "<img ([^>]*)> {0,}{style {1,}([^}]*)}", - "flags": "g", - "substitute": "<img $1 style=\"$2\">", - "decode": true - } - ] - } - } -} diff --git a/conf.d/app-templates/cmake/cmake.d/01-build_options.cmake b/conf.d/app-templates/cmake/cmake.d/01-build_options.cmake deleted file mode 100644 index 4fb10ef..0000000 --- a/conf.d/app-templates/cmake/cmake.d/01-build_options.cmake +++ /dev/null @@ -1,113 +0,0 @@ -########################################################################### -# Copyright 2015, 2016, 2017 IoT.bzh -# -# author: Fulup Ar Foll <fulup@iot.bzh> -# contrib: Romain Forlot <romain.forlot@iot.bzh> -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -########################################################################### - - -#-------------------------------------------------------------------------- -# WARNING: -# Do not change this cmake template -# Customise your preferences in "./conf.d/cmake/config.cmake" -#-------------------------------------------------------------------------- - -# (BUG!!!) as PKG_CONFIG_PATH does not work [should be en env variable] -set(PKG_CONFIG_USE_CMAKE_PREFIX_PATH ON CACHE BOOLEAN "Flag for using prefix path") - -INCLUDE(FindPkgConfig) -INCLUDE(CheckIncludeFiles) -INCLUDE(CheckLibraryExists) -INCLUDE(GNUInstallDirs) - -set(CMAKE_BUILD_TYPE Debug CACHE STRING "the type of build") -set(CMAKE_POSITION_INDEPENDENT_CODE ON) -set(CMP0048 1) - -# Default compilation options -############################################################################ -link_libraries(-Wl,--as-needed -Wl,--gc-sections) -set(COMPILE_OPTIONS -Wall -Wextra -Wconversion -Wno-unused-parameter -Wno-sign-compare -Wno-sign-conversion -Werror=maybe-uninitialized -Werror=implicit-function-declaration -ffunction-sections -fdata-sections -fPIC CACHE STRING "Compilation flags") -foreach(option ${COMPILE_OPTIONS}) - add_compile_options($<$<CONFIG:PROFILING>:${option}>) -endforeach() - -# Compilation OPTIONS depending on language -######################################### -foreach(option ${COMPILE_OPTIONS}) - add_compile_options(${option}) -endforeach() -foreach(option ${C_COMPILE_OPTIONS}) - add_compile_options($<$<COMPILE_LANGUAGE:C>:${option}>) -endforeach() -foreach(option ${CXX_COMPILE_OPTIONS}) - add_compile_options($<$<COMPILE_LANGUAGE:CXX>:${option}>) -endforeach() - -# Compilation option depending on CMAKE_BUILD_TYPE -################################################## -set(PROFILING_COMPILE_OPTIONS -g -O0 -pg -Wp,-U_FORTIFY_SOURCE CACHE STRING "Compilation flags for PROFILING build type.") -set(DEBUG_COMPILE_OPTIONS -g -ggdb -Wp,-U_FORTIFY_SOURCE CACHE STRING "Compilation flags for DEBUG build type.") -set(CCOV_COMPILE_OPTIONS -g -O2 --coverage CACHE STRING "Compilation flags for CCOV build type.") -set(RELEASE_COMPILE_OPTIONS -g -O2 CACHE STRING "Compilation flags for RELEASE build type.") -foreach(option ${PROFILING_COMPILE_OPTIONS}) - add_compile_options($<$<CONFIG:PROFILING>:${option}>) -endforeach() -foreach(option ${DEBUG_COMPILE_OPTIONS}) - add_compile_options($<$<CONFIG:PROFILING>:${option}>) -endforeach() -foreach(option ${CCOV_COMPILE_OPTIONS}) - add_compile_options($<$<CONFIG:PROFILING>:${option}>) -endforeach() -foreach(option ${RELEASE_COMPILE_OPTIONS}) - add_compile_options($<$<CONFIG:PROFILING>:${option}>) -endforeach() - -# Env variable overload default -if(DEFINED ENV{INSTALL_PREFIX}) - set(INSTALL_PREFIX $ENV{INSTALL_PREFIX} CACHE PATH "The path where to install") -else() - set(INSTALL_PREFIX "${CMAKE_SOURCE_DIR}/Install" CACHE PATH "The path where to install") -endif() -set(CMAKE_INSTALL_PREFIX ${INSTALL_PREFIX} CACHE STRING "Installation Prefix") - -# Loop on required package and add options -foreach (PKG_CONFIG ${PKG_REQUIRED_LIST}) - string(REGEX REPLACE "[<>]?=.*$" "" XPREFIX ${PKG_CONFIG}) - PKG_CHECK_MODULES(${XPREFIX} REQUIRED ${PKG_CONFIG}) - - INCLUDE_DIRECTORIES(${${XPREFIX}_INCLUDE_DIRS}) - list(APPEND link_libraries ${${XPREFIX}_LDFLAGS}) - add_compile_options (${${XPREFIX}_CFLAGS}) -endforeach(PKG_CONFIG) - -# Optional LibEfence Malloc debug library -IF(CMAKE_BUILD_TYPE MATCHES DEBUG) -CHECK_LIBRARY_EXISTS(efence malloc "" HAVE_LIBEFENCE) -IF(HAVE_LIBEFENCE) - MESSAGE(STATUS "Linking with ElectricFence for debugging purposes...") - SET(libefence_LIBRARIES "-lefence") - list (APPEND link_libraries ${libefence_LIBRARIES}) -ENDIF(HAVE_LIBEFENCE) -ENDIF(CMAKE_BUILD_TYPE MATCHES DEBUG) - -# set default include directories -INCLUDE_DIRECTORIES(${EXTRA_INCLUDE_DIRS}) - -# Default Linkflag -set (PKG_TEMPLATE_PREFIX ${CMAKE_SOURCE_DIR}/${PROJECT_APP_TEMPLATES_DIR} CACHE PATH "Default Package Templates Directory") -if(NOT BINDINGS_LINK_FLAG) - set(BINDINGS_LINK_FLAG "-Wl,--version-script=${PKG_TEMPLATE_PREFIX}/cmake/export.map") -endif() diff --git a/conf.d/app-templates/cmake/cmake.d/02-variables.cmake b/conf.d/app-templates/cmake/cmake.d/02-variables.cmake deleted file mode 100644 index 2491473..0000000 --- a/conf.d/app-templates/cmake/cmake.d/02-variables.cmake +++ /dev/null @@ -1,174 +0,0 @@ -########################################################################### -# Copyright 2015, 2016, 2017 IoT.bzh -# -# author: Fulup Ar Foll <fulup@iot.bzh> -# contrib: Romain Forlot <romain.forlot@iot.bzh> -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -########################################################################### - - -#-------------------------------------------------------------------------- -# WARNING: -# Do not change this cmake template -# Customise your preferences in "./etc/config.cmake" -#-------------------------------------------------------------------------- - -# Get colorized message output non Windows OS. You know bash ? :) -if(NOT WIN32) - string(ASCII 27 Esc) - set(ColourReset "${Esc}[m") - set(ColourBold "${Esc}[1m") - set(Red "${Esc}[31m") - set(Green "${Esc}[32m") - set(Yellow "${Esc}[33m") - set(Blue "${Esc}[34m") - set(Magenta "${Esc}[35m") - set(Cyan "${Esc}[36m") - set(White "${Esc}[37m") - set(BoldRed "${Esc}[1;31m") - set(BoldGreen "${Esc}[1;32m") - set(BoldYellow "${Esc}[1;33m") - set(BoldBlue "${Esc}[1;34m") - set(BoldMagenta "${Esc}[1;35m") - set(BoldCyan "${Esc}[1;36m") - set(BoldWhite "${Esc}[1;37m") -endif() - -# Native packaging name -set(NPKG_PROJECT_NAME agl-${PROJECT_NAME}) - -if(DEFINED ENV{SDKTARGETSYSROOT}) -file(STRINGS $ENV{SDKTARGETSYSROOT}/usr/include/linux/version.h LINUX_VERSION_CODE_LINE REGEX "LINUX_VERSION_CODE") -set(BUILD_ENV_SYSROOT $ENV{SDKTARGETSYSROOT}) -elseif(DEFINED ENV{PKG_CONFIG_SYSROOT_DIR}) -file(STRINGS $ENV{PKG_CONFIG_SYSROOT_DIR}/usr/include/linux/version.h LINUX_VERSION_CODE_LINE REGEX "LINUX_VERSION_CODE") -set(BUILD_ENV_SYSROOT $ENV{PKG_CONFIG_SYSROOT_DIR}) -else() -file(STRINGS /usr/include/linux/version.h LINUX_VERSION_CODE_LINE REGEX "LINUX_VERSION_CODE") -set(BUILD_ENV_SYSROOT "") -endif() - -string(REGEX MATCH "[0-9]+" LINUX_VERSION_CODE ${LINUX_VERSION_CODE_LINE}) -math(EXPR a "${LINUX_VERSION_CODE} >> 16") -math(EXPR b "(${LINUX_VERSION_CODE} >> 8) & 255") -math(EXPR c "(${LINUX_VERSION_CODE} & 255)") - -set(KERNEL_VERSION "${a}.${b}.${c}") - -# Get the os type -# Used to package .deb -set(OS_RELEASE_PATH "${BUILD_ENV_SYSROOT}/etc/os-release") -if(EXISTS ${OS_RELEASE_PATH}) - execute_process(COMMAND bash "-c" "grep -E '^ID(_LIKE)?=' ${OS_RELEASE_PATH} | tail -n 1" - OUTPUT_VARIABLE TMP_OSRELEASE - ) - - if (NOT TMP_OSRELEASE STREQUAL "") - string(REGEX REPLACE ".*=\"?([0-9a-z\._-]*)\"?\n" "\\1" OSRELEASE ${TMP_OSRELEASE}) - else() - set(OSRELEASE "NOT COMPATIBLE !") - endif() - -else() - set(OSRELEASE "NOT COMPATIBLE ! Missing ${OS_RELEASE_PATH} file.") -endif() -message(STATUS "Distribution used ${OSRELEASE}") - -# Include project configuration -# ------------------------------ -project(${PROJECT_NAME} VERSION ${PROJECT_VERSION} LANGUAGES ${PROJECT_LANGUAGES}) -set(PROJECT_LIBDIR "${CMAKE_SOURCE_DIR}/libs" CACHE PATH "Subpath to libraries") -set(PROJECT_RESOURCES "${CMAKE_SOURCE_DIR}/data" CACHE PATH "Subpath to data") - -set(AFB_TOKEN "" CACHE PATH "Default AFB_TOKEN") -set(AFB_REMPORT "1234" CACHE PATH "Default AFB_TOKEN") - -# Check GCC minimal version -if (gcc_minimal_version) -message (STATUS "${Cyan}-- Check gcc_minimal_version (found gcc version ${CMAKE_C_COMPILER_VERSION}) \ -(found g++ version ${CMAKE_CXX_COMPILER_VERSION})${ColourReset}") -if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${gcc_minimal_version} OR CMAKE_C_COMPILER_VERSION VERSION_LESS ${gcc_minimal_version}) -message(FATAL_ERROR "${Red}**** FATAL: Require at least gcc-${gcc_minimal_version} please set CMAKE_C[XX]_COMPILER") -endif() -endif(gcc_minimal_version) - -# Check Kernel mandatory version, will fail the configuration if required version not matched. -if (kernel_mandatory_version) -message (STATUS "${Cyan}-- Check kernel_mandatory_version (found kernel version ${KERNEL_VERSION})${ColourReset}") -if (KERNEL_VERSION VERSION_LESS ${kernel_mandatory_version}) -message(FATAL_ERROR "${Red}**** FATAL: Require at least ${kernel_mandatory_version} please use a recent kernel or source your SDK environment then clean and reconfigure your CMake project.") -endif (KERNEL_VERSION VERSION_LESS ${kernel_mandatory_version}) -endif(kernel_mandatory_version) - -# Check Kernel minimal version just print a Warning about missing features -# and set a definition to be used as preprocessor condition in code to disable -# incompatibles features. -if (kernel_minimal_version) -message (STATUS "${Cyan}-- Check kernel_minimal_version (found kernel version ${KERNEL_VERSION})${ColourReset}") -if (KERNEL_VERSION VERSION_LESS ${kernel_minimal_version}) -message(WARNING "${Yellow}**** Warning: Some feature(s) require at least ${kernel_minimal_version}. Please use a recent kernel or source your SDK environment then clean and reconfigure your CMake project.${ColourReset}") -else (KERNEL_VERSION VERSION_LESS ${kernel_minimal_version}) -add_definitions(-DKERNEL_MINIMAL_VERSION_OK) -endif (KERNEL_VERSION VERSION_LESS ${kernel_minimal_version}) -endif(kernel_minimal_version) - -# Project path variables -# ---------------------- -set(PKGOUT_DIR package CACHE PATH "Output directory for packages") - -# Define a default package directory -if(PKG_PREFIX) - set(PROJECT_PKG_BUILD_DIR ${PKG_PREFIX}/${PKGOUT_DIR} CACHE PATH "Application contents to be packaged") -else() - set(PROJECT_PKG_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/${PKGOUT_DIR} CACHE PATH "Application contents to be packaged") -endif() - -# Paths to templates files -set(TEMPLATE_DIR "${PKG_TEMPLATE_PREFIX}/template.d" CACHE PATH "Subpath to a directory where are stored needed files to launch on remote target to debuging purposes") - -string(REGEX REPLACE "^(.*)/.*$" "\\1" ENTRY_POINT "${PKG_TEMPLATE_PREFIX}") -set(PROJECT_PKG_ENTRY_POINT ${ENTRY_POINT}/packaging CACHE PATH "Where package build files, like rpm.spec file or config.xml, are write.") - -set(WIDGET_ICON "${ENTRY_POINT}/wgt/${PROJECT_ICON}" CACHE PATH "Path to the widget icon") -set(WIDGET_CONFIG_TEMPLATE ${TEMPLATE_DIR}/config.xml.in CACHE PATH "Path to widget config file template (config.xml.in)") - -# Path to autobuild template -set(PROJECT_TEMPLATE_AGL_AUTOBUILD_DIR ${CMAKE_SOURCE_DIR}/conf.d/autobuild/agl CACHE PATH "Subpath to a directory where are stored autobuild script") -set(PROJECT_TEMPLATE_LINUX_AUTOBUILD_DIR ${CMAKE_SOURCE_DIR}/conf.d/autobuild/linux CACHE PATH "Subpath to a directory where are stored autobuild script") - -# Archive target variables -set(ARCHIVE_OUTPUT_ARCHIVE ${PROJECT_PKG_ENTRY_POINT}/${NPKG_PROJECT_NAME}_${PROJECT_VERSION}.orig.tar) -set(ARCHIVE_OUTPUT ${ARCHIVE_OUTPUT_ARCHIVE}.gz) -set(TMP_ARCHIVE_SUBMODULE ${PROJECT_PKG_ENTRY_POINT}/${NPKG_PROJECT_NAME}-sub) -set(CMD_ARCHIVE_SUBMODULE \'git archive --verbose --prefix=${NPKG_PROJECT_NAME}-${PROJECT_VERSION}/$$path/ --format tar HEAD --output ${TMP_ARCHIVE_SUBMODULE}-$$sha1.tar\' ) - -if(OSRELEASE MATCHES "debian" AND NOT DEFINED ENV{SDKTARGETSYSROOT} AND NOT DEFINED CMAKE_TOOLCHAIN_FILE) - # build deb spec file from template - set(PACKAGING_DEB_OUTPUT_DSC ${PROJECT_PKG_ENTRY_POINT}/${NPKG_PROJECT_NAME}.dsc) - set(PACKAGING_DEB_OUTPUT_INSTALL ${PROJECT_PKG_ENTRY_POINT}/debian.${NPKG_PROJECT_NAME}.install) - set(PACKAGING_DEB_OUTPUT_CHANGELOG ${PROJECT_PKG_ENTRY_POINT}/debian.changelog) - set(PACKAGING_DEB_OUTPUT_COMPAT ${PROJECT_PKG_ENTRY_POINT}/debian.compat) - set(PACKAGING_DEB_OUTPUT_CONTROL ${PROJECT_PKG_ENTRY_POINT}/debian.control) - set(PACKAGING_DEB_OUTPUT_RULES ${PROJECT_PKG_ENTRY_POINT}/debian.rules) -endif() - -# Break After Binding are loaded but before they get initialised -set(GDB_INITIAL_BREAK "personality" CACHE STRING "Initial Break Point for GDB remote") - -# Define some checker binaries to verify input DATA files -# to be included in package. Schema aren't checked for now. -# Dummy checker about JSON. -set(LUA_CHECKER "luac" "-p" CACHE STRING "LUA compiler") -set(XML_CHECKER "xmllint" CACHE STRING "XML linter") -set(JSON_CHECKER "echo" CACHE STRING "JSON linter") diff --git a/conf.d/app-templates/cmake/cmake.d/03-macros.cmake b/conf.d/app-templates/cmake/cmake.d/03-macros.cmake deleted file mode 100644 index 45d1ef5..0000000 --- a/conf.d/app-templates/cmake/cmake.d/03-macros.cmake +++ /dev/null @@ -1,501 +0,0 @@ -########################################################################### -# Copyright 2015, 2016, 2017 IoT.bzh -# -# author: Fulup Ar Foll <fulup@iot.bzh> -# contrib: Romain Forlot <romain.forlot@iot.bzh> -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -########################################################################### - -#-------------------------------------------------------------------------- -# WARNING: -# Do not change this cmake template -# Customise your preferences in "./conf.d/cmake/config.cmake" -#-------------------------------------------------------------------------- -# CMake 3.6 imported macros to simulate list(FILTER ...) subcommand -# ----------------------- -MACRO(PARSE_ARGUMENTS prefix arg_names option_names) -SET(DEFAULT_ARGS) -FOREACH(arg_name ${arg_names}) - SET(${prefix}_${arg_name}) -ENDFOREACH(arg_name) -FOREACH(option ${option_names}) - SET(${prefix}_${option} FALSE) -ENDFOREACH(option) - -SET(current_arg_name DEFAULT_ARGS) -SET(current_arg_list) -FOREACH(arg ${ARGN}) - LIST_CONTAINS(is_arg_name ${arg} ${arg_names}) - IF (is_arg_name) - SET(${prefix}_${current_arg_name} ${current_arg_list}) - SET(current_arg_name ${arg}) - SET(current_arg_list) - ELSE (is_arg_name) - LIST_CONTAINS(is_option ${arg} ${option_names}) - IF (is_option) - SET(${prefix}_${arg} TRUE) - ELSE (is_option) - SET(current_arg_list ${current_arg_list} ${arg}) - ENDIF (is_option) - ENDIF (is_arg_name) -ENDFOREACH(arg) -SET(${prefix}_${current_arg_name} ${current_arg_list}) -ENDMACRO(PARSE_ARGUMENTS) - -MACRO(LIST_CONTAINS var value) -SET(${var}) -FOREACH (value2 ${ARGN}) - IF (${value} STREQUAL ${value2}) - SET(${var} TRUE) - ENDIF (${value} STREQUAL ${value2}) -ENDFOREACH (value2) -ENDMACRO(LIST_CONTAINS) - -MACRO(LIST_FILTER) -PARSE_ARGUMENTS(LIST_FILTER "OUTPUT_VARIABLE" "" ${ARGV}) -# Check arguments. -LIST(LENGTH LIST_FILTER_DEFAULT_ARGS LIST_FILTER_default_length) -IF(${LIST_FILTER_default_length} EQUAL 0) - MESSAGE(FATAL_ERROR "LIST_FILTER: missing list variable.") -ENDIF(${LIST_FILTER_default_length} EQUAL 0) -IF(${LIST_FILTER_default_length} EQUAL 1) - MESSAGE(FATAL_ERROR "LIST_FILTER: missing regular expression variable.") -ENDIF(${LIST_FILTER_default_length} EQUAL 1) -# Reset output variable -IF(NOT LIST_FILTER_OUTPUT_VARIABLE) - SET(LIST_FILTER_OUTPUT_VARIABLE "LIST_FILTER_internal_output") -ENDIF(NOT LIST_FILTER_OUTPUT_VARIABLE) -SET(${LIST_FILTER_OUTPUT_VARIABLE}) -# Extract input list from arguments -LIST(GET LIST_FILTER_DEFAULT_ARGS 0 LIST_FILTER_input_list) -LIST(REMOVE_AT LIST_FILTER_DEFAULT_ARGS 0) -FOREACH(LIST_FILTER_item ${${LIST_FILTER_input_list}}) - FOREACH(LIST_FILTER_regexp_var ${LIST_FILTER_DEFAULT_ARGS}) - FOREACH(LIST_FILTER_regexp ${${LIST_FILTER_regexp_var}}) - IF(${LIST_FILTER_item} MATCHES ${LIST_FILTER_regexp}) - LIST(APPEND ${LIST_FILTER_OUTPUT_VARIABLE} ${LIST_FILTER_item}) - ENDIF(${LIST_FILTER_item} MATCHES ${LIST_FILTER_regexp}) - ENDFOREACH(LIST_FILTER_regexp ${${LIST_FILTER_regexp_var}}) - ENDFOREACH(LIST_FILTER_regexp_var) -ENDFOREACH(LIST_FILTER_item) -# If OUTPUT_VARIABLE is not specified, overwrite the input list. -IF(${LIST_FILTER_OUTPUT_VARIABLE} STREQUAL "LIST_FILTER_internal_output") - SET(${LIST_FILTER_input_list} ${${LIST_FILTER_OUTPUT_VARIABLE}}) -ENDIF(${LIST_FILTER_OUTPUT_VARIABLE} STREQUAL "LIST_FILTER_internal_output") -ENDMACRO(LIST_FILTER) - -# Generic useful macro -# ----------------------- -macro(PROJECT_TARGET_ADD TARGET_NAME) - set_property(GLOBAL APPEND PROPERTY PROJECT_TARGETS ${TARGET_NAME}) - set(TARGET_NAME ${TARGET_NAME}) -endmacro(PROJECT_TARGET_ADD) - -macro(PROJECT_PKGDEP_ADD PKG_NAME) - set_property(GLOBAL APPEND PROPERTY PROJECT_PKG_DEPS ${PKG_NAME}) -endmacro(PROJECT_PKGDEP_ADD) - -macro(defstr name value) - add_definitions(-D${name}=${value}) -endmacro(defstr) - -macro(configure_files_in_dir dir) - file(GLOB filelist "${dir}/*in") - foreach(file ${filelist}) - get_filename_component(filename ${file} NAME) - string(REGEX REPLACE "target" "${RSYNC_TARGET}" destinationfile ${filename}) - string(REGEX REPLACE ".in$" "" destinationfile ${destinationfile}) - configure_file(${file} ${CMAKE_CURRENT_BINARY_DIR}/target/${destinationfile}) - set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES "${CMAKE_CURRENT_BINARY_DIR}/target/${destinationfile}") - endforeach() -endmacro(configure_files_in_dir) - -macro(add_required_module PKG_CONFIG) - string(REGEX REPLACE "[<>]?=.*$" "" XPREFIX ${PKG_CONFIG}) - PKG_CHECK_MODULES(${XPREFIX} REQUIRED ${PKG_CONFIG}) - - INCLUDE_DIRECTORIES(${${XPREFIX}_INCLUDE_DIRS}) - list(APPEND link_libraries ${${XPREFIX}_LDFLAGS}) - add_compile_options (${${XPREFIX}_CFLAGS}) -endmacro(add_required_module) - -# Create custom target dedicated for HTML5 and DATA AGL target type -macro(add_input_files INPUT_FILES) - if(NOT DEFINED XML_FILES) - set(ext_reg "xml$") - set(XML_LIST ${INPUT_FILES}) - list_filter(XML_LIST ext_reg) - endif() - if(NOT DEFINED LUA_LIST) - set(ext_reg "lua$") - set(LUA_LIST ${INPUT_FILES}) - list_filter(LUA_LIST ext_reg) - endif() - if(NOT DEFINED JSON_FILES) - set(ext_reg "json$") - set(JSON_LIST ${INPUT_FILES}) - list_filter(JSON_LIST ext_reg) - endif() - - # These are v3.6 subcommand. Not used as default for now as - # many dev use Ubuntu 16.04 which have only 3.5 version - #list(FILTER XML_LIST INCLUDE REGEX "xml$") - #list(FILTER LUA_LIST INCLUDE REGEX "lua$") - #list(FILTER JSON_LIST INCLUDE REGEX "json$") - - add_custom_target(${TARGET_NAME} - DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME} - ) - - foreach(file ${XML_LIST}) - add_custom_command(TARGET ${TARGET_NAME} - PRE_BUILD - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - COMMAND ${XML_CHECKER} ${file} - ) - endforeach() - foreach(file ${LUA_LIST}) - add_custom_command(TARGET ${TARGET_NAME} - PRE_BUILD - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - COMMAND ${LUA_CHECKER} ${file} - ) - endforeach() - foreach(file ${JSON_LIST}) - add_custom_command(TARGET ${TARGET_NAME} - PRE_BUILD - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - COMMAND cat ${file} | ${JSON_CHECKER} - ) - endforeach() - - add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME} - DEPENDS ${INPUT_FILES} - COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME} - COMMAND touch ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME} - COMMAND cp -r ${INPUT_FILES} ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME} - ) -endmacro() - -# Set the name of the OPENAPI definition JSON file for binding v2 -macro(set_openapi_filename openapi_filename) - set(OPENAPI_DEF ${openapi_filename} CACHE STRING "OpenAPI JSON file name used to generate binding header file before building a binding v2 target.") -endmacro() - -# Pre-packaging -macro(project_targets_populate) - # Default Widget default directory - set(BINDIR bin) - set(ETCDIR etc) - set(LIBDIR lib) - set(HTTPDIR htdocs) - set(DATADIR data) - set(PACKAGE_BINDIR ${PROJECT_PKG_BUILD_DIR}/${BINDIR}) - set(PACKAGE_ETCDIR ${PROJECT_PKG_BUILD_DIR}/${ETCDIR}) - set(PACKAGE_LIBDIR ${PROJECT_PKG_BUILD_DIR}/${LIBDIR}) - set(PACKAGE_HTTPDIR ${PROJECT_PKG_BUILD_DIR}/${HTTPDIR}) - set(PACKAGE_DATADIR ${PROJECT_PKG_BUILD_DIR}/${DATADIR}) - - add_custom_command(OUTPUT ${PACKAGE_BINDIR} ${PACKAGE_ETCDIR} ${PACKAGE_LIBDIR} ${PACKAGE_HTTPDIR} ${PACKAGE_DATADIR} - COMMAND mkdir -p ${PACKAGE_BINDIR} ${PACKAGE_ETCDIR} ${PACKAGE_LIBDIR} ${PACKAGE_HTTPDIR} ${PACKAGE_DATADIR}) - add_custom_target(populate DEPENDS ${PACKAGE_BINDIR} ${PACKAGE_ETCDIR} ${PACKAGE_LIBDIR} ${PACKAGE_HTTPDIR} ${PACKAGE_DATADIR}) - - INSTALL(CODE "execute_process(COMMAND make populate)") - INSTALL(DIRECTORY ${PROJECT_PKG_BUILD_DIR}/ - DESTINATION ${CMAKE_INSTALL_PREFIX}/${PROJECT_NAME} - ) - - get_property(PROJECT_TARGETS GLOBAL PROPERTY PROJECT_TARGETS) - foreach(TARGET ${PROJECT_TARGETS}) - get_target_property(T ${TARGET} LABELS) - if(T) - # Declaration of a custom command that will populate widget tree with the target - set(POPULE_PACKAGE_TARGET "project_populate_${TARGET}") - - get_target_property(P ${TARGET} PREFIX) - get_target_property(BD ${TARGET} BINARY_DIR) - get_target_property(SD ${TARGET} SOURCE_DIR) - get_target_property(OUT ${TARGET} OUTPUT_NAME) - - if(P MATCHES "NOTFOUND$") - if (${T} STREQUAL "BINDING") - set(P "lib") - else() - set(P "") - endif() - endif() - - if(${T} STREQUAL "BINDING") - list(APPEND BINDINGS_LIST "${P}${OUT}") - add_custom_command(OUTPUT ${PACKAGE_LIBDIR}/${P}${OUT}.so - DEPENDS ${BD}/${P}${OUT}.so - COMMAND mkdir -p ${PACKAGE_LIBDIR} - COMMAND cp ${BD}/${P}${OUT}.so ${PACKAGE_LIBDIR} - ) - add_custom_target(${POPULE_PACKAGE_TARGET} DEPENDS ${PACKAGE_LIBDIR}/${P}${OUT}.so) - add_dependencies(populate ${POPULE_PACKAGE_TARGET}) - add_dependencies(${POPULE_PACKAGE_TARGET} ${TARGET}) - elseif(${T} STREQUAL "BINDINGV2") - if (OPENAPI_DEF) - add_custom_command(OUTPUT ${SD}/${OPENAPI_DEF}.h - DEPENDS ${SD}/${OPENAPI_DEF}.json - COMMAND afb-genskel ${SD}/${OPENAPI_DEF}.json > ${SD}/${OPENAPI_DEF}.h - ) - add_custom_target("${TARGET}_GENSKEL" DEPENDS ${SD}/${OPENAPI_DEF}.h - COMMENT "Generating OpenAPI header file ${OPENAPI_DEF}.h") - add_dependencies(${TARGET} "${TARGET}_GENSKEL") - else() - add_custom_command(OUTPUT ${SD}/${OUT}-apidef.h - DEPENDS ${SD}/${OUT}-apidef.json - COMMAND afb-genskel ${SD}/${OUT}-apidef.json > ${SD}/${OUT}-apidef.h - ) - add_custom_target("${TARGET}_GENSKEL" DEPENDS ${SD}/${OUT}-apidef.h - COMMENT "Generating OpenAPI header file ${OUT}-apidef.h") - add_dependencies(${TARGET} "${TARGET}_GENSKEL") - endif() - - add_custom_command(OUTPUT ${PACKAGE_LIBDIR}/${P}${OUT}.so - DEPENDS ${BD}/${P}${OUT}.so - COMMAND mkdir -p ${PACKAGE_LIBDIR} - COMMAND cp ${BD}/${P}${OUT}.so ${PACKAGE_LIBDIR} - ) - add_custom_target(${POPULE_PACKAGE_TARGET} DEPENDS ${PACKAGE_LIBDIR}/${P}${OUT}.so) - add_dependencies(populate ${POPULE_PACKAGE_TARGET}) - add_dependencies(${POPULE_PACKAGE_TARGET} ${TARGET}) - elseif(${T} STREQUAL "EXECUTABLE") - add_custom_command(OUTPUT ${PACKAGE_BINDIR}/${P}${OUT} - DEPENDS ${BD}/${P}${OUT} - COMMAND mkdir -p ${PACKAGE_BINDIR} - COMMAND cp ${BD}/${P}${OUT} ${PACKAGE_BINDIR} - ) - add_custom_target(${POPULE_PACKAGE_TARGET} DEPENDS ${PACKAGE_BINDIR}/${P}${OUT}) - add_dependencies(populate ${POPULE_PACKAGE_TARGET}) - add_dependencies(${POPULE_PACKAGE_TARGET} ${TARGET}) - elseif(${T} STREQUAL "HTDOCS") - add_custom_command(OUTPUT ${PACKAGE_HTTPDIR}-xx - DEPENDS ${BD}/${P}${OUT} - COMMAND mkdir -p ${PACKAGE_HTTPDIR} - COMMAND touch ${PACKAGE_HTTPDIR} - COMMAND cp -r ${BD}/${P}${OUT}/* ${PACKAGE_HTTPDIR} - ) - add_custom_target(${POPULE_PACKAGE_TARGET} DEPENDS ${PACKAGE_HTTPDIR}-xx) - add_dependencies(populate ${POPULE_PACKAGE_TARGET}) - add_dependencies(${POPULE_PACKAGE_TARGET} ${TARGET}) - elseif(${T} STREQUAL "DATA") - # Generate list of output files instead of just one output directory - get_target_property(SF ${TARGET} SOURCES) - foreach(file ${SF}) - get_filename_component(JUST_FILENAME ${file} NAME) - list(APPEND OUTPUT_FILES ${PACKAGE_DATADIR}/${JUST_FILENAME}) - endforeach() - add_custom_target(${POPULE_PACKAGE_TARGET}) - add_custom_command(TARGET ${POPULE_PACKAGE_TARGET} - POST_BUILD - COMMAND mkdir -p ${PACKAGE_DATADIR} - COMMAND touch ${PACKAGE_DATADIR} - COMMAND cp -r ${BD}/${TARGET} ${PACKAGE_DATADIR} - ) - add_dependencies(populate ${POPULE_PACKAGE_TARGET}) - add_dependencies(${POPULE_PACKAGE_TARGET} ${TARGET}) - endif(${T} STREQUAL "BINDING") - elseif(${CMAKE_BUILD_TYPE} MATCHES "[Dd][Ee][Bb][Uu][Gg]") - MESSAGE("${Yellow}.. Warning: ${TARGET} ignored when packaging.${ColourReset}") - endif() - endforeach() -endmacro(project_targets_populate) - -macro(remote_targets_populate) - if (DEFINED ENV{RSYNC_TARGET}) - set (RSYNC_TARGET $ENV{RSYNC_TARGET}) - endif() - if (DEFINED ENV{RSYNC_PREFIX}) - set (RSYNC_PREFIX $ENV{RSYNC_PREFIX}) - endif() - - set( - REMOTE_LAUNCH "Test on target with: ${CMAKE_CURRENT_BINARY_DIR}/target/start-on-${RSYNC_TARGET}.sh" - CACHE STRING "Command to start ${PROJECT_NAME} on remote target ${RSYNC_TARGET}" - ) - - if(NOT RSYNC_TARGET OR NOT RSYNC_PREFIX) - message ("${Yellow}.. Warning: RSYNC_TARGET RSYNC_PREFIX not defined 'make remote-target-populate' not instanciated${ColourReset}") - add_custom_target(remote-target-populate - COMMENT "${Red}*** Fatal: RSYNC_TARGET RSYNC_PREFIX environment variables required with 'make remote-target-populate'${ColourReset}" - COMMAND exit -1 - ) - else() - set(BINDINGS_REGEX "not_set") - if(DEFINED BINDINGS_LIST) - list(LENGTH BINDINGS_LIST BINDINGS_LIST_LENGTH) - if(BINDINGS_LIST_LENGTH EQUAL 1) - list(GET BINDINGS_LIST 0 BINDINGS_REGEX) - string(APPEND BINDINGS_REGEX ".so") - elseif(BINDINGS_LIST_LENGTH GREATER 1) - foreach(B IN LISTS BINDINGS_LIST) - STRING(APPEND BINDINGS_STR "${B}|") - endforeach() - STRING(REGEX REPLACE "^(.*)\\|$" "(\\1).so" BINDINGS_REGEX ${BINDINGS_STR}) - endif() - endif() - - configure_files_in_dir(${TEMPLATE_DIR}) - configure_files_in_dir(${TEMPLATE_DIR}) - - add_custom_target(remote-target-populate - COMMAND chmod +x ${CMAKE_CURRENT_BINARY_DIR}/target/*.sh - COMMAND rsync -e "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --archive --delete ${PROJECT_PKG_BUILD_DIR}/ ${RSYNC_TARGET}:${RSYNC_PREFIX}/${PROJECT_NAME} - COMMENT "${REMOTE_LAUNCH}" - ) - add_dependencies(remote-target-populate populate) - endif() -endmacro(remote_targets_populate) - -macro(wgt_package_build) - if(NOT EXISTS ${WIDGET_CONFIG_TEMPLATE}) - MESSAGE(FATAL_ERROR "${Red}WARNING ! Missing mandatory files to build widget file.\nYou need a config.xml template: please specify WIDGET_CONFIG_TEMPLATE correctly.${ColourReset}") - endif() - if(NOT WIDGET_TYPE) - MESSAGE(FATAL_ERROR "WIDGET_TYPE must be set in your config.cmake.\neg.: set(WIDGET_TYPE application/vnd.agl.service)") - endif() - if(NOT DEFINED PROJECT_ICON) - if( ${WIDGET_TYPE} MATCHES "agl.native") - set(ICON_PATH ${PKG_APP_TEMPLATE_DIR}/wgt/icon-native.png) - elseif( ${WIDGET_TYPE} MATCHES "agl.service") - set(ICON_PATH ${PKG_APP_TEMPLATE_DIR}/wgt/icon-service.png) - elseif( ${WIDGET_TYPE} MATCHES "x-executable") - set(ICON_PATH ${PKG_APP_TEMPLATE_DIR}/wgt/icon-qml.png) - elseif( ${WIDGET_TYPE} MATCHES "text/html") - set(ICON_PATH ${PKG_APP_TEMPLATE_DIR}/wgt/icon-html5.png) - endif() - elseif(EXISTS "${CMAKE_SOURCE_DIR}/${WIDGET_ICON}") - set(ICON_PATH "${CMAKE_SOURCE_DIR}/${WIDGET_ICON}") - elseif(EXISTS "${WIDGET_ICON}") - set(ICON_PATH "${WIDGET_ICON}") - else() - set(ICON_PATH ${CMAKE_SOURCE_DIR}/${PROJECT_APP_TEMPLATES_DIR}/wgt/icon-default.png) - endif() - - if(NOT WIDGET_ENTRY_POINT) - set(WIDGET_ENTRY_POINT lib) - endif() - - add_custom_command(OUTPUT ${PROJECT_PKG_BUILD_DIR}/config.xml - COMMAND ${CMAKE_COMMAND} -DINFILE=${WIDGET_CONFIG_TEMPLATE} -DOUTFILE=${PROJECT_PKG_BUILD_DIR}/config.xml -DPROJECT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_APP_TEMPLATES_DIR}/cmake/configure_file.cmake - COMMAND cp ${ICON_PATH} ${PROJECT_PKG_BUILD_DIR}/${PROJECT_ICON} - - ) - add_custom_target(packaging_wgt DEPENDS ${PROJECT_PKG_BUILD_DIR}/config.xml) - - # Fulup ??? copy any extra file in wgt/etc into populate package before building the widget - file(GLOB PROJECT_CONF_FILES "${TEMPLATE_DIR}/etc/*") - if(${PROJECT_CONF_FILES}) - file(COPY "${TEMPLATE_DIR}/etc/*" DESTINATION ${PROJECT_PKG_BUILD_DIR}/etc/) - endif(${PROJECT_CONF_FILES}) - - add_custom_command(OUTPUT ${PROJECT_NAME}.wgt - DEPENDS ${PROJECT_TARGETS} - COMMAND wgtpkg-pack -f -o ${PROJECT_NAME}.wgt ${PROJECT_PKG_BUILD_DIR} - ) - - add_custom_target(widget DEPENDS ${PROJECT_NAME}.wgt) - add_dependencies(widget populate packaging_wgt) - set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.wgt") - - if(NOT RSYNC_TARGET) - message ("${Yellow}.. Warning: RSYNC_TARGET not defined 'make widget-target-install' not instanciated${ColourReset}") - add_custom_target(widget-target-install - COMMENT "${Red}*** Fatal: RSYNC_TARGET RSYNC_PREFIX environment variables required with 'make widget-target-install'${ColourReset}" - COMMAND exit -1 - ) - else() - configure_files_in_dir(${TEMPLATE_DIR}) - add_custom_target(widget-target-install - DEPENDS widget - COMMAND chmod +x ${CMAKE_CURRENT_BINARY_DIR}/target/install-wgt-on-${RSYNC_TARGET}.sh - COMMAND ${CMAKE_CURRENT_BINARY_DIR}/target/install-wgt-on-${RSYNC_TARGET}.sh - ) -endif() - - if(PACKAGE_MESSAGE) - add_custom_command(TARGET widget - POST_BUILD - COMMAND ${CMAKE_COMMAND} -E cmake_echo_color --cyan "++ ${PACKAGE_MESSAGE}") - endif() -endmacro(wgt_package_build) - -macro(rpm_package_build) - add_custom_command(OUTPUT ${NPKG_PROJECT_NAME}.spec - DEPENDS ${PROJECT_TARGETS} - archive - packaging - COMMAND rpmbuild --define=\"%_sourcedir ${PROJECT_PKG_ENTRY_POINT}\" -ba ${PROJECT_PKG_ENTRY_POINT}/${NPKG_PROJECT_NAME}.spec - ) - - add_custom_target(rpm DEPENDS ${NPKG_PROJECT_NAME}.spec) - add_dependencies(rpm populate packaging) - - if(PACKAGE_MESSAGE) - add_custom_command(TARGET rpm - POST_BUILD - COMMAND ${CMAKE_COMMAND} -E cmake_echo_color --cyan "++ ${PACKAGE_MESSAGE}") - endif() -endmacro(rpm_package_build) - -macro(deb_package_build) -#TODO -endmacro(deb_package_build) - -macro(project_package_build) - if(EXISTS ${TEMPLATE_DIR}) - rpm_package_build() - endif() - - if(EXISTS ${TEMPLATE_DIR}) - wgt_package_build() - endif() - - if(EXISTS ${TEMPLATE_DIR}) - deb_package_build() - endif() -endmacro(project_package_build) - -macro(project_subdirs_add) - set (ARGSLIST ${ARGN}) - list(LENGTH ARGSLIST ARGSNUM) - if(${ARGSNUM} GREATER 0) - file(GLOB filelist "${ARGV0}") - else() - file(GLOB filelist "*") - endif() - - foreach(filename ${filelist}) - if(EXISTS "${filename}/CMakeLists.txt") - add_subdirectory(${filename}) - endif(EXISTS "${filename}/CMakeLists.txt") - endforeach() -endmacro(project_subdirs_add) - -# Print developer helper message when build is done -# ------------------------------------------------------- -macro(project_closing_msg) - get_property(PROJECT_TARGETS_SET GLOBAL PROPERTY PROJECT_TARGETS SET) - get_property(PROJECT_TARGETS GLOBAL PROPERTY PROJECT_TARGETS) - if(CLOSING_MESSAGE AND ${PROJECT_TARGETS_SET}) - add_custom_target(${PROJECT_NAME}_build_done ALL - COMMAND ${CMAKE_COMMAND} -E cmake_echo_color --cyan "++ ${CLOSING_MESSAGE}" - ) - add_dependencies(${PROJECT_NAME}_build_done - ${DEPENDENCIES_TARGET} ${PROJECT_TARGETS}) - endif() -endmacro() diff --git a/conf.d/app-templates/cmake/cmake.d/04-extra_targets.cmake b/conf.d/app-templates/cmake/cmake.d/04-extra_targets.cmake deleted file mode 100644 index d54e128..0000000 --- a/conf.d/app-templates/cmake/cmake.d/04-extra_targets.cmake +++ /dev/null @@ -1,162 +0,0 @@ -########################################################################### -# Copyright 2015, 2016, 2017 IoT.bzh -# -# author: Fulup Ar Foll <fulup@iot.bzh> -# contrib: Romain Forlot <romain.forlot@iot.bzh> -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -########################################################################### - - -#-------------------------------------------------------------------------- -# WARNING: -# Do not change this cmake template -# Customise your preferences in "./conf.d/cmake/config.cmake" -#-------------------------------------------------------------------------- - -# Add a dummy target to enable global dependency order -# ----------------------------------------------------- -if(EXTRA_DEPENDENCIES_ORDER) - set(DEPENDENCIES_TARGET ${PROJECT_NAME}_extra_dependencies) - add_custom_target(${DEPENDENCIES_TARGET} ALL - DEPENDS ${EXTRA_DEPENDENCY_ORDER} - ) -endif() - -# ---------------------------------------------------------------------------- -# Archive target -# ---------------------------------------------------------------------------- -add_custom_command(OUTPUT ${ARCHIVE_OUTPUT} - DEPENDS ${PROJECT_TARGETS} - #Create git archive of the main project - COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR}\; git --git-dir=${CMAKE_CURRENT_SOURCE_DIR}/.git archive --format=tar --prefix=${NPKG_PROJECT_NAME}-${PROJECT_VERSION}/ HEAD -o ${ARCHIVE_OUTPUT_ARCHIVE} - #Create tmp git archive for each submodule - COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR}\; git --git-dir=${CMAKE_CURRENT_SOURCE_DIR}/.git submodule foreach --recursive ${CMD_ARCHIVE_SUBMODULE} - #Concatenate main archive and tmp submodule archive - COMMAND for SUBTAR in ${TMP_ARCHIVE_SUBMODULE}-*.tar\; do tar --concatenate --file=${ARCHIVE_OUTPUT_ARCHIVE} $$SUBTAR\;done - #Remove tmp submodule archive - COMMAND rm -rf ${TMP_ARCHIVE_SUBMODULE}-*.tar - #Compress main archive - COMMAND gzip --force --verbose ${ARCHIVE_OUTPUT_ARCHIVE} -) -add_custom_target(archive DEPENDS ${ARCHIVE_OUTPUT}) - -# ---------------------------------------------------------------------------- -# Packaging target -# ---------------------------------------------------------------------------- -#Format Build require package -foreach (PKG_CONFIG ${PKG_REQUIRED_LIST}) - #Unset TMP variable - unset(XPREFIX) - unset(XRULE) - unset(RPM_EXTRA_DEP) - unset(DEB_EXTRA_DEP) - #For deb package,add EOL format only for a new line - if(DEB_PKG_DEPS) - set(DEB_PKG_DEPS "${DEB_PKG_DEPS},\n") - endif() - #Get pkg-config rule on version - string(REGEX REPLACE "[<>]?=.*$" "" XPREFIX ${PKG_CONFIG}) - string(REGEX MATCH "[<>]?=" XRULE ${PKG_CONFIG}) - #Only if pkg-config has rule on version - if(XRULE) - string(REGEX REPLACE ".*[<>]?=" "" XVERS ${PKG_CONFIG}) - set(RPM_EXTRA_DEP " ${XRULE} ${XVERS}") - set(DEB_EXTRA_DEP " (${XRULE} ${XVERS})") - endif() - # Format for rpm package - set(RPM_PKG_DEPS "${RPM_PKG_DEPS}BuildRequires: pkgconfig(${XPREFIX})${RPM_EXTRA_DEP}\n") - - # Format for deb package - # Because the tool "dpkg" is used on the packages db to find the - # package providing the pkg-cong file ${XPREFIX}.pc, we need - # to test the OS release package type - # Only doable within a native environment not under SDK - if( OSRELEASE MATCHES "debian" AND NOT DEFINED ENV{SDKTARGETSYSROOT} AND NOT DEFINED CMAKE_TOOLCHAIN_FILE) - execute_process( - COMMAND pkg-config --print-provides ${XPREFIX} - OUTPUT_VARIABLE TMP_PKG_BIN - ) - if(TMP_PKG_BIN) - string(REGEX REPLACE " *=.*$" "" PKG_BIN ${TMP_PKG_BIN}) - set(DEB_PKG_DEPS "${DEB_PKG_DEPS} ${PKG_BIN} ${DEB_EXTRA_DEP}") - else() - message(FATAL_ERROR "-- ${Red}${XPREFIX} development files not installed. Abort.${ColourReset}") - endif() - endif() -endforeach() - -if(NOT EXISTS ${TEMPLATE_DIR}/rpm-config.spec.in) - MESSAGE(FATAL_ERROR "${Red}Missing mandatory files: you need rpm-config.spec.in in ${TEMPLATE_DIR} folder.${ColourReset}") -endif() - -# Because the tool "dpkg" is used on the packages db to find the -# package providing the pkg-cong file ${XPREFIX}.pc, we need -# to test the OS release package type -# Only doable within a native environment not under SDK -if(OSRELEASE MATCHES "debian" AND NOT DEFINED ENV{SDKTARGETSYSROOT} AND NOT DEFINED CMAKE_TOOLCHAIN_FILE) - add_custom_target(packaging_deb DEPENDS ${TEMPLATE_DIR}/debian.compat.in - ${TEMPLATE_DIR}/debian.changelog.in - ${TEMPLATE_DIR}/deb-config.dsc.in - ${TEMPLATE_DIR}/deb-config.install.in - ${TEMPLATE_DIR}/debian.control.in - ${TEMPLATE_DIR}/debian.rules.in - COMMAND ${CMAKE_COMMAND} -DINFILE=${TEMPLATE_DIR}/debian.compat.in -DOUTFILE=${PACKAGING_DEB_OUTPUT_COMPAT} -DPROJECT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_APP_TEMPLATES_DIR}/cmake/configure_file.cmake - COMMAND ${CMAKE_COMMAND} -DINFILE=${TEMPLATE_DIR}/debian.changelog.in -DOUTFILE=${PACKAGING_DEB_OUTPUT_CHANGELOG} -DPROJECT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_APP_TEMPLATES_DIR}/cmake/configure_file.cmake - COMMAND ${CMAKE_COMMAND} -DINFILE=${TEMPLATE_DIR}/deb-config.dsc.in -DOUTFILE=${PACKAGING_DEB_OUTPUT_DSC} -DPROJECT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_APP_TEMPLATES_DIR}/cmake/configure_file.cmake - COMMAND ${CMAKE_COMMAND} -DINFILE=${TEMPLATE_DIR}/deb-config.install.in -DOUTFILE=${PACKAGING_DEB_OUTPUT_INSTALL} -DPROJECT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_APP_TEMPLATES_DIR}/cmake/configure_file.cmake - COMMAND ${CMAKE_COMMAND} -DINFILE=${TEMPLATE_DIR}/debian.control.in -DOUTFILE=${PACKAGING_DEB_OUTPUT_CONTROL} -DPROJECT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_APP_TEMPLATES_DIR}/cmake/configure_file.cmake - COMMAND ${CMAKE_COMMAND} -DINFILE=${TEMPLATE_DIR}/debian.rules.in -DOUTFILE=${PACKAGING_DEB_OUTPUT_RULES} -DPROJECT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_APP_TEMPLATES_DIR}/cmake/configure_file.cmake - ) -endif() - -add_custom_target(packaging) -set(PACKAGING_SPEC_OUTPUT ${PROJECT_PKG_ENTRY_POINT}/${NPKG_PROJECT_NAME}.spec) -add_custom_target(packaging_rpm DEPENDS ${TEMPLATE_DIR}/rpm-config.spec.in - COMMAND ${CMAKE_COMMAND} -DINFILE=${TEMPLATE_DIR}/rpm-config.spec.in -DOUTFILE=${PACKAGING_SPEC_OUTPUT} -DPROJECT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_APP_TEMPLATES_DIR}/cmake/configure_file.cmake -) -add_dependencies(packaging packaging_rpm) -if(TARGET packaging_wgt) - add_dependencies(packaging packaging_wgt) -endif() -if(OSRELEASE MATCHES "debian" AND NOT DEFINED ENV{SDKTARGETSYSROOT} AND NOT DEFINED CMAKE_TOOLCHAIN_FILE) - # Target to add dependencies indirectly to "packaging" target. - add_dependencies(packaging packaging_deb) -endif() - -#Generate a cmake cache file usable by cmake script. -set(CacheForScript ${CMAKE_BINARY_DIR}/CMakeCacheForScript.cmake) -#Create a tmp cmake file. -file(WRITE ${CacheForScript} "") - -get_cmake_property(Vars VARIABLES) -foreach(Var ${Vars}) - if(${Var}) - #Replace unwanted char. - string(REPLACE "\\" "\\\\" VALUE ${${Var}}) - string(REPLACE "\n" "\\n" VALUE ${VALUE}) - string(REPLACE "\r" "\\n" VALUE ${VALUE}) - string(REPLACE "\"" "\\\"" VALUE ${VALUE}) - endif() - file(APPEND ${CacheForScript} "set(${Var} \"${VALUE}\")\n") -endforeach() - -# ---------------------------------------------------------------------------- -# Autobuild target -# ---------------------------------------------------------------------------- - -add_custom_target(autobuild ALL DEPENDS ${CMAKE_SOURCE_DIR}/${PROJECT_APP_TEMPLATES_DIR}/template.d/autobuild/agl/autobuild.in - ${CMAKE_SOURCE_DIR}/${PROJECT_APP_TEMPLATES_DIR}/template.d/autobuild/linux/autobuild.in - COMMAND ${CMAKE_COMMAND} -DINFILE=${CMAKE_SOURCE_DIR}/${PROJECT_APP_TEMPLATES_DIR}/template.d/autobuild/agl/autobuild.in -DOUTFILE=${PROJECT_TEMPLATE_AGL_AUTOBUILD_DIR}/autobuild -DPROJECT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_APP_TEMPLATES_DIR}/cmake/configure_file.cmake - COMMAND ${CMAKE_COMMAND} -DINFILE=${CMAKE_SOURCE_DIR}/${PROJECT_APP_TEMPLATES_DIR}/template.d/autobuild/agl/autobuild.in -DOUTFILE=${PROJECT_TEMPLATE_LINUX_AUTOBUILD_DIR}/autobuild -DPROJECT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_APP_TEMPLATES_DIR}/cmake/configure_file.cmake -) diff --git a/conf.d/app-templates/cmake/common.cmake b/conf.d/app-templates/cmake/common.cmake deleted file mode 100644 index d0ec12e..0000000 --- a/conf.d/app-templates/cmake/common.cmake +++ /dev/null @@ -1,63 +0,0 @@ -########################################################################### -# Copyright 2015, 2016, 2017 IoT.bzh -# -# author: Fulup Ar Foll <fulup@iot.bzh> -# contrib: Romain Forlot <romain.forlot@iot.bzh> -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -########################################################################### - - -#-------------------------------------------------------------------------- -# WARNING: -# Do not change this cmake template -# Customise your preferences in "./conf.d/cmake/config.cmake" -#-------------------------------------------------------------------------- - -file(GLOB project_cmakefiles ${PROJECT_APP_TEMPLATES_DIR}/cmake/cmake.d/[0-9][0-9]-*.cmake) -list(SORT project_cmakefiles) -file(GLOB home_cmakefiles $ENV{HOME}/.config/app-templates/cmake.d/[0-9][0-9]-common*.cmake $ENV{HOME}/.config/app-templates/cmake.d/[0-9][0-9]-${PROJECT_NAME}*.cmake) -list(SORT home_cmakefiles) -file(GLOB system_cmakefiles /etc/app-templates/cmake.d/[0-9][0-9]-common*.cmake /etc/app-templates/cmake.d/[0-9][0-9]-${PROJECT_NAME}*.cmake) -list(SORT system_cmakefiles) - -foreach(file ${system_cmakefiles} ${home_cmakefiles} ${project_cmakefiles}) - message(STATUS "Include: ${file}") - include(${file}) -endforeach() - -file(GLOB project_cmakefiles ${ENTRY_POINT}/cmake/[0-9][0-9]-${OSRELEASE}*.cmake ) -list(SORT project_cmakefiles) -if(NOT project_cmakefiles) - file(GLOB project_cmakefiles ${ENTRY_POINT}/cmake/[0-9][0-9]-default*.cmake) -endif() - -foreach(file ${project_cmakefiles}) - message(STATUS "Include: ${file}") - include(${file}) -endforeach() - -if(DEFINED PROJECT_SRC_DIR_PATTERN) - project_subdirs_add(${PROJECT_SRC_DIR_PATTERN}) -else() - project_subdirs_add() -endif(DEFINED PROJECT_SRC_DIR_PATTERN) - -configure_files_in_dir(${PROJECT_APP_TEMPLATES_DIR}/${ENTRY_POINT}/template.d) -configure_files_in_dir($ENV{HOME}/.config/app-templates/scripts) -configure_files_in_dir(/etc/app-templates/scripts) - -project_targets_populate() -remote_targets_populate() -project_package_build() -project_closing_msg() diff --git a/conf.d/app-templates/cmake/configure_file.cmake b/conf.d/app-templates/cmake/configure_file.cmake deleted file mode 100644 index 2028388..0000000 --- a/conf.d/app-templates/cmake/configure_file.cmake +++ /dev/null @@ -1,2 +0,0 @@ -include(${CMAKE_BINARY_DIR}/CMakeCacheForScript.cmake) -configure_file(${INFILE} ${OUTFILE} @ONLY) diff --git a/conf.d/app-templates/cmake/export.map b/conf.d/app-templates/cmake/export.map deleted file mode 100644 index ee2f413..0000000 --- a/conf.d/app-templates/cmake/export.map +++ /dev/null @@ -1 +0,0 @@ -{ global: afbBindingV*; local: *; }; diff --git a/conf.d/app-templates/docs/0-Doc-Revisions.md b/conf.d/app-templates/docs/0-Doc-Revisions.md deleted file mode 100644 index 38b6e74..0000000 --- a/conf.d/app-templates/docs/0-Doc-Revisions.md +++ /dev/null @@ -1,6 +0,0 @@ -Document revisions -================== - -| Date | Version | Designation | Author | -|-------------|---------|--------------------------------------|-------------------------| -| 4 Jul 2017 | 1.0 | Initial release | R. Forlot [ Iot.bzh ] | diff --git a/conf.d/app-templates/docs/README.md b/conf.d/app-templates/docs/README.md deleted file mode 100644 index 39f9209..0000000 --- a/conf.d/app-templates/docs/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# Introduction - -This document explain how to use the CMake templates files and associated -files to ease developement of AGL application. - -<br> -<br> -<br> -<br> -<br> - -| *Meta* | *Data* | -| -- | -- | -| **Title** | {{ config.title }} | -| **Author** | {{ config.author }} | -| **Description** | {{ config.description }} | -| **Keywords** | {{ config.keywords }} | -| **Language** | English | -| **Published** | Published {{ config.published }} as an electronic book | -| **Updated** | {{ gitbook.time }} | -| **Collection** | Open-source | -| **Website** | [{{ config.website }}]({{ config.website }}) | diff --git a/conf.d/app-templates/docs/SUMMARY.md b/conf.d/app-templates/docs/SUMMARY.md deleted file mode 100644 index f475678..0000000 --- a/conf.d/app-templates/docs/SUMMARY.md +++ /dev/null @@ -1,10 +0,0 @@ -# Summary - -* [Document revisions](0-Doc-Revisions.md) - -* [Developper guide](dev_guide/0_Abstract.md) - * [Quickstart](dev_guide/1_Quickstart.md) - * [Project architecture](dev_guide/2_project_architecture.md) - * [Advanced usage](dev_guide/3_advanced_usage.md) - * [Customization](dev_guide/4_advanced_customization.md) - * [Autobuild](dev_guide/5_autobuild.md) diff --git a/conf.d/app-templates/docs/_layouts/ebook/page.html b/conf.d/app-templates/docs/_layouts/ebook/page.html deleted file mode 100644 index bf325e9..0000000 --- a/conf.d/app-templates/docs/_layouts/ebook/page.html +++ /dev/null @@ -1,36 +0,0 @@ -{% extends "layout.html" %} - -{% block title %}{{ page.title }}{% endblock %} -{% block description %}{{ page.description }}{% endblock %} - -{% block style %} - {### Include theme css before plugins css ###} - {% if not fileExists(config.styles.print) %} - {% if options.format %} - <link rel="stylesheet" href="{{ (options.format + ".css")|resolveAsset }}"> - {% else %} - <link rel="stylesheet" href="{{ "ebook.css"|resolveAsset }}"> - {% endif %} - {% endif %} - - {{ super() }} - - {### Custom stylesheets for the book ###} - - {% for type, style in config.styles %} - {% if fileExists(style) and (type == "ebook" or type == "print" or type == options.format) %} - <link rel="stylesheet" href="{{ style|resolveFile }}"> - {% endif %} - {% endfor %} -{% endblock %} - -{% block body %} -<div class="page"> - {% block page %} - <h1 class="book-chapter book-chapter-{{ page.depth }}">{{ page.title }}</h1> - <div class="section"> - {{ page.content|safe }} - </div> - {% endblock %} -</div> -{% endblock %} diff --git a/conf.d/app-templates/docs/_layouts/ebook/pdf_footer.html b/conf.d/app-templates/docs/_layouts/ebook/pdf_footer.html deleted file mode 100644 index 679e562..0000000 --- a/conf.d/app-templates/docs/_layouts/ebook/pdf_footer.html +++ /dev/null @@ -1,13 +0,0 @@ -{% extends "./page.html" %} -{% block body %} -<div id="pdf-footer" class="pdf-footer"> - <span class="footer-left">Version {{ config.version }}</span> - <span class="footer-right">{{ page.num }}</span> - <span class="footer-center">{{ config.published }}</span> -</div> - -<!-- Allow to hide footer for some pages using hidepagefooters config in book.json --> -<script> - if (({% for num in config.hidepagefooters %}{{ page.num }} == {{ num }} || {% endfor %}false)) document.getElementById('pdf-footer').style.display = 'none' -</script> -{% endblock %} diff --git a/conf.d/app-templates/docs/_layouts/ebook/pdf_header.html b/conf.d/app-templates/docs/_layouts/ebook/pdf_header.html deleted file mode 100644 index ef49641..0000000 --- a/conf.d/app-templates/docs/_layouts/ebook/pdf_header.html +++ /dev/null @@ -1,13 +0,0 @@ -{% extends "./page.html" %} -{% block body %} -<div id="pdf-header" class="pdf-header"> - <span class="header-left">IoT.Bzh</span> - <span class="header-right">{{ config.title }}</span> -</div> - -<!-- Allow to hide header for some pages using hidepageheaders config in book.json --> -<script> - if (({% for num in config.hidepageheaders %}{{ page.num }} == {{ num }} || {% endfor %}false)) document.getElementById('pdf-header').style.display = 'none' -</script> - -{% endblock %}
\ No newline at end of file diff --git a/conf.d/app-templates/docs/_layouts/ebook/summary.html b/conf.d/app-templates/docs/_layouts/ebook/summary.html deleted file mode 100644 index be328a4..0000000 --- a/conf.d/app-templates/docs/_layouts/ebook/summary.html +++ /dev/null @@ -1,58 +0,0 @@ -{% extends "./page.html" %} - -{% block title %}{{ "SUMMARY"|t }}{% endblock %} - -{% macro articles(_articles) %} - {% for article in _articles %} - <li> - <span class="inner"> - {% if article.path or article.url %} - {% if article.path %} - <a href="{{ article.path|contentURL }}{{ article.anchor }}">{{ article.title }}</a> - {% else %} - <a target="_blank" href="{{ article.url }}">{{ article.title }}</a> - {% endif %} - {% else %} - <span>{{ article.title }}</span> - {% endif %} - {% if 1 %} - <span class="page">{{ article.level }}</span> - {% endif %} - </span> - {% if article.articles.length > 0 %} - <ol> - {{ articles(article.articles) }} - </ol> - {% endif %} - </li> - {% endfor %} -{% endmacro %} - -{% block page %} -<div class="section toc"> - <h1>{{ "SUMMARY"|t }}</h1> - <ol> - {% for part in summary.parts %} - {% if part.title %} - <li class="part-title"> - <h2>{{ part.title }}</h2> - </li> - {% endif %} - {{ articles(part.articles) }} - - {% if not loop.last %} - <li class="divider"></li> - {% endif %} - {% endfor %} - - {% if glossary.path %} - <li> - <span class="inner"> - <a href="{{ ('/' + glossary.path)|contentURL }}">{{ "GLOSSARY"|t }}</a> - </span> - </li> - {% endif %} - </ol> -</div> -{% endblock %} - diff --git a/conf.d/app-templates/docs/_layouts/layout.html b/conf.d/app-templates/docs/_layouts/layout.html deleted file mode 100644 index 3d5aca6..0000000 --- a/conf.d/app-templates/docs/_layouts/layout.html +++ /dev/null @@ -1,28 +0,0 @@ -<!DOCTYPE HTML> -<html lang="{{ config.language }}" {% if page.dir == "rtl" %}dir="rtl"{% endif %}> - <head> - <meta charset="UTF-8"> - <meta content="text/html; charset=utf-8" http-equiv="Content-Type"> - <title>{% block title %}{{ config.title|d("GitBook", true) }}{% endblock %}</title> - <meta http-equiv="X-UA-Compatible" content="IE=edge" /> - <meta name="description" content="{% block description %}{% endblock %}"> - <meta name="generator" content="GitBook {{ gitbook.version }}"> - {% if config.author %}<meta name="author" content="{{ config.author }}">{% endif %} - {% if config.isbn %}<meta name="identifier" content="{{ config.isbn }}" scheme="ISBN">{% endif %} - {% block style %} - {% for resource in plugins.resources.css %} - {% if resource.url %} - <link rel="stylesheet" href="{{ resource.url }}"> - {% else %} - <link rel="stylesheet" href="{{ resource.path|resolveAsset }}"> - {% endif %} - {% endfor %} - {% endblock %} - - {% block head %}{% endblock %} - </head> - <body> - {% block body %}{% endblock %} - {% block javascript %}{% endblock %} - </body> -</html> diff --git a/conf.d/app-templates/docs/cover.jpg b/conf.d/app-templates/docs/cover.jpg Binary files differdeleted file mode 100644 index 4e04b0c..0000000 --- a/conf.d/app-templates/docs/cover.jpg +++ /dev/null diff --git a/conf.d/app-templates/docs/cover_small.jpg b/conf.d/app-templates/docs/cover_small.jpg Binary files differdeleted file mode 100644 index 315816b..0000000 --- a/conf.d/app-templates/docs/cover_small.jpg +++ /dev/null diff --git a/conf.d/app-templates/docs/dev_guide/0_Abstract.md b/conf.d/app-templates/docs/dev_guide/0_Abstract.md deleted file mode 100644 index a04cc87..0000000 --- a/conf.d/app-templates/docs/dev_guide/0_Abstract.md +++ /dev/null @@ -1,21 +0,0 @@ -# Developper Guide: use AGL CMake Templates - -## Abstract - -Files used to build an application, or binding, project with the -AGL Application Framework. - -To build your AGL project using these templates, you have to install -them within your project and adjust compilation option in `config.cmake`. -For technical reasons, you also have to specify **cmake** target in -sub CMakeLists.txt installed. Make a globbing search to find source files -isn't recommended now to handle project build especially in a multiuser -project because CMake will not be aware of new or removed source files. - -You'll find usage samples here: - -- [helloworld-service](https://github.com/iotbzh/helloworld-service) -- [low-level-can-service](https://gerrit.automotivelinux.org/gerrit/apps/low-level-can-service) -- [high-level-viwi-service](https://github.com/iotbzh/high-level-viwi-service) -- [audio-binding](https://github.com/iotbzh/audio-binding) -- [unicens2-binding](https://github.com/iotbzh/unicens2-binding) diff --git a/conf.d/app-templates/docs/dev_guide/1_Quickstart.md b/conf.d/app-templates/docs/dev_guide/1_Quickstart.md deleted file mode 100644 index 9aad1ef..0000000 --- a/conf.d/app-templates/docs/dev_guide/1_Quickstart.md +++ /dev/null @@ -1,81 +0,0 @@ - -# Quickstart - -## Initialization - -To use these templates files on your project just install the reference files using -**git submodule** then use `config.cmake` file to configure your project specificities : - -```bash -git submodule add https://gerrit.automotivelinux.org/gerrit/apps/app-templatesconf.d/app-templates conf.d/app-templates -mkdir conf.d/cmake -cp conf.d/app-templates/cmake/config.cmake.sample conf.d/cmake/config.cmake -``` - -Edit the copied config.cmake file to fit your needs. - -Now, create your top CMakeLists.txt file which include `config.cmake` file. - -An example is available in **app-templates** submodule that you can copy and -use: - -```bash -cp conf.d/app-templates/cmake/CMakeLists.txt CMakeLists.txt -``` - -## Create your CMake targets - -For each target part of your project, you need to use ***PROJECT_TARGET_ADD*** -to include this target to your project. - -Using it, make available the cmake variable ***TARGET_NAME*** until the next -***PROJECT_TARGET_ADD*** is invoked with a new target name. - -So, typical usage defining a target is: - -```cmake -PROJECT_TARGET_ADD(SuperExampleName) --> Adding target to your project - -add_executable/add_library(${TARGET_NAME}.... --> defining your target sources - -SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES.... --> fit target properties -for macros usage - -INSTALL(TARGETS ${TARGET_NAME}.... -``` - -## Targets PROPERTIES - -You should set properties on your targets that will be used to package your -apps in a widget file that could be installed on an AGL system. - -Specify what is the type of your targets that you want to be included in the -widget package with the property **LABELS**: - -Choose between: - -- **BINDING**: Shared library that be loaded by the AGL Application Framework -- **BINDINGV2**: Shared library that be loaded by the AGL Application Framework. - This has to be accompagnied with a JSON file named like the *${OUTPUT_NAME}-apidef* of - the target that describe the API with OpenAPI syntax (e.g: *mybinding-apidef*). - Or you can choose the name by setting the *CACHE* cmake variable *OPENAPI_DEF* - (***CAUTION***: setting a CACHE variable is needed, or set a normal variable - with the *PARENT_SCOPE* option to make it visible for the parent scope - where the target is defined) JSON file will be used to generate header file - using `afb-genskel` tool. -- **HTDOCS**: Root directory of a web app. This target has to build its - directory and puts its files in the ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME} -- **DATA**: Resources used by your application. This target has to build its - directory and puts its files in the ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME} -- **EXECUTABLE**: Entry point of your application executed by the AGL - Application Framework - -```cmake -SET_TARGET_PROPERTIES(${TARGET_NAME} - PREFIX "afb-" - LABELS "BINDING" - OUTPUT_NAME "file_output_name") -``` - -> **TIP** you should use the prefix _afb-_ with your **BINDING* targets which -> stand for **Application Framework Binding**. diff --git a/conf.d/app-templates/docs/dev_guide/2_project_architecture.md b/conf.d/app-templates/docs/dev_guide/2_project_architecture.md deleted file mode 100644 index 0cae607..0000000 --- a/conf.d/app-templates/docs/dev_guide/2_project_architecture.md +++ /dev/null @@ -1,98 +0,0 @@ -# Project architecture - -A typical project architecture would be : - -```tree -<project-root-path> -│ -├── conf.d/ -│ ├── autobuild/ -│ │ ├── agl -│ │ │ └── autobuild -│ │ ├── linux -│ │ │ └── autobuild -│ │ └── windows -│ │ └── autobuild -│ ├── app-templates/ -│ │ ├── README.md -│ │ ├── autobuild/ -│ │ │ ├── agl -│ │ │ │ └── autobuild.in -│ │ │ ├── linux -│ │ │ │ └── autobuild.in -│ │ │ └── windows -│ │ │ └── autobuild.in -│ │ ├── cmake/ -│ │ │ ├── config.cmake.sample -│ │ │ ├── export.map -│ │ │ └── macros.cmake -│ │ ├── deb/ -│ │ │ └── config.deb.in -│ │ ├── rpm/ -│ │ │ └── config.spec.in -│ │ └── wgt/ -│ │ ├── config.xml.in -│ │ ├── config.xml.in.sample -│ │ ├── icon-default.png -│ │ ├── icon-html5.png -│ │ ├── icon-native.png -│ │ ├── icon-qml.png -│ │ └── icon-service.png -│ ├── packaging/ -│ │ ├── config.spec -│ │ └── config.deb -│ ├── cmake -│ │ └── config.cmake -│ └── wgt -│ └── config.xml.in -├── <libs> -├── <target> -│ └── <files> -├── <target> -│ └── <file> -└── <target> - └── <files> -``` - -| # | Parent | Description | -| - | -------| ----------- | -| \<root-path\> | - | Path to your project. Hold master CMakeLists.txt and general files of your projects. | -| conf.d | \<root-path\> | Holds needed files to build, install, debug, package an AGL app project | -| app-templates | conf.d | Git submodule to app-templates AGL repository which provides CMake helpers macros library, and build scripts. config.cmake is a copy of config.cmake.sample configured for the projects. SHOULD NOT BE MODIFIED MANUALLY !| -| autobuild | conf.d | Scripts generated from app-templates to build packages the same way for differents platforms.| -| cmake | conf.d | Contains at least config.cmake file modified from the sample provided in app-templates submodule. | -| wgt | conf.d | Contains at least config.xml.in template file modified from the sample provided in app-templates submodule for the needs of project (See config.xml.in.sample file for more details). | -| packaging | conf.d | Contains output files used to build packages. | -| \<libs\> | \<root-path\> | External dependencies libraries. This isn't to be used to include header file but build and link statically specifics libraries. | Library sources files. Can be a decompressed library archive file or project fork. | -| \<target\> | \<root-path\> | A target to build, typically library, executable, etc. | - -## Manage app-templates submodule - -### Update - -You may have some news bug fixes or features available from app-templates -repository that you want. To update your submodule proceed like the following: - -```bash -git submodule update --remote -git commit -s conf.d/app-templates -``` - -This will update the submodule to the HEAD of master branch repository. Save -the modification by commiting it in your master git project. - -### Checkout submodule to a git tag - -You could just want to update at a specified repository tag or branch or commit -, here are the method to do so: - -```bash -cd conf.d/app-templates -# Choose one of the following depending what you want -git checkout <tag_name> -git checkout --detach <branch_name> -git checkout --detach <commit_id> -# Then commit -cd ../.. -git commit -s conf.d/app-templates -``` diff --git a/conf.d/app-templates/docs/dev_guide/3_advanced_usage.md b/conf.d/app-templates/docs/dev_guide/3_advanced_usage.md deleted file mode 100644 index cf85986..0000000 --- a/conf.d/app-templates/docs/dev_guide/3_advanced_usage.md +++ /dev/null @@ -1,102 +0,0 @@ -# Build a widget - -## config.xml.in file - -To build a widget you need a _config.xml_ file describing what is your apps and -how Application Framework would launch it. This repo provide a simple default -file _config.xml.in_ that should work for simple application without -interactions with others bindings. - -It is recommanded that you use the sample one which is more complete. You can -find it at the same location under the name _config.xml.in.sample_ (stunning -isn't it). Just copy the sample file to your _conf.d/wgt_ directory and name it -_config.xml.in_, then edit it to fit your needs. - -> ***CAUTION*** : The default file is only meant to be use for a -> simple widget app, more complicated ones which needed to export -> their api, or ship several app in one widget need to use the provided -> _config.xml.in.sample_ which had all new Application Framework -> features explained and examples. - -## Using cmake template macros - -To leverage all cmake templates features, you have to specify ***properties*** -on your targets. Some macros will not works without specifying which is the -target type. - -As the type is not always specified for some custom targets, like an ***HTML5*** -application, macros make the difference using ***LABELS*** property. - -Choose between: - -- **BINDING**: Shared library that be loaded by the AGL Application Framework -- **BINDINGV2**: Shared library that be loaded by the AGL Application Framework. - This has to be accompagnied with a JSON file named like the *${OUTPUT_NAME}-apidef* of - the target that describe the API with OpenAPI syntax (e.g: *mybinding-apidef*). - Or you can choose the name by setting the *CACHE* cmake variable *OPENAPI_DEF* - (***CAUTION***: setting a CACHE variable is needed, or set a normal variable - with the *PARENT_SCOPE* option to make it visible for the parent scope - where the target is defined) JSON file will be used to generate header file - using `afb-genskel` tool. -- **HTDOCS**: Root directory of a web app. This target has to build its - directory and puts its files in the ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME} -- **DATA**: Resources used by your application. This target has to build its - directory and puts its files in the ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME} -- **EXECUTABLE**: Entry point of your application executed by the AGL - Application Framework - -Example: - -```cmake -SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES - LABELS "HTDOCS" - OUTPUT_NAME dist.prod - ) -``` - -If your target output is not named as the ***TARGET_NAME***, you need to specify -***OUTPUT_NAME*** property that will be used by the ***populate_widget*** macro. - -Use the ***populate_widget*** macro as latest statement of your target -definition. Then at the end of your project definition you should use the macro -***build_widget*** that make an archive from the populated widget tree using the -`wgtpkg-pack` Application Framework tools. - -## Macro reference - -### PROJECT_TARGET_ADD - -Typical usage would be to add the target to your project using macro -`PROJECT_TARGET_ADD` with the name of your target as parameter. - -Example: - -```cmake -PROJECT_TARGET_ADD(low-can-demo) -``` - -> ***NOTE***: This will make available the variable `${TARGET_NAME}` -> set with the specificied name. This variable will change at the next call -> to this macros. - -### project_subdirs_add - -This macro will search in all subfolder any `CMakeLists.txt` file. If found then -it will be added to your project. This could be use in an hybrid application by -example where the binding lay in a sub directory. - -Usage : - -```cmake -project_subdirs_add() -``` - -You also can specify a globbing pattern as argument to filter which folders -will be looked for. - -To filter all directories that begin with a number followed by a dash the -anything: - -```cmake -project_subdirs_add("[0-9]-*") -``` diff --git a/conf.d/app-templates/docs/dev_guide/4_advanced_customization.md b/conf.d/app-templates/docs/dev_guide/4_advanced_customization.md deleted file mode 100644 index 0d8957e..0000000 --- a/conf.d/app-templates/docs/dev_guide/4_advanced_customization.md +++ /dev/null @@ -1,42 +0,0 @@ -# Advanced customization - -## Including additionnals cmake files - -Advanced tuning is possible using addionnals cmake files that are included -automatically from some specifics locations. They are included in that order: - -- Project CMake files normaly located in _<project-root-path>/conf.d/app-templates/cmake/cmake.d_ -- Home CMake files located in _$HOME/.config/app-templates/cmake.d_ -- System CMake files located in _/etc/app-templates/cmake.d_ - -CMake files has to be named using the following convention: `XX-common-*.cmake` -or `XX-${PROJECT_NAME}-*.cmake`, where `XX` are numbers, `*` file name -(ie. `99-common-my_customs.cmake`). - -> **NOTE** You need to specify after numbers that indicate include order, to -which project that file applies, if it applies to all project then use keyword -`common`. - -So, saying that you should be aware that every normal cmake variables used at -project level could be overwrited by home or system located cmake files if -variables got the same name. Exceptions are cached variables set using -**CACHE** keyword: - -Example: - -```cmake -set(VARIABLE_NAME 'value string random' CACHE STRING 'docstring') -``` - -## Include customs templated scripts - -As well as for additionnals cmake files you can include your own templated -scripts that will be passed to cmake command `configure_file`. - -Just create your own script to the following directories: - -- Home location in _$HOME/.config/app-templates/scripts_ -- System location in _/etc/app-templates/scripts_ - -Scripts only needs to use the extension `.in` to be parsed and configured by -CMake command. diff --git a/conf.d/app-templates/docs/dev_guide/5_autobuild.md b/conf.d/app-templates/docs/dev_guide/5_autobuild.md deleted file mode 100644 index fe1c63d..0000000 --- a/conf.d/app-templates/docs/dev_guide/5_autobuild.md +++ /dev/null @@ -1,41 +0,0 @@ -# Autobuild script usage - -## Generation - -To be integrated in the Yocto build workflow you have to generate `autobuild` -scripts using _autobuild_ target. - -To generate those scripts proceeds: - -```bash -mkdir -p build -cd build -cmake .. && make autobuild -``` - -You should see _conf.d/autobuild/agl/autobuild_ file now. - -## Available targets - -Here are the available targets available from _autobuild_ scripts: - -- **clean** : clean build directory from object file and targets results. -- **distclean** : delete build directory -- **configure** : generate project Makefile from CMakeLists.txt files. -- **build** : compile all project targets. -- **package** : build and output a wgt package. - -You can specify variables that modify the behavior of compilation using -the following variables: - -- **CONFIGURE_ARGS** : Variable used at **configure** time. -- **BUILD_ARGS** : Variable used at **build** time. -- **DEST** : Directory where to output ***wgt*** file. - -Variable as to be in CMake format. (ie: BUILD_ARGS="-DC_FLAGS='-g -O2'") - -Usage example: - -```bash -./conf.d/autobuild/wgt/autobuild package DEST=/tmp -``` diff --git a/conf.d/app-templates/docs/dev_guide/pictures/iotbzh_logo_small.png b/conf.d/app-templates/docs/dev_guide/pictures/iotbzh_logo_small.png Binary files differdeleted file mode 100644 index 6a98c60..0000000 --- a/conf.d/app-templates/docs/dev_guide/pictures/iotbzh_logo_small.png +++ /dev/null diff --git a/conf.d/app-templates/docs/resources/cover.svg b/conf.d/app-templates/docs/resources/cover.svg deleted file mode 100644 index 6726de7..0000000 --- a/conf.d/app-templates/docs/resources/cover.svg +++ /dev/null @@ -1,210 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> - -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="1800" - height="2360" - viewBox="0 0 1800 2360" - id="svg2" - version="1.1" - inkscape:version="0.91 r13725" - sodipodi:docname="cover.svg"> - <defs - id="defs4175"> - <filter - style="color-interpolation-filters:sRGB" - inkscape:label="Drop Shadow" - id="filter4000"> - <feFlood - result="flood" - flood-color="rgb(0,0,0)" - flood-opacity="0.475" - id="feFlood4002" /> - <feComposite - result="composite1" - operator="in" - in="flood" - in2="SourceGraphic" - id="feComposite4004" /> - <feGaussianBlur - result="blur" - stdDeviation="5" - id="feGaussianBlur4006" /> - <feOffset - result="offset" - dy="8" - dx="8" - id="feOffset4008" /> - <feComposite - result="composite2" - operator="over" - in="SourceGraphic" - in2="offset" - id="feComposite4010" /> - </filter> - <filter - style="color-interpolation-filters:sRGB" - id="filter4000-6" - inkscape:label="Drop Shadow"> - <feFlood - id="feFlood4002-4" - flood-opacity="0.475" - flood-color="rgb(0,0,0)" - result="flood" /> - <feComposite - id="feComposite4004-6" - in2="SourceGraphic" - in="flood" - operator="in" - result="composite1" /> - <feGaussianBlur - id="feGaussianBlur4006-2" - stdDeviation="5" - result="blur" /> - <feOffset - id="feOffset4008-8" - dx="8" - dy="8" - result="offset" /> - <feComposite - id="feComposite4010-9" - in2="offset" - in="SourceGraphic" - operator="over" - result="composite2" /> - </filter> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="0.24748737" - inkscape:cx="928.3577" - inkscape:cy="404.58117" - inkscape:document-units="px" - inkscape:current-layer="layer1" - showgrid="false" - inkscape:snap-text-baseline="false" - units="px" - inkscape:window-width="1920" - inkscape:window-height="1171" - inkscape:window-x="1920" - inkscape:window-y="0" - inkscape:window-maximized="1" - showguides="false" /> - <metadata - id="metadata7"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1" - transform="translate(0,1307.6379)"> - <g - id="iotbzh-logo" - transform="matrix(2.3917866,0,0,2.3917866,216.6324,-1946.4393)" - inkscape:export-filename="/home/sdx/Pictures/Logo/logo_iot_bzh_100dpi.png" - inkscape:export-xdpi="100.22011" - inkscape:export-ydpi="100.22011" - style="display:inline;filter:url(#filter4000-6)"> - <text - sodipodi:linespacing="125%" - id="text3557-5-3-7-0-7-3" - y="519.50671" - x="27.886671" - style="font-style:normal;font-weight:normal;font-size:97.09867096px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;display:inline;fill:#000000;fill-opacity:1;stroke:none" - xml:space="preserve"><tspan - style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:97.09867096px;line-height:125%;font-family:FreeEuro;-inkscape-font-specification:'FreeEuro Bold';text-align:start;writing-mode:lr-tb;text-anchor:start" - y="519.50671" - x="27.886671" - id="tspan3559-5-4-1-5-0-6" - sodipodi:role="line">IOT</tspan></text> - <path - inkscape:connector-curvature="0" - d="m 286.73007,473.23356 c 28.21686,16.29102 28.75566,58.73779 0.99693,78.53831 -7.67688,5.47598 -8.77935,4.91028 -1.99529,-1.0238 17.47377,-15.28453 17.98492,-42.17775 1.08522,-57.09786 l -3.91266,-3.45435 0.72312,-3.71053 c 0.39771,-2.04076 0.5997,-5.73115 0.44885,-8.20083 -0.33876,-5.54623 0.15803,-6.49185 2.65383,-5.05094 z m -64.76568,11.40332 c 7.06047,-7.74198 18.64659,-14.16089 29.04027,-16.08874 l 6.87489,-1.27521 0.87404,2.89709 c 0.4807,1.59343 0.67439,5.2245 0.43037,8.06906 l -0.44364,5.17195 -6.13887,1.6918 c -10.91241,3.00731 -20.4022,10.85909 -25.4533,21.05979 l -2.41633,4.87984 -2.74281,-0.41238 c -5.14252,-0.77316 -12.72985,-3.97645 -12.79123,-5.40033 -0.092,-2.13451 8.34659,-15.74625 12.76661,-20.59287 z m 33.20546,36.39493 c -28.21687,16.29101 -65.24624,-4.46574 -68.51461,-38.40577 -0.9039,-9.38637 0.13723,-10.0583 1.88428,-1.21608 4.49989,22.77499 27.53453,36.66428 48.90556,29.48876 l 4.94788,-1.66128 2.85184,2.48149 c 1.56852,1.36481 4.66349,3.38493 6.87772,4.48914 4.97257,2.47973 5.54308,3.38282 3.04733,4.82374 z m 22.50729,-61.79039 c 3.17451,9.98553 2.94038,23.22889 -0.58688,33.19399 l -2.33309,6.59143 -2.94597,-0.69161 c -1.6203,-0.38041 -4.86173,-2.02821 -7.2032,-3.6618 l -4.25721,-2.97018 1.60429,-6.16234 c 2.85178,-10.95404 0.79685,-23.09833 -5.51167,-32.57307 l -3.01788,-4.53253 1.72854,-2.16916 c 3.24083,-4.06698 9.80863,-9.03614 11.07242,-8.37738 1.89457,0.98756 9.46336,15.1015 11.45065,21.35265 z m -48.80223,10.31437 c 0,-32.58201 36.49058,-54.27201 67.51771,-40.1325 8.58077,3.9104 8.6421,5.148 0.11108,2.23988 -21.97368,-7.49048 -45.51946,5.51348 -49.99082,27.6091 l -1.03521,5.11561 -3.57498,1.22902 c -1.96621,0.67596 -5.26316,2.34622 -7.32655,3.71171 -4.63379,3.06649 -5.70115,3.10904 -5.70115,0.22718 z m 42.25842,50.3871 c -10.23499,-2.24356 -21.58699,-9.06801 -28.45341,-17.10525 l -4.5418,-5.31622 2.07194,-2.20549 c 1.13957,-1.21302 4.18733,-3.19628 6.77282,-4.40726 l 4.70085,-2.20176 4.53458,4.47053 c 8.06061,7.94674 19.60535,12.23927 30.96496,11.51329 l 5.43422,-0.34731 1.01427,2.58154 c 1.90169,4.84014 2.92124,13.01261 1.71883,13.77769 -1.80254,1.14695 -17.80995,0.64475 -24.21726,-0.75976 z" - style="display:inline;fill:#5a2ca0" - id="path3415-4-2-2-5-0-3-7-4-4-1-5" /> - <text - sodipodi:linespacing="125%" - id="text3557-5-3-7-46-7-3-7" - y="519.50671" - x="317.95816" - style="font-style:normal;font-weight:normal;font-size:97.09867096px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;display:inline;fill:#000000;fill-opacity:1;stroke:none" - xml:space="preserve"><tspan - style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:97.09867096px;line-height:125%;font-family:FreeEuro;-inkscape-font-specification:'FreeEuro Bold';text-align:start;writing-mode:lr-tb;text-anchor:start" - y="519.50671" - x="317.95816" - id="tspan3559-5-4-1-90-0-2-9" - sodipodi:role="line">BZH</tspan></text> - </g> - <flowRoot - xml:space="preserve" - id="root-title" - transform="matrix(2.3469382,0,0,2.3469382,464.13874,-1200)"><flowRegion - id="flowRegion4303"><rect - id="rect4305" - width="679.99994" - height="141.42853" - x="-154.28572" - y="400"/> - </flowRegion> - <flowPara - id="title" - style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:87.5px;line-height:125%;font-family:Verdana;-inkscape-font-specification:'Verdana, Bold';text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1">{title}</flowPara></flowRoot> <flowRoot - xml:space="preserve" - id="root-subtitle" - transform="matrix(1.8523279,0,0,1.8523279,553.97647,-380)"><flowRegion - id="flowRegion4303-6"><rect - id="rect4305-0" - width="852.32806" - height="154.51677" - x="-239.3591" - y="290"/> - </flowRegion> - <flowPara - id="subtitle" - style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:62.5px;line-height:125%;font-family:Verdana;-inkscape-font-specification:'Verdana, Bold';text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1">{subtitle}</flowPara> - </flowRoot> - <flowRoot - id="root-version" - xml:space="preserve" - transform="translate(-2.0185547,164)"><flowRegion - id="flowRegion4169"><rect - y="501.68909" - x="343.32947" - height="99.591171" - width="1117.3768" - id="rect4171" /></flowRegion><flowPara - style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:50px;line-height:125%;font-family:Verdana;-inkscape-font-specification:'Verdana, Bold';text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1" - id="version">{version}</flowPara></flowRoot> <flowRoot - transform="translate(-2.0185547,238)" - xml:space="preserve" - id="root-date"><flowRegion - id="flowRegion4170"><rect - id="rect4172" - width="1117.3768" - height="99.591171" - x="343.32947" - y="501.68909" /></flowRegion><flowPara - id="date" - style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:50px;line-height:125%;font-family:Verdana;-inkscape-font-specification:'Verdana, Bold';text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1">{date}</flowPara></flowRoot> </g> -</svg> diff --git a/conf.d/app-templates/docs/resources/ebook.css b/conf.d/app-templates/docs/resources/ebook.css deleted file mode 100644 index 39f126c..0000000 --- a/conf.d/app-templates/docs/resources/ebook.css +++ /dev/null @@ -1,386 +0,0 @@ -/* IoT.Bzh theaming */ - -h1 { - color: #330066; - border-bottom: 2px solid #330066; -} - -h2 { - color: #330066; -} - -h3 { - color: #330066; -} - -h4 { - color: #330066; -} - - -/* GENERAL ELEMENTS */ - -/* clear both */ - -.clear { - clear: both; -} - -.section> :last-child { - margin-bottom: 0 !important; -} - -.section> :first-child { - margin-top: 0 !important; -} - - -/* SPECIAL ELEMENTS */ - - -/* page break always after element on pdf/print definition */ - -div.pagebreak { - page-break-after: always; -} - - -/* no page break inside element on pdf/print definition */ - -div.nopb { - page-break-inside: avoid !important; - margin: 4px 0 4px 0; -} - - -/* note blocks */ - -div.note { - background: #FCF8E3 none repeat scroll 0% 0%; - color: #8A6D3B; - padding: 15px; - margin-bottom: 10px; - border-bottom: 5px solid #DDD; - border-color: #FAEBCC; - page-break-inside: avoid; -} - -div.note p { - padding-bottom: 0; - margin-bottom: 0; -} - - -/* images, figures and captions */ - -p img { - /* center all images */ - display: block; - margin: 0 auto; - padding: 10px 0; -} - -figure { - margin: 1.0em 0px; - padding: 10px 0; - text-align: center; - page-break-inside: avoid; - display: block; -} - -figure img { - display: block; - margin: 0 auto; -} - -figcaption { - clear: left; - margin: 1.0em 0 0 0; - text-align: center; - font-style: italic; - line-height: 1.5em; - font-size: 80%; - color: #666; - display: block; -} - -.page .section p img { - margin-top: 10px; -} - - -/* ul, ol list margin fix */ - -.page .section ol, -.page .section ul { - margin-bottom: 10px; -} - - -/* blockquotes */ - -.page .section blockquote { - margin: 0 0 0 5%; - font-style: italic; -} - - -/* PAGE SPECIFIC */ - - -/* set summary page to right side of the paper */ - -.page .toc h1 { - page-break-before: right; -} - -.page .section.toc { - page-break-inside: always; -} - -/* table headers */ - -div#README\.md table { - margin-top: 30px; - font-size: 95%; -} - -div#README\.md table thead { - display: none; -} - - - -/* CITATION AND IMAGES */ - - -/* math image styles */ - -.page .section p img.svg, -.page .section p img.png { - margin-top: 0px; - margin-bottom: -2px; -} - -.page .section p img.math { - vertical-align: middle; - height: auto; - width: auto; - margin-top: -4px; - max-height: 15px; -} - -.page .section p img.math.line1 { - margin-top: -7px; - max-height: 19px; -} - -.page .section p img.math.line2 { - margin-top: -1px; - max-height: 30px; -} - - -/* credits page */ - -.page .section ul.pictures { - margin-left: -30px; -} - -.page .section ul.pictures li { - list-style: outside none none; -} - -.page .section ul.pictures li a { - float: left; -} - -.page .section ul.pictures li span { - display: block; - margin-left: 100px; -} - - - -/* sub and super script */ - -.page .section sub { - font-size: 80%; - margin-left: 1px; -} - - -/* citations and references */ - -.page .section sup { - margin-left: -1px; - margin-right: 2px; - font-size: 80%; -} - -.page .section sup:before { - content: " "; -} - -.page .section ul.citations, -.page .section ul.references { - margin-left: -30px; -} - - -.page .section ul.citations li:nth-child(1) { - margin-top: 20px; - padding-top: 20px; - border-top: 1px solid #BBB; -} - -.page .section ul.citations li, -.page .section ul.references li { - list-style: outside none none; -} - -.page .section ul.citations li { - font-size: 80%; -} - -.page .section ul.citations li>span:nth-child(1), -.page .section ul.references li>span:nth-child(1) { - display: block; - float: left; - text-align: left; - width: 70px -} - -.page .section ul.citations li>span:nth-child(1) { - width: 50px -} - -.page .section ul.references li div { - margin-left: 70px; -} - -.page .section ul.citations li div { - margin-left: 50px; -} - -.page .section a[href="#"], -.page .section a[href="#"]:link, -.page .section a[href="#"]:visited, -.page .section a[href="#"]:hover, -.page .section a[href="#"]:focus { - text-decoration: none; - color: inherit; - cursor: text; - font-style: italic; -} - - -/* self referential footnotes */ - -.page .section div[type="selfref"] a[href="#"], -.page .section div[type="selfref"] a[href="#"]:link, -.page .section div[type="selfref"] a[href="#"]:visited, -.page .section div[type="selfref"] a[href="#"]:hover, -.page .section div[type="selfref"] a[href="#"]:focus { - font-style: normal; -} - -.page .section div[type="selfref"] span:nth-child(1) { - display: none; -} - - -/* page break always after element on pdf/print definition */ - -div.page-break { - page-break-inside: always; -} - -div.page-break:before { - content: ' '; -} - - -/* no page break inside element on pdf/print definition */ - -div.nopb { - page-break-inside: avoid; -} - -/* justify text */ -p { - text-align: justify; -} - -/* page header and footer */ - -.pdf-footer, -.pdf-header { - margin-top: 20px; - color: #aaa; -} - -.pdf-header .header-left { - float: left; - margin-left: 2em; - margin-right: auto; -} - -.pdf-header .header-right { - display: table; - margin-left: auto; - margin-right: 2em; -} - -.pdf-footer .sub { - padding-top: 8px; - font-size: 70%; -} - -.pdf-header .sub { - padding-top: 2px; - font-size: 70%; -} - -.pdf-footer { - padding-top: 10px; - border-top: 1px solid #eee; -} - -.pdf-footer .footer-left { - float: left; - margin-left: 2em; - margin-right: auto; -} - -.pdf-footer .footer-center { - display: table; - margin-left: auto; - margin-right: auto; -} - -.pdf-footer .footer-right { - float: right; - margin-left: auto; - margin-right: 2em; -} - -.pdf-header { - padding-bottom: 10px; - border-bottom: 1px solid #eee; -} - -.pdf-header .header-pages-count { - float: right; - text-align: right; -} - -.pdf-header .header-pages-count a, -.pdf-header .header-pages-count a:visited, -.pdf-header .header-pages-count a:active, -.pdf-header .header-pages-count a:focus, -.pdf-header .header-pages-count a:link { - text-decoration: none; - color: #aaa; - cursor: text; -} diff --git a/conf.d/app-templates/docs/resources/make_cover.sh b/conf.d/app-templates/docs/resources/make_cover.sh deleted file mode 100755 index 1026ecb..0000000 --- a/conf.d/app-templates/docs/resources/make_cover.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/bash -DOCS_DIR=$(cd $(dirname $0)/.. && pwd) -BOOKFILE=$DOCS_DIR/../book.json - -TITLE=$(grep '"title":' $BOOKFILE | cut -d'"' -f 4) -SUBTITLE=$(grep '"subtitle":' $BOOKFILE | cut -d'"' -f 4) -VERSION="Version $(grep '"version":' $BOOKFILE | cut -d'"' -f 4)" -DATE=$(grep '"published":' $BOOKFILE | cut -d'"' -f 4) - -[ -z "$TITLE" ] && { echo "Error TITLE not set!" ; exit 1; } -[ -z "$VERSION" ] && { echo "Error VERSION not set!" ; exit 1; } -[ -z "$DATE" ] && { echo "Error DATE not set!" ; exit 1; } - - -cat $(dirname $0)/cover.svg | sed -e "s/{title}/$TITLE/g" \ - -e "s/font-size:87.5px/font-size:54px/g" \ - -e "s/{subtitle}/$SUBTITLE/g" \ - -e "s/font-size:62.5px/font-size:40px/g" \ - -e "s/{version}/$VERSION/g" \ - -e "s/{date}/$DATE/g" \ - > /tmp/cover.svg - -# use imagemagick convert tool (cover size must be 1800x2360) -convert -resize "1600x2160!" -border 100 -bordercolor white -background white \ - -flatten -quality 100 /tmp/cover.svg $DOCS_DIR/cover.jpg - -convert -resize "200x262!" $DOCS_DIR/cover.jpg $DOCS_DIR/cover_small.jpg diff --git a/conf.d/app-templates/gendocs.sh b/conf.d/app-templates/gendocs.sh deleted file mode 100755 index ea9400a..0000000 --- a/conf.d/app-templates/gendocs.sh +++ /dev/null @@ -1,79 +0,0 @@ -#!/bin/bash - -OUTFILENAME="Gitbook-Iotbzh-template" - -SCRIPT=$(basename $BASH_SOURCE) - -function usage() { - cat <<EOF >&2 -Usage: $SCRIPT [options] [pdf|serve|doxygen] - -Options: - --debug - enable debug when generating pdf or html documentation - -d|--dry - dry run - -h|--help - get this help - -Example: - $SCRIPT pdf - -EOF - exit 1 -} - -function info() { - echo "$@" >&2 -} - -#default values -DEBUG_FLAG="" -DRY="" -DO_ACTION="" -OUT_DIR=./build - -[[ $? != 0 ]] && usage -while [ $# -gt 0 ]; do - case "$1" in - --debug) DEBUG_FLAG="--log=debug --debug";; - -d|--dry) DRY=echo;; - -h|--help) usage;; - pdf | serve | doxygen) DO_ACTION=$1;; - --) break;; - esac - shift -done - -cd $(dirname $0) -ROOTDIR=`pwd -P` - -# Create out dir if needed -[ -d $OUT_DIR ] || mkdir -p $OUT_DIR - -if [ "$DO_ACTION" = "pdf" -o "$DO_ACTION" = "serve" ]; then - GITBOOK=`which gitbook` - [ "$?" = "1" ] && { echo "You must install gitbook first, using: sudo npm install -g gitbook-cli"; exit 1; } - - EBCONV=`which ebook-convert` - [ "$?" = "1" ] && { echo "You must install calibre first, using: 'sudo apt install calibre' or refer to https://calibre-ebook.com/download"; exit 1; } - - if [ "$DO_ACTION" = "pdf" ]; then - - # Update cover when book.json has been changed - [[ $ROOTDIR/book.json -nt $ROOTDIR/docs/cover.jpg ]] && { echo "Update cover files"; $ROOTDIR/docs/resources/make_cover.sh || exit 1; } - - OUTFILE=$OUT_DIR/$OUTFILENAME.pdf - $DRY $GITBOOK pdf $ROOTDIR $OUTFILE $DEBUG_FLAG - [ "$?" = "0" ] && echo "PDF has been successfully generated in $OUTFILE" - else - $DRY $GITBOOK serve $DEBUG_FLAG - fi - -elif [ "$DO_ACTION" = "doxygen" ]; then - $DRY cd $OUT_DIR && cmake .. && make doxygen $ROOTDIR/Doxyfile - -else - echo "Unknown action !" - usage -fi diff --git a/conf.d/app-templates/samples.d/config.cmake.sample b/conf.d/app-templates/samples.d/config.cmake.sample deleted file mode 100644 index 393c893..0000000 --- a/conf.d/app-templates/samples.d/config.cmake.sample +++ /dev/null @@ -1,203 +0,0 @@ -########################################################################### -# Copyright 2015, 2016, 2017 IoT.bzh -# -# author: Fulup Ar Foll <fulup@iot.bzh> -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -########################################################################### - -# Project Info -# ------------------ -set(PROJECT_NAME example) -set(PROJECT_VERSION "0.0") -set(PROJECT_PRETTY_NAME "Example") -set(PROJECT_DESCRIPTION "AGL application example") -set(PROJECT_URL "https://gerrit.automotivelinux.org/gerrit/apps/app-templates") -set(PROJECT_ICON "icon.png") -set(PROJECT_AUTHOR "Last Name, First Name") -set(PROJECT_AUTHOR_MAIL "example.man@bigouden.bzh") -set(PROJECT_LICENSE "APL2.0") -set(PROJECT_LANGUAGES,"C") - -# Where are stored default templates files from submodule or subtree app-templates in your project tree -# relative to the root project directory -set(PROJECT_APP_TEMPLATES_DIR "conf.d/app-templates") - -# Where are stored your external libraries for your project. This is 3rd party library that you don't maintain -# but used and must be built and linked. -# set(PROJECT_LIBDIR "libs") - -# Where are stored data for your application. Pictures, static resources must be placed in that folder. -# set(PROJECT_RESOURCES "data") - -# Which directories inspect to find CMakeLists.txt target files -# set(PROJECT_SRC_DIR_PATTERN "*") - -# Compilation Mode (DEBUG, RELEASE) -# ---------------------------------- -set(CMAKE_BUILD_TYPE "DEBUG") - -# Kernel selection if needed. You can choose between a -# mandatory version to impose a minimal version. -# Or check Kernel minimal version and just print a Warning -# about missing features and define a preprocessor variable -# to be used as preprocessor condition in code to disable -# incompatibles features. Preprocessor define is named -# KERNEL_MINIMAL_VERSION_OK. -# -# NOTE*** FOR NOW IT CHECKS KERNEL Yocto environment and -# Yocto SDK Kernel version. -# ----------------------------------------------- -#set (kernel_mandatory_version 4.8) -#set (kernel_minimal_version 4.8) - -# Compiler selection if needed. Impose a minimal version. -# ----------------------------------------------- -set (gcc_minimal_version 4.9) - -# PKG_CONFIG required packages -# ----------------------------- -set (PKG_REQUIRED_LIST - json-c - libsystemd>=222 - afb-daemon - libmicrohttpd>=0.9.55 -) - -# Customize link option -# ----------------------------- -#list(APPEND link_libraries -an-option) - -# Compilation options definition -# Use CMake generator expressions to specify only for a specific language -# Values are prefilled with default options that is currently used. -# Either separate options with ";", or each options must be quoted separately -# DO NOT PUT ALL OPTION QUOTED AT ONCE , COMPILATION COULD FAILED ! -# ---------------------------------------------------------------------------- -#set(COMPILE_OPTIONS -# -Wall -# -Wextra -# -Wconversion -# -Wno-unused-parameter -# -Wno-sign-compare -# -Wno-sign-conversion -# -Werror=maybe-uninitialized -# -Werror=implicit-function-declaration -# -ffunction-sections -# -fdata-sections -# -fPIC -# CACHE STRING "Compilation flags") -#set(C_COMPILE_OPTIONS "" CACHE STRING "Compilation flags for C language.") -#set(CXX_COMPILE_OPTIONS "" CACHE STRING "Compilation flags for C++ language.") -#set(PROFILING_COMPILE_OPTIONS -# -g -# -O0 -# -pg -# -Wp,-U_FORTIFY_SOURCE -# CACHE STRING "Compilation flags for PROFILING build type.") -#set(DEBUG_COMPILE_OPTIONS -# -g -# -ggdb -# -Wp,-U_FORTIFY_SOURCE -# CACHE STRING "Compilation flags for DEBUG build type.") -#set(CCOV_COMPILE_OPTIONS -# -g -# -O2 -# --coverage -# CACHE STRING "Compilation flags for CCOV build type.") -#set(RELEASE_COMPILE_OPTIONS -# -g -# -O2 -# CACHE STRING "Compilation flags for RELEASE build type.") - -# Print a helper message when every thing is finished -# ---------------------------------------------------- -#set(CLOSING_MESSAGE "") -#set(PACKAGE_MESSAGE "Install widget file using in the target : afm-util install ${PROJECT_NAME}.wgt") - -# Prefix path where will be installed the files -# Default: /usr/local (need root permission to write in) -# ------------------------------------------------------ -#set(CMAKE_INSTALL_PREFIX $ENV{HOME}/opt) - -# (BUG!!!) as PKG_CONFIG_PATH does not work [should be an env variable] -# --------------------------------------------------------------------- -set(CMAKE_PREFIX_PATH ${CMAKE_INSTALL_PREFIX}/lib64/pkgconfig ${CMAKE_INSTALL_PREFIX}/lib/pkgconfig) -set(LD_LIBRARY_PATH ${CMAKE_INSTALL_PREFIX}/lib64 ${CMAKE_INSTALL_PREFIX}/lib) - -# Optional location for config.xml.in -# ----------------------------------- -#set(WIDGET_ICON conf.d/wgt/${PROJECT_ICON} CACHE PATH "Path to the widget icon") -#set(WIDGET_CONFIG_TEMPLATE ${CMAKE_CURRENT_SOURCE_DIR}/conf.d/wgt/config.xml.in CACHE PATH "Path to widget config file template (config.xml.in)") - -# Mandatory widget Mimetype specification of the main unit -# -------------------------------------------------------------------------- -# Choose between : -#- text/html : HTML application, -# content.src designates the home page of the application -# -#- application/vnd.agl.native : AGL compatible native, -# content.src designates the relative path of the binary. -# -# - application/vnd.agl.service: AGL service, content.src is not used. -# -#- ***application/x-executable***: Native application, -# content.src designates the relative path of the binary. -# For such application, only security setup is made. -# -set(WIDGET_TYPE MimeType_Not_Set) - -# Mandatory Widget entry point file of the main unit -# -------------------------------------------------------------- -# This is the file that will be executed, loaded, -# at launch time by the application framework. -# -set(WIDGET_ENTRY_POINT EntryPoint_Path_Not_Set) - -# Optional dependencies order -# --------------------------- -#set(EXTRA_DEPENDENCIES_ORDER) - -# Optional Extra global include path -# ----------------------------------- -#set(EXTRA_INCLUDE_DIRS) - -# Optional extra libraries -# ------------------------- -#set(EXTRA_LINK_LIBRARIES) - -# Optional force binding Linking flag -# ------------------------------------ -# set(BINDINGS_LINK_FLAG LinkOptions ) - -# Optional force package prefix generation, like widget -# ----------------------------------------------------- -# set(PKG_PREFIX DestinationPath) - -# Optional Application Framework security token -# and port use for remote debugging. -#------------------------------------------------------------ -#set(AFB_TOKEN "" CACHE PATH "Default AFB_TOKEN") -#set(AFB_REMPORT "1234" CACHE PATH "Default AFB_TOKEN") - -# Optional schema validator about now only XML, LUA and JSON -# are supported -#------------------------------------------------------------ -#set(LUA_CHECKER "luac -o /dev/null" CACHE STRING "LUA compiler") -#set(XML_CHECKER "xmllint" CACHE STRING "XML linter") -#set(JSON_CHECKER "json_verify" CACHE STRING "JSON linter") - -# This include is mandatory and MUST happens at the end -# of this file, else you expose you to unexpected behavior -# ----------------------------------------------------------- -include(${PROJECT_APP_TEMPLATES_DIR}/cmake/common.cmake) diff --git a/conf.d/app-templates/samples.d/config.xml.in.sample b/conf.d/app-templates/samples.d/config.xml.in.sample deleted file mode 100644 index b93f3d9..0000000 --- a/conf.d/app-templates/samples.d/config.xml.in.sample +++ /dev/null @@ -1,142 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<widget xmlns="http://www.w3.org/ns/widgets" id="@PROJECT_NAME@" version="@PROJECT_VERSION@"> - <name>@PROJECT_NAME@</name> - <icon src="@PROJECT_ICON@"/> - <content src="@WIDGET_ENTRY_POINT@" type="@WIDGET_TYPE@"/> - <description>@PROJECT_DESCRIPTION@</description> - <author>@PROJECT_AUTHOR@ <@PROJECT_AUTHOR_MAIL@></author> - <license>@PROJECT_LICENSE@</license> - -<!-- Feature : required-api ------------------------------------------------------ -#### param name="#target" OPTIONAL - -Declares the name of the unit requiring the listed apis. -Only one instance of the param "#target" is allowed. -When there is not instance of this param, it behave as if -the target main was specified. - -#### param name=[required api name] - -The name is the name of the required API. -The value describes how to connect to the required api. -It is either: - - - local: The binding is a local shared object. - In that case, the name is the relative path of the - shared object to be loaded. - - auto: The framework set automatically the kind of - the connection to the API - - ws: The framework connect using internal websockets - - dbus: The framework connect using internal dbus - - link: The framework connect in memory by dinamically linking - -Example: - <feature name="urn:AGL:widget:required-api"> - <param name="#target" value="low-can" /> - <param name="<a-required-api>" value="auto" /> - <param name="<another-required-api>" value="auto" /> - </feature> ----------------------------------------------------------------------------------> - -<!-- Feature : required-permission ------------------------------------------ - -List of the permissions required by the unit. -Each required permission must be explicited using a <param> entry. - -#### param name="#target" OPTIONAL - -Declares the name of the unit requiring the listed permissions. -Only one instance of the param "#target" is allowed. -When there is not instance of this param, it behave as if -the target main was specified. - -#### param name=[required permission name] - -The value is either: -- required: the permission is mandatorily needed except if the feature -isn't required (required="false") and in that case it is optional. -- optional: the permission is optional - -Example: -<feature name="urn:AGL:widget:required-permission"> - <param name="#target" value="geoloc" /> - <param name="urn:AGL:permission:real-time" value="required" /> - <param name="urn:AGL:permission:syscall:*" value="required" /> -</feature> ----------------------------------------------------------------------------------> - -<!-- Feature : provided-unit ------------------------------------------------- -This feature is made for declaring new units -for the widget. Using this feature, a software publisher -can provide more than one application in the same widget. - -#### param name="#target" REQUIRED - -Declares the name of the unit. The default unit, the unit -of the main of the widget, has the name "main". The value -given here must be unique within the widget file. It will -be used in other places of the widget config.xml file to -designate the unit. - -Only one instance of the param "#target" is allowed. -The value can't be "main". - -#### param name="content.type" REQUIRED - -The mimetype of the provided unit. - -#### param name="content.src" - -A path to the file (subject to localisation), this is the entry point -to that unit. - -#### other parameters - -The items that can be set for the main unit -can also be set using the params if needed. - - - description - - name.content - - name.short - - ... - -Example: -<feature name="urn:AGL:widget:provided-unit"> - <param name="#target" value="geoloc" /> - <param name="description" value="binding of name geoloc" /> - <param name="content.src" value="index.html" /> - <param name="content.type" value="application/vnd.agl.service" /> -</feature> ----------------------------------------------------------------------------------> - -<!-- Feature: provided-api --------------------------------------------------- -Use this feature for exporting one or more API of a unit -to other widgets of the platform. - -This feature is an important feature of the framework. - -#### param name="#target" OPTIONAL - -Declares the name of the unit exporting the listed apis. -Only one instance of the param "#target" is allowed. -When there is not instance of this param, it behave as if -the target main was specified. - -#### param name=[name of exported api] - -The name give the name of the api that is exported. - -The value is one of the following values: - -- ws: export the api using UNIX websocket -- dbus: export the API using dbus -- auto: export the api using the default method(s). - -Example: -<feature name="urn:AGL:widget:provided-api"> - <param name="#target" value="geoloc" /> - <param name="geoloc" value="auto" /> - <param name="moonloc" value="auto" /> -</feature> ----------------------------------------------------------------------------------> -</widget> diff --git a/conf.d/app-templates/samples.d/xds-config.env.sample b/conf.d/app-templates/samples.d/xds-config.env.sample deleted file mode 100644 index a4c51b1..0000000 --- a/conf.d/app-templates/samples.d/xds-config.env.sample +++ /dev/null @@ -1,10 +0,0 @@ -XDS_PROJECT_ID=W2EAQBA-HQI75XA_unicens2-binding -XDS_SDK_ID=poky-agl_aarch64_3.99.1+snapshot -XDS_SERVER_URL=localhost:8000 - -DOCKER_TARGET=docker-sdk - -RSYNC_TARGET=root@192.168.168.11 -RSYNC_PREFIX=./opt -PROJECT_DIR=/home/seb/tmp/unicens2-binding - diff --git a/conf.d/app-templates/template.d/autobuild/agl/autobuild.in b/conf.d/app-templates/template.d/autobuild/agl/autobuild.in deleted file mode 100755 index 4811441..0000000 --- a/conf.d/app-templates/template.d/autobuild/agl/autobuild.in +++ /dev/null @@ -1,63 +0,0 @@ -#!/usr/bin/make -f -# Copyright (C) 2015, 2016 "IoT.bzh" -# Author "Romain Forlot" <romain.forlot@iot.bzh> -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -THISFILE := $(lastword $(MAKEFILE_LIST)) -BUILD_DIR := $(abspath $(dir $(THISFILE)/../../../../..)/build) -DEST := ${BUILD_DIR}/target - -.PHONY: all clean distclean configure build package help update - -all: help - -help: - @echo "List of targets available:" - @echo "" - @echo "- all" - @echo "- clean" - @echo "- distclean" - @echo "- configure" - @echo "- build" - @echo "- package" - @echo "" - @echo "Usage: ./conf.d/autobuild/agl/autobuild package DEST=${HOME}/opt" - @echo "Don't use your build dir as DEST as wgt file is generated at this location" - -update: configure - @cmake --build ${BUILD_DIR} --target autobuild - -clean: - @([ -d ${BUILD_DIR} ] && make -C ${BUILD_DIR} clean) || echo Nothing to clean - -distclean: - @rm -rf ${BUILD_DIR} - -configure: ${BUILD_DIR}/Makefile - -build: configure - @cmake --build ${BUILD_DIR} ${BUILD_ARGS} --target all - -package: build - @mkdir -p ${BUILD_DIR}/$@/bin - @mkdir -p ${BUILD_DIR}/$@/etc - @mkdir -p ${BUILD_DIR}/$@/lib - @mkdir -p ${BUILD_DIR}/$@/htdocs - @mkdir -p ${BUILD_DIR}/$@/data - @cmake --build ${BUILD_DIR} --target widget - @mkdir -p ${DEST} && cp ${BUILD_DIR}/*wgt ${DEST} - -${BUILD_DIR}/Makefile: - @[ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR} - @[ -f ${BUILD_DIR}/Makefile ] || (cd ${BUILD_DIR} && cmake ${CONFIGURE_ARGS} ..) diff --git a/conf.d/app-templates/template.d/autobuild/linux/autobuild.in b/conf.d/app-templates/template.d/autobuild/linux/autobuild.in deleted file mode 100755 index 0b6f06c..0000000 --- a/conf.d/app-templates/template.d/autobuild/linux/autobuild.in +++ /dev/null @@ -1,65 +0,0 @@ -#!/usr/bin/make -f -# Copyright (C) 2015, 2016 "IoT.bzh" -# Author "Romain Forlot" <romain.forlot@iot.bzh> -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -THISFILE := $(lastword $(MAKEFILE_LIST)) -BUILD_DIR := $(abspath $(dir $(THISFILE)/../../../../..)/build) -DEST := ${BUILD_DIR}/target - -.PHONY: all clean distclean configure build package help update - -all: help - -help: - @echo "List of targets available:" - @echo "" - @echo "- all" - @echo "- clean" - @echo "- distclean" - @echo "- configure" - @echo "- build" - @echo "- package" - @echo "" - @echo "Usage: ./conf.d/autobuild/agl/autobuild package DEST=${HOME}/opt" - @echo "Don't use your build dir as DEST as wgt file is generated at this location" - -update: configure - @cmake --build ${BUILD_DIR} --target autobuild - -clean: - @([ -d ${BUILD_DIR} ] && make -C ${BUILD_DIR} clean) || echo Nothing to clean - -distclean: - @rm -rf ${BUILD_DIR} - -configure: ${BUILD_DIR}/Makefile - -build: configure - @cmake --build ${BUILD_DIR} ${BUILD_ARGS} --target all - -package: build - @mkdir -p ${BUILD_DIR}/$@/bin - @mkdir -p ${BUILD_DIR}/$@/etc - @mkdir -p ${BUILD_DIR}/$@/lib - @mkdir -p ${BUILD_DIR}/$@/htdocs - @mkdir -p ${BUILD_DIR}/$@/data - @cmake --build ${BUILD_DIR} --target packaging - @cmake --build ${BUILD_DIR} --target widget - @mkdir -p ${DEST} && cp ${BUILD_DIR}/*wgt ${DEST} - - -${BUILD_DIR}/Makefile: - @[ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR} - @[ -f ${BUILD_DIR}/Makefile ] || (cd ${BUILD_DIR} && cmake ${CONFIGURE_ARGS} ..) diff --git a/conf.d/app-templates/template.d/config.xml.in b/conf.d/app-templates/template.d/config.xml.in deleted file mode 100644 index 35d20b8..0000000 --- a/conf.d/app-templates/template.d/config.xml.in +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<widget xmlns="http://www.w3.org/ns/widgets" id="@PROJECT_NAME@" version="@PROJECT_VERSION@"> - <name>@PROJECT_NAME@</name> - <icon src="@PROJECT_ICON@"/> - <content src="@WIDGET_ENTRY_POINT@" type="@WIDGET_TYPE@"/> - <description>@PROJECT_DESCRIPTION@</description> - <author>@PROJECT_AUTHOR@ <@PROJECT_AUTHOR_MAIL@></author> - <license>@PROJECT_LICENSE@</license> -</widget> diff --git a/conf.d/app-templates/template.d/deb-config.dsc.in b/conf.d/app-templates/template.d/deb-config.dsc.in deleted file mode 100644 index 28a4835..0000000 --- a/conf.d/app-templates/template.d/deb-config.dsc.in +++ /dev/null @@ -1,15 +0,0 @@ -Format: @PROJECT_VERSION@ -Source: @NPKG_PROJECT_NAME@ -Binary: @NPKG_PROJECT_NAME@-bin -Architecture: any -Version: 2.0-0 -Maintainer: @PROJECT_AUTHOR@ <@PROJECT_AUTHOR_MAIL@> -Standards-Version: 3.8.2 -Homepage: @PROJECT_URL@ -Build-Depends: debhelper (>= 5), - pkg-config, - cmake, - gcc, - g++, -@DEB_PKG_DEPS@ -Debtransform-Tar: @NPKG_PROJECT_NAME@_@PROJECT_VERSION@.orig.tar.gz diff --git a/conf.d/app-templates/template.d/deb-config.install.in b/conf.d/app-templates/template.d/deb-config.install.in deleted file mode 100644 index 5858efd..0000000 --- a/conf.d/app-templates/template.d/deb-config.install.in +++ /dev/null @@ -1,2 +0,0 @@ -/opt/AGL/* -/etc/profile.d/* diff --git a/conf.d/app-templates/template.d/debian.changelog.in b/conf.d/app-templates/template.d/debian.changelog.in deleted file mode 100644 index f72c717..0000000 --- a/conf.d/app-templates/template.d/debian.changelog.in +++ /dev/null @@ -1,5 +0,0 @@ -@NPKG_PROJECT_NAME@ (@PROJECT_VERSION@-0) UNRELEASED; urgency=low - - * init build - - -- @PROJECT_AUTHOR@ <@PROJECT_AUTHOR_MAIL@> Mon, 25 Dec 2007 10:50:38 +0100 diff --git a/conf.d/app-templates/template.d/debian.compat.in b/conf.d/app-templates/template.d/debian.compat.in deleted file mode 100644 index 45a4fb7..0000000 --- a/conf.d/app-templates/template.d/debian.compat.in +++ /dev/null @@ -1 +0,0 @@ -8 diff --git a/conf.d/app-templates/template.d/debian.control.in b/conf.d/app-templates/template.d/debian.control.in deleted file mode 100644 index ea4ad8a..0000000 --- a/conf.d/app-templates/template.d/debian.control.in +++ /dev/null @@ -1,16 +0,0 @@ -Priority: optional -Maintainer: @PROJECT_AUTHOR@ <@PROJECT_AUTHOR_MAIL@> -Source: @NPKG_PROJECT_NAME@ -Build-Depends: debhelper (>= 5), - pkg-config, - cmake, - gcc, - g++, -@DEB_PKG_DEPS@ -Standards-Version: 3.8.2 -Homepage: @PROJECT_URL@ - -Package: @NPKG_PROJECT_NAME@ -Section: libs -Architecture: any -Description: @PROJECT_DESCRIPTION@ diff --git a/conf.d/app-templates/template.d/debian.rules.in b/conf.d/app-templates/template.d/debian.rules.in deleted file mode 100644 index 6bb2825..0000000 --- a/conf.d/app-templates/template.d/debian.rules.in +++ /dev/null @@ -1,87 +0,0 @@ -#!/usr/bin/make -f -# -*- makefile -*- -# Uncomment this to turn on verbose mode. -export DH_VERBOSE=1 - -# These are used for cross-compiling and for saving the configure script -# from having to guess our platform (since we know it already) -DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) -DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) - - -CFLAGS = -Wall -g - -ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) - CFLAGS += -O0 -else - CFLAGS += -O2 -endif -ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS))) - INSTALL_PROGRAM += -s -endif - -configure: configure-stamp -configure-stamp: - dh_testdir - # - touch configure-stamp - -build: build-stamp -build-stamp: configure-stamp - dh_testdir - mkdir -p build - cd build;cmake ../ -DCMAKE_INSTALL_PREFIX:PATH=/opt/AGL/@PROJECT_NAME@ -DCMAKE_INSTALL_LIBDIR:PATH=lib/$(DEB_HOST_MULTIARCH);$(MAKE) - # - touch build-stamp - -clean: - #dh_testdir - dh_testroot - rm -f configure-stamp build-stamp - [ ! -f Makefile ] || $(MAKE) distclean - #dh_clean - -install: build - dh_testdir - dh_testroot - dh_prep - dh_installdirs - # Add here commands to install the package into debian/tmp - mkdir -p debian/tmp/opt/AGL/@PROJECT_NAME@;cd build;make populate;cp -r package/* ../debian/tmp/opt/AGL/@PROJECT_NAME@/ - mkdir -p debian/tmp/etc/profile.d - echo '#---------- AGL @PROJECT_NAME@ options Start ---------" ' > debian/tmp/etc/profile.d/AGL_@PROJECT_NAME@.sh - echo '# Object: AGL cmake option for binder/bindings' >> debian/tmp/etc/profile.d/AGL_@PROJECT_NAME@.sh - echo 'export LD_LIBRARY_PATH=/opt/AGL/@PROJECT_NAME@/lib/$(DEB_HOST_MULTIARCH):$$LD_LIBRARY_PATH' >> debian/tmp/etc/profile.d/AGL_@PROJECT_NAME@.sh - echo 'export LIBRARY_PATH=/opt/AGL/@PROJECT_NAME@/lib/$(DEB_HOST_MULTIARCH):$$LIBRARY_PATH' >> debian/tmp/etc/profile.d/AGL_@PROJECT_NAME@.sh - echo 'export PATH=/opt/AGL/@PROJECT_NAME@/bin:$$PATH' >> debian/tmp/etc/profile.d/AGL_@PROJECT_NAME@.sh - echo '#---------- AGL options End ---------' >> debian/tmp/etc/profile.d/AGL_@PROJECT_NAME@.sh - # Move all files in their corresponding package - dh_install --list-missing -s --sourcedir=debian/tmp - # empty dependency_libs in .la files - #sed -i "/dependency_libs/ s/'.*'/''/" `find debian/ -name '*.la'` - -# Build architecture-independent files here. -binary-indep: build install -# We have nothing to do by default. - -# Build architecture-dependent files here. -binary-arch: build install - dh_testdir - dh_testroot - dh_installchangelogs - dh_installdocs - dh_installexamples - dh_installman - dh_link - dh_strip - dh_compress - dh_fixperms - dh_makeshlibs -V - dh_installdeb - dh_shlibdeps --dpkg-shlibdeps-params=--ignore-missing-info - dh_gencontrol - dh_md5sums - dh_builddeb - -binary: binary-indep binary-arch -.PHONY: build clean binary-indep binary-arch binary install diff --git a/conf.d/app-templates/template.d/gdb-native-target.ini.in b/conf.d/app-templates/template.d/gdb-native-target.ini.in deleted file mode 100644 index 1ba6bdb..0000000 --- a/conf.d/app-templates/template.d/gdb-native-target.ini.in +++ /dev/null @@ -1,35 +0,0 @@ -# gdb-remote.init file for IDE -# Object: allow to use standard gdb to remote debug a target -# Usage: remote-target-populate update script under ./build directory -# Author: Fulup Ar Foll (IoT.bzh) -# Reference: https://blog.flameeyes.eu/2010/02/remote-debugging-with-gdb-part-2-gdb/ -# -# Warning: In remote native mode netbeans impose debug-command to point on a local instance of afb-daemon binary - -# Fulup Hoops: --ldpath should be absolute as solib-search-path refuse to work as documented - -# Start gdbserver on target and connect through SSH link WARNING: -target remote | ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null @RSYNC_TARGET@ gdbserver - afb-daemon --port=@AFB_REMPORT@ --workdir=$HOME/@RSYNC_PREFIX@/@PROJECT_NAME@ --roothttp=htdocs --ldpaths=$HOME/@RSYNC_PREFIX@/@PROJECT_NAME@/lib --verbose --token=@AFB_TOKEN@ - -# Disable auto answer no on questions and to set breakpoint -set confirm off - -# Disable auto load of libraries to improved perf -set auto-solib-add off - -# Define path for project libraries -set solib-search-path ${PROJECT_PKG_BUILD_DIR} - -# Replace run by continue (gdb use 'run' when gdbserver wants 'continue') -define run -continue -end - -# Manually load project libraries when loaded by afb-daemon -tbreak @GDB_INITIAL_BREAK@ -commands -sharedlibrary @RSYNC_PREFIX@/@PROJECT_NAME@ -continue -end - - diff --git a/conf.d/app-templates/template.d/install-wgt-on-target.sh.in b/conf.d/app-templates/template.d/install-wgt-on-target.sh.in deleted file mode 100755 index 39a69d5..0000000 --- a/conf.d/app-templates/template.d/install-wgt-on-target.sh.in +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/sh -# -# File: install-wgt-on-target.sh -# Author: Sebastien Douheret @ IoT.bzh -# Object: install widget on target -# Created on 24-May-2017, 09:23:37 -# Usage: - -# Do not change manually use 'make remote-target-populate' -export RSYNC_TARGET=@RSYNC_TARGET@ -export WGT_FILE_L=@CMAKE_CURRENT_BINARY_DIR@/@PROJECT_NAME@.wgt -export WGT_FILE_T=/tmp/@PROJECT_NAME@.wgt - -scp $WGT_FILE_L $RSYNC_TARGET:$WGT_FILE_T \ - && ssh -o "StrictHostKeyChecking no" -tt $RSYNC_TARGET -- \ - afm-util install $WGT_FILE_T - -# && rm -f $WGT_FILE_T - diff --git a/conf.d/app-templates/template.d/rpm-config.spec.in b/conf.d/app-templates/template.d/rpm-config.spec.in deleted file mode 100644 index 34a605d..0000000 --- a/conf.d/app-templates/template.d/rpm-config.spec.in +++ /dev/null @@ -1,62 +0,0 @@ -########################################################################### -# Copyright 2015, 2016, 2017 IoT.bzh -# -# author: @PROJECT_AUTHOR@ <@PROJECT_AUTHOR_MAIL@> -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -########################################################################### - - -Name: @NPKG_PROJECT_NAME@ -Version: @PROJECT_VERSION@ -Release: 1 -Group: AGL -License: @PROJECT_LICENSE@ -Summary: @PROJECT_DESCRIPTION@ -Url: @PROJECT_URL@ -Source0: %{name}_%{version}.orig.tar.gz - -BuildRequires: cmake -BuildRequires: gcc gcc-c++ -@RPM_PKG_DEPS@ - -BuildRoot: %{_tmppath}/%{name}-%{version}-build - -%define _prefix /opt/AGL/@PROJECT_NAME@ -%define __cmake cmake - -%description -@PROJECT_DESCRIPTION@ - -%prep -%setup -q - -%build -%cmake -DCMAKE_INSTALL_PREFIX:PATH=%{_libdir} -make %{?_smp_mflags} - -%install -CURDIR=$(pwd) -[ -d build ] && cd build -make populate -mkdir -p %{?buildroot}%{_prefix} -cp -r package/* %{?buildroot}%{_prefix} - -cd $CURDIR -find %{?buildroot}%{_prefix} -type d -exec echo "%dir {}" \;>> pkg_file -find %{?buildroot}%{_prefix} -type f -exec echo "{}" \;>> pkg_file -sed -i 's@%{?buildroot}@@g' pkg_file - - -%files -f pkg_file -%defattr(-,root,root) diff --git a/conf.d/app-templates/template.d/start-on-target.sh.in b/conf.d/app-templates/template.d/start-on-target.sh.in deleted file mode 100755 index d5426ed..0000000 --- a/conf.d/app-templates/template.d/start-on-target.sh.in +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/sh -# -# File: start-on-target.sh -# Author: Fulup Ar Foll @ IoT.bzh -# Object: Forward signal (SIGTERM) to remote process -# Created on 24-May-2017, 09:23:37 -# Usage: remote-target-populate update script under ./build directory - -# Do not change manually use 'make remote-target-populate' -export RSYNC_TARGET=@RSYNC_TARGET@ -export PROJECT_NAME=@PROJECT_NAME@ -export RSYNC_PREFIX=@RSYNC_PREFIX@/@PROJECT_NAME@ -export AFB_REMPORT=@AFB_REMPORT@ -export AFB_TOKEN=@AFB_TOKEN@ - -exec ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -tt $RSYNC_TARGET << EOF - afb-daemon --workdir=$RSYNC_PREFIX --port=$AFB_REMPORT --roothttp=./htdocs --ldpath=./lib --verbose --token=$AFB_TOKEN & - PID_DAEMON=\$! - - trap "echo REMOTE-SIGNAL TRAP; kill -15 \$PID_DAEMON" INT QUIT TERM EXIT - - # wait for daemon to finish - wait \$PID_DAEMON - exit -EOF diff --git a/conf.d/app-templates/wgt/icon-default.png b/conf.d/app-templates/wgt/icon-default.png Binary files differdeleted file mode 100644 index def888b..0000000 --- a/conf.d/app-templates/wgt/icon-default.png +++ /dev/null diff --git a/conf.d/app-templates/wgt/icon-html5.png b/conf.d/app-templates/wgt/icon-html5.png Binary files differdeleted file mode 100644 index a3573ef..0000000 --- a/conf.d/app-templates/wgt/icon-html5.png +++ /dev/null diff --git a/conf.d/app-templates/wgt/icon-native.png b/conf.d/app-templates/wgt/icon-native.png Binary files differdeleted file mode 100644 index fcb5d35..0000000 --- a/conf.d/app-templates/wgt/icon-native.png +++ /dev/null diff --git a/conf.d/app-templates/wgt/icon-qml.png b/conf.d/app-templates/wgt/icon-qml.png Binary files differdeleted file mode 100644 index ba248ea..0000000 --- a/conf.d/app-templates/wgt/icon-qml.png +++ /dev/null diff --git a/conf.d/app-templates/wgt/icon-service.png b/conf.d/app-templates/wgt/icon-service.png Binary files differdeleted file mode 100644 index 3aeb6f0..0000000 --- a/conf.d/app-templates/wgt/icon-service.png +++ /dev/null diff --git a/conf.d/autobuild/agl/autobuild b/conf.d/autobuild/agl/autobuild index 4811441..3a1ba5f 100755 --- a/conf.d/autobuild/agl/autobuild +++ b/conf.d/autobuild/agl/autobuild @@ -29,8 +29,9 @@ help: @echo "- clean" @echo "- distclean" @echo "- configure" - @echo "- build" - @echo "- package" + @echo "- build: compilation, link and prepare files for package into a widget" + @echo "- package: output a widget file '*.wgt'" + @echo "- install: install in your ${CMAKE_INSTALL_DIR} directory" @echo "" @echo "Usage: ./conf.d/autobuild/agl/autobuild package DEST=${HOME}/opt" @echo "Don't use your build dir as DEST as wgt file is generated at this location" @@ -58,6 +59,9 @@ package: build @cmake --build ${BUILD_DIR} --target widget @mkdir -p ${DEST} && cp ${BUILD_DIR}/*wgt ${DEST} +install: build + @cmake --build ${BUILD_DIR} --target install + ${BUILD_DIR}/Makefile: @[ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR} @[ -f ${BUILD_DIR}/Makefile ] || (cd ${BUILD_DIR} && cmake ${CONFIGURE_ARGS} ..) diff --git a/conf.d/autobuild/linux/autobuild b/conf.d/autobuild/linux/autobuild index 4811441..3a1ba5f 100755 --- a/conf.d/autobuild/linux/autobuild +++ b/conf.d/autobuild/linux/autobuild @@ -29,8 +29,9 @@ help: @echo "- clean" @echo "- distclean" @echo "- configure" - @echo "- build" - @echo "- package" + @echo "- build: compilation, link and prepare files for package into a widget" + @echo "- package: output a widget file '*.wgt'" + @echo "- install: install in your ${CMAKE_INSTALL_DIR} directory" @echo "" @echo "Usage: ./conf.d/autobuild/agl/autobuild package DEST=${HOME}/opt" @echo "Don't use your build dir as DEST as wgt file is generated at this location" @@ -58,6 +59,9 @@ package: build @cmake --build ${BUILD_DIR} --target widget @mkdir -p ${DEST} && cp ${BUILD_DIR}/*wgt ${DEST} +install: build + @cmake --build ${BUILD_DIR} --target install + ${BUILD_DIR}/Makefile: @[ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR} @[ -f ${BUILD_DIR}/Makefile ] || (cd ${BUILD_DIR} && cmake ${CONFIGURE_ARGS} ..) diff --git a/conf.d/cmake/config.cmake b/conf.d/cmake/config.cmake index 08e79fc..ff824cf 100644 --- a/conf.d/cmake/config.cmake +++ b/conf.d/cmake/config.cmake @@ -54,12 +54,14 @@ set(CONTROL_SUPPORT_LUA 1 CACHE BOOL "Active or not LUA Support") # PKG_CONFIG required packages # ----------------------------- set (PKG_REQUIRED_LIST + glib-2.0 alsa>=1.1.2 libsystemd>=222 libmicrohttpd>=0.9.55 afb-daemon json-c libafbwsc + glib-2.0 ) # Compilation options definition @@ -85,6 +87,7 @@ set(COMPILE_OPTIONS -DMAX_LINEAR_DB_SCALE=24 # until 24db volume normalisation use a simple linear scale -DTLV_BYTE_SIZE=256 # Alsa use 4096 as default but 256 should fit most sndcards -DCONTROL_MAXPATH_LEN=255 +-DCONTROL_CONFIG_PATH="${CMAKE_SOURCE_DIR}/conf.d/project:${CMAKE_INSTALL_PREFIX}/${PROJECT_NAME}" CACHE STRING "Compilation flags") #set(C_COMPILE_OPTIONS "" CACHE STRING "Compilation flags for C language.") #set(CXX_COMPILE_OPTIONS "" CACHE STRING "Compilation flags for C++ language.") @@ -99,6 +102,7 @@ if(IS_DIRECTORY $ENV{HOME}/opt/afb-monitoring) set(MONITORING_ALIAS "--alias=/monitoring:$ENV{HOME}/opt/afb-monitoring") endif() +set(CLOSING_MESSAGE "Debug: afb-daemon --name=afb-audiok4a --port=1234 --ws-server=unix:/var/tmp/ahl-4a --cntxtimeout=1 ${MONITORING_ALIAS} --binding=package/lib/afb-audiohighlevel.so --ldpaths=../../alsa-4a/build/package/lib:../../hal-sample-4a/build/package/lib --workdir=. --roothttp=../htdocs --token= --verbose ") # Optional location for config.xml.in diff --git a/conf.d/project/.asoundrc b/conf.d/project/.asoundrc-audiok index cba88e5..cba88e5 100644 --- a/conf.d/project/.asoundrc +++ b/conf.d/project/.asoundrc-audiok diff --git a/conf.d/project/.asounrc-fulup b/conf.d/project/.asounrc-fulup new file mode 100644 index 0000000..c98d5a8 --- /dev/null +++ b/conf.d/project/.asounrc-fulup @@ -0,0 +1,198 @@ +# +# Author: Fulup Ar Foll +# Object: PCM hook type +# +# Test : Note: Jabra_USB=hw:v1340 +# Check SoundCard ==> speaker-test -Dhw:v1340 -c2 -twav +# Check MixerPCM ==> speaker-test -DSpeakers -c2 -twav +# Check SoftVol ==> speaker-test -DMusicPCM -c2 -twav +# Check Plugin ==> speaker-test -DMultimedia -c2 -twav +# Check Plugin ==> speaker-test -DNavigation -c2 -twav +# +# MultiMedia aplay -DDMyNavPCM /usr/share/sounds/alsa/test.wav +# +# Bug/Feature: when softvol control is initialised from plugin and not +# from AGL binding. At 1st run ctl has invalid TLV and cannot be +# use. Bypass Solution: +# * start audio-binder before playing sound (binding create control before softvol plugin) +# * run a dummy aplay -DMyNavPCM "" to get a clean control +# +# References: https://www.spinics.net/lists/alsa-devel/msg54235.html +# -------------------------------------------------------------------- + +# ------------------------------------------------------ +# Mixer PCM allow to play multiple stream simultaneously +# ------------------------------------------------------ +pcm.Speakers { + type dmix + slave {pcm "hw:v1340"} #Jabra Solmate 1 + ipc_key 1001 # ipc_key should be unique to each dmix +} + +# ----------------------------------------------------- +# Register ControllerHookPlugin (ToiBeFix fullpath) +# ----------------------------------------------------- +pcm_hook_type.CtlHookPlugin { + install "AlsaInstallHook" + lib "/home/fulup/Workspace/Audio-4a/alsa-4a/build/alsa-hook/policy_alsa_hook.so" +} + + +# ------------------------------------------------------- +# Define one Audio Virtual Channel per Audio Roles +# ------------------------------------------------------- +pcm.MusicPCM { + type softvol + + # Point Slave on HOOK for policies control + slave.pcm "Speakers" + + # name should match with HAL definition + control.name "Playback Multimedia" +} + +pcm.NaviPCM { + type softvol + + # Point Slave on HOOK for policies control + slave.pcm "Speakers" + + # name should match with HAL definition + control.name "Playback Navigation" +} + +pcm.UrgentPCM { + type softvol + + # Point Slave on HOOK for policies control + slave.pcm "Speakers" + + # name should match with HAL definition + control.name "Playback Emergency" +} + +# ---------------------------------------------------- +# Define one hooked PCM channel per Audio Roles +# ---------------------------------------------------- +pcm.Multimedia { + type hooks + slave {pcm "MusicPCM"} + hooks.0 { + comment "Defined used hook sharelib and provide arguments/config to install func" + type "CtlHookPlugin" + hook_args { + + # print few log messages (default false) + verbose true + + # uri to audio-4a policy engine + uri="unix:/var/tmp/ahl-4a" + + # timeout in ms (default 500) + timeout 5000 + + # force API synchronous mode + synchronous true + + # api subcall to request a role + request { + stream_open "{'audio_role':'Entertainment', 'endpoint_type': 'sink'}" + set_stream_state "{'state': 'running'}" + } + + # api subcall to request a role + release { + stream_close "{}" + } + + # map AGL event on Unix signal. Search in event for json key=value + events { + sig-02 {search music, value quit} + sig-31 {search event, value start} + sig-32 {search event, value start} + } + } + } +} + +pcm.Navigation { + type hooks + slave {pcm "NaviPCM"} + hooks.0 { + comment "Defined used hook sharelib and provide arguments/config to install func" + type "CtlHookPlugin" + hook_args { + + # print few log messages (default false) + verbose true + + # uri to audio-4a policy engine + uri="unix:/var/tmp/ahl-4a" + + # timeout in ms (default 500) + timeout 5000 + + # force API synchronous mode + synchronous true + + # api subcall to request a role + request { + stream_open "{'audio_role':'Guidance', 'endpoint_type': 'sink'}" + set_stream_state "{'state': 'running'}" + } + + # api subcall to request a role + release { + release-role "{'uid':'alsa-hook-client'}" + } + + # map AGL event on Unix signal. Search in event for json key=value + events { + sig-02 {search navi, value quit} + sig-31 {search event, value start} + sig-32 {search event, value start} + } + } + } +} + +pcm.Emergency { + type hooks + slave {pcm "UrgentPCM"} + hooks.0 { + comment "Defined used hook sharelib and provide arguments/config to install func" + type "CtlHookPlugin" + hook_args { + + # print few log messages (default false) + verbose true + + # uri to audio-4a policy engine + uri="unix:/var/tmp/ahl-4a" + + # timeout in ms (default 500) + timeout 5000 + + # force API synchronous mode + synchronous true + + # api subcall to request a role + request { + stream_open "{'audio_role':'Emergency', 'endpoint_type': 'sink'}" + set_stream_state "{'state': 'running'}" + } + + # api subcall to request a role + release { + release-role "{'uid':'alsa-hook-client'}" + } + + # map AGL event on Unix signal. Search in event for json key=value + events { + sig-02 {search navi, value quit} + sig-31 {search event, value start} + sig-32 {search event, value start} + } + } + } +} diff --git a/conf.d/project/README.md b/conf.d/project/README.md new file mode 100644 index 0000000..00e3c2f --- /dev/null +++ b/conf.d/project/README.md @@ -0,0 +1,15 @@ + +1) $HOME/.asoundrc or /etc/asound.conf should match you hardware audio configuration. +2) ahl-xxxxxx-config.json should match your .asoundrc config + +Note: config file is search within with following rules: + - default search path is $PROJECT_ROOT/conf.d/project:${CMAKE_INSTALL_PREFIX}/${PROJECT_NAME} + - if environment variable "AAAA_CONFIG_PATH" is defined that it is used as search path + - config file should match "ahl-BINDERNAME-config.json" where BINDERNAME is provided through "--name=BINDERNAME" in afb-daemon commande line. + +Note: you may debug Audio-4A from your development tree with: + + afb-daemon --name=afb-audio4a --port=1234 --ws-server=unix:/var/tmp/ahl-4a --cntxtimeout=1 \ + --alias=/monitoring:/home/fulup/opt/afb-monitoring --binding=package/lib/afb-audiohighlevel.so \ + --ldpaths=../../alsa-4a/build/package/lib:../../hal-sample-4a/build/package/lib --workdir=. \ + --roothttp=../htdocs --token= --verbose --verbose
\ No newline at end of file diff --git a/conf.d/project/agl-ahl-config.json b/conf.d/project/ahl-audiok4a-config.json index 74ab251..74ab251 100644 --- a/conf.d/project/agl-ahl-config.json +++ b/conf.d/project/ahl-audiok4a-config.json diff --git a/conf.d/project/ahl-fulup4a-config.json b/conf.d/project/ahl-fulup4a-config.json new file mode 100644 index 0000000..1a851a5 --- /dev/null +++ b/conf.d/project/ahl-fulup4a-config.json @@ -0,0 +1,39 @@ +{ + "version": "0.2.0", + "policy_module": "AudioPolicy_v1", + "description": "High-level binding configuration file", + "note": "Devices and routings are always listed in order of priority (for device selection rules)", + "hal_list": ["jabra-usb"], + "audio_roles": [ + { + "name": "Guidance", + "id": 1, + "description": "Important user information where user action is expected (e.g. navigation instruction)", + "priority": 25, + "output": [ + "alsa.plug:NaviPCM" + ], + "interupt_behavior": "continue" + }, + { + "name": "Emergency", + "id": 2, + "description": "HMI or else notifications (e.g. touchscreen events, speech recognition on/off,...)", + "priority": 100, + "output": [ + "alsa.plug:UrgentPCM" + ], + "interupt_behavior": "pause" + }, + { + "name": "Entertainment", + "id": 3, + "description": "Multimedia content (e.g. tuner, media player, etc.)", + "priority": 0, + "output": [ + "alsa.plug:MusicPCM" + ], + "interupt_behavior": "pause" + } + ] +} diff --git a/htdocs/audiohl.html b/htdocs/audiohl.html index b59e404..0e153f5 100644 --- a/htdocs/audiohl.html +++ b/htdocs/audiohl.html @@ -8,9 +8,9 @@ <script type="text/javascript" src="AudioBinding.js"></script> </head> -<body onload="init('audiohl'); ep_type='sink' ; ar='Entertainment' ; ep_id=0 ; s_id=0 ; prop_val=0 ; vol_val='0' ; p_name='balance' ; st_state='idle' ; st_mute='off'"> +<body onload="init('ahl-4a'); ep_type='sink' ; ar='Entertainment' ; ep_id=0 ; s_id=0 ; prop_val=0 ; vol_val='0' ; p_name='balance' ; st_state='idle' ; st_mute='off'"> - <button id="connected" onclick="init('audiohl');">Binder WS Fail</button> <br><br> + <button id="connected" onclick="init('ahl-4a');">Binder WS Fail</button> <br><br> <button id="monitoring" onclick="window.open('/monitoring/monitor.html','_monitor_audio')">Debug/Monitoring</a></button> <b>Audio Role</b> @@ -59,26 +59,26 @@ <br> <ol> - <li><button onclick="callbinder('audiohl','get_endpoints', {audio_role:ar,endpoint_type:ep_type})">get_endpoints(audio_role,endpoint_type)</button></li> - <li><button onclick="callbinder('audiohl','stream_open', {audio_role:ar,endpoint_type:ep_type})">stream_open(audio_role,endpoint_type)</button></li> - <li><button onclick="callbinder('audiohl','stream_open', {audio_role:ar,endpoint_type:ep_type,endpoint_id:ep_id})">stream_open(audio_role,enpoint_type,endpoint_id)</button></li> - <li><button onclick="callbinder('audiohl','stream_close', {stream_id:s_id})">stream_close(stream_id)</button></li> - <li><button onclick="callbinder('audiohl','stream_close', {})">stream_close()</button></li> - <li><button onclick="callbinder('audiohl','get_stream_info', {stream_id:s_id})">get_stream_info(stream_id)</button></li> - <li><button onclick="callbinder('audiohl','set_stream_state', {stream_id:s_id})">set_stream_state(stream_id)</button></li> - <li><button onclick="callbinder('audiohl','set_stream_state', {stream_id:s_id,state:st_state})">set_stream_state(stream_id,stream_state)</button></li> - <li><button onclick="callbinder('audiohl','set_stream_state', {stream_id:s_id,mute:st_mute})">set_stream_state(stream_id,mute)</button></li> - <li><button onclick="callbinder('audiohl','set_stream_state', {stream_id:s_id,state:st_state,mute:st_mute})">set_stream_state(stream_id,stream_state,mute)</button></li> - <li><button onclick="callbinder('audiohl','set_stream_state', {state:st_state,mute:st_mute})">set_stream_state(stream_state,mute)</button></li> - <li><button onclick="callbinder('audiohl','volume', {endpoint_type:ep_type,endpoint_id:ep_id,volume:vol_val})">volume(endpoint_type,endpoint_id,value)</button></li> - <li><button onclick="callbinder('audiohl','volume', {endpoint_type:ep_type,endpoint_id:ep_id})">volume(endpoint_type,endpoint_id)</button></li> - <li><button onclick="callbinder('audiohl','property', {endpoint_type:ep_type,endpoint_id:ep_id,property_name:p_name,value:prop_val})">property(endpoint_type,endpoint_id,property,value)</button></li> - <li><button onclick="callbinder('audiohl','property', {endpoint_type:ep_type,endpoint_id:ep_id,property_name:p_name})">property(endpoint_type,endpoint_id,property)</button></li> - <li><button onclick="callbinder('audiohl','get_endpoint_info', {endpoint_type:ep_type,endpoint_id:ep_id})">get_endpoint_info(endpoint_type,endpoint_id)</button></li> - <li><button onclick="callbinder('audiohl','get_list_actions', {audio_role:ar})">get_list_actions(audio_role)</button></li> - <li><button onclick="callbinder('audiohl','post_action', {action_name:'emergency_brake',audio_role:ar,media_name:'Warning.wav'})">post_action(emergency_brake,audio_role,'Warning.wav')</button></li> - <li><button onclick="callbinder('audiohl','event_subscription', {events:['ahl_endpoint_property_event','ahl_endpoint_volume_event','ahl_post_action'],subscribe:1})">subscribe(['ahl_endpoint_property_event','ahl_endpoint_volume_event','ahl_post_action'])</button> - <li><button onclick="callbinder('audiohl','event_subscription', {events:['ahl_endpoint_property_event','ahl_endpoint_volume_event','ahl_post_action'],subscribe:0})">unsubscribe(['ahl_endpoint_property_event','ahl_endpoint_volume_event','ahl_post_action'])</button></li> + <li><button onclick="callbinder('ahl-4a','get_endpoints', {audio_role:ar,endpoint_type:ep_type})">get_endpoints(audio_role,endpoint_type)</button></li> + <li><button onclick="callbinder('ahl-4a','stream_open', {audio_role:ar,endpoint_type:ep_type})">stream_open(audio_role,endpoint_type)</button></li> + <li><button onclick="callbinder('ahl-4a','stream_open', {audio_role:ar,endpoint_type:ep_type,endpoint_id:ep_id})">stream_open(audio_role,enpoint_type,endpoint_id)</button></li> + <li><button onclick="callbinder('ahl-4a','stream_close', {stream_id:s_id})">stream_close(stream_id)</button></li> + <li><button onclick="callbinder('ahl-4a','stream_close', {})">stream_close()</button></li> + <li><button onclick="callbinder('ahl-4a','get_stream_info', {stream_id:s_id})">get_stream_info(stream_id)</button></li> + <li><button onclick="callbinder('ahl-4a','set_stream_state', {stream_id:s_id})">set_stream_state(stream_id)</button></li> + <li><button onclick="callbinder('ahl-4a','set_stream_state', {stream_id:s_id,state:st_state})">set_stream_state(stream_id,stream_state)</button></li> + <li><button onclick="callbinder('ahl-4a','set_stream_state', {stream_id:s_id,mute:st_mute})">set_stream_state(stream_id,mute)</button></li> + <li><button onclick="callbinder('ahl-4a','set_stream_state', {stream_id:s_id,state:st_state,mute:st_mute})">set_stream_state(stream_id,stream_state,mute)</button></li> + <li><button onclick="callbinder('ahl-4a','set_stream_state', {state:st_state,mute:st_mute})">set_stream_state(stream_state,mute)</button></li> + <li><button onclick="callbinder('ahl-4a','volume', {endpoint_type:ep_type,endpoint_id:ep_id,volume:vol_val})">volume(endpoint_type,endpoint_id,value)</button></li> + <li><button onclick="callbinder('ahl-4a','volume', {endpoint_type:ep_type,endpoint_id:ep_id})">volume(endpoint_type,endpoint_id)</button></li> + <li><button onclick="callbinder('ahl-4a','property', {endpoint_type:ep_type,endpoint_id:ep_id,property_name:p_name,value:prop_val})">property(endpoint_type,endpoint_id,property,value)</button></li> + <li><button onclick="callbinder('ahl-4a','property', {endpoint_type:ep_type,endpoint_id:ep_id,property_name:p_name})">property(endpoint_type,endpoint_id,property)</button></li> + <li><button onclick="callbinder('ahl-4a','get_endpoint_info', {endpoint_type:ep_type,endpoint_id:ep_id})">get_endpoint_info(endpoint_type,endpoint_id)</button></li> + <li><button onclick="callbinder('ahl-4a','get_list_actions', {audio_role:ar})">get_list_actions(audio_role)</button></li> + <li><button onclick="callbinder('ahl-4a','post_action', {action_name:'emergency_brake',audio_role:ar,media_name:'Warning.wav'})">post_action(emergency_brake,audio_role,'Warning.wav')</button></li> + <li><button onclick="callbinder('ahl-4a','event_subscription', {events:['ahl_endpoint_property_event','ahl_endpoint_volume_event','ahl_post_action'],subscribe:1})">subscribe(['ahl_endpoint_property_event','ahl_endpoint_volume_event','ahl_post_action'])</button> + <li><button onclick="callbinder('ahl-4a','event_subscription', {events:['ahl_endpoint_property_event','ahl_endpoint_volume_event','ahl_post_action'],subscribe:0})">unsubscribe(['ahl_endpoint_property_event','ahl_endpoint_volume_event','ahl_post_action'])</button></li> </ol> <div id="main" style="visibility:hidden"> diff --git a/nbproject/configurations.xml b/nbproject/configurations.xml new file mode 100644 index 0000000..93a17f5 --- /dev/null +++ b/nbproject/configurations.xml @@ -0,0 +1,109 @@ +<?xml version="1.0" encoding="UTF-8"?> +<configurationDescriptor version="100"> + <logicalFolder name="root" displayName="root" projectFiles="true" kind="ROOT"> + <df root="." name="0"> + <df name="afb-utilities"> + <in>filescan-utils.c</in> + <in>wrap-json.c</in> + </df> + <df name="ahl-binding"> + <in>ahl-binding.c</in> + <in>ahl-config.c</in> + <in>ahl-deviceenum.c</in> + </df> + <df name="ahl-utilities"> + <in>ahl-policy-utils.c</in> + <in>ahl-policy-utils.h</in> + </df> + <df name="build"> + <df name="CMakeFiles"> + <df name="3.5.2"> + <df name="CompilerIdC"> + <in>CMakeCCompilerId.c</in> + </df> + <df name="CompilerIdCXX"> + <in>CMakeCXXCompilerId.cpp</in> + </df> + </df> + <in>feature_tests.c</in> + <in>feature_tests.cxx</in> + </df> + </df> + </df> + <logicalFolder name="ExternalFiles" + displayName="Important Files" + projectFiles="false" + kind="IMPORTANT_FILES_FOLDER"> + <itemPath>build/Makefile</itemPath> + <itemPath>nbproject/private/launcher.properties</itemPath> + </logicalFolder> + </logicalFolder> + <sourceFolderFilter>^(nbproject)$</sourceFolderFilter> + <sourceRootList> + <Elem>.</Elem> + </sourceRootList> + <projectmakefile>build/Makefile</projectmakefile> + <confs> + <conf name="Default" type="0"> + <toolsSet> + <compilerSet>default</compilerSet> + <dependencyChecking>false</dependencyChecking> + <rebuildPropChanged>false</rebuildPropChanged> + </toolsSet> + <codeAssistance> + <buildAnalyzer>false</buildAnalyzer> + </codeAssistance> + <makefileType> + <makeTool> + <buildCommandWorkingDir>build</buildCommandWorkingDir> + <buildCommand>${MAKE} -f Makefile</buildCommand> + <cleanCommand>${MAKE} -f Makefile clean</cleanCommand> + <executablePath></executablePath> + <cTool> + <incDir> + <pElem>.</pElem> + </incDir> + </cTool> + <ccTool> + <incDir> + <pElem>.</pElem> + </incDir> + </ccTool> + </makeTool> + <preBuild> + <preBuildCommandWorkingDir>build</preBuildCommandWorkingDir> + <preBuildCommand>cmake ..</preBuildCommand> + <preBuildFirst>true</preBuildFirst> + </preBuild> + </makefileType> + <item path="afb-utilities/filescan-utils.c" ex="false" tool="0" flavor2="0"> + </item> + <item path="afb-utilities/wrap-json.c" ex="false" tool="0" flavor2="0"> + </item> + <item path="ahl-binding/ahl-binding.c" ex="false" tool="0" flavor2="0"> + </item> + <item path="ahl-binding/ahl-config.c" ex="false" tool="0" flavor2="0"> + </item> + <item path="ahl-binding/ahl-deviceenum.c" ex="false" tool="0" flavor2="0"> + </item> + <item path="ahl-utilities/ahl-policy-utils.c" ex="false" tool="0" flavor2="0"> + </item> + <item path="ahl-utilities/ahl-policy-utils.h" ex="false" tool="3" flavor2="0"> + </item> + <item path="build/CMakeFiles/3.5.2/CompilerIdC/CMakeCCompilerId.c" + ex="false" + tool="0" + flavor2="0"> + </item> + <item path="build/CMakeFiles/3.5.2/CompilerIdCXX/CMakeCXXCompilerId.cpp" + ex="false" + tool="1" + flavor2="0"> + </item> + <item path="build/CMakeFiles/feature_tests.c" ex="false" tool="0" flavor2="0"> + </item> + <item path="build/CMakeFiles/feature_tests.cxx" ex="false" tool="1" flavor2="0"> + </item> + </conf> + </confs> +</configurationDescriptor> diff --git a/nbproject/project.xml b/nbproject/project.xml new file mode 100644 index 0000000..3e0cffd --- /dev/null +++ b/nbproject/project.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://www.netbeans.org/ns/project/1"> + <type>org.netbeans.modules.cnd.makeproject</type> + <configuration> + <data xmlns="http://www.netbeans.org/ns/make-project/1"> + <name>afb-audiohighlevel</name> + <c-extensions>c</c-extensions> + <cpp-extensions>cpp,cxx</cpp-extensions> + <header-extensions>h,hpp</header-extensions> + <sourceEncoding>UTF-8</sourceEncoding> + <make-dep-projects/> + <sourceRootList> + <sourceRootElem>.</sourceRootElem> + </sourceRootList> + <confList> + <confElem> + <name>Default</name> + <type>0</type> + </confElem> + </confList> + <formatting> + <project-formatting-style>false</project-formatting-style> + </formatting> + </data> + </configuration> +</project> diff --git a/src/ahl-apidef.h b/src/ahl-apidef.h deleted file mode 100644 index 97f8de7..0000000 --- a/src/ahl-apidef.h +++ /dev/null @@ -1,237 +0,0 @@ - -static const char _afb_description_v2_audiohl[] = - "{\"openapi\":\"3.0.0\",\"info\":{\"description\":\"Audio high level API " - "for AGL applications\",\"title\":\"audiohighlevel\",\"version\":\"1.0\"," - "\"x-binding-c-generator\":{\"api\":\"audiohl\",\"version\":2,\"prefix\":" - "\"audiohlapi_\",\"postfix\":\"\",\"start\":null,\"onevent\":\"AhlOnEvent" - "\",\"init\":\"AhlBindingInit\",\"scope\":\"\",\"private\":false}},\"serv" - "ers\":[{\"url\":\"ws://{host}:{port}/api/audiohl\",\"description\":\"Aud" - "io high level API for AGL applications.\",\"variables\":{\"host\":{\"def" - "ault\":\"localhost\"},\"port\":{\"default\":\"1234\"}},\"x-afb-events\":" - "[{\"$ref\":\"#/components/schemas/afb-event\"}]}],\"components\":{\"sche" - "mas\":{\"afb-reply\":{\"$ref\":\"#/components/schemas/afb-reply-v2\"},\"" - "afb-event\":{\"$ref\":\"#/components/schemas/afb-event-v2\"},\"afb-reply" - "-v2\":{\"title\":\"Generic response.\",\"type\":\"object\",\"required\":" - "[\"jtype\",\"request\"],\"properties\":{\"jtype\":{\"type\":\"string\",\"" - "const\":\"afb-reply\"},\"request\":{\"type\":\"object\",\"required\":[\"" - "status\"],\"properties\":{\"status\":{\"type\":\"string\"},\"info\":{\"t" - "ype\":\"string\"},\"token\":{\"type\":\"string\"},\"uuid\":{\"type\":\"s" - "tring\"},\"reqid\":{\"type\":\"string\"}}},\"response\":{\"type\":\"obje" - "ct\"}}},\"afb-event-v2\":{\"type\":\"object\",\"required\":[\"jtype\",\"" - "event\"],\"properties\":{\"jtype\":{\"type\":\"string\",\"const\":\"afb-" - "event\"},\"event\":{\"type\":\"string\"},\"data\":{\"type\":\"object\"}}" - "},\"endpoint_info\":{\"type\":\"object\",\"required\":[\"endpoint_id\",\"" - "type\",\"device_name\",\"device_uri\"],\"properties\":{\"endpoint_id\":{" - "\"type\":\"int\"},\"type\":{\"type\":\"enum\"},\"device_name\":{\"type\"" - ":\"string\"},\"device_uri_type\":{\"type\":\"string\"}}},\"stream_info\"" - ":{\"type\":\"object\",\"required\":[\"stream_id\",\"state\",\"mute\",\"e" - "ndpoint_info\"],\"properties\":{\"stream_id\":{\"type\":\"int\"},\"state" - "\":{\"type\":\"int\"},\"mute\":{\"type\":\"int\"},\"device_uri\":{\"type" - "\":\"string\"},\"$ref\":\"#/components/schemas/endpoint_info\"}}},\"x-pe" - "rmissions\":{\"streamcontrol\":{\"permission\":\"urn:AGL:permission:audi" - "o:public:streamcontrol\"},\"endpointcontrol\":{\"permission\":\"urn:AGL:" - "permission:audio:public:endpointcontrol\"},\"audiostream\":{\"permission" - "\":\"urn:AGL:permission:audio:public:audiostream\"},\"soundevent\":{\"pe" - "rmission\":\"urn:AGL:permission:audio:public:soundevent\"}},\"responses\"" - ":{\"200\":{\"description\":\"A complex object array response\",\"content" - "\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/af" - "b-reply\"}}}},\"400\":{\"description\":\"Invalid arguments\"}}},\"paths\"" - ":{\"/get_endpoints\":{\"description\":\"Retrieve array of available audi" - "o endpoints\",\"get\":{\"parameters\":[{\"in\":\"query\",\"name\":\"audi" - "o_role\",\"required\":true,\"schema\":{\"type\":\"string\"}},{\"in\":\"q" - "uery\",\"name\":\"endpoint_type\",\"required\":true,\"schema\":{\"type\"" - ":\"enum\"}}],\"responses\":{\"200\":{\"$ref\":\"#/components/responses/2" - "00\",\"response\":{\"description\":\"Array of endpoint info structures\"" - ",\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/endpoint_" - "info\"}}},\"400\":{\"$ref\":\"#/components/responses/400\"}}}},\"/stream" - "_open\":{\"description\":\"Request opening a stream\",\"get\":{\"x-permi" - "ssions\":{\"$ref\":\"#/components/x-permissions/audiostream\"},\"paramet" - "ers\":[{\"in\":\"query\",\"name\":\"audio_role\",\"required\":true,\"sch" - "ema\":{\"type\":\"string\"}},{\"in\":\"query\",\"name\":\"endpoint_type\"" - ",\"required\":true,\"schema\":{\"type\":\"enum\"}},{\"in\":\"query\",\"n" - "ame\":\"endpoint_id\",\"required\":false,\"schema\":{\"type\":\"int\"}}]" - ",\"responses\":{\"200\":{\"$ref\":\"#/components/responses/200\",\"respo" - "nse\":{\"description\":\"Stream information structure\",\"$ref\":\"#/com" - "ponents/schemas/stream_info\"}},\"400\":{\"$ref\":\"#/components/respons" - "es/400\"}}}},\"/stream_close\":{\"description\":\"Request closing a stre" - "am\",\"get\":{\"x-permissions\":{\"$ref\":\"#/components/x-permissions/a" - "udiostream\"},\"parameters\":[{\"in\":\"query\",\"name\":\"stream_id\",\"" - "required\":false,\"schema\":{\"type\":\"int\"}}],\"responses\":{\"200\":" - "{\"$ref\":\"#/components/responses/200\"},\"400\":{\"$ref\":\"#/componen" - "ts/responses/400\"}}}},\"/set_stream_state\":{\"description\":\"Change s" - "tream active and/or mute state\",\"get\":{\"x-permissions\":{\"$ref\":\"" - "#/components/x-permissions/streamcontrol\"},\"parameters\":[{\"in\":\"qu" - "ery\",\"name\":\"stream_id\",\"required\":false,\"schema\":{\"type\":\"i" - "nt\"}},{\"in\":\"query\",\"name\":\"state\",\"required\":false,\"schema\"" - ":{\"type\":\"int\"}},{\"in\":\"query\",\"name\":\"mute\",\"required\":fa" - "lse,\"schema\":{\"type\":\"int\"}}],\"responses\":{\"200\":{\"$ref\":\"#" - "/components/responses/200\"},\"400\":{\"$ref\":\"#/components/responses/" - "400\"}}}},\"/get_stream_info\":{\"description\":\"Retrieve stream inform" - "ation\",\"get\":{\"parameters\":[{\"in\":\"query\",\"name\":\"stream_id\"" - ",\"required\":true,\"schema\":{\"type\":\"int\"}}],\"responses\":{\"200\"" - ":{\"$ref\":\"#/components/responses/200\",\"response\":{\"description\":" - "\"Stream information structure\",\"$ref\":\"#/components/schemas/stream_" - "info\"}},\"400\":{\"$ref\":\"#/components/responses/400\"}}}},\"/volume\"" - ":{\"description\":\"Set or get volume on endpoint\",\"get\":{\"x-permiss" - "ions\":{\"$ref\":\"#/components/x-permissions/endpointcontrol\"},\"param" - "eters\":[{\"in\":\"query\",\"name\":\"endpoint_type\",\"required\":true," - "\"schema\":{\"type\":\"enum\"}},{\"in\":\"query\",\"name\":\"endpoint_id" - "\",\"required\":true,\"schema\":{\"type\":\"int\"}},{\"in\":\"query\",\"" - "name\":\"volume\",\"required\":false,\"schema\":{\"type\":\"string\"}}]," - "\"responses\":{\"200\":{\"$ref\":\"#/components/responses/200\"},\"400\"" - ":{\"$ref\":\"#/components/responses/400\"}}}},\"/get_endpoint_info\":{\"" - "description\":\"Retrieve endpoint information including its properties\"" - ",\"get\":{\"parameters\":[{\"in\":\"query\",\"name\":\"endpoint_type\",\"" - "required\":true,\"schema\":{\"type\":\"enum\"}},{\"in\":\"query\",\"name" - "\":\"endpoint_id\",\"required\":true,\"schema\":{\"type\":\"int\"}}],\"r" - "esponses\":{\"200\":{\"$ref\":\"#/components/responses/200\"},\"400\":{\"" - "$ref\":\"#/components/responses/400\"}}}},\"/property\":{\"description\"" - ":\"Set/get endpoint property value\",\"get\":{\"x-permissions\":{\"$ref\"" - ":\"#/components/x-permissions/endpointcontrol\"},\"parameters\":[{\"in\"" - ":\"query\",\"name\":\"endpoint_type\",\"required\":true,\"schema\":{\"ty" - "pe\":\"enum\"}},{\"in\":\"query\",\"name\":\"endpoint_id\",\"required\":" - "true,\"schema\":{\"type\":\"int\"}},{\"in\":\"query\",\"name\":\"propert" - "y_name\",\"required\":true,\"schema\":{\"type\":\"string\"}},{\"in\":\"q" - "uery\",\"name\":\"value\",\"required\":false,\"schema\":{\"type\":\"stri" - "ng\"}}],\"responses\":{\"200\":{\"$ref\":\"#/components/responses/200\"}" - ",\"400\":{\"$ref\":\"#/components/responses/400\"}}}},\"/get_list_action" - "s\":{\"description\":\"Retrieve a list of supported actions for a partic" - "ular audio role\",\"get\":{\"parameters\":[{\"in\":\"query\",\"name\":\"" - "audio_role\",\"required\":true,\"schema\":{\"type\":\"string\"}}],\"resp" - "onses\":{\"200\":{\"$ref\":\"#/components/responses/200\"},\"400\":{\"$r" - "ef\":\"#/components/responses/400\"}}}},\"/post_action\":{\"description\"" - ":\"Post sound or audio device related action event (extendable mechanism" - ")\",\"get\":{\"x-permissions\":{\"$ref\":\"#/components/x-permissions/so" - "undevent\"},\"parameters\":[{\"in\":\"query\",\"name\":\"action_name\",\"" - "required\":true,\"schema\":{\"type\":\"string\"}},{\"in\":\"query\",\"na" - "me\":\"audio_role\",\"required\":true,\"schema\":{\"type\":\"string\"}}," - "{\"in\":\"query\",\"name\":\"media_name\",\"required\":false,\"schema\":" - "{\"type\":\"string\"}},{\"in\":\"query\",\"name\":\"action_context\",\"r" - "equired\":false,\"schema\":{\"type\":\"object\"}}],\"responses\":{\"200\"" - ":{\"$ref\":\"#/components/responses/200\"},\"400\":{\"$ref\":\"#/compone" - "nts/responses/400\"}}}},\"/event_subscription\":{\"description\":\"Subsc" - "ribe to audio high level events\",\"get\":{\"parameters\":[{\"in\":\"que" - "ry\",\"name\":\"events\",\"required\":true,\"schema\":{\"type\":\"array\"" - ",\"items\":{\"type\":\"string\"}}},{\"in\":\"query\",\"name\":\"subscrib" - "e\",\"required\":true,\"schema\":{\"type\":\"int\"}}],\"responses\":{\"2" - "00\":{\"$ref\":\"#/components/responses/200\"},\"400\":{\"$ref\":\"#/com" - "ponents/responses/400\"}}}}}}" -; - -static const struct afb_auth _afb_auths_v2_audiohl[] = { - { .type = afb_auth_Permission, .text = "urn:AGL:permission:audio:public:audiostream" }, - { .type = afb_auth_Permission, .text = "urn:AGL:permission:audio:public:streamcontrol" }, - { .type = afb_auth_Permission, .text = "urn:AGL:permission:audio:public:endpointcontrol" }, - { .type = afb_auth_Permission, .text = "urn:AGL:permission:audio:public:soundevent" } -}; - - void audiohlapi_get_endpoints(struct afb_req req); - void audiohlapi_stream_open(struct afb_req req); - void audiohlapi_stream_close(struct afb_req req); - void audiohlapi_set_stream_state(struct afb_req req); - void audiohlapi_get_stream_info(struct afb_req req); - void audiohlapi_volume(struct afb_req req); - void audiohlapi_get_endpoint_info(struct afb_req req); - void audiohlapi_property(struct afb_req req); - void audiohlapi_get_list_actions(struct afb_req req); - void audiohlapi_post_action(struct afb_req req); - void audiohlapi_event_subscription(struct afb_req req); - -static const struct afb_verb_v2 _afb_verbs_v2_audiohl[] = { - { - .verb = "get_endpoints", - .callback = audiohlapi_get_endpoints, - .auth = NULL, - .info = "Retrieve array of available audio endpoints", - .session = AFB_SESSION_NONE_V2 - }, - { - .verb = "stream_open", - .callback = audiohlapi_stream_open, - .auth = &_afb_auths_v2_audiohl[0], - .info = "Request opening a stream", - .session = AFB_SESSION_NONE_V2 - }, - { - .verb = "stream_close", - .callback = audiohlapi_stream_close, - .auth = &_afb_auths_v2_audiohl[0], - .info = "Request closing a stream", - .session = AFB_SESSION_NONE_V2 - }, - { - .verb = "set_stream_state", - .callback = audiohlapi_set_stream_state, - .auth = &_afb_auths_v2_audiohl[1], - .info = "Change stream active and/or mute state", - .session = AFB_SESSION_NONE_V2 - }, - { - .verb = "get_stream_info", - .callback = audiohlapi_get_stream_info, - .auth = NULL, - .info = "Retrieve stream information", - .session = AFB_SESSION_NONE_V2 - }, - { - .verb = "volume", - .callback = audiohlapi_volume, - .auth = &_afb_auths_v2_audiohl[2], - .info = "Set or get volume on endpoint", - .session = AFB_SESSION_NONE_V2 - }, - { - .verb = "get_endpoint_info", - .callback = audiohlapi_get_endpoint_info, - .auth = NULL, - .info = "Retrieve endpoint information including its properties", - .session = AFB_SESSION_NONE_V2 - }, - { - .verb = "property", - .callback = audiohlapi_property, - .auth = &_afb_auths_v2_audiohl[2], - .info = "Set/get endpoint property value", - .session = AFB_SESSION_NONE_V2 - }, - { - .verb = "get_list_actions", - .callback = audiohlapi_get_list_actions, - .auth = NULL, - .info = "Retrieve a list of supported actions for a particular audio role", - .session = AFB_SESSION_NONE_V2 - }, - { - .verb = "post_action", - .callback = audiohlapi_post_action, - .auth = &_afb_auths_v2_audiohl[3], - .info = "Post sound or audio device related action event (extendable mechanism)", - .session = AFB_SESSION_NONE_V2 - }, - { - .verb = "event_subscription", - .callback = audiohlapi_event_subscription, - .auth = NULL, - .info = "Subscribe to audio high level events", - .session = AFB_SESSION_NONE_V2 - }, - { - .verb = NULL, - .callback = NULL, - .auth = NULL, - .info = NULL, - .session = 0 - } -}; - -const struct afb_binding_v2 afbBindingV2 = { - .api = "audiohl", - .specification = _afb_description_v2_audiohl, - .info = "Audio high level API for AGL applications", - .verbs = _afb_verbs_v2_audiohl, - .preinit = NULL, - .init = AhlBindingInit, - .onevent = AhlOnEvent, - .noconcurrency = 0 -}; - diff --git a/src/ahl-policyJSON.c b/src/ahl-policyJSON.c deleted file mode 100644 index 1fdf2d9..0000000 --- a/src/ahl-policyJSON.c +++ /dev/null @@ -1,307 +0,0 @@ -/* - * Copyright (C) 2017 "Audiokinetic Inc" - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "wrap-json.h" -#include <json-c/json.h> -#include <glib.h> -#include "ahl-policy-utils.h" -#include "ahl-interface.h" -#include "ahl-binding.h" - -static char * DeviceURITypeEnumToStr(DeviceURITypeT in_eDeviceURIType) { - switch(in_eDeviceURIType) { - case DEVICEURITYPE_ALSA_HW: // Alsa hardware device URI - return AHL_DEVICEURITYPE_ALSA_HW; - case DEVICEURITYPE_ALSA_DMIX: // Alsa Dmix device URI (only for playback devices) - return AHL_DEVICEURITYPE_ALSA_DMIX; - case DEVICEURITYPE_ALSA_DSNOOP: // Alsa DSnoop device URI (only for capture devices) - return AHL_DEVICEURITYPE_ALSA_DSNOOP; - case DEVICEURITYPE_ALSA_SOFTVOL: // Alsa softvol device URI - return AHL_DEVICEURITYPE_ALSA_SOFTVOL; - case DEVICEURITYPE_ALSA_PLUG: // Alsa plug device URI - return AHL_DEVICEURITYPE_ALSA_PLUG; - case DEVICEURITYPE_ALSA_OTHER: // Alsa domain URI device of unspecified type - return AHL_DEVICEURITYPE_ALSA_OTHER; - case DEVICEURITYPE_NOT_ALSA: // Unknown (not ALSA domain) - return AHL_DEVICEURITYPE_NOT_ALSA; - default: - return "Unknown"; - } -} - -static char * StreamStateEnumToStr(StreamStateT in_eStreamState) { - switch(in_eStreamState) { - case STREAM_STATE_IDLE: - return AHL_STREAM_STATE_IDLE; - case STREAM_STATE_RUNNING: - return AHL_STREAM_STATE_RUNNING; - case STREAM_STATE_PAUSED: - return AHL_STREAM_STATE_PAUSED; - default: - return "Unknown"; - } -} - -static char * StreamMuteEnumToStr(StreamMuteT in_eStreamMute) { - switch(in_eStreamMute) { - case STREAM_UNMUTED: - return AHL_STREAM_UNMUTED; - case STREAM_MUTED: - return AHL_STREAM_MUTED; - default: - return "Unknown"; - } -} - -static int EndpointPropTableToJSON(GHashTable * pPropTable, json_object **ppProptableJ) -{ - if(pPropTable == NULL) - { - AFB_ERROR("Invalid EndpointPropTableToJSON arguments"); - return AHL_FAIL; - } - - // Create json object for PropTable - *ppProptableJ = json_object_new_array(); - GHashTableIter iter; - gpointer key, value; - g_hash_table_iter_init (&iter, pPropTable); - while (g_hash_table_iter_next (&iter, &key, &value)) - { - if ( key != NULL && value != NULL) { - json_object *pPropertyJ = NULL; - json_object_get(value); - int err = wrap_json_pack(&pPropertyJ, "{s:s,s:o}", - "property_name", (char*)key, - "property_value", value - ); - if(err) - { - AFB_ERROR("Unable to pack JSON endpoint, =%s", wrap_json_get_error_string(err)); - return AHL_FAIL; - } - json_object_array_add(*ppProptableJ, pPropertyJ); - } - } - - return AHL_SUCCESS; -} - -int EndpointInfoToJSON(EndpointInfoT * pEndpointInfo, json_object **ppEndpointInfoJ) -{ - if(pEndpointInfo == NULL || pEndpointInfo->pPropTable == NULL) - { - AFB_ERROR("Invalid EndpointInfoToJSON arguments"); - return AHL_FAIL; - } - - json_object * pPropTableJ = NULL; - int err = EndpointPropTableToJSON(pEndpointInfo->pPropTable,&pPropTableJ); - if (err) { - return AHL_FAIL; - } - - // Create json object for EndpointInfo - err = wrap_json_pack(ppEndpointInfoJ, "{s:i,s:i,s:s,s:s,s:s,s:s,s:s,s:i,s:s,s:i,s:i,s:i,s:i,s:i,s:i,s:i,s:o}", - "endpoint_id", pEndpointInfo->endpointID, - "endpoint_type", pEndpointInfo->type, - "device_name", pEndpointInfo->gsDeviceName, - "display_name", pEndpointInfo->gsDisplayName, - "device_uri", pEndpointInfo->gsDeviceURI, - "device_domain", pEndpointInfo->gsDeviceDomain, - "audio_role",pEndpointInfo->pRoleName, - "device_uri_type", pEndpointInfo->deviceURIType, - "hal_api_name", pEndpointInfo->gsHALAPIName, - "alsa_cardNum", pEndpointInfo->alsaInfo.cardNum, - "alsa_deviceNum", pEndpointInfo->alsaInfo.deviceNum, - "alsa_subDeviceNum", pEndpointInfo->alsaInfo.subDeviceNum, - "format_samplerate", pEndpointInfo->format.sampleRate, - "format_numchannels", pEndpointInfo->format.numChannels, - "format_sampletype",pEndpointInfo->format.sampleType, - "volume", pEndpointInfo->iVolume, - "property_table", pPropTableJ - ); - if (err) { - AFB_ERROR("Unable to pack JSON endpoint, =%s", wrap_json_get_error_string(err)); - return AHL_FAIL; - } - - return AHL_SUCCESS; -} - -int StreamInfoToJSON(StreamInfoT * pStreamInfo, json_object **ppStreamInfoJ) -{ - if(pStreamInfo == NULL) - { - AFB_ERROR("Invalid arguments to StreamInfoToJSON"); - return AHL_FAIL; - } - - json_object * pEndpointInfoJ = NULL; - int err = EndpointInfoToJSON(pStreamInfo->pEndpointInfo, &pEndpointInfoJ); - if (err) { - return AHL_FAIL; - } - - // Create json object for stream - err = wrap_json_pack(ppStreamInfoJ, "{s:i,s:i,s:i,s:I,s:i,s:s,s:i,s:i,s:o}", - "stream_id", pStreamInfo->streamID, - "stream_state", pStreamInfo->streamState, - "stream_mute", pStreamInfo->streamMute, - "stream_state_event", &pStreamInfo->streamStateEvent, - "endpoint_sel_mod", pStreamInfo->endpointSelMode, - "role_name", pStreamInfo->pRoleName, - "priority", pStreamInfo->iPriority, - "interrupt_behavior", pStreamInfo->eInterruptBehavior, - "endpoint_info", pEndpointInfoJ - ); - if (err) { - AFB_ERROR("Unable to pack JSON endpoint, =%s", wrap_json_get_error_string(err)); - return AHL_FAIL; - } - - return AHL_SUCCESS; -} - -static int UpdatePropertyList(GHashTable * pPropTable, json_object * pPropTableJ) { - if (pPropTable == NULL || pPropTableJ == NULL) { - AFB_ERROR("Invalid arguments to UpdatePropertyList"); - return AHL_FAIL; - } - // Unpack prop table - int nbProperties = json_object_array_length(pPropTableJ); - for(int i = 0; i < nbProperties; i++) - { - json_object * propJ = json_object_array_get_idx(pPropTableJ,i); - if (propJ) { - char * pPropertyName = NULL; - json_object * pPropertyValueJ = NULL; - int err = wrap_json_unpack(propJ, "{s:s,s:o}", - "property_name", &pPropertyName, - "property_value", &pPropertyValueJ); - if (err) { - AFB_ERROR("Unable to unpack JSON property, = %s", wrap_json_get_error_string(err)); - return AHL_FAIL; - } - - // Object type detection for property value (string = state, numeric = property) - json_type jType = json_object_get_type(pPropertyValueJ); - switch (jType) { - case json_type_double: - g_hash_table_insert(pPropTable, pPropertyName, json_object_new_double(json_object_get_double(pPropertyValueJ))); - break; - case json_type_int: - g_hash_table_insert(pPropTable, pPropertyName, json_object_new_int(json_object_get_int(pPropertyValueJ))); - break; - case json_type_string: - g_hash_table_insert(pPropTable, pPropertyName, json_object_new_string(json_object_get_string(pPropertyValueJ))); - break; - default: - AFB_ERROR("Invalid property argument Property value not a valid json object query=%s", json_object_get_string(pPropertyValueJ)); - return AHL_FAIL; - } - } - } - - return AHL_SUCCESS; -} - -int UpdateEndpointInfo(EndpointInfoT * pEndpoint, json_object * pEndpointInfoJ) { - - if(pEndpoint == NULL || pEndpointInfoJ == NULL) - { - AFB_ERROR("Invalid arguments to UpdateEndpointInfo"); - return AHL_FAIL; - } - - // Push information to endpoint info struct - json_object * pPropTableJ = NULL; - char * pDisplayName = NULL; - char * pHALName = NULL; - int err = wrap_json_unpack(pEndpointInfoJ,"{s:i,s:s,s:s,s:o}", - "init_volume",&pEndpoint->iVolume, - "display_name",&pDisplayName, - "hal_name", &pHALName, - "property_table",&pPropTableJ); - if (err) { - AFB_ERROR("Unable to create Endpoint Json object error:%s ",wrap_json_get_error_string(err)); - return AHL_FAIL; - } - g_strlcpy(pEndpoint->gsDisplayName,pDisplayName,AHL_STR_MAX_LENGTH); - g_strlcpy(pEndpoint->gsHALAPIName,pHALName,AHL_STR_MAX_LENGTH); - - if (pEndpoint->pPropTable && pPropTableJ) { - err = UpdatePropertyList(pEndpoint->pPropTable,pPropTableJ); - if (err) { - AFB_ERROR("Unable to update property table Json object error:%s ",wrap_json_get_error_string(err)); - return AHL_FAIL; - } - } - - return AHL_SUCCESS; -} - -static void AudioFormatStructToJSON(json_object **audioFormatJ, AudioFormatT * pAudioFormat) -{ - wrap_json_pack(audioFormatJ, "{s:i,s:i,s:i}", - "sample_rate", pAudioFormat->sampleRate, - "num_channels", pAudioFormat->numChannels, - "sample_type", pAudioFormat->sampleType); -} - -// Package only information that can useful to application clients when selecting endpoint -void JSONPublicPackageEndpoint(EndpointInfoT * pEndpointInfo,json_object **endpointInfoJ) -{ - json_object *formatInfoJ = NULL; - int err = wrap_json_pack(endpointInfoJ, "{s:i,s:s,s:s,s:s,s:s,s:s,s:s}", - "endpoint_id", pEndpointInfo->endpointID, - "endpoint_type", (pEndpointInfo->type == ENDPOINTTYPE_SOURCE) ? AHL_ENDPOINTTYPE_SOURCE : AHL_ENDPOINTTYPE_SINK, - "device_name", pEndpointInfo->gsDeviceName, - "display_name", pEndpointInfo->gsDisplayName, - "audio_role", pEndpointInfo->pRoleName, - "device_domain",pEndpointInfo->gsDeviceDomain, - "device_uri_type", DeviceURITypeEnumToStr(pEndpointInfo->deviceURIType)); - if(err) - { - AFB_NOTICE("Content object=%s", json_object_get_string(*endpointInfoJ)); - } - - AudioFormatStructToJSON(&formatInfoJ,&pEndpointInfo->format); - json_object_object_add(*endpointInfoJ,"format",formatInfoJ); - - json_object *pPropTableJ = NULL; - EndpointPropTableToJSON(pEndpointInfo->pPropTable,&pPropTableJ); - json_object_object_add(*endpointInfoJ,"properties",pPropTableJ); -} - -// Package only information that can useful to application clients when opening a stream -void JSONPublicPackageStream(StreamInfoT * pStreamInfo,json_object **streamInfoJ) -{ - json_object *endpointInfoJ = NULL; - JSONPublicPackageEndpoint(pStreamInfo->pEndpointInfo,&endpointInfoJ); - int err = wrap_json_pack(streamInfoJ, "{s:i,s:s,s:s,s:s}", - "stream_id", pStreamInfo->streamID, - "state", StreamStateEnumToStr(pStreamInfo->streamState), - "mute", StreamMuteEnumToStr(pStreamInfo->streamMute), - "device_uri",pStreamInfo->pEndpointInfo->gsDeviceURI); // Need to open a stream to have access to the device URI - - if(err) - { - AFB_NOTICE("Content object=%s", json_object_get_string(*streamInfoJ)); - } - - json_object_object_add(*streamInfoJ,"endpoint_info",endpointInfoJ); -}
\ No newline at end of file diff --git a/src/ahl-policyJSON.h b/src/ahl-policyJSON.h deleted file mode 100644 index c651f79..0000000 --- a/src/ahl-policyJSON.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (C) 2017 "Audiokinetic Inc" - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef AHL_POLICY_JSON_INCLUDE -#define AHL_POLICY_JSON_INCLUDE - -#include <json-c/json.h> -#include <afb/afb-binding.h> -#include "ahl-policy-utils.h" // TODO: Should remigrate AHL structures to binding.h - -int EndpointInfoToJSON(EndpointInfoT * pEndpointInfo, json_object **ppEndpointInfoJ); -int StreamInfoToJSON(StreamInfoT * pStreamInfo, json_object **ppStreamInfoJ); -int UpdateEndpointInfo(EndpointInfoT * pEndpoint,json_object * pEndpointInfoJ); -void JSONPublicPackageEndpoint(EndpointInfoT * pEndpointInfo,json_object **endpointInfoJ); -void JSONPublicPackageStream(StreamInfoT * pStreamInfo,json_object **streamInfoJ); - -#endif // AHL_POLICY_JSON_INCLUDE |