code_twain/sane/gb_json.h

234 lines
7.9 KiB
C
Raw Permalink Normal View History

2022-07-01 07:24:58 +00:00
#pragma once
2022-07-19 01:42:16 +00:00
#if defined(WIN32) || defined(_WIN64)
2022-07-01 07:24:58 +00:00
#include <Windows.h>
2022-10-28 08:55:11 +00:00
#include "../../code_device/hgsane/cJSON.h"
2022-10-26 06:41:18 +00:00
#define PATH_SYMBOL "\\"
#else
2022-10-28 08:55:11 +00:00
#include "cJSON.h"
2022-10-26 06:41:18 +00:00
#define PATH_SYMBOL "/"
2022-10-28 08:55:11 +00:00
#define NULL nullptr
#define DWORD_PTR char*
#define _countof(a) sizeof(a) / sizeof(a[0])
2022-07-01 07:24:58 +00:00
#endif
2022-10-28 08:55:11 +00:00
//
2022-07-01 07:24:58 +00:00
#include <vector>
#include <string>
#include <map>
2022-10-28 08:55:11 +00:00
#include <algorithm>
2022-07-01 07:24:58 +00:00
namespace gb
{
2022-10-26 06:41:18 +00:00
class scanner_cfg;
class refer
{
volatile long ref_;
protected:
refer();
virtual ~refer();
public:
long add_ref(void);
long release(void);
};
class json : public refer
2022-07-01 07:24:58 +00:00
{
cJSON *obj_;
cJSON *cur_child_;
cJSON walk_head_;
2022-07-01 07:24:58 +00:00
bool is_array_;
cJSON* find_sibling(cJSON* first, const char* name, cJSON*** addr);
cJSON* find_child(cJSON *parent, std::vector<std::string>& path, bool create, cJSON*** addr = NULL);
cJSON* find(const char* path, bool create = false, cJSON*** addr = NULL);
protected:
~json();
2022-07-01 07:24:58 +00:00
public:
json(char* json_txt = 0);
static std::string to_string(cJSON* root, bool formatted);
static std::string get_value_as_string(cJSON* root, bool integer = false);
static void free_node_data(cJSON* node);
2022-09-28 12:56:17 +00:00
static cJSON* create_element(bool is_array = false);
2022-07-01 07:24:58 +00:00
static cJSON* create_element_with_name(const char* name);
public:
bool attach_text(char* json_txt);
bool attach_cjson(cJSON* cjson);
bool create_empty(bool array = false);
void clear(void);
std::string to_string(bool formatted);
// can be path: child/value ...
bool get_value(const char* key, bool& val);
bool get_value(const char* key, int& val);
bool get_value(const char* key, double& val);
bool get_value(const char* key, std::string& val);
bool get_value(const char* key, json*& val); // caller shoud call "delete" to free the returned object !!!
bool get_value_as_string(const char* key, std::string& val, bool integer);
bool get_as_array(const char* key, std::vector<std::string>& val);
bool first_child(std::string& val, std::string* name = NULL);
bool next_child(std::string& val, std::string* name = NULL);
bool set_value(const char* key, bool val);
bool set_value(const char* key, int val);
bool set_value(const char* key, double val);
bool set_value(const char* key, std::string val);
bool set_value(const char* key, const char* val);
bool set_value(const char* key, json* obj);
2022-10-08 06:13:09 +00:00
bool change_key(const char* old_key, const char* new_key);
2022-07-01 07:24:58 +00:00
bool remove(const char* key);
};
class base64
{
char base64_ind_[128];
char base64_char_[80];
char padding_char_;
bool is_valid_base64_table(const char* table);
bool initialize_base64_table(const char* table);
public:
base64();
~base64();
public:
bool set_base64_table(const char* table = NULL);
std::string encode(const char* data, size_t bytes, unsigned int line_bytes = -1, bool need_padding = true);
std::string decode(const char* data, size_t bytes);
};
class sane_config_schm : public refer
2022-07-01 07:24:58 +00:00
{
std::string scheme_name_;
2022-10-26 06:41:18 +00:00
scanner_cfg *scanner_;
std::string file_;
2022-07-01 07:24:58 +00:00
json* jsn_;
json* bkp_;
json* def_val_;
bool in_setting_;
std::map<int, std::string> id_name_; // (id, default-val)
2022-07-01 07:24:58 +00:00
void clear();
2022-10-08 06:13:09 +00:00
std::string default_value(const char* name);
2022-07-01 07:24:58 +00:00
protected:
~sane_config_schm();
2022-07-01 07:24:58 +00:00
public:
2022-10-26 06:41:18 +00:00
sane_config_schm(scanner_cfg* scanner = nullptr);
2022-07-01 07:24:58 +00:00
static std::string opt_data_appendix_;
2022-07-01 07:24:58 +00:00
static bool hex(unsigned char ch, unsigned char* val);
static bool hex_char(const char* data, unsigned char* val);
2022-10-26 06:41:18 +00:00
static std::string to_hex_letter(const char* data, size_t bytes);
static std::string from_hex_letter(const char* data, size_t bytes);
static bool is_option_data(std::string& name); // reset baase option name into 'name' if name was option data, and return true
2022-07-01 07:24:58 +00:00
public:
2022-10-28 08:55:11 +00:00
sane_config_schm* copy(void);
2022-10-26 06:41:18 +00:00
bool load_from_file(const char* file);
bool load_from_mem(const char* mem, bool in_b64 = true);
bool save_to(const char* file);
2022-10-08 06:13:09 +00:00
void set_default_value(int sn, const char* name, const char* val, size_t bytes);
2022-10-28 08:55:11 +00:00
void copy_default_value(sane_config_schm* from);
2022-10-08 06:13:09 +00:00
bool first_config(std::string& name, std::string& val);
bool next_config(std::string& name, std::string& val);
2022-10-28 08:55:11 +00:00
bool get_config(const char* name, std::string& val);
2022-07-01 07:24:58 +00:00
void begin_setting(bool restore = false);
void config_changed(const char* name, const char* val, size_t bytes, bool extra = false);
void config_changed(int sn, const char* val, size_t bytes, bool extra = false);
2022-10-08 06:13:09 +00:00
void remove_config(const char* name);
2022-10-26 06:41:18 +00:00
void set_value(const char* name, const char* val, size_t bytes, bool extra = false);
2022-10-28 08:55:11 +00:00
bool has_changed(void);
2022-07-01 07:24:58 +00:00
void end_setting(bool cancel);
2022-10-08 06:13:09 +00:00
int id_from_name(const char* name);
2022-10-26 06:41:18 +00:00
std::string to_text_stream(bool b64 = true, bool with_ver = true);
std::string get_version(void);
std::string get_scheme_name(void);
void set_scheme_name(const char* name);
2022-10-28 08:55:11 +00:00
void update(bool(* is_float)(int, void*), void* param, const char*(* t2n)(const char*), std::string* discard = NULL);
2022-07-01 07:24:58 +00:00
};
2022-10-26 06:41:18 +00:00
class scanner_cfg : public refer
{
// format: in base64
//
// {
// "global": {
// "ver": "4.33",
// "cur": -1
// },
// "scheme_1": sane_config_schm*,
// "scheme_2": sane_config_schm*,
// "scheme_3": sane_config_schm*,
// ...
// }
//
std::string path_;
std::string scanner_name_; // scanner type: HUAGOSCAN G100 - 0100
json *global_; // version, current scheme, ...
typedef struct _cfg_schm
{
std::string name;
sane_config_schm* schm;
bool operator==(const char* n)
{
return name == n;
}
}CFGSCHM;
std::vector<CFGSCHM> schemes_;
static std::string global_name_;
static std::string cur_sel_;
static std::string default_setting_name_;
void clear(void);
void init_version(void);
void init_select(void);
void walk_sibling_schemes(cJSON* first);
protected:
~scanner_cfg();
public:
scanner_cfg();
typedef struct _update_func
{
2022-10-28 08:55:11 +00:00
void(* trans_number)(const char* name, std::string& val, void* param);
const char* (* title2name)(const char* title, void* param);
2022-10-26 06:41:18 +00:00
std::string discard_msg; // update failed items ...
void* func_param;
}UDF, *LPUDF;
static bool update(const char* file, LPUDF func);
public:
int load_file(const char* file);
int load_mem(const char* mem);
int save(const char* file = nullptr);
void get_all_schemes(std::vector<std::string>& schemes); // return all schemes name queue, the first is always be 'Default settings'
sane_config_schm* get_scheme(const char* scheme_name = nullptr/*return current scheme if was null*/); // call sane_config_schm::release() if not use anymore
2022-10-28 08:55:11 +00:00
std::string get_current_scheme_name(void);
2022-10-26 06:41:18 +00:00
bool remove_scheme(const char* scheme_name);
2022-10-28 08:55:11 +00:00
void remove_all_schemes(void);
2022-10-26 06:41:18 +00:00
bool select_scheme(const char* scheme_name);
sane_config_schm* copy_scheme(const char* cp_from_name); // for UI setting, call release() if not use anymore
bool add_scheme(sane_config_schm* schm, const char* name = nullptr);
2022-10-28 08:55:11 +00:00
bool rename_scheme(const char* from, const char* to);
2022-10-26 06:41:18 +00:00
};
2022-10-28 08:55:11 +00:00
};