EVE 1.0
json-app.h
Go to the documentation of this file.
1 #ifndef JSON_APP_API_H_INCLUDED
2 #define JSON_APP_API_H_INCLUDED
3 
4 /**
5  * @file
6  * @brief JSON application API
7  *
8  * \todo TODO: XXX: Documentation to be translated and updated.
9  */
10 
11 #include <stdint.h>
12 #include <stdbool.h>
13 #include <http/types.h>
14 #include <toc/toc-app.h>
15 
16 /** @cond INTERNAL */
17 #ifdef DEBUG
18 #include <lib/assert.h>
19 #define JSON_APP_PARANOID(x) assert(x)
20 #else
21 #define JSON_APP_PARANOID(x)
22 #endif
23 /** @endcond */
24 
25 #ifdef __cplusplus
26 extern "C" {
27 #endif
28 
29 /**
30  * \defgroup Json application
31  * \ingroup http
32  * \{
33  */
34 
35 /**
36  * ID Base for JSON TOC requests
37  */
38 #define JSON_BASE_ID (0x100)
39 
40 /**
41  * @brief Lett string gjennomføring
42  *
43  * I stedet av vanlig "C" stringer bruker JSON pasrer seq_t
44  * primitive, som består av et par av en peker på en string
45  * og lenge av stringen. Formålet er å redusere lenge beregning
46  * og å bruke "levende" pekerene direkte i TCP buffere.
47  *
48  * @note Stringen tiny_seq_t peker på er ikke null-terminert.
49  *
50  * @param Ptr peker på string
51  * @param Len lenge av stringen
52  */
53 struct tiny_seq_t
54 {
55  char *Ptr;
56  uint8_t Len;
57 };
58 
59 /**
60  * @brief Enumen settes typen på generel verdi.
61  */
63 {
64  VAL_TYPE_STRING = 0, /**< Verdien er en tiny_seq_t */
65  VAL_TYPE_INT, /**< Verdien er en 32-bit integer */
66  VAL_TYPE_BOOL, /**< Verdien er boolean */
67  VAL_TYPE_STRUCT, /**< Struktur, brukes bare i TOC tabell */
68 #ifdef JSON_APP_HAS_FLOAT
69  VAL_TYPE_FLOAT, /**< Verdien er en float */
70 #endif
71  VAL_TYPE_UNKNOWN, /**< Reservert */
72 };
73 
74 /**
75  * @brief Generel verdi
76  *
77  * Parseren sjekker typer av data gått fra nettleseren og
78  * konverterer dem følgende toc_t spesifikasjonen.
79  * val_t strukturen brukes til å holde verdi av forskelige
80  * typer.
81  *
82  * Applikasjonen skal ikke bruke intern unionen i denne struktur
83  * direkte. @ref JsonValAsString, @ref JsonValAsInt,
84  * @ref JsonValAsFloat, @ref JsonValAsBool må brukes i stedet.
85  *
86  * @param Type type av verdi
87  * @param u intern verdi
88  */
89 struct val_t
90 {
91  /** @cond INTERNAL */
92  union
93  {
94  struct tiny_seq_t AsString;
95  int AsInt;
96 #ifdef JSON_APP_HAS_FLOAT
97  float AsFloat;
98 #endif
99  int AsBool;
100  } u;
101  /** @endcond */
102  uint8_t Type;
103 };
104 
105 /**
106  * @brief val_t tilgangsmetod, gir string verdi
107  *
108  * @param Val generel verdi
109  * @return string verdi
110  */
111 static inline const struct tiny_seq_t *JsonValAsString(const struct val_t *Val)
112 {
113  JSON_APP_PARANOID(Val->Type == VAL_TYPE_STRING);
114  return &Val->u.AsString;
115 }
116 
117 /**
118  * @brief val_t tilgangsmetod, gir integer verdi
119  *
120  * @param Val generel verdi
121  * @return integer verdi
122  */
123 static inline int JsonValAsInt(const struct val_t *Val)
124 {
125  JSON_APP_PARANOID(Val->Type == VAL_TYPE_INT);
126  return Val->u.AsInt;
127 }
128 
129 #ifdef JSON_APP_HAS_FLOAT
130 /**
131  * @brief val_t tilgangsmetod, gir float verdi
132  *
133  * @param Val generel verdi
134  * @return float verdi
135  */
136 static inline float JsonValAsFloat(const struct val_t *Val)
137 {
138  JSON_APP_PARANOID(Val->Type == VAL_TYPE_FLOAT);
139  return Val->u.AsFloat;
140 }
141 #endif
142 
143 /**
144  * @brief val_t tilgangsmetod, gir bool verdi
145  *
146  * @param Val generel verdi
147  * @return bool verdi
148  */
149 static inline int JsonValAsBool(const struct val_t *Val)
150 {
151  JSON_APP_PARANOID(Val->Type == VAL_TYPE_BOOL);
152  return Val->u.AsBool;
153 }
154 
155 /**
156  * Checks if the parameter is an array.
157  */
158 static inline bool JsonTocIsArray(const struct toc_t *Entry)
159 {
160  return (Entry->Count > 1 || (Entry->Flags & TOC_FLAG_VIRTUAL));
161 }
162 
163 /**
164  * @brief Gir "table of content" (TOC).
165  *
166  * Tabellen definerer de parameterene applikasjon kan kontrollere.
167  * JSON aldri skrives noe i tabellen, så den kan ligge i flash minne.
168  *
169  * @param Ptr applikasjonen må settes (*TocPtr) pekeren på TOC-tabel
170  */
171 extern void JsonAppGetToc(struct toc_blob_t *Ptr);
172 
173 /**
174  * @brief "get" opphandler.
175  *
176  * JSON engine kalles funksjonen til å svare på "get" spørsmål.
177  *
178  * @param State peker på brukerdata.
179  * @param Id indeks av parameteren i TOC tabellen.
180  * @param Index indeks av parameter i tabell (gjelder bare TOC_FLAG_ARRAY-markert parametre)
181  * @param Val generel verdi applikasjon må fille ut.
182  * @return 0 som indikasjon av suksess.
183  * @return negativsk errno som indikasjon av en fail. Bruke errno.h semantik.
184  */
185 extern int JsonAppGet(struct toc_var_context_t *State, int Id, int Index, struct val_t *Val);
186 
187 /**
188  * @brief beginnelse av "get" opphandler for structur.
189  *
190  * JSON engine kalles funksjonen til å informere at den skal lese en struktur.
191  *
192  * @param State peker på brukerdata.
193  * @param Id indeks av parameteren i TOC tabellen.
194  * @param Index indeks av parameter i tabell (gjelder bare TOC_FLAG_ARRAY-markert parametre)
195  * @return 0 som indikasjon av suksess.
196  * @return negativsk errno som indikasjon av en fail. Bruke `errno.h` semantik.
197  */
198 extern int JsonAppGetStructBegin(struct toc_var_context_t *State, int Id, int Index);
199 
200 /**
201  * @brief slutt av "get" opphandler for structur.
202  *
203  * JSON engine kalles funksjonen til å informere at den sluttet med strukturen.
204  *
205  * @param State peker på brukerdata.
206  * @param Id indeks av parameteren i TOC tabellen.
207  * @param Index indeks av parameter i tabell (gjelder bare TOC_FLAG_ARRAY-markert parametre)
208  * @return 0 som indikasjon av suksess.
209  * @return negativsk errno som indikasjon av en fail. Bruke `errno.h` semantik.
210  */
211 extern int JsonAppGetStructEnd(struct toc_var_context_t *State, int Id, int Index);
212 
213 /**
214  * @brief "set" opphandler.
215  *
216  * JSON engine kalles funksjonen til å handle "set" kommand.
217  *
218  * @param State peker på brukerdata.
219  * @param Id indeks av parameteren i TOC tabellen.
220  * @param Index indeks av parameter i tabell (gjelder bare TOC_FLAG_ARRAY-markert parametre)
221  * @param Val generel verdi applikasjon må sette. Applikasjonen må
222  * også sette levende verdien i val hvis det trenges.
223  * @return 0 som indikasjon av suksess.
224  * @return negativsk errno som indikasjon av en fail. Bruke `errno.h` semantik.
225  */
226 extern int JsonAppSet(struct toc_var_context_t *State, int Id, int Index, struct val_t *Val);
227 
228 /**
229  * @brief beginnelse av "set" opphandler for structur.
230  *
231  * JSON engine kalles funksjonen til å informere at den skal skrive en struktur.
232  *
233  * @param State peker på brukerdata.
234  * @param Id indeks av parameteren i TOC tabellen.
235  * @param Index indeks av parameter i tabell (gjelder bare TOC_FLAG_ARRAY-markert parametre)
236  * @return 0 som indikasjon av suksess.
237  * @return negativsk errno som indikasjon av en fail. Bruke `errno.h` semantik.
238  */
239 extern int JsonAppSetStructBegin(struct toc_var_context_t *State, int Id, int Index);
240 
241 /**
242  * @brief slutt av "set" opphandler for structur.
243  *
244  * JSON engine kalles funksjonen til å informere at den sluttet med strukturen.
245  *
246  * @param State peker på brukerdata.
247  * @param Id indeks av parameteren i TOC tabellen.
248  * @param Index indeks av parameter i tabell (gjelder bare TOC_FLAG_ARRAY-markert parametre)
249  * @return 0 som indikasjon av suksess.
250  * @return negativsk errno som indikasjon av en fail. Bruke `errno.h` semantik.
251  */
252 extern int JsonAppSetStructEnd(struct toc_var_context_t *State, int Id, int Index);
253 
254 /**
255  * @brief Beginnelse av "file push" operasjon.
256  *
257  * JSON engine kalles funksjonen som en indikasjon av fil opdatering kommand.
258  *
259  * @param State peker på brukerdata.
260  * @param File navnet av filen. Faktiske det er "query" delen av HTTP request.
261  * @param Size totalt størrelse av filen.
262  * @return 0 som indikasjon av suksess.
263  * @return negativsk errno som indikasjon av en fail. Bruke `errno.h` semantik.
264  */
265 extern int JsonAppPushBegin(struct toc_file_context_t *State, uint8_t Id, const char *File, unsigned Size);
266 
267 /**
268  * @brief Opdatere en porsjon av fil i "file push" operasjon.
269  *
270  * JSON engine kalles funksjonen til å lagre en del (fragment) av fil.
271  *
272  * @param State peker på brukerdata.
273  * @param Pos skrive posisjon i filen.
274  * @param Size størrelse av fragmenten.
275  * @param Data fragmenten til å lagre..
276  * @return 0 som indikasjon av suksess.
277  * @return negativsk errno som indikasjon av en fail. Bruke `errno.h` semantik.
278  */
279 extern int JsonAppPush(struct toc_file_context_t *State, unsigned Pos, unsigned Size, const void *Data);
280 
281 /**
282  * @brief "file push" operasjon er ferdig.
283  *
284  * JSON engine kalles funksjonen som en indikasjon at fil opdatering kommand er ferdig.
285  *
286  * @param State peker på brukerdata.
287  * @return 0 som indikasjon av suksess.
288  * @return negativsk errno som indikasjon av en fail. Bruke `errno.h` semantik.
289  */
290 extern int JsonAppPushEnd(struct toc_file_context_t *State);
291 
292 /**
293  * @brief Beginnelse av "file pull" operasjon.
294  *
295  * JSON engine kalles funksjonen som en indikasjon av fil lesering kommand.
296  *
297  * @param State peker på brukerdata.
298  * @param Id //!< TODO document it.
299  * @param File navnet av filen. Faktiske det er "query" delen av HTTP request.
300  * @return fil størrelse som indikasjon av suksess.
301  * @return negativsk errno som indikasjon av en fail. Bruke `errno.h` semantik.
302  */
303 extern int JsonAppPullBegin(struct toc_file_context_t *State, uint8_t Id, const char *File);
304 
305 /**
306  * @brief Lese en porsjon av fil i "file pull" operasjon.
307  *
308  * JSON engine kalles funksjonen til å lese en del (fragment) av fil.
309  *
310  * @param State peker på brukerdata.
311  * @param Pos lese posisjon i filen.
312  * @param Size størrelse av fragmenten.
313  * @param Data applikasjon må kopiere data fragmenten der.
314  * @return 0 som indikasjon av suksess.
315  * @return negativsk errno som indikasjon av en fail. Bruke `errno.h` semantik.
316  */
317 extern int JsonAppPull(struct toc_file_context_t *State, unsigned Pos, unsigned Size, void *Data);
318 
319 /**
320  * @brief "file pull" operasjon er ferdig.
321  *
322  * JSON engine kalles funksjonen som en indikasjon at fil lesning kommand er ferdig.
323  *
324  * @param State peker på brukerdata.
325  * @return 0 som indikasjon av suksess.
326  * @return negativsk errno som indikasjon av en fail. Bruke `errno.h` semantik.
327  */
328 extern int JsonAppPullEnd(struct toc_file_context_t *State);
329 
330 /**
331  * @brief slutt av alle opphandlere for structurer.
332  *
333  * JSON engine kalles funksjonen til å informere at prosessering av en rekvest er ferdig.
334  *
335  * @return negativsk errno som indikasjon av en fail. Bruke `errno.h` semantik.
336  */
337 extern int JsonAppClear();
338 
339 /**
340  * @brief En mobil klient har tilkoblet på serveren.
341  *
342  * JSON engine kalles funksjonen til å informere at en klient har tilkoblet.
343  */
344 extern void JsonAppClientConnect();
345 
346 /**
347  * @brief En mobil klienten var frakoblet fra serveren.
348  *
349  * JSON engine kalles funksjonen til å informere at en klient var frakoblet.
350  */
351 extern void JsonAppClientDisconnect();
352 
353 /** \} */
354 
355 #ifdef __cplusplus
356 }
357 #endif
358 
359 #endif
void JsonAppClientConnect()
En mobil klient har tilkoblet på serveren.
HTTP module basic types.
int JsonAppGetStructBegin(struct toc_var_context_t *State, int Id, int Index)
beginnelse av "get" opphandler for structur.
Applikasjon-spesifikk parameter beskrivelse.
Definition: toc-app.h:144
Lett string gjennomføring.
Definition: json-app.h:53
int JsonAppSet(struct toc_var_context_t *State, int Id, int Index, struct val_t *Val)
"set" opphandler.
int JsonAppPullBegin(struct toc_file_context_t *State, uint8_t Id, const char *File)
Beginnelse av "file pull" operasjon.
int JsonAppSetStructBegin(struct toc_var_context_t *State, int Id, int Index)
beginnelse av "set" opphandler for structur.
#define TOC_FLAG_VIRTUAL
Definition: toc-app.h:127
int JsonAppPushBegin(struct toc_file_context_t *State, uint8_t Id, const char *File, unsigned Size)
Beginnelse av "file push" operasjon.
static int JsonValAsBool(const struct val_t *Val)
val_t tilgangsmetod, gir bool verdi
Definition: json-app.h:149
static float JsonValAsFloat(const struct val_t *Val)
val_t tilgangsmetod, gir float verdi
Definition: json-app.h:136
int JsonAppPush(struct toc_file_context_t *State, unsigned Pos, unsigned Size, const void *Data)
Opdatere en porsjon av fil i "file push" operasjon.
int JsonAppPullEnd(struct toc_file_context_t *State)
"file pull" operasjon er ferdig.
void JsonAppClientDisconnect()
En mobil klienten var frakoblet fra serveren.
uint8_t Count
Definition: toc-app.h:152
int JsonAppSetStructEnd(struct toc_var_context_t *State, int Id, int Index)
slutt av "set" opphandler for structur.
int JsonAppPushEnd(struct toc_file_context_t *State)
"file push" operasjon er ferdig.
int JsonAppGet(struct toc_var_context_t *State, int Id, int Index, struct val_t *Val)
"get" opphandler.
TOC application API.
static const struct tiny_seq_t * JsonValAsString(const struct val_t *Val)
val_t tilgangsmetod, gir string verdi
Definition: json-app.h:111
val_type_t
Enumen settes typen på generel verdi.
Definition: json-app.h:62
uint16_t Flags
Definition: toc-app.h:148
int JsonAppPull(struct toc_file_context_t *State, unsigned Pos, unsigned Size, void *Data)
Lese en porsjon av fil i "file pull" operasjon.
static int JsonValAsInt(const struct val_t *Val)
val_t tilgangsmetod, gir integer verdi
Definition: json-app.h:123
int JsonAppGetStructEnd(struct toc_var_context_t *State, int Id, int Index)
slutt av "get" opphandler for structur.
Generel verdi.
Definition: json-app.h:89
int JsonAppClear()
slutt av alle opphandlere for structurer.
void JsonAppGetToc(struct toc_blob_t *Ptr)
Gir "table of content" (TOC).
static bool JsonTocIsArray(const struct toc_t *Entry)
Definition: json-app.h:158