[nautilus-actions] Able to import type 3 XML files
- From: Pierre Wieser <pwieser src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [nautilus-actions] Able to import type 3 XML files
- Date: Fri, 26 Feb 2010 00:43:28 +0000 (UTC)
commit 592f44df95f4c6fde3adfc081b737bc671a9e1d4
Author: pierre <pierre vfedora10 virtuals pwi>
Date: Wed Feb 24 18:02:20 2010 +0100
Able to import type 3 XML files
ChangeLog | 4 +
src/io-xml/naxml-keys.c | 26 +++--
src/io-xml/naxml-keys.h | 1 +
src/io-xml/naxml-reader.c | 229 ++++++++++++++++++++++++++++++++++++---------
4 files changed, 206 insertions(+), 54 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index d52a558..94aa7a6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
2009-02-24 Pierre Wieser <pwieser trychlos org>
+ * src/io-xml/naxml-keys.c:
+ * src/io-xml/naxml-keys.h:
+ * src/io-xml/naxml-reader.c: Able to import type 3 XML files.
+
* exports/config_1af5a47e-96d9_v1.4.schemas:
* src/api/na-data-boxed.h:
* src/api/na-ifactory-object-data.h:
diff --git a/src/io-xml/naxml-keys.c b/src/io-xml/naxml-keys.c
index 8235782..621626e 100644
--- a/src/io-xml/naxml-keys.c
+++ b/src/io-xml/naxml-keys.c
@@ -35,19 +35,25 @@
#include "naxml-keys.h"
NAXMLKeyStr naxml_schema_key_schema_str [] = {
- { NAXML_KEY_SCHEMA_NODE_KEY, TRUE, FALSE },
- { NAXML_KEY_SCHEMA_NODE_APPLYTO, TRUE, FALSE },
- { NAXML_KEY_SCHEMA_NODE_OWNER, FALSE, FALSE },
- { NAXML_KEY_SCHEMA_NODE_TYPE, TRUE, FALSE },
- { NAXML_KEY_SCHEMA_NODE_LISTTYPE, TRUE, FALSE },
- { NAXML_KEY_SCHEMA_NODE_LOCALE, TRUE, FALSE },
- { NAXML_KEY_SCHEMA_NODE_DEFAULT, TRUE, FALSE },
+ { NAXML_KEY_SCHEMA_NODE_KEY, TRUE, TRUE, FALSE },
+ { NAXML_KEY_SCHEMA_NODE_APPLYTO, TRUE, TRUE, FALSE },
+ { NAXML_KEY_SCHEMA_NODE_OWNER, TRUE, FALSE, FALSE },
+ { NAXML_KEY_SCHEMA_NODE_TYPE, TRUE, TRUE, FALSE },
+ { NAXML_KEY_SCHEMA_NODE_LISTTYPE, TRUE, TRUE, FALSE },
+ { NAXML_KEY_SCHEMA_NODE_LOCALE, TRUE, TRUE, FALSE },
+ { NAXML_KEY_SCHEMA_NODE_DEFAULT, TRUE, TRUE, FALSE },
{ NULL }
};
NAXMLKeyStr naxml_schema_key_locale_str [] = {
- { NAXML_KEY_SCHEMA_NODE_LOCALE_DEFAULT, TRUE, FALSE },
- { NAXML_KEY_SCHEMA_NODE_LOCALE_SHORT, FALSE, FALSE },
- { NAXML_KEY_SCHEMA_NODE_LOCALE_LONG, FALSE, FALSE },
+ { NAXML_KEY_SCHEMA_NODE_LOCALE_DEFAULT, TRUE, TRUE, FALSE },
+ { NAXML_KEY_SCHEMA_NODE_LOCALE_SHORT, TRUE, FALSE, FALSE },
+ { NAXML_KEY_SCHEMA_NODE_LOCALE_LONG, TRUE, FALSE, FALSE },
+ { NULL }
+};
+
+NAXMLKeyStr naxml_dump_key_entry_str [] = {
+ { NAXML_KEY_DUMP_NODE_KEY, TRUE, TRUE, FALSE },
+ { NAXML_KEY_DUMP_NODE_VALUE, TRUE, TRUE, FALSE },
{ NULL }
};
diff --git a/src/io-xml/naxml-keys.h b/src/io-xml/naxml-keys.h
index 0cd0294..8fbffa8 100644
--- a/src/io-xml/naxml-keys.h
+++ b/src/io-xml/naxml-keys.h
@@ -68,6 +68,7 @@ G_BEGIN_DECLS
*/
typedef struct {
gchar *key; /* static data */
+ gboolean v1;
gboolean v2;
gboolean reader_found; /* dynamic data */
diff --git a/src/io-xml/naxml-reader.c b/src/io-xml/naxml-reader.c
index cfe01d0..3c4ce46 100644
--- a/src/io-xml/naxml-reader.c
+++ b/src/io-xml/naxml-reader.c
@@ -37,6 +37,8 @@
#include <string.h>
#include <api/na-core-utils.h>
+#include <api/na-gconf-utils.h>
+#include <api/na-data-types.h>
#include <api/na-ifactory-provider.h>
#include <api/na-object-api.h>
@@ -93,6 +95,7 @@ struct NAXMLReaderPrivate {
};
extern NAXMLKeyStr naxml_schema_key_schema_str[];
+extern NAXMLKeyStr naxml_dump_key_entry_str[];
static GObjectClass *st_parent_class = NULL;
@@ -107,12 +110,11 @@ static NAXMLReader *reader_new( void );
static guint schema_parse_schema_content( NAXMLReader *reader, xmlNode *node );
static void schema_check_for_id( NAXMLReader *reader, xmlNode *iter );
static void schema_check_for_type( NAXMLReader *reader, xmlNode *iter );
-static gchar *schema_get_value( xmlNode *node );
-static gchar *schema_get_locale_value( xmlNode *node );
static gchar *schema_read_value( NAXMLReader *reader, xmlNode *node, const NADataDef *def );
static guint dump_parse_list_parms( NAXMLReader *reader, xmlNode *node );
static guint dump_parse_entry_content( NAXMLReader *reader, xmlNode *node );
+static void dump_check_for_type( NAXMLReader *reader, xmlNode *key_node );
static gchar *dump_read_value( NAXMLReader *reader, xmlNode *node, const NADataDef *def );
static RootNodeStr st_root_node_str[] = {
@@ -218,6 +220,8 @@ static guint iter_on_list_children( NAXMLReader *reader, xmlNode *first
static void add_message( NAXMLReader *reader, const gchar *format, ... );
static gchar *build_key_node_list( NAXMLKeyStr *strlist );
static gchar *build_root_node_list( void );
+static gchar *get_value_from_child_node( xmlNode *node, const gchar *child );
+static gchar *get_value_from_child_child_node( xmlNode *node, const gchar *first, const gchar *second );
static gboolean is_profile_path( NAXMLReader *reader, xmlChar *text );
static void reset_node_data( NAXMLReader *reader );
static xmlNode *search_for_child_node( xmlNode *node, const gchar *key );
@@ -1201,7 +1205,7 @@ schema_check_for_type( NAXMLReader *reader, xmlNode *iter )
if( !strcmp( entry, NAGP_ENTRY_TYPE )){
reader->private->type_found = TRUE;
- gchar *type = schema_get_value( iter->parent );
+ gchar *type = get_value_from_child_node( iter->parent, NAXML_KEY_SCHEMA_NODE_DEFAULT );
if( !strcmp( type, NAGP_VALUE_TYPE_ACTION )){
reader->private->parms->item = NA_OBJECT_ITEM( na_object_action_new());
@@ -1222,51 +1226,14 @@ schema_check_for_type( NAXMLReader *reader, xmlNode *iter )
}
static gchar *
-schema_get_value( xmlNode *node )
-{
- gchar *value = NULL;
-
- xmlNode *default_node = search_for_child_node( node, NAXML_KEY_SCHEMA_NODE_DEFAULT );
- if( default_node ){
- xmlChar *default_value = xmlNodeGetContent( default_node );
- if( default_value ){
- value = g_strdup(( const char * ) default_value );
- xmlFree( default_value );
- }
- }
-
- return( value );
-}
-
-static gchar *
-schema_get_locale_value( xmlNode *node )
-{
- gchar *value = NULL;
-
- xmlNode *locale = search_for_child_node( node, NAXML_KEY_SCHEMA_NODE_LOCALE );
- if( locale ){
- xmlNode *default_node = search_for_child_node( locale, NAXML_KEY_SCHEMA_NODE_LOCALE_DEFAULT );
- if( default_node ){
- xmlChar *default_value = xmlNodeGetContent( default_node );
- if( default_value ){
- value = g_strdup(( const char * ) default_value );
- xmlFree( default_value );
- }
- }
- }
-
- return( value );
-}
-
-static gchar *
schema_read_value( NAXMLReader *reader, xmlNode *node, const NADataDef *def )
{
gchar *value;
if( def->localizable ){
- value = schema_get_locale_value( node );
+ value = get_value_from_child_child_node( node, NAXML_KEY_SCHEMA_NODE_LOCALE, NAXML_KEY_SCHEMA_NODE_LOCALE_DEFAULT );
} else {
- value = schema_get_value( node );
+ value = get_value_from_child_node( node, NAXML_KEY_SCHEMA_NODE_DEFAULT );
}
return( value );
@@ -1283,6 +1250,10 @@ dump_parse_list_parms( NAXMLReader *reader, xmlNode *node )
code = IMPORTER_CODE_OK;
+ xmlChar *path = xmlGetProp( node, ( const xmlChar * ) NAXML_KEY_DUMP_LIST_PARM_BASE );
+ reader->private->item_id = g_path_get_basename(( const gchar * ) path );
+ xmlFree( path );
+
return( code );
}
@@ -1291,19 +1262,148 @@ dump_parse_list_parms( NAXMLReader *reader, xmlNode *node )
* second run: load data
*/
static guint
-dump_parse_entry_content( NAXMLReader *reader, xmlNode *node )
+dump_parse_entry_content( NAXMLReader *reader, xmlNode *entry )
{
+ xmlNode *iter;
+ NAXMLKeyStr *str;
+ int i;
guint code;
code = IMPORTER_CODE_OK;
+ for( iter = entry->children ; iter && code == IMPORTER_CODE_OK ; iter = iter->next ){
+
+ if( iter->type != XML_ELEMENT_NODE ){
+ continue;
+ }
+
+ str = NULL;
+ for( i = 0 ; naxml_dump_key_entry_str[i].key && !str ; ++i ){
+ if( !strxcmp( iter->name, naxml_dump_key_entry_str[i].key )){
+ str = naxml_dump_key_entry_str+i;
+ }
+ }
+
+ if( !str ){
+ gchar *node_list = build_key_node_list( naxml_dump_key_entry_str );
+ add_message( reader,
+ ERR_NODE_UNKNOWN,
+ ( const char * ) iter->name, iter->line, node_list );
+ g_free( node_list );
+ reader->private->node_ok = FALSE;
+ continue;
+ }
+
+ if( str->reader_found ){
+ add_message( reader,
+ ERR_NODE_ALREADY_FOUND,
+ ( const char * ) iter->name, iter->line );
+ reader->private->node_ok = FALSE;
+ continue;
+ }
+
+ str->reader_found = TRUE;
+
+ /* search for the type of the item
+ */
+ if( !strxcmp( iter->name, NAXML_KEY_DUMP_NODE_KEY )){
+
+ dump_check_for_type( reader, iter );
+
+ if( !reader->private->node_ok ){
+ continue;
+ }
+ }
+ }
+
return( code );
}
+/*
+ * check for 'Type'
+ */
+static void
+dump_check_for_type( NAXMLReader *reader, xmlNode *key_node )
+{
+ xmlChar *key_content = xmlNodeGetContent( key_node );
+
+ if( !strxcmp( key_content, NAGP_ENTRY_TYPE )){
+ reader->private->type_found = TRUE;
+ gchar *type = get_value_from_child_child_node( key_node->parent, NAXML_KEY_DUMP_NODE_VALUE, NAXML_KEY_DUMP_NODE_VALUE_TYPE_STRING );
+
+ if( !strcmp( type, NAGP_VALUE_TYPE_ACTION )){
+ reader->private->parms->item = NA_OBJECT_ITEM( na_object_action_new());
+
+ } else if( !strcmp( type, NAGP_VALUE_TYPE_MENU )){
+ reader->private->parms->item = NA_OBJECT_ITEM( na_object_menu_new());
+
+ } else {
+ add_message( reader, ERR_NODE_UNKNOWN_TYPE, type, key_node->line );
+ reader->private->node_ok = FALSE;
+ }
+
+ g_free( type );
+ }
+
+ xmlFree( key_content );
+}
+
+/*
+ * string list is converted to GSList, then to a GConf string
+ */
static gchar *
dump_read_value( NAXMLReader *reader, xmlNode *node, const NADataDef *def )
{
- return( NULL );
+ gchar *string;
+ GSList *slist;
+ xmlNode *value_node;
+ xmlNode *list_node;
+ xmlNode *vv_node;
+ xmlChar *text;
+ xmlNode *it;
+
+ string = NULL;
+
+ switch( def->type ){
+ case NAFD_TYPE_STRING:
+ case NAFD_TYPE_LOCALE_STRING:
+ case NAFD_TYPE_UINT:
+ case NAFD_TYPE_BOOLEAN:
+ string = get_value_from_child_child_node( node, NAXML_KEY_DUMP_NODE_VALUE, NAXML_KEY_DUMP_NODE_VALUE_TYPE_STRING );
+ break;
+
+ case NAFD_TYPE_STRING_LIST:
+ slist = NULL;
+ value_node = search_for_child_node( node, NAXML_KEY_DUMP_NODE_VALUE );
+
+ if( value_node ){
+ list_node = search_for_child_node( value_node, NAXML_KEY_DUMP_NODE_VALUE_LIST );
+
+ if( list_node ){
+ vv_node = search_for_child_node( list_node, NAXML_KEY_DUMP_NODE_VALUE );
+
+ for( it = vv_node->children ; it ; it = it->next ){
+
+ if( it->type == XML_ELEMENT_NODE &&
+ !strxcmp( it->name, NAXML_KEY_DUMP_NODE_VALUE_TYPE_STRING )){
+
+ text = xmlNodeGetContent( it );
+ slist = g_slist_append( slist, ( gchar * ) text );
+ }
+
+ }
+ }
+ }
+ string = na_gconf_utils_slist_to_string( slist );
+ na_core_utils_slist_free( slist );
+ break;
+
+ case NAFD_TYPE_POINTER:
+ default:
+ break;
+ }
+
+ return( string );
}
#if 0
@@ -2173,6 +2273,43 @@ build_root_node_list( void )
return( g_string_free( string, FALSE ));
}
+static gchar *
+get_value_from_child_node( xmlNode *node, const gchar *child )
+{
+ gchar *value = NULL;
+
+ xmlNode *value_node = search_for_child_node( node, child );
+ if( value_node ){
+ xmlChar *value_value = xmlNodeGetContent( value_node );
+ if( value_value ){
+ value = g_strdup(( const char * ) value_value );
+ xmlFree( value_value );
+ }
+ }
+
+ return( value );
+}
+
+static gchar *
+get_value_from_child_child_node( xmlNode *node, const gchar *first, const gchar *second )
+{
+ gchar *value = NULL;
+
+ xmlNode *first_node = search_for_child_node( node, first );
+ if( first_node ){
+ xmlNode *second_node = search_for_child_node( first_node, second );
+ if( second_node ){
+ xmlChar *value_value = xmlNodeGetContent( second_node );
+ if( value_value ){
+ value = g_strdup(( const char * ) value_value );
+ xmlFree( value_value );
+ }
+ }
+ }
+
+ return( value );
+}
+
static gboolean
is_profile_path( NAXMLReader *reader, xmlChar *text )
{
@@ -2211,6 +2348,10 @@ reset_node_data( NAXMLReader *reader )
naxml_schema_key_schema_str[i].reader_found = FALSE;
}
+ for( i=0 ; naxml_dump_key_entry_str[i].key ; ++i ){
+ naxml_dump_key_entry_str[i].reader_found = FALSE;
+ }
+
reader->private->node_ok = TRUE;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]