int main(void) { int bytes_read; gchar buffer[MAX_BUFFER_SIZE]; JSON_Value *root_value; JSON_Object *root_object; gchar *json_str; gchar *func_name; gchar *path; while((bytes_read = read_msg(buffer)) > 0) { json_str = g_strndup((const gchar *)buffer, bytes_read); root_value = json_parse_string(json_str); root_object = json_value_get_object(root_value); func_name = (gchar *)json_object_get_string(root_object, "exec"); path = (gchar *)json_object_get_string(root_object, "path"); GString *json_message = NULL; if (!g_ascii_strcasecmp(func_name, "get_preview_json")) { json_message = gmimex_get_json(path, JSON_NO_MESSAGE_CONTENT); if (!json_message) { send_err(); } else { send_msg((gchar *)json_message->str, json_message->len); g_string_free(json_message, TRUE); } } else if (!g_ascii_strcasecmp(func_name, "get_json")) { gboolean raw = json_object_get_boolean(root_object, "raw"); json_message = gmimex_get_json(path, (raw ? JSON_RAW_MESSAGE_CONTENT : JSON_PREPARED_MESSAGE_CONTENT)); if (!json_message) { send_err(); } else { send_msg((gchar *)json_message->str, json_message->len); g_string_free(json_message, TRUE); } } else if (!g_ascii_strcasecmp(func_name, "get_part")) { int part_id = json_object_get_number(root_object, "partId"); GByteArray *part_content = gmimex_get_part(path, part_id); if (!part_content) { send_err(); } else { send_msg((gchar *)part_content->data, part_content->len); g_byte_array_free(part_content, TRUE); } } json_value_free(root_value); g_free(json_str); } return 0; }
static ERL_NIF_TERM nif_get_json(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { gchar *path = get_char_argument(env, &argv[0]); if (!path) return enif_make_badarg(env); gchar include_content_atom[10]; guint content_option = 0; if (argc == 2 && enif_get_atom(env, argv[1], include_content_atom, sizeof(include_content_atom), ERL_NIF_LATIN1)) { if (!g_ascii_strcasecmp(include_content_atom, "true")) content_option = 1; else if (!g_ascii_strcasecmp(include_content_atom, "raw")) content_option = 2; } GString *json_str = gmimex_get_json(path, content_option); g_free(path); if (!json_str) return enif_make_badarg(env); ErlNifBinary result_binary = {0}; enif_alloc_binary(json_str->len, &result_binary); (void)memcpy(result_binary.data, json_str->str, json_str->len); g_string_free(json_str, TRUE); return enif_make_binary(env, &result_binary); }
int main(int argc, char *argv[]) { if (argc < 2) { g_printerr ("usage: %s <MIME-Message-path>\n", argv[0]); exit(EXIT_FAILURE); } gmimex_init(); GString *json_message = NULL; json_message = gmimex_get_json(argv[1], TRUE); if (!json_message) exit(EXIT_FAILURE); setbuf(stdout, NULL); g_printf("%s\n", json_message->str); g_string_free(json_message, TRUE); gmimex_shutdown(); return 0; }