libacfutils
A general purpose library of utility functions designed to make it easier to develop addons for the X-Plane flight simulator.
Loading...
Searching...
No Matches
chartdb_impl.h
1/*
2 * CDDL HEADER START
3 *
4 * This file and its contents are supplied under the terms of the
5 * Common Development and Distribution License ("CDDL"), version 1.0.
6 * You may only use this file in accordance with the terms of version
7 * 1.0 of the CDDL.
8 *
9 * A full copy of the text of the CDDL should have accompanied this
10 * source. A copy of the CDDL is also available via the Internet at
11 * http://www.illumos.org/license/CDDL.
12 *
13 * CDDL HEADER END
14*/
15/*
16 * Copyright 2018 Saso Kiselkov. All rights reserved.
17 */
18
19#ifndef _CHARTDB_IMPL_H_
20#define _CHARTDB_IMPL_H_
21
22#include <cairo.h>
23#include <time.h>
24
25#include "acfutils/avl.h"
26#include "acfutils/chartdb.h"
27#include "acfutils/list.h"
28#include "acfutils/thread.h"
29#include "acfutils/worker.h"
30
31#ifdef __cplusplus
32extern "C" {
33#endif
34
35typedef struct chart_arpt_s chart_arpt_t;
36typedef struct chart_s chart_t;
37
38typedef cairo_surface_t *(*chart_load_cb_t)(chart_t *chart);
39
40typedef enum {
41 PROV_AERONAV_FAA_GOV,
42 PROV_AUTOROUTER_AERO,
43 PROV_NAVIGRAPH,
44 NUM_PROVIDERS
45} chart_prov_id_t;
46
47struct chart_s {
48 /* immutable once created */
49 chart_arpt_t *arpt;
50 char *name;
51 char *codename;
52 chart_type_t type;
53 char *filename;
54 char *filename_night;
55 chart_procs_t procs;
56
57 chart_georef_t georef;
58 chart_bbox_t views[NUM_CHART_VIEWS];
59
60 chart_load_cb_t load_cb;
61
62 /* protected by chartdb_t->lock */
63 cairo_surface_t *surf;
64 double zoom;
65 int cur_page;
66 int load_page;
67 int num_pages;
68 bool_t load_error;
69 bool_t night;
70 bool_t night_prev;
71 bool_t refreshed;
72 /* Only present when `disallow_caching' is set in chartdb_t */
73 void *png_data;
74 size_t png_data_len;
75
76 avl_node_t node;
77 list_node_t loader_node;
78 list_node_t load_seq_node;
79};
80
82 /* immutable once created */
83 chartdb_t *db;
84 char icao[8];
85 char *name;
86 char *city;
87 char state[4];
88 avl_tree_t charts;
89 char *metar;
90 time_t metar_load_t;
91 char *taf;
92 time_t taf_load_t;
93 char *codename;
94 bool_t load_complete;
95
96 avl_node_t node;
97 list_node_t loader_node;
98};
99
100struct chartdb_s {
101 mutex_t lock;
102 worker_t loader;
103 bool_t loader_stop; /* set only once on exit */
104
105 /* immutable once created */
106 unsigned airac;
107 char *path;
108 char *pdftoppm_path;
109 char *pdfinfo_path;
110 chart_prov_id_t prov;
111 char prov_name[32];
112 avl_tree_t arpts;
113 bool_t normalize_non_icao;
114
115 /* immutable after provider init */
116 bool_t flat_db;
117 bool_t disallow_caching;
118 int (*chart_sort_func)(const void *, const void *, void *);
119
120 /* private to chart provider */
121 chart_prov_info_login_t *prov_login;
122 void *prov_priv;
123 bool_t init_complete;
124
125 /* protected by `lock' */
126 list_t loader_queue;
127 list_t loader_arpt_queue;
128 list_t load_seq;
129 uint64_t load_limit;
130
131 /* protected by `lock' */
132 char *proxy;
133
134 chart_t loader_cmd_purge;
135 chart_t loader_cmd_metar;
136 chart_t loader_cmd_taf;
137};
138
139typedef struct {
140 const char *name;
141 bool_t (*init)(chartdb_t *cdb);
142 void (*fini)(chartdb_t *cdb);
143 bool_t (*get_chart)(chart_t *chart);
144 void (*watermark_chart)(chart_t *chart,
145 cairo_surface_t *surf);
146 chart_arpt_t *(*arpt_lazy_discover)(chartdb_t *cdb, const char *icao);
147 void (*arpt_lazyload)(chart_arpt_t *arpt);
148 bool_t (*test_conn)(const chart_prov_info_login_t *creds,
149 const char *proxy);
150 bool_t (*pending_ext_account_setup)(chartdb_t *cdb);
152
153chart_arpt_t *chartdb_add_arpt(chartdb_t *cdb, const char *icao,
154 const char *name, const char *city_name, const char *state_id);
155bool_t chartdb_add_chart(chart_arpt_t *arpt, chart_t *chart);
156void chartdb_chart_destroy(chart_t *chart);
157char *chartdb_mkpath(chart_t *chart);
158
159char *chartdb_pdf_convert_file(const char *pdftoppm_path, char *old_path,
160 int page, double zoom);
161uint8_t *chartdb_pdf_convert_direct(const char *pdftoppm_path,
162 const uint8_t *pdf_data, size_t len, int page, double zoom,
163 size_t *out_len);
164int chartdb_pdf_count_pages_file(const char *pdfinfo_path, const char *path);
165int chartdb_pdf_count_pages_direct(const char *pdfinfo_path,
166 const uint8_t *buf, size_t len);
167
168#ifdef __cplusplus
169}
170#endif
171
172#endif /* _CHARTDB_IMPL_H_ */