bf809cc384a11907451870c9261107a9c80cb74a
[src/app-framework-binder.git] / plugins / samples / HelloWorld.c
1 /*
2  * Copyright (C) 2015 "IoT.bzh"
3  * Author "Fulup Ar Foll"
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *   http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 #define _GNU_SOURCE
18 #include <stdio.h>
19 #include <string.h>
20 #include <json.h>
21
22 #include "afb-plugin.h"
23
24 // Sample Generic Ping Debug API
25 static void ping(struct afb_req request, json_object *jresp, const char *tag)
26 {
27     static int pingcount = 0;
28     json_object *query = afb_req_json(request);
29
30     afb_req_success_f(request, jresp, "Ping Binder Daemon tag=%s count=%d query=%s", tag, ++pingcount, json_object_to_json_string(query));
31 }
32
33 static void pingSample (struct afb_req request)
34 {
35         ping(request, json_object_new_string ("Some String"), "pingSample");
36 }
37
38 static void pingFail (struct afb_req request)
39 {
40         afb_req_fail(request, "failed", "Ping Binder Daemon fails");
41 }
42
43 static void pingNull (struct afb_req request)
44 {
45         ping(request, NULL, "pingNull");
46 }
47
48 static void pingBug (struct afb_req request)
49 {
50         ping((struct afb_req){NULL,NULL,NULL}, NULL, "pingBug");
51 }
52
53
54 // For samples https://linuxprograms.wordpress.com/2010/05/20/json-c-libjson-tutorial/
55 static void pingJson (struct afb_req request) {
56     json_object *jresp, *embed;    
57     
58     jresp = json_object_new_object();
59     json_object_object_add(jresp, "myString", json_object_new_string ("Some String"));
60     json_object_object_add(jresp, "myInt", json_object_new_int (1234));
61      
62     embed  = json_object_new_object();
63     json_object_object_add(embed, "subObjString", json_object_new_string ("Some String"));
64     json_object_object_add(embed, "subObjInt", json_object_new_int (5678));
65     
66     json_object_object_add(jresp,"eobj", embed);
67
68     ping(request, jresp, "pingJson");
69 }
70
71 // NOTE: this sample does not use session to keep test a basic as possible
72 //       in real application most APIs should be protected with AFB_SESSION_CHECK
73 static const struct AFB_restapi pluginApis[]= {
74   {"ping"     , AFB_SESSION_NONE, pingSample  , "Ping Application Framework"},
75   {"pingfail" , AFB_SESSION_NONE, pingFail    , "Fails"},
76   {"pingnull" , AFB_SESSION_NONE, pingNull    , "Return NULL"},
77   {"pingbug"  , AFB_SESSION_NONE, pingBug     , "Do a Memory Violation"},
78   {"pingJson" , AFB_SESSION_NONE, pingJson    , "Return a JSON object"},
79   {NULL}
80 };
81
82 static const struct AFB_plugin plugin_desc = {
83         .type = AFB_PLUGIN_JSON,
84         .info = "Minimal Hello World Sample",
85         .prefix = "hello",
86         .apis = pluginApis
87 };
88
89 const struct AFB_plugin *pluginRegister (const struct AFB_interface *itf)
90 {
91         return &plugin_desc;
92 }