static void parole_xspf_xml_text (GMarkupParseContext *context, const gchar *text, gsize text_len, gpointer user_data, GError **error) { ParoleParserData *data = user_data; const gchar *element_name; if (!data->started) return; element_name = g_markup_parse_context_get_element (context); if (!g_ascii_strcasecmp (element_name, "location") ) { if (data->uri) { g_free (data->uri); data->uri = NULL; } if (text_len > 0) data->uri = g_strdup (text); } else if (!g_ascii_strcasecmp (element_name, "title") ) { if (data->title) { g_free (data->title); data->title = NULL; } if (text_len > 0) data->title = g_strdup (text); } }
static void xml_text( GMarkupParseContext *ctx, const gchar *text_orig, gsize text_len, gpointer data, GError **error ) { char text[text_len+1]; struct xml_parsedata *xd = data; strncpy( text, text_orig, text_len ); /// making text a null terminated string text[text_len] = 0; if( xd->pass_st < XML_PASS_OK ) { /* Let's not parse anything else if we only have to check the password, or if we didn't get the chance to check it yet. */ } else if( g_strcasecmp( g_markup_parse_context_get_element( ctx ), "setting" ) == 0 && xd->current_setting ) { if( xd->current_account ) { set_t *s = set_find( xd->current_set_head, xd->current_setting ); if( s && ( s->flags & ACC_SET_ONLINE_ONLY ) ) { g_free( xd->current_setting ); xd->current_setting = NULL; return; } } set_setstr( xd->current_set_head, xd->current_setting, (char*) text ); g_free( xd->current_setting ); xd->current_setting = NULL; } }
/* text is not nul-terminated */ static void text (GMarkupParseContext *context, const gchar *text, gsize text_len, gpointer user_data, GError **error) { ParserData *data = (ParserData*)user_data; CommonInfo *info; if (data->subparser && data->subparser->start) { GError *tmp_error = NULL; if (data->subparser->parser->text) data->subparser->parser->text (context, text, text_len, data->subparser->data, &tmp_error); if (tmp_error) g_propagate_error (error, tmp_error); return; } if (!data->stack) return; info = state_peek_info (data, CommonInfo); g_assert (info != NULL); if (strcmp (g_markup_parse_context_get_element (context), "property") == 0) { PropertyInfo *prop_info = (PropertyInfo*)info; g_string_append_len (prop_info->text, text, text_len); } }
static void parse_text (GMarkupParseContext *context, const gchar *text, gsize text_len, gpointer data, GError **error) { std::string error_msg; XmlParser::Impl *parser = (XmlParser::Impl *) data; const gchar *element_name = g_markup_parse_context_get_element (context); parser->pushText (element_name, text, text_len, error_msg); }
/* * Implements the Ruby method "LichXML#current_element" * */ static VALUE lichxml_get_current_element(VALUE self) { GMarkupParseContext *context; const gchar *gstr; Data_Get_Struct(rb_iv_get(self, "@g_context"), GMarkupParseContext, context); gstr = g_markup_parse_context_get_element(context); return rb_str_new2(gstr); }
static void dt_styles_style_text_handler(GMarkupParseContext *context, const gchar *text, gsize text_len, gpointer user_data, GError **error) { StyleData *style = user_data; const gchar *elt = g_markup_parse_context_get_element(context); if(g_ascii_strcasecmp(elt, "name") == 0) { g_string_append_len(style->info->name, text, text_len); } else if(g_ascii_strcasecmp(elt, "description") == 0) { g_string_append_len(style->info->description, text, text_len); } else if(style->in_plugin) { StylePluginData *plug = g_list_first(style->plugins)->data; if(g_ascii_strcasecmp(elt, "operation") == 0) { g_string_append_len(plug->operation, text, text_len); } else if(g_ascii_strcasecmp(elt, "op_params") == 0) { g_string_append_len(plug->op_params, text, text_len); } else if(g_ascii_strcasecmp(elt, "blendop_params") == 0) { g_string_append_len(plug->blendop_params, text, text_len); } else if(g_ascii_strcasecmp(elt, "blendop_version") == 0) { plug->blendop_version = atoi(text); } else if(g_ascii_strcasecmp(elt, "multi_priority") == 0) { plug->multi_priority = atoi(text); } else if(g_ascii_strcasecmp(elt, "multi_name") == 0) { g_string_append_len(plug->multi_name, text, text_len); } else if(g_ascii_strcasecmp(elt, "num") == 0) { plug->num = atoi(text); } else if(g_ascii_strcasecmp(elt, "module") == 0) { plug->module = atoi(text); } else if(g_ascii_strcasecmp(elt, "enabled") == 0) { plug->enabled = atoi(text); } } }
static void dt_styles_end_tag_handler(GMarkupParseContext *context, const gchar *element_name, gpointer user_data, GError **error) { StyleData *style = user_data; const gchar *elt = g_markup_parse_context_get_element(context); // We need to append the contents of any subtags to the content field // for this we need to know when we are inside the note-content tag if(g_ascii_strcasecmp(elt, "plugin") == 0) { style->in_plugin = FALSE; } }
static void dt_styles_start_tag_handler(GMarkupParseContext *context, const gchar *element_name, const gchar **attribute_names, const gchar **attribute_values, gpointer user_data, GError **error) { StyleData *style = user_data; const gchar *elt = g_markup_parse_context_get_element(context); // We need to append the contents of any subtags to the content field // for this we need to know when we are inside the note-content tag if(g_ascii_strcasecmp(elt, "plugin") == 0) { style->in_plugin = TRUE; style->plugins = g_list_prepend(style->plugins, dt_styles_style_plugin_new()); } }
static void updateinfo_parse_text(GMarkupParseContext *context, const gchar *text, gsize text_len, gpointer user_data, GError **error) { const gchar *element = g_markup_parse_context_get_element(context); if (!element) return; updateinfo_ParseUserData *Data = (updateinfo_ParseUserData *)user_data; if (strcmp(element, "latest_version_num")==0) { std::string str(text, text_len); Data->latest_version_num = atoi(str.c_str()); } else if (g_str_has_prefix(element, "version_msg_title")) { const char *locale = element + (sizeof("version_msg_title")-1); if (locale[0] == '\0') { if (Data->version_msg_title.empty()) { Data->version_msg_title.assign(text, text_len); } } else if (Data->locale_name == locale+1) { Data->version_msg_title.assign(text, text_len); } } else if (g_str_has_prefix(element, "version_msg_content")) { const char *locale = element + (sizeof("version_msg_content")-1); if (locale[0] == '\0') { if (Data->version_msg_content.empty()) { Data->version_msg_content.assign(text, text_len); } } else if (Data->locale_name == locale+1) { Data->version_msg_content.assign(text, text_len); } } else if (g_str_has_prefix(element, "latest_news")) { const char *locale = element + (sizeof("latest_news")-1); if (locale[0] == '\0') { if (Data->latest_news.empty()) { Data->latest_news.assign(text, text_len); } } else if (Data->locale_name == locale+1) { Data->latest_news.assign(text, text_len); } } else if (g_str_has_prefix(element, "links")) { const char *locale = element + (sizeof("links")-1); if (locale[0] == '\0') { if (Data->links.empty()) { Data->links.assign(text, text_len); } } else if (Data->locale_name == locale+1) { Data->links.assign(text, text_len); } } }
static void func_parse_text(GMarkupParseContext *context, const gchar *text, gsize text_len, gpointer user_data, GError **error) { const gchar *element = g_markup_parse_context_get_element(context); if (!element) return; WnUserData *Data = (WnUserData *)user_data; if (strcmp(element, "type")==0) { Data->type.assign(text, text_len); } else if (strcmp(element, "word")==0) { std::string word(text, text_len); if (word != Data->oword) { Data->wordlist.push_back(word); } } else if (strcmp(element, "gloss")==0) { Data->gloss.assign(text, text_len); } }
static void dict_parse_text(GMarkupParseContext *context, const gchar *text, gsize text_len, gpointer user_data, GError **error) { const gchar *element = g_markup_parse_context_get_element(context); if (!element) return; dict_ParseUserData *Data = (dict_ParseUserData *)user_data; if (strcmp(element, "pron")==0) { Data->pron.assign(text, text_len); } else if (strcmp(element, "def")==0) { Data->def.assign(text, text_len); } else if (strcmp(element, "rel")==0) { Data->rel.assign(text, text_len); } else if (strcmp(element, "orig")==0) { Data->orig.assign(text, text_len); } else if (strcmp(element, "trans")==0) { Data->trans.assign(text, text_len); } }
static void plugininfo_parse_text(GMarkupParseContext *context, const gchar *text, gsize text_len, gpointer user_data, GError **error) { const gchar *element = g_markup_parse_context_get_element(context); if (!element) return; plugininfo_ParseUserData *Data = (plugininfo_ParseUserData *)user_data; if (strcmp(element, "name")==0) { Data->name.assign(text, text_len); } else if (strcmp(element, "version")==0) { Data->version.assign(text, text_len); } else if (strcmp(element, "short_desc")==0) { Data->short_desc.assign(text, text_len); } else if (strcmp(element, "long_desc")==0) { Data->long_desc.assign(text, text_len); } else if (strcmp(element, "author")==0) { Data->author.assign(text, text_len); } else if (strcmp(element, "website")==0) { Data->website.assign(text, text_len); } }
static void gimp_tags_installer_load_text (GMarkupParseContext *context, const gchar *text, gsize text_len, gpointer user_data, GError **error) { GimpTagsInstaller *tags_installer = user_data; const gchar *current_element; gchar *tag_string; current_element = g_markup_parse_context_get_element (context); if (tags_installer->locale_matches && current_element && strcmp (current_element, "thetag") == 0) { tag_string = g_markup_escape_text (text, text_len); g_string_append_printf (tags_installer->buf, " <tag>%s</tag>\n", tag_string); g_free (tag_string); } }
static void text (GMarkupParseContext *context, const gchar *text, gsize text_len, gpointer user_data, GError **error) { ParseState *state = user_data; gsize i; for (i = 0; i < text_len; i++) if (!g_ascii_isspace (text[i])) { if (state->string) g_string_append_len (state->string, text, text_len); else g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, "text may not appear inside <%s>\n", g_markup_parse_context_get_element (context)); break; } }
static void _xml_text (GMarkupParseContext *context, const gchar *text, gsize text_len, gpointer user_data, GError **error) { lfParserData *pd = (lfParserData *)user_data; const gchar *ctx = g_markup_parse_context_get_element (context); while (*text && strchr (" \t\n\r", *text)) text++; if (!*text) goto leave; if (!strcmp (ctx, "name")) { if (pd->mount) pd->mount->SetName (text, pd->lang); else { bad_ctx: g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, "Wrong context for element <%.*s>\n", int (text_len), text); goto leave; } } else if (!strcmp (ctx, "maker")) { if (pd->camera) pd->camera->SetMaker (text, pd->lang); else if (pd->lens) pd->lens->SetMaker (text, pd->lang); else goto bad_ctx; } else if (!strcmp (ctx, "model")) { if (pd->camera) pd->camera->SetModel (text, pd->lang); else if (pd->lens) pd->lens->SetModel (text, pd->lang); else goto bad_ctx; } else if (!strcmp (ctx, "variant")) { if (pd->camera) pd->camera->SetVariant (text, pd->lang); else goto bad_ctx; } else if (!strcmp (ctx, "mount")) { if (pd->camera) pd->camera->SetMount (text); else if (pd->lens) pd->lens->AddMount (text); else goto bad_ctx; } else if (!strcmp (ctx, "compat")) { if (pd->mount) pd->mount->AddCompat (text); else goto bad_ctx; } else if (!strcmp (ctx, "cropfactor")) { if (pd->camera) pd->camera->CropFactor = atof (text); else if (pd->lens) pd->lens->CropFactor = atof (text); else goto bad_ctx; } else if (!strcmp (ctx, "type")) { if (pd->lens) { if (!_lf_strcmp (text, "rectilinear")) pd->lens->Type = LF_RECTILINEAR; else if (!_lf_strcmp (text, "fisheye")) pd->lens->Type = LF_FISHEYE; else if (!_lf_strcmp (text, "panoramic")) pd->lens->Type = LF_PANORAMIC; else if (!_lf_strcmp (text, "equirectangular")) pd->lens->Type = LF_EQUIRECTANGULAR; else { g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, "Invalid lens type `%s' (%s/%s)\n", text, pd->camera ? pd->camera->Maker : "???", pd->camera ? pd->camera->Model : "???"); return; } } else goto bad_ctx; } leave: lf_free (pd->lang); pd->lang = NULL; }
static void func_parse_passthrough(GMarkupParseContext *context, const gchar *passthrough_text, gsize text_len, gpointer user_data, GError **error) { if (!g_str_has_prefix(passthrough_text, "<![CDATA[")) return; const gchar *element = g_markup_parse_context_get_element(context); if (!element) return; const gchar *text = passthrough_text+9; gsize len = text_len-9-3; while (g_ascii_isspace(*text)) { text++; len--; } while (len>0 && g_ascii_isspace(*(text+len-1))) { len--; } if (len==0) return; std::string *pango = ((PwUserData*)user_data)->pango; std::string::size_type &cur_pos = ((PwUserData*)user_data)->cur_pos; if (strcmp(element, "词典音标")==0 || strcmp(element, "CB")==0) { if (!pango->empty()) { *pango+='\n'; cur_pos++; } *pango+="[<span foreground=\"blue\">"; cur_pos++; gchar *str = toUtfPhonetic(text, len); *pango+=str; cur_pos+=xml_strlen(str); g_free(str); *pango+="</span>]"; cur_pos++; } else if (strcmp(element, "单词原型")==0 || strcmp(element, "YX")==0) { const gchar *oword = ((PwUserData*)user_data)->oword; if (strncmp(oword, text, len)) { if (!pango->empty()) { *pango+='\n'; cur_pos++; } *pango+="<b>"; gchar *str = g_markup_escape_text(text, len); pango->append(str); cur_pos+=xml_strlen(str); g_free(str); *pango+="</b>"; } } else if (strcmp(element, "单词词性")==0 || strcmp(element, "DX")==0) { if (!pango->empty()) { *pango+='\n'; cur_pos++; } *pango+="<i>"; powerword_markup_add_text(text, len, pango, cur_pos, ((PwUserData*)user_data)->links_list); *pango+="</i>"; } else if (strcmp(element, "汉语拼音")==0 || strcmp(element, "PY")==0) { if (!pango->empty()) { *pango+='\n'; cur_pos++; } *pango+="<span foreground=\"blue\" underline=\"single\">"; powerword_markup_add_text(text, len, pango, cur_pos, ((PwUserData*)user_data)->links_list); *pango+="</span>"; } else if (strcmp(element, "例句原型")==0 || strcmp(element, "LY")==0) { if (!pango->empty()) { *pango+='\n'; cur_pos++; } *pango+="<span foreground=\"#008080\">"; powerword_markup_add_text(text, len, pango, cur_pos, ((PwUserData*)user_data)->links_list); *pango+="</span>"; } else if (strcmp(element, "例句解释")==0 || strcmp(element, "LS")==0) { if (!pango->empty()) { *pango+='\n'; cur_pos++; } *pango+="<span foreground=\"#01259A\">"; powerword_markup_add_text(text, len, pango, cur_pos, ((PwUserData*)user_data)->links_list); *pango+="</span>"; /*} else if (strcmp(element, "相关词")==0) { if (!res->empty()) *res+='\n'; std::string tabstr; tabstr+=text[0]; for (gsize i=1;i<len;i++) { if (text[i]=='&') tabstr+="\t&"; else tabstr+=text[i]; } gchar *str = powerword_markup_escape_text(tabstr.c_str(), tabstr.length()); res->append(str); g_free(str);*/ } else /*} else if ( strcmp(element, "解释项")==0 || strcmp(element, "跟随解释")==0 || strcmp(element, "相关词")==0 || strcmp(element, "预解释")==0 || strcmp(element, "繁体写法")==0 || strcmp(element, "台湾音标")==0 || strcmp(element, "图片名称")==0 || strcmp(element, "跟随注释")==0 || strcmp(element, "音节分段")==0 || strcmp(element, "AHD音标")==0 || strcmp(element, "国际音标")==0 || strcmp(element, "美国音标")==0 || strcmp(element, "子解释项")==0 || strcmp(element, "同义词")==0 || strcmp(element, "日文发音")==0 || strcmp(element, "惯用型原型")==0 || strcmp(element, "惯用型解释")==0 || strcmp(element, "另见")==0 ) {*/ { if (!pango->empty()) { *pango+='\n'; cur_pos++; } powerword_markup_add_text(text, len, pango, cur_pos, ((PwUserData*)user_data)->links_list); } }
static void func_parse_passthrough(GMarkupParseContext *context, const gchar *passthrough_text, gsize text_len, gpointer user_data, GError **error) { gchar *text = g_strndup(passthrough_text, text_len); if (!(g_str_has_prefix(text, "<![CDATA[") && (g_str_has_suffix(text, "]]>")))) { g_print("Wrong, not CDATA: %s\n", text); return; } const gchar *element = g_markup_parse_context_get_element(context); if (!element) { g_print("Wrong, no element: %s\n", text); return; } ParseUserData *Data = (ParseUserData *)user_data; gchar *p = strchr(text, '&'); if (p && *(p+1)!='\0') { p++; gchar *n = g_utf8_next_char(p); if (*n == '{') { std::string temp(p, n-p); bool find = false; for (std::list<std::string>::const_iterator it=Data->TagList->begin(); it!=Data->TagList->end(); ++it) { if (*it == temp) { find = true; break; } } if (!find) { g_print("Find mark tag: %s - %s\n", temp.c_str(), Data->word); Data->TagList->push_back(temp); } } } if (strcmp(element, "单词原型")==0) { gchar *str = g_strdup(text); gchar *oword = get_cdata(str); if (strcmp(Data->word, oword)) { bool find = false; for (std::list<std::string>::const_iterator it=Data->WordList->begin(); it!=Data->WordList->end(); ++it) { if (*it == oword) { //g_print("Same word: %s\n", oword); find= true; break; } } if (!find) { Data->WordList->push_back(oword); struct _synworditem synworditem; synworditem.synword = g_strdup(oword); synworditem.origword = Data->word; synworditem.definition = Data->definition; g_array_append_val(Data->array, synworditem); } } g_free(str); } else if (strcmp(element, "词典音标")==0) { } else if (strcmp(element, "单词词性")==0) { } else if (strcmp(element, "解释项")==0) { } else if (strcmp(element, "跟随解释")==0) { } else if (strcmp(element, "相关词")==0) { } else if (strcmp(element, "预解释")==0) { } else if (strcmp(element, "繁体写法")==0) { } else if (strcmp(element, "汉语拼音")==0) { } else if (strcmp(element, "台湾音标")==0) { } else if (strcmp(element, "例句原型")==0) { } else if (strcmp(element, "例句解释")==0) { } else if (strcmp(element, "图片名称")==0) { } else if (strcmp(element, "跟随注释")==0) { } else if (strcmp(element, "音节分段")==0) { } else if (strcmp(element, "AHD音标")==0) { } else if (strcmp(element, "国际音标")==0) { } else if (strcmp(element, "美国音标")==0) { } else if (strcmp(element, "子解释项")==0) { } else if (strcmp(element, "同义词")==0) { } else if (strcmp(element, "日文发音")==0) { } else if (strcmp(element, "惯用型原型")==0) { } else if (strcmp(element, "惯用型解释")==0) { } else if (strcmp(element, "另见")==0) { } else { g_print("Warning: Unknow tag: %s - %s - %s\n", element, Data->word, text); } g_free(text); }
/** * called for each new element in the last xml config file * see the g_lib doc for the description of param * * \param context * \param text * \param text_len * \param user_data * \param error * * \return * */ static void gsb_file_config_get_xml_text_element ( GMarkupParseContext *context, const gchar *text, gsize text_len, gpointer user_data, GError **error) { const gchar *element_name; gint i; element_name = g_markup_parse_context_get_element ( context ); if ( !strcmp ( element_name, "Width" )) { conf.main_width = utils_str_atoi (text); return; } if ( !strcmp ( element_name, "Height" )) { conf.main_height = utils_str_atoi (text); return; } if ( !strcmp ( element_name, "Modification_operations_rapprochees" )) { conf.r_modifiable = utils_str_atoi (text); return; } if ( !strcmp ( element_name, "Dernier_chemin_de_travail" )) { gsb_file_update_last_path (text); if ( !gsb_file_get_last_path () || !strlen (gsb_file_get_last_path ())) gsb_file_update_last_path (g_get_home_dir ()); return; } if ( !strcmp ( element_name, "Affichage_alerte_permission" )) { conf.alerte_permission = utils_str_atoi (text); return; } if ( !strcmp ( element_name, "Force_enregistrement" )) { conf.force_enregistrement = utils_str_atoi (text); return; } if ( !strcmp ( element_name, "Fonction_touche_entree" )) { conf.entree = utils_str_atoi (text); return; } if ( !strcmp ( element_name, "Affichage_messages_alertes" )) { conf.alerte_mini = utils_str_atoi (text); return; } if ( !strcmp ( element_name, "Utilise_fonte_des_listes" )) { conf.utilise_fonte_listes = utils_str_atoi (text); return; } if ( !strcmp ( element_name, "Fonte_des_listes" )) { conf.font_string = my_strdup (text); return; } if ( !strcmp ( element_name, "Navigateur_web" )) { if ( conf.browser_command ) g_free ( conf.browser_command ); conf.browser_command = my_strdelimit (text, "\\e", "&" ); return; } if ( !strcmp ( element_name, "Largeur_colonne_echeancier" )) { etat.largeur_colonne_echeancier = utils_str_atoi (text); return; } if ( !strcmp ( element_name, "Largeur_colonne_comptes_comptes" )) { etat.largeur_colonne_comptes_comptes = utils_str_atoi (text); return; } if ( !strcmp ( element_name, "Largeur_colonne_etats" )) { etat.largeur_colonne_etat = utils_str_atoi (text); return; } if ( !strcmp ( element_name, "Chargement_auto_dernier_fichier" )) { conf.dernier_fichier_auto = utils_str_atoi (text); return; } if ( !strcmp ( element_name, "Nom_dernier_fichier" )) { nom_fichier_comptes = my_strdup (text); return; } if ( !strcmp ( element_name, "Enregistrement_automatique" )) { conf.sauvegarde_auto = utils_str_atoi (text); return; } if ( !strcmp ( element_name, "Enregistrement_au_demarrage" )) { conf.sauvegarde_demarrage = utils_str_atoi (text); return; } if ( !strcmp ( element_name, "Nb_max_derniers_fichiers_ouverts" )) { conf.nb_max_derniers_fichiers_ouverts = utils_str_atoi (text); return; } if ( !strcmp ( element_name, "Compression_fichier" )) { conf.compress_file = utils_str_atoi (text); return; } if ( !strcmp ( element_name, "Compression_backup" )) { conf.compress_backup = utils_str_atoi (text); return; } if ( !strcmp ( element_name, "fichier" )) { if (!tab_noms_derniers_fichiers_ouverts) tab_noms_derniers_fichiers_ouverts = g_malloc0 ( conf.nb_max_derniers_fichiers_ouverts * sizeof(gchar *) ); tab_noms_derniers_fichiers_ouverts[conf.nb_derniers_fichiers_ouverts] = my_strdup (text); conf.nb_derniers_fichiers_ouverts++; return; } if ( !strcmp ( element_name, "Delai_rappel_echeances" )) { nb_days_before_scheduled = utils_str_atoi (text); conf.execute_scheduled_of_month = FALSE; return; } if ( !strcmp ( element_name, "Affichage_formulaire" )) { conf.formulaire_toujours_affiche = utils_str_atoi (text); return; } if ( !strcmp ( element_name, "Affichage_exercice_automatique" )) { conf.affichage_exercice_automatique = utils_str_atoi (text); return; } if ( !strcmp ( element_name, "display_toolbar" )) { conf.display_toolbar = utils_str_atoi (text); return; } if ( !strcmp ( element_name, "show_closed_accounts" )) { conf.show_closed_accounts = utils_str_atoi (text); return; } if ( !strcmp ( element_name, "show_tip" )) { conf.show_tip = utils_str_atoi (text); return; } if ( !strcmp ( element_name, "last_tip" )) { conf.last_tip = utils_str_atoi (text); return; } for ( i = 0; messages[i].name; i++ ) { if ( !strcmp ( element_name, messages[i].name ) ) { messages[i].hidden = utils_str_atoi (text); } } }
/* called from the GMarkupParser */ static void text_handler (GMarkupParseContext *markup_context, const gchar *text, gsize text_len, gpointer user_data, GError **error) { XMPParseContext *context = user_data; switch (context->state) { case STATE_INSIDE_PROPERTY: if (! is_whitespace_string (text)) add_property_value (context, XMP_PTYPE_TEXT, NULL, g_strndup (text, text_len)); break; case STATE_INSIDE_STRUCT_ELEMENT: case STATE_INSIDE_ALT_LI: case STATE_INSIDE_BAG_LI: case STATE_INSIDE_SEQ_LI: if (! is_whitespace_string (text)) update_property_value (context, g_strndup (text, text_len)); break; case STATE_INSIDE_ALT_LI_RSC_IMG: { size_t len, max_size; guchar *decoded; gint decoded_size; gint state; guint save; #ifdef DEBUG_XMP_PARSER /* g_print ("XMP: Pushing text:\n%s\n", text); */ #endif len = text_len - text_len; max_size = (len / 4) * 3 + 3; decoded = g_malloc (max_size); state = 0; save = 0; decoded_size = g_base64_decode_step (text, text_len, decoded, &state, &save); #ifdef DEBUG_XMP_PARSER if (decoded_size > 0) { /* FIXME: remove this debugging code */ /* FILE *ttt; ttt = fopen ("/tmp/xmp-thumb.jpg", "wb"); fwrite (decoded, decoded_size, 1, ttt); fclose (ttt); */ g_print ("XMP: Thumb text len: %d (1/4 = %d)\nMax size: %d\nUsed size: %d\n", (int) text_len, (int) text_len / 4, max_size, decoded_size); } #endif if (decoded_size > 0) { gint *size_p; size_p = g_new (gint, 1); *size_p = decoded_size; add_property_value (context, XMP_PTYPE_ALT_THUMBS, (gchar *) size_p, (gchar *) decoded); } else add_property_value (context, XMP_PTYPE_ALT_THUMBS, NULL, NULL); } break; case STATE_INSIDE_QDESC_VALUE: if (! is_whitespace_string (text)) { if (context->saved_state == STATE_INSIDE_PROPERTY) add_property_value (context, XMP_PTYPE_TEXT, NULL, g_strndup (text, text_len)); else update_property_value (context, g_strndup (text, text_len)); } break; case STATE_INSIDE_QDESC_QUAL: #ifdef DEBUG_XMP_PARSER g_print ("ignoring qualifier for part of \"%s\"[]: \"%.*s\"\n", context->property, (int)text_len, text); #endif /* FIXME: notify the user? add a way to collect qualifiers? */ break; case STATE_SKIPPING_UNKNOWN_ELEMENTS: case STATE_SKIPPING_IGNORED_ELEMENTS: break; default: if (! is_whitespace_string (text)) parse_error (context, error, XMP_ERROR_INVALID_CONTENT, _("The current element (<%s>) cannot contain text"), g_markup_parse_context_get_element (markup_context)); break; } }
const char* SimpleXmlParser::getElement() { return g_markup_parse_context_get_element(context_); }
static void parse_text (GMarkupParseContext * ctx, const gchar * text, gsize text_len, gpointer user_data, GError ** err) { License *license = user_data; const gchar *element_name, *found; int i; element_name = g_markup_parse_context_get_element (ctx); for (i = 0; i < G_N_ELEMENTS (tag_map); ++i) { if (strcmp (element_name, tag_map[i].element_name) == 0) break; } if (i == G_N_ELEMENTS (tag_map)) g_error ("Unexpected tag '%s'\n", element_name); switch (tag_map[i].element_tag) { case TAG_CC_LICENSE: case TAG_CC_JURISDICTION: case TAG_CC_LEGALCODE: case TAG_DC_CREATOR: case TAG_CC_PROHIBITS: case TAG_CC_REQUIRES: case TAG_CC_PERMITS: case TAG_RDF_RDF: case TAG_RDF_DESCRIPTION: break; case TAG_DC_TITLE: if (license->titles == NULL) { license->titles = g_hash_table_new (g_str_hash, g_str_equal); } g_hash_table_insert (license->titles, (gpointer) license->cur_lang, (gpointer) g_intern_string (text)); break; case TAG_DC_DESCRIPTION:{ gchar *txt = g_strdup (text); if (license->descriptions == NULL) { license->descriptions = g_hash_table_new (g_str_hash, g_str_equal); } g_strdelimit (txt, "\n", ' '); g_hash_table_insert (license->descriptions, (gpointer) license->cur_lang, (gpointer) g_intern_string (txt)); g_free (txt); break; } case TAG_DCQ_HAS_VERSION: /* we assume one version per license */ g_assert (license->version == NULL); license->version = g_strdup (text); found = strstr (known_versions, license->version); if (found == NULL || found[strlen (license->version)] != '/') g_error ("Unexpected version '%s', please add to table.", text); break; case TAG_CC_DEPRECATED_ON: license->deprecated = TRUE; break; case TAG_DC_SOURCE: // FIXME default: g_print ("text (%s) (%s): '%s'\n", element_name, license->cur_lang, text); } }
// Called for character data // text is not nul-terminated static void text(GMarkupParseContext *context, const gchar *text, gsize text_len, gpointer user_data, GError **error) { struct my_parse_data *parse_data = user_data; workflow_t *workflow = parse_data->workflow; const gchar *inner_element = g_markup_parse_context_get_element(context); if(parse_data->in_event_list && strcmp(inner_element, EVENT_ELEMENT) == 0) { event_config_t *ec = new_event_config(text); char *subevent_filename = xasprintf(EVENTS_DIR"/%s.xml", text); load_event_description_from_file(ec, subevent_filename); if (ec_get_screen_name(ec)) wf_add_event(workflow, ec); else free_event_config(ec); free(subevent_filename); } if(strcmp(inner_element, NAME_ELEMENT) == 0) { log_debug("workflow name:'%s'", text); if (parse_data->attribute_lang != NULL) /* if it isn't for other locale */ { /* set the value only if we found a value for the current locale * OR the description is still not set and we found the default value */ if (parse_data->attribute_lang[0] != '\0' || !wf_get_screen_name(workflow) /* && parse_data->attribute_lang is "" - always true */ ) { if (!parse_data->exact_name) { parse_data->exact_name = (strcmp(parse_data->cur_locale, parse_data->attribute_lang) == 0); wf_set_screen_name(workflow, text); } } } } else if(strcmp(inner_element, DESCRIPTION_ELEMENT) == 0) { log_debug("workflow description:'%s'", text); if (parse_data->attribute_lang != NULL) /* if it isn't for other locale */ { /* set the value only if we found a value for the current locale * OR the description is still not set and we found the default value */ if (parse_data->attribute_lang[0] != '\0' || !wf_get_description(workflow) /* && parse_data->attribute_lang is "" - always true */ ) { if (!parse_data->exact_description) { parse_data->exact_description = (strcmp(parse_data->cur_locale, parse_data->attribute_lang) == 0); wf_set_description(workflow, text); } } } } else if(strcmp(inner_element, PRIORITY_ELEMENT) == 0) { log_debug("workflow priority:'%s'", text); char *end = NULL; long long val = strtoll(text, &end, 10); if (text == end || end[0] != '\0' || (errno == ERANGE && (val == LLONG_MAX || val == LLONG_MIN)) || (val > INT_MAX || val < INT_MIN) || (errno != 0 && val == 0)) { error_msg("Workflow's priority is not a number in range <%d,%d>", INT_MIN, INT_MAX); return; } wf_set_priority(workflow, (int)val); } }