]> Creatis software - creaImageIO.git/commitdiff
*** empty log message ***
authorguigues <guigues>
Thu, 12 Feb 2009 15:10:20 +0000 (15:10 +0000)
committerguigues <guigues>
Thu, 12 Feb 2009 15:10:20 +0000 (15:10 +0000)
27 files changed:
appli/gimmick/CMakeLists.txt
appli/gimmick/gimmick.ggo [new file with mode: 0644]
appli/gimmick/gimmick_ggo.c [new file with mode: 0644]
appli/gimmick/gimmick_ggo.h [new file with mode: 0644]
appli/gimmick/main.cxx
src2/creaImageIOGimmick.cpp
src2/creaImageIOGimmick.h
src2/creaImageIOImageFinder.cpp
src2/creaImageIOImageFinder.h
src2/creaImageIOImageReader.cpp
src2/creaImageIOImageReader.h
src2/creaImageIOSQLiteTreeHandler.cpp
src2/creaImageIOSQLiteTreeHandler.h
src2/creaImageIOSystem.h
src2/creaImageIOTree.cpp
src2/creaImageIOTree.h
src2/creaImageIOTreeAttributeDescriptor.cpp
src2/creaImageIOTreeAttributeDescriptor.h
src2/creaImageIOTreeAttributeMapType.h [new file with mode: 0644]
src2/creaImageIOTreeDescriptor.cpp
src2/creaImageIOTreeDescriptor.h
src2/creaImageIOTreeHandler.h
src2/creaImageIOTreeLevelDescriptor.cpp
src2/creaImageIOTreeLevelDescriptor.h
src2/creaImageIOTreeNode.cpp
src2/creaImageIOTreeNode.h
src2/doxygen/Doxyfile.txt.in

index 20b6c9dd978f2f409c9420c3894a27d535919757..7f9f7add37397244c1c7b8a71b4e99e4394d4fea 100644 (file)
@@ -1,9 +1,37 @@
+IF(GGO)
+  #=========================================================
+  # Find ggo (gengetopt) files (http://www.gnu.org/software/gengetopt/)
+  FILE(GLOB ALL_GGO_FILES *.ggo)
+  MESSAGE(${ALL_GGO_FILES})
+  
+  FOREACH(GGO_FILE ${ALL_GGO_FILES})
+    #MESSAGE(input=${GGO_FILE})  
+    STRING(REGEX REPLACE "(.*).ggo" 
+      "\\1" GGO_BASENAME
+      "${GGO_FILE}")  
+    MESSAGE( base= ${GGO_BASENAME})
+    SET(GGO_H ${GGO_BASENAME}_ggo.h)
+    MESSAGE(${GGO_H})
+    SET(GGO_C ${GGO_BASENAME}_ggo.c)
+    MESSAGE(${GGO_C}) 
+    SET(GGO_OUTPUT  ${GGO_H} ${GGO_C})
+    ADD_CUSTOM_COMMAND(OUTPUT ${GGO_OUTPUT} 
+      COMMAND gengetopt 
+      ARGS < ${GGO_FILE} --file-name=${GGO_BASENAME}_ggo -u --conf-parser
+      DEPENDS ${GGO_FILE}
+      )  
+  ENDFOREACH(GGO_FILE)
+#=========================================================
+ENDIF(GGO)
+
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
+SET(SOURCES main gimmick_ggo.c)
 
 IF(WIN32)
-  ADD_EXECUTABLE(gimmick main)  
+  ADD_EXECUTABLE(gimmick ${SOURCES})  
   SET_TARGET_PROPERTIES(gimmick PROPERTIES LINK_FLAGS /subsystem:console )
 ELSE(WIN32)
-  ADD_EXECUTABLE(gimmick main)
+  ADD_EXECUTABLE(gimmick ${SOURCES})
 ENDIF(WIN32)
 
 TARGET_LINK_LIBRARIES( gimmick creaImageIO2)
diff --git a/appli/gimmick/gimmick.ggo b/appli/gimmick/gimmick.ggo
new file mode 100644 (file)
index 0000000..d67d7ee
--- /dev/null
@@ -0,0 +1,38 @@
+# file gimmick.ggo
+package "gimmick"
+version "0.1.0"
+purpose ""
+description ""
+usage "gimmick COMMAND [OPTIONS]"
+
+section "COMMANDS"
+option "print" p "Prints the local database tree" flag off
+option "file" f "Adds the file to local database" typestr="<file name>" string optional
+option "dir" d "Adds the directory to local database" typestr="<path>" string optional
+option "recurse" r "Recurse into sub-directories" flag off dependon="dir"
+
+section "OPTIONS" 
+option "verbose" v "Verbosity level" int default="1" optional
+
+#package "<packname>"
+#     version "<version>"
+#     purpose "<purpose>"
+#     usage "<usage>"
+#     description "<description>"
+    
+#     args "<command line options>"
+     
+#     option <long> <short> "<desc>"
+#         {details="<detailed description>"}
+#         {argtype} {typestr="<type descr>"}
+#         {values="<value1>","<value2>",...}
+#         {default="<default value>"}
+#         {dependon="<other option>"}
+#         {required} {argoptional} {multiple}
+#         {hidden}
+     
+#     option <long> <short> "<desc>" flag <on/off>
+     
+#     section "section name" {sectiondesc="optional section description"}
+     
+#     text "a textual sentence"
diff --git a/appli/gimmick/gimmick_ggo.c b/appli/gimmick/gimmick_ggo.c
new file mode 100644 (file)
index 0000000..6f5e74d
--- /dev/null
@@ -0,0 +1,884 @@
+/*
+  File autogenerated by gengetopt version 2.22
+  generated with the following command:
+  gengetopt --file-name=/home/guigues/coding/CreaTools/creaImageIO/appli/gimmick/gimmick_ggo -u --conf-parser 
+
+  The developers of gengetopt consider the fixed text that goes in all
+  gengetopt output files to be in the public domain:
+  we make no copyright claims on it.
+*/
+
+/* If we use autoconf.  */
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "getopt.h"
+
+#include "/home/guigues/coding/CreaTools/creaImageIO/appli/gimmick/gimmick_ggo.h"
+
+const char *gengetopt_args_info_purpose = "";
+
+const char *gengetopt_args_info_usage = "Usage: gimmick COMMAND [OPTIONS]";
+
+const char *gengetopt_args_info_description = "";
+
+const char *gengetopt_args_info_help[] = {
+  "  -h, --help              Print help and exit",
+  "  -V, --version           Print version and exit",
+  "\nCOMMANDS:",
+  "  -p, --print             Prints the local database tree  (default=off)",
+  "  -f, --file=<file name>  Adds the file to local database",
+  "  -d, --dir=<path>        Adds the directory to local database",
+  "  -r, --recurse           Recurse into sub-directories  (default=off)",
+  "\nOPTIONS:",
+  "  -v, --verbose=INT       Verbosity level  (default=`1')",
+    0
+};
+
+typedef enum {ARG_NO
+  , ARG_FLAG
+  , ARG_STRING
+  , ARG_INT
+} cmdline_parser_arg_type;
+
+static
+void clear_given (struct gengetopt_args_info *args_info);
+static
+void clear_args (struct gengetopt_args_info *args_info);
+
+static int
+cmdline_parser_internal (int argc, char * const *argv, struct gengetopt_args_info *args_info,
+                        struct cmdline_parser_params *params, const char *additional_error);
+
+static int
+cmdline_parser_required2 (struct gengetopt_args_info *args_info, const char *prog_name, const char *additional_error);
+struct line_list
+{
+  char * string_arg;
+  struct line_list * next;
+};
+
+static struct line_list *cmd_line_list = 0;
+static struct line_list *cmd_line_list_tmp = 0;
+
+static void
+free_cmd_list(void)
+{
+  /* free the list of a previous call */
+  if (cmd_line_list)
+    {
+      while (cmd_line_list) {
+        cmd_line_list_tmp = cmd_line_list;
+        cmd_line_list = cmd_line_list->next;
+        free (cmd_line_list_tmp->string_arg);
+        free (cmd_line_list_tmp);
+      }
+    }
+}
+
+
+static char *
+gengetopt_strdup (const char *s);
+
+static
+void clear_given (struct gengetopt_args_info *args_info)
+{
+  args_info->help_given = 0 ;
+  args_info->version_given = 0 ;
+  args_info->print_given = 0 ;
+  args_info->file_given = 0 ;
+  args_info->dir_given = 0 ;
+  args_info->recurse_given = 0 ;
+  args_info->verbose_given = 0 ;
+}
+
+static
+void clear_args (struct gengetopt_args_info *args_info)
+{
+  args_info->print_flag = 0;
+  args_info->file_arg = NULL;
+  args_info->file_orig = NULL;
+  args_info->dir_arg = NULL;
+  args_info->dir_orig = NULL;
+  args_info->recurse_flag = 0;
+  args_info->verbose_arg = 1;
+  args_info->verbose_orig = NULL;
+  
+}
+
+static
+void init_args_info(struct gengetopt_args_info *args_info)
+{
+
+
+  args_info->help_help = gengetopt_args_info_help[0] ;
+  args_info->version_help = gengetopt_args_info_help[1] ;
+  args_info->print_help = gengetopt_args_info_help[3] ;
+  args_info->file_help = gengetopt_args_info_help[4] ;
+  args_info->dir_help = gengetopt_args_info_help[5] ;
+  args_info->recurse_help = gengetopt_args_info_help[6] ;
+  args_info->verbose_help = gengetopt_args_info_help[8] ;
+  
+}
+
+void
+cmdline_parser_print_version (void)
+{
+  printf ("%s %s\n", CMDLINE_PARSER_PACKAGE, CMDLINE_PARSER_VERSION);
+}
+
+static void print_help_common(void) {
+  cmdline_parser_print_version ();
+
+  if (strlen(gengetopt_args_info_purpose) > 0)
+    printf("\n%s\n", gengetopt_args_info_purpose);
+
+  if (strlen(gengetopt_args_info_usage) > 0)
+    printf("\n%s\n", gengetopt_args_info_usage);
+
+  printf("\n");
+
+  if (strlen(gengetopt_args_info_description) > 0)
+    printf("%s\n", gengetopt_args_info_description);
+}
+
+void
+cmdline_parser_print_help (void)
+{
+  int i = 0;
+  print_help_common();
+  while (gengetopt_args_info_help[i])
+    printf("%s\n", gengetopt_args_info_help[i++]);
+}
+
+void
+cmdline_parser_init (struct gengetopt_args_info *args_info)
+{
+  clear_given (args_info);
+  clear_args (args_info);
+  init_args_info (args_info);
+
+  args_info->inputs = NULL;
+  args_info->inputs_num = 0;
+}
+
+void
+cmdline_parser_params_init(struct cmdline_parser_params *params)
+{
+  if (params)
+    { 
+      params->override = 0;
+      params->initialize = 1;
+      params->check_required = 1;
+      params->check_ambiguity = 0;
+      params->print_errors = 1;
+    }
+}
+
+struct cmdline_parser_params *
+cmdline_parser_params_create(void)
+{
+  struct cmdline_parser_params *params = 
+    (struct cmdline_parser_params *)malloc(sizeof(struct cmdline_parser_params));
+  cmdline_parser_params_init(params);  
+  return params;
+}
+
+static void
+free_string_field (char **s)
+{
+  if (*s)
+    {
+      free (*s);
+      *s = 0;
+    }
+}
+
+
+static void
+cmdline_parser_release (struct gengetopt_args_info *args_info)
+{
+  unsigned int i;
+  free_string_field (&(args_info->file_arg));
+  free_string_field (&(args_info->file_orig));
+  free_string_field (&(args_info->dir_arg));
+  free_string_field (&(args_info->dir_orig));
+  free_string_field (&(args_info->verbose_orig));
+  
+  
+  for (i = 0; i < args_info->inputs_num; ++i)
+    free (args_info->inputs [i]);
+
+  if (args_info->inputs_num)
+    free (args_info->inputs);
+
+  clear_given (args_info);
+}
+
+
+static void
+write_into_file(FILE *outfile, const char *opt, const char *arg, char *values[])
+{
+  if (arg) {
+    fprintf(outfile, "%s=\"%s\"\n", opt, arg);
+  } else {
+    fprintf(outfile, "%s\n", opt);
+  }
+}
+
+
+int
+cmdline_parser_dump(FILE *outfile, struct gengetopt_args_info *args_info)
+{
+  int i = 0;
+
+  if (!outfile)
+    {
+      fprintf (stderr, "%s: cannot dump options to stream\n", CMDLINE_PARSER_PACKAGE);
+      return EXIT_FAILURE;
+    }
+
+  if (args_info->help_given)
+    write_into_file(outfile, "help", 0, 0 );
+  if (args_info->version_given)
+    write_into_file(outfile, "version", 0, 0 );
+  if (args_info->print_given)
+    write_into_file(outfile, "print", 0, 0 );
+  if (args_info->file_given)
+    write_into_file(outfile, "file", args_info->file_orig, 0);
+  if (args_info->dir_given)
+    write_into_file(outfile, "dir", args_info->dir_orig, 0);
+  if (args_info->recurse_given)
+    write_into_file(outfile, "recurse", 0, 0 );
+  if (args_info->verbose_given)
+    write_into_file(outfile, "verbose", args_info->verbose_orig, 0);
+  
+
+  i = EXIT_SUCCESS;
+  return i;
+}
+
+int
+cmdline_parser_file_save(const char *filename, struct gengetopt_args_info *args_info)
+{
+  FILE *outfile;
+  int i = 0;
+
+  outfile = fopen(filename, "w");
+
+  if (!outfile)
+    {
+      fprintf (stderr, "%s: cannot open file for writing: %s\n", CMDLINE_PARSER_PACKAGE, filename);
+      return EXIT_FAILURE;
+    }
+
+  i = cmdline_parser_dump(outfile, args_info);
+  fclose (outfile);
+
+  return i;
+}
+
+void
+cmdline_parser_free (struct gengetopt_args_info *args_info)
+{
+  cmdline_parser_release (args_info);
+}
+
+/** @brief replacement of strdup, which is not standard */
+char *
+gengetopt_strdup (const char *s)
+{
+  char *result = NULL;
+  if (!s)
+    return result;
+
+  result = (char*)malloc(strlen(s) + 1);
+  if (result == (char*)0)
+    return (char*)0;
+  strcpy(result, s);
+  return result;
+}
+
+int
+cmdline_parser (int argc, char * const *argv, struct gengetopt_args_info *args_info)
+{
+  return cmdline_parser2 (argc, argv, args_info, 0, 1, 1);
+}
+
+int
+cmdline_parser_ext (int argc, char * const *argv, struct gengetopt_args_info *args_info,
+                   struct cmdline_parser_params *params)
+{
+  int result;
+  result = cmdline_parser_internal (argc, argv, args_info, params, NULL);
+
+  if (result == EXIT_FAILURE)
+    {
+      cmdline_parser_free (args_info);
+      exit (EXIT_FAILURE);
+    }
+  
+  return result;
+}
+
+int
+cmdline_parser2 (int argc, char * const *argv, struct gengetopt_args_info *args_info, int override, int initialize, int check_required)
+{
+  int result;
+  struct cmdline_parser_params params;
+  
+  params.override = override;
+  params.initialize = initialize;
+  params.check_required = check_required;
+  params.check_ambiguity = 0;
+  params.print_errors = 1;
+
+  result = cmdline_parser_internal (argc, argv, args_info, &params, NULL);
+
+  if (result == EXIT_FAILURE)
+    {
+      cmdline_parser_free (args_info);
+      exit (EXIT_FAILURE);
+    }
+  
+  return result;
+}
+
+int
+cmdline_parser_required (struct gengetopt_args_info *args_info, const char *prog_name)
+{
+  int result = EXIT_SUCCESS;
+
+  if (cmdline_parser_required2(args_info, prog_name, NULL) > 0)
+    result = EXIT_FAILURE;
+
+  if (result == EXIT_FAILURE)
+    {
+      cmdline_parser_free (args_info);
+      exit (EXIT_FAILURE);
+    }
+  
+  return result;
+}
+
+int
+cmdline_parser_required2 (struct gengetopt_args_info *args_info, const char *prog_name, const char *additional_error)
+{
+  int error = 0;
+
+  /* checks for required options */
+  
+  /* checks for dependences among options */
+  if (args_info->recurse_given && ! args_info->dir_given)
+    {
+      fprintf (stderr, "%s: '--recurse' ('-r') option depends on option 'dir'%s\n", prog_name, (additional_error ? additional_error : ""));
+      error = 1;
+    }
+
+  return error;
+}
+
+
+static char *package_name = 0;
+
+/**
+ * @brief updates an option
+ * @param field the generic pointer to the field to update
+ * @param orig_field the pointer to the orig field
+ * @param field_given the pointer to the number of occurrence of this option
+ * @param prev_given the pointer to the number of occurrence already seen
+ * @param value the argument for this option (if null no arg was specified)
+ * @param possible_values the possible values for this option (if specified)
+ * @param default_value the default value (in case the option only accepts fixed values)
+ * @param arg_type the type of this option
+ * @param check_ambiguity @see cmdline_parser_params.check_ambiguity
+ * @param override @see cmdline_parser_params.override
+ * @param no_free whether to free a possible previous value
+ * @param multiple_option whether this is a multiple option
+ * @param long_opt the corresponding long option
+ * @param short_opt the corresponding short option (or '-' if none)
+ * @param additional_error possible further error specification
+ */
+static
+int update_arg(void *field, char **orig_field,
+               unsigned int *field_given, unsigned int *prev_given, 
+               char *value, char *possible_values[], const char *default_value,
+               cmdline_parser_arg_type arg_type,
+               int check_ambiguity, int override,
+               int no_free, int multiple_option,
+               const char *long_opt, char short_opt,
+               const char *additional_error)
+{
+  char *stop_char = 0;
+  const char *val = value;
+  int found;
+  char **string_field;
+
+  stop_char = 0;
+  found = 0;
+
+  if (!multiple_option && prev_given && (*prev_given || (check_ambiguity && *field_given)))
+    {
+      if (short_opt != '-')
+        fprintf (stderr, "%s: `--%s' (`-%c') option given more than once%s\n", 
+               package_name, long_opt, short_opt,
+               (additional_error ? additional_error : ""));
+      else
+        fprintf (stderr, "%s: `--%s' option given more than once%s\n", 
+               package_name, long_opt,
+               (additional_error ? additional_error : ""));
+      return 1; /* failure */
+    }
+
+    
+  if (field_given && *field_given && ! override)
+    return 0;
+  if (prev_given)
+    (*prev_given)++;
+  if (field_given)
+    (*field_given)++;
+  if (possible_values)
+    val = possible_values[found];
+
+  switch(arg_type) {
+  case ARG_FLAG:
+    *((int *)field) = !*((int *)field);
+    break;
+  case ARG_INT:
+    if (val) *((int *)field) = strtol (val, &stop_char, 0);
+    break;
+  case ARG_STRING:
+    if (val) {
+      string_field = (char **)field;
+      if (!no_free && *string_field)
+        free (*string_field); /* free previous string */
+      *string_field = gengetopt_strdup (val);
+    }
+    break;
+  default:
+    break;
+  };
+
+  /* check numeric conversion */
+  switch(arg_type) {
+  case ARG_INT:
+    if (val && !(stop_char && *stop_char == '\0')) {
+      fprintf(stderr, "%s: invalid numeric value: %s\n", package_name, val);
+      return 1; /* failure */
+    }
+    break;
+  default:
+    ;
+  };
+
+  /* store the original value */
+  switch(arg_type) {
+  case ARG_NO:
+  case ARG_FLAG:
+    break;
+  default:
+    if (value && orig_field) {
+      if (no_free) {
+        *orig_field = value;
+      } else {
+        if (*orig_field)
+          free (*orig_field); /* free previous string */
+        *orig_field = gengetopt_strdup (value);
+      }
+    }
+  };
+
+  return 0; /* OK */
+}
+
+
+int
+cmdline_parser_internal (int argc, char * const *argv, struct gengetopt_args_info *args_info,
+                        struct cmdline_parser_params *params, const char *additional_error)
+{
+  int c;       /* Character of the parsed option.  */
+
+  int error = 0;
+  struct gengetopt_args_info local_args_info;
+  
+  int override;
+  int initialize;
+  int check_required;
+  int check_ambiguity;
+  
+  package_name = argv[0];
+  
+  override = params->override;
+  initialize = params->initialize;
+  check_required = params->check_required;
+  check_ambiguity = params->check_ambiguity;
+
+  if (initialize)
+    cmdline_parser_init (args_info);
+
+  cmdline_parser_init (&local_args_info);
+
+  optarg = 0;
+  optind = 0;
+  opterr = params->print_errors;
+  optopt = '?';
+
+  while (1)
+    {
+      int option_index = 0;
+
+      static struct option long_options[] = {
+        { "help",      0, NULL, 'h' },
+        { "version",   0, NULL, 'V' },
+        { "print",     0, NULL, 'p' },
+        { "file",      1, NULL, 'f' },
+        { "dir",       1, NULL, 'd' },
+        { "recurse",   0, NULL, 'r' },
+        { "verbose",   1, NULL, 'v' },
+        { NULL,        0, NULL, 0 }
+      };
+
+      c = getopt_long (argc, argv, "hVpf:d:rv:", long_options, &option_index);
+
+      if (c == -1) break;      /* Exit from `while (1)' loop.  */
+
+      switch (c)
+        {
+        case 'h':      /* Print help and exit.  */
+          cmdline_parser_print_help ();
+          cmdline_parser_free (&local_args_info);
+          exit (EXIT_SUCCESS);
+
+        case 'V':      /* Print version and exit.  */
+          cmdline_parser_print_version ();
+          cmdline_parser_free (&local_args_info);
+          exit (EXIT_SUCCESS);
+
+        case 'p':      /* Prints the local database tree.  */
+        
+        
+          if (update_arg((void *)&(args_info->print_flag), 0, &(args_info->print_given),
+              &(local_args_info.print_given), optarg, 0, 0, ARG_FLAG,
+              check_ambiguity, override, 1, 0, "print", 'p',
+              additional_error))
+            goto failure;
+        
+          break;
+        case 'f':      /* Adds the file to local database.  */
+        
+        
+          if (update_arg( (void *)&(args_info->file_arg), 
+               &(args_info->file_orig), &(args_info->file_given),
+              &(local_args_info.file_given), optarg, 0, 0, ARG_STRING,
+              check_ambiguity, override, 0, 0,
+              "file", 'f',
+              additional_error))
+            goto failure;
+        
+          break;
+        case 'd':      /* Adds the directory to local database.  */
+        
+        
+          if (update_arg( (void *)&(args_info->dir_arg), 
+               &(args_info->dir_orig), &(args_info->dir_given),
+              &(local_args_info.dir_given), optarg, 0, 0, ARG_STRING,
+              check_ambiguity, override, 0, 0,
+              "dir", 'd',
+              additional_error))
+            goto failure;
+        
+          break;
+        case 'r':      /* Recurse into sub-directories.  */
+        
+        
+          if (update_arg((void *)&(args_info->recurse_flag), 0, &(args_info->recurse_given),
+              &(local_args_info.recurse_given), optarg, 0, 0, ARG_FLAG,
+              check_ambiguity, override, 1, 0, "recurse", 'r',
+              additional_error))
+            goto failure;
+        
+          break;
+        case 'v':      /* Verbosity level.  */
+        
+        
+          if (update_arg( (void *)&(args_info->verbose_arg), 
+               &(args_info->verbose_orig), &(args_info->verbose_given),
+              &(local_args_info.verbose_given), optarg, 0, "1", ARG_INT,
+              check_ambiguity, override, 0, 0,
+              "verbose", 'v',
+              additional_error))
+            goto failure;
+        
+          break;
+
+        case 0:        /* Long option with no short option */
+        case '?':      /* Invalid option.  */
+          /* `getopt_long' already printed an error message.  */
+          goto failure;
+
+        default:       /* bug: option not considered.  */
+          fprintf (stderr, "%s: option unknown: %c%s\n", CMDLINE_PARSER_PACKAGE, c, (additional_error ? additional_error : ""));
+          abort ();
+        } /* switch */
+    } /* while */
+
+
+
+  if (check_required)
+    {
+      error += cmdline_parser_required2 (args_info, argv[0], additional_error);
+    }
+
+  cmdline_parser_release (&local_args_info);
+
+  if ( error )
+    return (EXIT_FAILURE);
+
+  if (optind < argc)
+    {
+      int i = 0 ;
+      int found_prog_name = 0;
+      /* whether program name, i.e., argv[0], is in the remaining args
+         (this may happen with some implementations of getopt,
+          but surely not with the one included by gengetopt) */
+
+      i = optind;
+      while (i < argc)
+        if (argv[i++] == argv[0]) {
+          found_prog_name = 1;
+          break;
+        }
+      i = 0;
+
+      args_info->inputs_num = argc - optind - found_prog_name;
+      args_info->inputs =
+        (char **)(malloc ((args_info->inputs_num)*sizeof(char *))) ;
+      while (optind < argc)
+        if (argv[optind++] != argv[0])
+          args_info->inputs[ i++ ] = gengetopt_strdup (argv[optind-1]) ;
+    }
+
+  return 0;
+
+failure:
+  
+  cmdline_parser_release (&local_args_info);
+  return (EXIT_FAILURE);
+}
+
+#ifndef CONFIG_FILE_LINE_SIZE
+#define CONFIG_FILE_LINE_SIZE 2048
+#endif
+#define ADDITIONAL_ERROR " in configuration file "
+
+#define CONFIG_FILE_LINE_BUFFER_SIZE (CONFIG_FILE_LINE_SIZE+3)
+/* 3 is for "--" and "=" */
+
+static int
+_cmdline_parser_configfile (char * const filename, int *my_argc)
+{
+  FILE* file;
+  char my_argv[CONFIG_FILE_LINE_BUFFER_SIZE+1];
+  char linebuf[CONFIG_FILE_LINE_SIZE];
+  int line_num = 0;
+  int result = 0, equal;
+  char *fopt, *farg;
+  char *str_index;
+  size_t len, next_token;
+  char delimiter;
+
+  if ((file = fopen(filename, "r")) == NULL)
+    {
+      fprintf (stderr, "%s: Error opening configuration file '%s'\n",
+               CMDLINE_PARSER_PACKAGE, filename);
+      return EXIT_FAILURE;
+    }
+
+  while ((fgets(linebuf, CONFIG_FILE_LINE_SIZE, file)) != NULL)
+    {
+      ++line_num;
+      my_argv[0] = '\0';
+      len = strlen(linebuf);
+      if (len > (CONFIG_FILE_LINE_BUFFER_SIZE-1))
+        {
+          fprintf (stderr, "%s:%s:%d: Line too long in configuration file\n",
+                   CMDLINE_PARSER_PACKAGE, filename, line_num);
+          result = EXIT_FAILURE;
+          break;
+        }
+
+      /* find first non-whitespace character in the line */
+      next_token = strspn (linebuf, " \t\r\n");
+      str_index  = linebuf + next_token;
+
+      if ( str_index[0] == '\0' || str_index[0] == '#')
+        continue; /* empty line or comment line is skipped */
+
+      fopt = str_index;
+
+      /* truncate fopt at the end of the first non-valid character */
+      next_token = strcspn (fopt, " \t\r\n=");
+
+      if (fopt[next_token] == '\0') /* the line is over */
+        {
+          farg  = NULL;
+          equal = 0;
+          goto noarg;
+        }
+
+      /* remember if equal sign is present */
+      equal = (fopt[next_token] == '=');
+      fopt[next_token++] = '\0';
+
+      /* advance pointers to the next token after the end of fopt */
+      next_token += strspn (fopt + next_token, " \t\r\n");
+
+      /* check for the presence of equal sign, and if so, skip it */
+      if ( !equal )
+        if ((equal = (fopt[next_token] == '=')))
+          {
+            next_token++;
+            next_token += strspn (fopt + next_token, " \t\r\n");
+          }
+      str_index  += next_token;
+
+      /* find argument */
+      farg = str_index;
+      if ( farg[0] == '\"' || farg[0] == '\'' )
+        { /* quoted argument */
+          str_index = strchr (++farg, str_index[0] ); /* skip opening quote */
+          if (! str_index)
+            {
+              fprintf
+                (stderr,
+                 "%s:%s:%d: unterminated string in configuration file\n",
+                 CMDLINE_PARSER_PACKAGE, filename, line_num);
+              result = EXIT_FAILURE;
+              break;
+            }
+        }
+      else
+        { /* read up the remaining part up to a delimiter */
+          next_token = strcspn (farg, " \t\r\n#\'\"");
+          str_index += next_token;
+        }
+
+      /* truncate farg at the delimiter and store it for further check */
+      delimiter = *str_index, *str_index++ = '\0';
+
+      /* everything but comment is illegal at the end of line */
+      if (delimiter != '\0' && delimiter != '#')
+        {
+          str_index += strspn(str_index, " \t\r\n");
+          if (*str_index != '\0' && *str_index != '#')
+            {
+              fprintf
+                (stderr,
+                 "%s:%s:%d: malformed string in configuration file\n",
+                 CMDLINE_PARSER_PACKAGE, filename, line_num);
+              result = EXIT_FAILURE;
+              break;
+            }
+        }
+
+    noarg:
+      if (!strcmp(fopt,"include")) {
+        if (farg && *farg) {
+          result = _cmdline_parser_configfile(farg, my_argc);
+        } else {
+          fprintf(stderr, "%s:%s:%d: include requires a filename argument.\n",
+                  CMDLINE_PARSER_PACKAGE, filename, line_num);
+        }
+        continue;
+      }
+      len = strlen(fopt);
+      strcat (my_argv, len > 1 ? "--" : "-");
+      strcat (my_argv, fopt);
+      if (len > 1 && ((farg && *farg) || equal))
+        strcat (my_argv, "=");
+      if (farg && *farg)
+        strcat (my_argv, farg);
+      ++(*my_argc);
+
+      cmd_line_list_tmp = (struct line_list *) malloc (sizeof (struct line_list));
+      cmd_line_list_tmp->next = cmd_line_list;
+      cmd_line_list = cmd_line_list_tmp;
+      cmd_line_list->string_arg = gengetopt_strdup(my_argv);
+    } /* while */
+
+  if (file)
+    fclose(file);
+  return result;
+}
+
+int
+cmdline_parser_configfile (char * const filename,
+                           struct gengetopt_args_info *args_info,
+                           int override, int initialize, int check_required)
+{
+  struct cmdline_parser_params params;
+
+  params.override = override;
+  params.initialize = initialize;
+  params.check_required = check_required;
+  params.check_ambiguity = 0;
+  params.print_errors = 1;
+  
+  return cmdline_parser_config_file (filename, args_info, &params);
+}
+
+int
+cmdline_parser_config_file (char * const filename,
+                           struct gengetopt_args_info *args_info,
+                           struct cmdline_parser_params *params)
+{
+  int i, result;
+  int my_argc = 1;
+  char **my_argv_arg;
+  char *additional_error;
+
+  /* store the program name */
+  cmd_line_list_tmp = (struct line_list *) malloc (sizeof (struct line_list));
+  cmd_line_list_tmp->next = cmd_line_list;
+  cmd_line_list = cmd_line_list_tmp;
+  cmd_line_list->string_arg = gengetopt_strdup (CMDLINE_PARSER_PACKAGE);
+
+  result = _cmdline_parser_configfile(filename, &my_argc);
+
+  if (result != EXIT_FAILURE) {
+    my_argv_arg = (char **) malloc((my_argc+1) * sizeof(char *));
+    cmd_line_list_tmp = cmd_line_list;
+
+    for (i = my_argc - 1; i >= 0; --i) {
+      my_argv_arg[i] = cmd_line_list_tmp->string_arg;
+      cmd_line_list_tmp = cmd_line_list_tmp->next;
+    }
+
+    my_argv_arg[my_argc] = 0;
+
+    additional_error = (char *)malloc(strlen(filename) + strlen(ADDITIONAL_ERROR) + 1);
+    strcpy (additional_error, ADDITIONAL_ERROR);
+    strcat (additional_error, filename);
+    result =
+      cmdline_parser_internal (my_argc, my_argv_arg, args_info,
+                              params,
+                              additional_error);
+
+    free (additional_error);
+    free (my_argv_arg);
+  }
+
+  free_cmd_list();
+  if (result == EXIT_FAILURE)
+    {
+      cmdline_parser_free (args_info);
+      exit (EXIT_FAILURE);
+    }
+  
+  return result;
+}
diff --git a/appli/gimmick/gimmick_ggo.h b/appli/gimmick/gimmick_ggo.h
new file mode 100644 (file)
index 0000000..db36397
--- /dev/null
@@ -0,0 +1,211 @@
+/** @file gimmick_ggo.h
+ *  @brief The header file for the command line option parser
+ *  generated by GNU Gengetopt version 2.22
+ *  http://www.gnu.org/software/gengetopt.
+ *  DO NOT modify this file, since it can be overwritten
+ *  @author GNU Gengetopt by Lorenzo Bettini */
+
+#ifndef GIMMICK_GGO_H
+#define GIMMICK_GGO_H
+
+/* If we use autoconf.  */
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h> /* for FILE */
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#ifndef CMDLINE_PARSER_PACKAGE
+/** @brief the program name */
+#define CMDLINE_PARSER_PACKAGE "gimmick"
+#endif
+
+#ifndef CMDLINE_PARSER_VERSION
+/** @brief the program version */
+#define CMDLINE_PARSER_VERSION "0.1.0"
+#endif
+
+/** @brief Where the command line options are stored */
+struct gengetopt_args_info
+{
+  const char *help_help; /**< @brief Print help and exit help description.  */
+  const char *version_help; /**< @brief Print version and exit help description.  */
+  int print_flag;      /**< @brief Prints the local database tree (default=off).  */
+  const char *print_help; /**< @brief Prints the local database tree help description.  */
+  char * file_arg;     /**< @brief Adds the file to local database.  */
+  char * file_orig;    /**< @brief Adds the file to local database original value given at command line.  */
+  const char *file_help; /**< @brief Adds the file to local database help description.  */
+  char * dir_arg;      /**< @brief Adds the directory to local database.  */
+  char * dir_orig;     /**< @brief Adds the directory to local database original value given at command line.  */
+  const char *dir_help; /**< @brief Adds the directory to local database help description.  */
+  int recurse_flag;    /**< @brief Recurse into sub-directories (default=off).  */
+  const char *recurse_help; /**< @brief Recurse into sub-directories help description.  */
+  int verbose_arg;     /**< @brief Verbosity level (default='1').  */
+  char * verbose_orig; /**< @brief Verbosity level original value given at command line.  */
+  const char *verbose_help; /**< @brief Verbosity level help description.  */
+  
+  unsigned int help_given ;    /**< @brief Whether help was given.  */
+  unsigned int version_given ; /**< @brief Whether version was given.  */
+  unsigned int print_given ;   /**< @brief Whether print was given.  */
+  unsigned int file_given ;    /**< @brief Whether file was given.  */
+  unsigned int dir_given ;     /**< @brief Whether dir was given.  */
+  unsigned int recurse_given ; /**< @brief Whether recurse was given.  */
+  unsigned int verbose_given ; /**< @brief Whether verbose was given.  */
+
+  char **inputs ; /**< @brief unamed options (options without names) */
+  unsigned inputs_num ; /**< @brief unamed options number */
+} ;
+
+/** @brief The additional parameters to pass to parser functions */
+struct cmdline_parser_params
+{
+  int override; /**< @brief whether to override possibly already present options (default 0) */
+  int initialize; /**< @brief whether to initialize the option structure gengetopt_args_info (default 1) */
+  int check_required; /**< @brief whether to check that all required options were provided (default 1) */
+  int check_ambiguity; /**< @brief whether to check for options already specified in the option structure gengetopt_args_info (default 0) */
+  int print_errors; /**< @brief whether getopt_long should print an error message for a bad option (default 1) */
+} ;
+
+/** @brief the purpose string of the program */
+extern const char *gengetopt_args_info_purpose;
+/** @brief the usage string of the program */
+extern const char *gengetopt_args_info_usage;
+/** @brief all the lines making the help output */
+extern const char *gengetopt_args_info_help[];
+
+/**
+ * The command line parser
+ * @param argc the number of command line options
+ * @param argv the command line options
+ * @param args_info the structure where option information will be stored
+ * @return 0 if everything went fine, NON 0 if an error took place
+ */
+int cmdline_parser (int argc, char * const *argv,
+  struct gengetopt_args_info *args_info);
+
+/**
+ * The command line parser (version with additional parameters - deprecated)
+ * @param argc the number of command line options
+ * @param argv the command line options
+ * @param args_info the structure where option information will be stored
+ * @param override whether to override possibly already present options
+ * @param initialize whether to initialize the option structure my_args_info
+ * @param check_required whether to check that all required options were provided
+ * @return 0 if everything went fine, NON 0 if an error took place
+ * @deprecated use cmdline_parser_ext() instead
+ */
+int cmdline_parser2 (int argc, char * const *argv,
+  struct gengetopt_args_info *args_info,
+  int override, int initialize, int check_required);
+
+/**
+ * The command line parser (version with additional parameters)
+ * @param argc the number of command line options
+ * @param argv the command line options
+ * @param args_info the structure where option information will be stored
+ * @param params additional parameters for the parser
+ * @return 0 if everything went fine, NON 0 if an error took place
+ */
+int cmdline_parser_ext (int argc, char * const *argv,
+  struct gengetopt_args_info *args_info,
+  struct cmdline_parser_params *params);
+
+/**
+ * Save the contents of the option struct into an already open FILE stream.
+ * @param outfile the stream where to dump options
+ * @param args_info the option struct to dump
+ * @return 0 if everything went fine, NON 0 if an error took place
+ */
+int cmdline_parser_dump(FILE *outfile,
+  struct gengetopt_args_info *args_info);
+
+/**
+ * Save the contents of the option struct into a (text) file.
+ * This file can be read by the config file parser (if generated by gengetopt)
+ * @param filename the file where to save
+ * @param args_info the option struct to save
+ * @return 0 if everything went fine, NON 0 if an error took place
+ */
+int cmdline_parser_file_save(const char *filename,
+  struct gengetopt_args_info *args_info);
+
+/**
+ * Print the help
+ */
+void cmdline_parser_print_help(void);
+/**
+ * Print the version
+ */
+void cmdline_parser_print_version(void);
+
+/**
+ * Initializes all the fields a cmdline_parser_params structure 
+ * to their default values
+ * @param params the structure to initialize
+ */
+void cmdline_parser_params_init(struct cmdline_parser_params *params);
+
+/**
+ * Allocates dynamically a cmdline_parser_params structure and initializes
+ * all its fields to their default values
+ * @return the created and initialized cmdline_parser_params structure
+ */
+struct cmdline_parser_params *cmdline_parser_params_create(void);
+
+/**
+ * Initializes the passed gengetopt_args_info structure's fields
+ * (also set default values for options that have a default)
+ * @param args_info the structure to initialize
+ */
+void cmdline_parser_init (struct gengetopt_args_info *args_info);
+/**
+ * Deallocates the string fields of the gengetopt_args_info structure
+ * (but does not deallocate the structure itself)
+ * @param args_info the structure to deallocate
+ */
+void cmdline_parser_free (struct gengetopt_args_info *args_info);
+
+/**
+ * The config file parser (deprecated version)
+ * @param filename the name of the config file
+ * @param args_info the structure where option information will be stored
+ * @param override whether to override possibly already present options
+ * @param initialize whether to initialize the option structure my_args_info
+ * @param check_required whether to check that all required options were provided
+ * @return 0 if everything went fine, NON 0 if an error took place
+ * @deprecated use cmdline_parser_config_file() instead
+ */
+int cmdline_parser_configfile (char * const filename,
+  struct gengetopt_args_info *args_info,
+  int override, int initialize, int check_required);
+
+/**
+ * The config file parser
+ * @param filename the name of the config file
+ * @param args_info the structure where option information will be stored
+ * @param params additional parameters for the parser
+ * @return 0 if everything went fine, NON 0 if an error took place
+ */
+int cmdline_parser_config_file (char * const filename,
+  struct gengetopt_args_info *args_info,
+  struct cmdline_parser_params *params);
+
+/**
+ * Checks that all the required options were specified
+ * @param args_info the structure to check
+ * @param prog_name the name of the program that will be used to print
+ *   possible errors
+ * @return
+ */
+int cmdline_parser_required (struct gengetopt_args_info *args_info,
+  const char *prog_name);
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* GIMMICK_GGO_H */
index d90f0b8bcfa15f955261f571e2bef05c284c78d1..516dfd45c312412751fe82ef6a9ce37e95fbc743 100644 (file)
@@ -1,18 +1,50 @@
 #include <creaImageIOGimmick.h>
 #include <creaMessageManager.h>
+#include <gimmick_ggo.h>
 
 int main(int argc, char* argv[])
 {
-  bool debug = false;
-  if(argc>1) 
+  gengetopt_args_info args;
+  if (cmdline_parser (argc, argv, &args) != 0) exit(1) ;
+     
+  creaImageIO::Gimmick g;
+  if (args.verbose_given) g.SetMessageLevel(args.verbose_arg);
+    
+  bool something_to_do = 
+    args.dir_given |
+    args.file_given |
+    args.print_given;
+
+  if (!something_to_do)
     {
-      debug = true;
+      std::cout << "Nothing to do !" << std::endl;
+      exit(0);
     }
 
-  creaImageIO::Gimmick g;
-  g.SetDebugMode(debug);
-
-  if (!g.Initialize()) return 1;
-  if (!g.Finalize()) return 1;
+  try
+    {
+      if (!g.Initialize()) return 1;
+      
+      if (args.file_given) 
+       {
+         g.AddFileToLocalDatabase(args.file_arg);
+       }
+      if (args.dir_given) 
+       {
+         g.AddDirToLocalDatabase(args.dir_arg, args.recurse_given);
+       }
+      
+      if (args.print_given) 
+       {
+         g.GetLocalDatabase()->LoadChildren(0,0);
+         g.PrintLocalDatabase();
+       }
+      
+      if (!g.Finalize()) return 1;
+    }
+  catch (crea::Exception e)
+    {
+      e.Print();
+    }
   return 0;
 }
index b7cc5f7b5ad1874e36fdd725515fdf2d569a3faa..a9f72644144b8171a78cf9fbea4e736e3246bd48 100644 (file)
@@ -1,6 +1,7 @@
 #include <creaImageIOGimmick.h>
 
 #include <creaMessageManager.h>
+#include <creaImageIOImageFinder.h>
 
 #include <boost/filesystem.hpp>
 #include <boost/algorithm/string.hpp>
@@ -52,6 +53,7 @@ namespace creaImageIO
                        "[Gimmick!] !! ERROR CREATING '"<<GetLocalDatabasePath()<<"'");
            return false;
          }
+       mLocalDatabase->SetAttribute(0,"Name","Local database");
       }
     else 
       {
@@ -157,18 +159,41 @@ namespace creaImageIO
 
 
   //========================================================================
-  /// Sets debug mode
-  void Gimmick::SetDebugMode(bool m)
+  /// Sets message level
+  void Gimmick::SetMessageLevel(int l)
   {
-    if (m) 
-      {
-       crea::MessageManager::SetMessageLevel("Gimmick!",9);
-      }
-    else 
-      {
-       crea::MessageManager::SetMessageLevel("Gimmick!",1);
-      }
+    crea::MessageManager::SetMessageLevel("Gimmick!",l);
+  }
+  //========================================================================
+
+  //========================================================================
+  /// Add a file to the local database
+  void Gimmick::AddFileToLocalDatabase(const std::string& f)
+  {
+    ImageFinder finder(mLocalDatabase);
+    if (finder.IsHandledFile(f)) finder.AddFile(f);
+    
+  }
+  //========================================================================
+
+  //========================================================================
+  /// Add a dir to the local database
+  void Gimmick::AddDirToLocalDatabase(const std::string& f, bool recurse)
+  {
+    ImageFinder finder(mLocalDatabase);
+    
+    finder.AddDirectory(f,recurse);
+    
   }
   //========================================================================
 
+  //========================================================================
+  /// 
+  void Gimmick::PrintLocalDatabase()
+  {
+    mLocalDatabase->GetTree().Print();
+  }
+  //========================================================================
+
+
 }
index c351332ba7725d09bec92c1ed79d2ef733b27474..9cd56660bcef50bb7cb325c181180865b88119db 100644 (file)
@@ -35,10 +35,23 @@ namespace creaImageIO
     /// Finalize (closes databases, etc.)
     bool Finalize();
 
+    /// Sets level for messages "Gimmick!" 
+    void SetMessageLevel(int level);
 
-    /// Sets debug mode
-    void SetDebugMode(bool );
+    /// Add a file to the local database
+    void AddFileToLocalDatabase(const std::string&);
+    /// Add a dir to the local database
+    void AddDirToLocalDatabase(const std::string&, bool recurse);
 
+    ///
+    void PrintLocalDatabase();
+
+    /// 
+    SQLiteTreeHandler* GetLocalDatabase() { return mLocalDatabase; }
+
+    const SQLiteTreeHandler* GetLocalDatabase() const { return mLocalDatabase; }
+
+    /// 
     const std::string& GetHomeDirectory();
     const std::string& GetUserSettingsDirectory();
     bool CreateUserSettingsDirectory();
index 8a28144041dfb25f649d84d2fc39c5545f625f21..599c3f4d4a7e7ec3bdda33fcb3e8c0f01460ef61 100644 (file)
@@ -27,31 +27,21 @@ namespace creaImageIO
   //=====================================================================
 
   //=====================================================================
-  bool ImageFinder::AddFiles( const std::vector<std::string>& filenames,
-                             wxProgressDialog* progress, 
-                             UpdateSummary& summary)
+  bool ImageFinder::AddFiles( const std::vector<std::string>& filenames)
+  //                         wxProgressDialog* progress, 
+  //                         UpdateSummary& summary)
   {
-    for (int swi=0;swi<10;swi++) 
-      {
-       msw[swi].Start(0);
-       msw[swi].Pause();
-      }
-    
-    // Parse directory
-    wxStopWatch sw; 
-
-
-    summary.added_images = 0;
     unsigned int nbf = filenames.size(); 
     std::vector<std::string>::const_iterator i;
     for (i=filenames.begin();i!=filenames.end();++i)
       {
-       summary.scanned_files++;
+       //      summary.scanned_files++;
        if (IsHandledFile(*i)) 
          {
-           summary.handled_images++;
-           AddFile(*i,summary);
-            
+           //      summary.handled_images++;
+           AddFile(*i);//,summary);
+           /*
            if (progress)
              {
                std::string mess("Adding ");
@@ -64,40 +54,23 @@ namespace creaImageIO
                    break;
                  }
              }
+           */
          }
       }
 
-
-    sw.Pause();
-    msw[0].Pause();
-    msw[1].Pause();
-    msw[2].Pause();
-
-    summary.total_time = sw.Time();
-    summary.file_scan_time = msw[1].Time();
-    summary.update_database_time = msw[2].Time();
-    summary.update_structs_time = 
-      summary.total_time - 
-      summary.parse_time - 
-      summary.file_scan_time - 
-      summary.update_database_time;
-     
     return true;
   }
   //=====================================================================
 
   //=====================================================================
-  bool ImageFinder::AddFile( const std::string& filename,
-                            UpdateSummary& summary)
+  bool ImageFinder::AddFile( const std::string& filename )
+  //                        UpdateSummary& summary)
   {
     
     std::map< std::string, std::string>  attr;
     mTreeHandler->GetTree().GetDescriptor().BuildAttributeMap(attr);
 
-    msw[1].Resume();
     mReader.ReadAttributes(filename,attr);
-    //     mReader.ReadDicomInfo(filename,image);
-    msw[1].Pause();
 
     //     image->SetFieldValue("FullFileName",filename);
      
@@ -118,25 +91,23 @@ namespace creaImageIO
    */
   void ImageFinder::ParseDirectory( const std::string &dirpath, 
                                    std::vector<std::string> &Filenames,
-                                   bool recursive,
-                                   wxProgressDialog* progress, 
-                                   UpdateSummary& summary)
+                                   bool recursive)
+  //                               wxProgressDialog* progress, 
+  //                               UpdateSummary& summary)
     
   {
+    /*
     if (progress) 
       {
        std::string mess("Parsing ");
        mess += dirpath;
        progress->Pulse(std2wx(mess));
       }
-
-    wxStopWatch sw; 
-    sw.Start(0);
-    
+    */    
     std::string fileName;
     std::string dirName = dirpath;
 
-    summary.scanned_dirs++;
+    //    summary.scanned_dirs++;
 
     wxDir dir( std2wx(dirpath) );
 
@@ -152,6 +123,7 @@ namespace creaImageIO
     bool cont = dir.GetFirst(&filename, wxEmptyString, wxDIR_FILES | wxDIR_HIDDEN );
     while ( cont )
       {
+       /*
        if ((progress)&&( sw.Time() >= 250 )) 
          {
            //                  std::cout << "PULSE"<<std::endl;
@@ -162,15 +134,15 @@ namespace creaImageIO
                break;
              }
          }
-      
-       summary.scanned_files++;
+       */
+       //      summary.scanned_files++;
        wxFileName wxffn(dir.GetName(),filename);
        std::string ffn = wx2std(wxffn.GetFullPath());
        //              std::cout << ffn << std::endl;
        if (mReader.CanRead(ffn,""))
          {
            Filenames.push_back( ffn );
-           summary.handled_images++;
+           //      summary.handled_images++;
          }
        cont = dir.GetNext(&filename);
       }
@@ -189,10 +161,10 @@ namespace creaImageIO
            
            ParseDirectory( ffn, 
                            Filenames,
-                           recursive,
-                           progress,
-                           summary);
-           if (summary.cancelled_by_user) break;
+                           recursive);
+           //                      progress,
+           //                      summary);
+           //      if (summary.cancelled_by_user) break;
            
            cont = dir.GetNext(&filename);
          }
@@ -204,15 +176,15 @@ namespace creaImageIO
 
   //=====================================================================
   bool ImageFinder::AddDirectory( const std::string& directory,
-                                 bool recurse,
-                                 wxProgressDialog* progress, 
-                                 UpdateSummary& summary
-                                 )
+                                 bool recurse)
+  //                             wxProgressDialog* progress, 
+  //                             UpdateSummary& summary
+  //                             )
   {
     //    std::cout << "** ImageFinder::AddDirectory"
     //       << " '"<<directory<<"'"<<std::endl;
     //    std::cout << "------ Parsing directory ------"<<std::endl;
-    
+    /*
     if (progress)
       {
        progress->Pulse();
@@ -228,13 +200,15 @@ namespace creaImageIO
     wxStopWatch sw; 
     
     bool was_canceled_by_user(false);
+    */
     std::vector<std::string> filenames;
     ParseDirectory( directory, 
                    filenames,
-                   recurse, 
-                   progress,
-                   summary);
-    
+                   recurse );
+    //, 
+    //             progress,
+    //             summary);
+    /*
     if ( summary.cancelled_by_user ) 
       {
        return false;
@@ -244,12 +218,13 @@ namespace creaImageIO
 
 
     summary.added_images = 0;
+    */
     unsigned int nbf = filenames.size(); // , nf = 0;
     std::vector<std::string>::iterator i;
     for (i=filenames.begin();i!=filenames.end();++i)
       {
-       AddFile(*i,summary);
-
+       AddFile(*i); //,summary);
+       /*
        if (progress)
          {
            std::string mess("Adding ");
@@ -262,9 +237,10 @@ namespace creaImageIO
                break;
              }
          }
+       */
       }
 
-
+    /*
     sw.Pause();
     msw[0].Pause();
     msw[1].Pause();
@@ -278,7 +254,7 @@ namespace creaImageIO
       summary.parse_time - 
       summary.file_scan_time - 
       summary.update_database_time;
-     
+    */
     return true;
   }
   //=====================================================================
index 6e6a9e3895293b80a481e9b049cdcec2136babd2..da3213bcabdc1dc0b93f65e7cba808fc9a2415b9 100644 (file)
@@ -24,7 +24,7 @@ namespace creaImageIO
     /// Dtor
     ~ImageFinder();
     ///====================================================================
-    
+    /*
     struct UpdateSummary
     {
       int scanned_dirs;
@@ -59,28 +59,32 @@ namespace creaImageIO
        cancelled_by_user(false)
       {}
     };
-      ///
+    */
+
+    ///
+    
+
     bool IsHandledFile( const std::string& filename);
-    bool AddFile( const std::string& filename,
-                 UpdateSummary& summary );
-    bool AddFiles( const std::vector<std::string>& filename,
-                  wxProgressDialog* progress, 
-                  UpdateSummary& summary);
+    bool AddFile( const std::string& filename );
+    //           UpdateSummary& summary );
+    bool AddFiles( const std::vector<std::string>& filename );
+    //            wxProgressDialog* progress, 
+    //            UpdateSummary& summary);
     bool AddDirectory( const std::string& directory, 
-                      bool recurse,
-                      wxProgressDialog* progress, 
-                      UpdateSummary& summary
-                      );
+                      bool recurse );
+    //                wxProgressDialog* progress, 
+    //                UpdateSummary& summary
+    //                );
 
     void ParseDirectory( const std::string& directory, 
                         std::vector<std::string> &Filenames,
-                        bool recurse,
-                        wxProgressDialog* progress, 
-                        UpdateSummary& summary);
+                        bool recurse );
+    //                  wxProgressDialog* progress, 
+    //                  UpdateSummary& summary);
   private:
     TreeHandler* mTreeHandler;
     ImageReader mReader;
-   wxStopWatch msw[10];
+    //   wxStopWatch msw[10];
 
   };
   // EO class ImageFinder
index 63a87ce515b6db8261a0391a22a59e37aa7e95e3..aa8012bc7228abf5c435387a21e13c85760ff72d 100644 (file)
@@ -1,6 +1,6 @@
 #include <creaImageIOImageReader.h>
 #include <creaImageIOTreeAttributeDescriptor.h>
-
+#include <creaImageIOSystem.h>
 
 #include <vtkImageReader2.h>
 #include <vtkPNGReader.h>
@@ -25,7 +25,7 @@ namespace creaImageIO
   {
     if (str == "GDCM::Unfound") 
       {
-       return "----";
+       return "";
       }
     if (str[str.size()-1]==' ')
       {
@@ -157,6 +157,7 @@ namespace creaImageIO
                        std::map<std::string,std::string>& attr)
     {
       //      std::cout << "SpecificVtkReader::ReadDicomInfo '"<<filename<<"'"<<std::endl;
+      GimmickMessage(2,"Reading attributes from '"<<filename<<std::endl);
       // Get image dimensions
       // How to get the image info without loading it in vtk ?
       mVTKReader->SetFileName(filename.c_str());
@@ -173,26 +174,36 @@ namespace creaImageIO
       char planes[128];
       sprintf(planes,"%i",ext[5]-ext[4]);
       
+
       // 
       std::map<std::string,std::string>::iterator i;
-      if ( (i = attr.find("Full File Name")) != attr.end())
+      if ( (i = attr.find("FullFileName")) != attr.end())
+       {
+         //      boost::filesystem::path full_path(filename);
+         // std::string f = full_path.leaf();
+         i->second = filename;
+       }
+      if ( (i = attr.find("D0004_1500")) != attr.end())
        {
          boost::filesystem::path full_path(filename);
          std::string f = full_path.leaf();
          i->second = f;
        }
-      if ( (i = attr.find("Columns")) != attr.end())
-       {
-         i->second = cols;
-       }
-      if ( (i = attr.find("Rows")) != attr.end())
+       if ( (i = attr.find("D0028_0010")) != attr.end())
        {
          i->second = rows;
        }
-      if ( (i = attr.find("Planes")) != attr.end())
-       {
+       if ( (i = attr.find("D0028_0011")) != attr.end())
+        {
+          i->second = cols;
+        }
+       
+       if ( (i = attr.find("D0028_0012")) != attr.end())
+        {
          i->second = planes;
        }
+
+       GimmickMessage(2,"Attributes map:"<<std::endl<<attr<<std::endl);
     }
     //=====================================================================
   private:
@@ -307,6 +318,9 @@ namespace creaImageIO
                        std::map<std::string,std::string>& attr)
     {
       //    std::cout << "DicomReader::ReadDicomInfo '"<<filename<<"'"<<std::endl;
+      GimmickMessage(2,"Reading attributes from DICOM file '"
+                    <<filename<<"'"<<std::endl);
+
       GDCM_NAME_SPACE::File* file = GDCM_NAME_SPACE::File::New();
       file->SetLoadMode( GDCM_NAME_SPACE::LD_ALL);
       file->SetFileName(filename.c_str());
@@ -317,21 +331,29 @@ namespace creaImageIO
          std::map<std::string,std::string>::iterator i;
          for (i=attr.begin();i!=attr.end();++i)
            {
-             if ( i->first == "FullFileName" )
+             if ( i->first == "D0004_1500" )
                {
                  boost::filesystem::path full_path(filename);
                  std::string f = full_path.leaf();
                  i->second = f;
                }
+             else if ( i->first == "FullFileName" )
+               {
+                 i->second = filename;
+               }
              else
                {
                  uint16_t gr;
                  uint16_t el;
                  tree::AttributeDescriptor::GetDicomGroupElementFromKey(i->first,gr,el);
+                 //              GimmickMessage(2,"Key '"<<i->first<<"' : "<<gr<<"|"<<el
+                 //                             <<std::endl);
                  if ( ( gr!=0 ) && ( el!=0 ) )
                    {
                      std::string val = file->GetEntryString(gr,el);
                      i->second = irclean(val);
+                     //                      GimmickMessage(2,"Key '"<<i->first<<"' : "<<gr<<"|"<<el
+                     //                                     <<"="<<i->second<<std::endl);
                    }
                }
            }
index 2f3e7d0141fad6fc5ea30b50e7ff4dc7bdbd4a9f..36fafd4a452f75143734799c6f84657c5703ba99 100644 (file)
@@ -2,12 +2,11 @@
 #define __creaImageIOImageReader_h_INCLUDED__
 
 
-#include <creaImageIOTreeAttributeDescriptor.h>
-
 #include <vtkImageData.h>
 #include <string>
 #include <vector>
 #include <map>
+#include <creaImageIOTreeAttributeMapType.h>
 
 namespace creaImageIO
 {
@@ -44,7 +43,7 @@ namespace creaImageIO
     /// On return, the values of the map are the values 
     /// of the attributes (empty string if not available).
     void ReadAttributes(const std::string& filename, 
-                       std::map<std::string,std::string>& attr);
+                       tree::AttributeMapType& attr);
 
     /// Returns the known extensions
     const std::vector<std::string>& GetKnownExtensions()  
index e1a0307b3673093365844786789de7e0d589ac02..3bea907f3f31abae26fd805192186c6992ef3b59 100644 (file)
@@ -119,7 +119,8 @@ namespace creaImageIO
   //===================================================================== 
   int SQLiteTreeHandler::LoadChildren(tree::Node* parent, int maxlevel)
   {
-    return 0;
+    if (parent==0) parent = GetTree().GetTree();
+    return DBLoadChildren(parent,maxlevel);
   }
   //===================================================================== 
 
@@ -137,52 +138,8 @@ namespace creaImageIO
   int SQLiteTreeHandler::AddBranch( const AttributeMapType& attr )
   {
     tree::Node* parent = DBGetParent(attr);
-    for (int level = parent->GetLevel()+1;
-        level < GetTree().GetNumberOfLevels();
-        level++)
-      {
-       // Create Node
-       parent = new tree::Node(parent,attr);
-       
-       // Insert into DB
-       if (node->GetType()!=Node::Patient) 
-         node->SetFieldValue("PARENT_ID",parent_id);
-       
-       // Insert in DB
-       std::string val;
-       BuildSQLFieldsValues(node,val);
-       std::string insert("INSERT INTO ");
-       insert += std::string(SQLiteTreeHandlerStructure::Table(node->GetType())) 
-         + " " + val + ";";
-       //    std::cout << "** SQL = '"<<insert<<"'"<<std::endl;
-       UPDATEDB(insert);
-       //    std::cout << "** SQL OK"<<std::endl;
-       
-       // Store DB id of newly created node;
-       long lastrow = mDB->lastRowId();
-       std::stringstream ri;
-       ri << mDB->lastRowId();
-       node_id = ri.str();
-       //    std::cout << "LastRowId='"<<mDB->lastRowId()<<"' vs '"<<created_id<<"'"<<std::endl;
-       
-       node->SetFieldValue("ID",node_id);
-       /*
-       // Insert in TypeId map
-       TypeId ti;
-       ti.type = node->GetType();
-       ti.id = node_id;
-       mTypeIdToNodeMap[ti] = node;
-       //    std::cout << "== Insert TypeId ("<<ti.type<<","<<ti.id<<")"<<std::endl; 
-       // 
-       msw[2].Pause();
-       
-       if (node->GetType()==Node::Patient) summary.added_patients++;
-       if (node->GetType()==Node::Study) summary.added_studies++;
-       if (node->GetType()==Node::Series) summary.added_series++;
-       if (node->GetType()==Node::Image) summary.added_images++;
-       */
-      }
-    return -1;
+    DBGraftToParent(parent,attr);
+    return (parent->GetLevel()+1);
   }
   //===================================================================== 
  
@@ -194,7 +151,16 @@ namespace creaImageIO
    }
   //===================================================================== 
 
-
+  //===================================================================== 
+  /// Sets an attribute of a Node
+  bool SQLiteTreeHandler::SetAttribute(tree::Node* n, 
+                                      const std::string& key,
+                                      const std::string& value)
+  {
+    if (n==0) n=GetTree().GetTree();
+    return DBSetAttribute(n,key,value);
+  }
+  //===================================================================== 
 
 
 
@@ -231,17 +197,14 @@ namespace creaImageIO
 #define QUERYDB(QUER,RES)                                              \
     try                                                                        \
       {                                                                        \
-       GimmickMessage(2,"SQL: '"<<QUER<<"'"<<std::endl);               \
+       GimmickMessage(2,"SQL query: '"<<QUER<<"'"<<std::endl);         \
        RES = mDB->execQuery(QUER.c_str());                             \
       }                                                                        \
     catch (CppSQLite3Exception& e)                                     \
       {                                                                        \
-       std::cout << "SQLite query '"<<QUER<<"' : "                     \
-                 << e.errorCode() << ":"                               \
-                 << e.errorMessage()<<std::endl;                       \
-       creaError("SQLite query '"<<QUER<<"' : "                        \
-                 << e.errorCode() << ":"                               \
-                 << e.errorMessage() );                                \
+       GimmickError("SQLite query '"<<QUER<<"' : "                     \
+                    << e.errorCode() << ":"                            \
+                    << e.errorMessage() );                             \
       }                                                                        \
     
   //=====================================================================
@@ -250,17 +213,14 @@ namespace creaImageIO
 #define UPDATEDB(UP)                                                   \
   try                                                                  \
     {                                                                  \
-      GimmickMessage(2,"SQL: '"<<UP<<"'"<<std::endl);                  \
+      GimmickMessage(2,"SQL update: '"<<UP<<"'"<<std::endl);           \
       mDB->execDML(UP.c_str());                                                \
     }                                                                  \
   catch (CppSQLite3Exception& e)                                       \
     {                                                                  \
-      std::cout << "SQLite update '"<<UP<<"' Error : "                 \
-               << e.errorCode() << ":"                                 \
-               << e.errorMessage()<<std::endl;                         \
-      creaError("SQLite update '"<<UP<<"' Error : "                    \
-               << e.errorCode() << ":"                                 \
-               << e.errorMessage() );                                  \
+      GimmickError("SQLite update '"<<UP<<"' Error : "                 \
+                  << e.errorCode() << ":"                              \
+                  << e.errorMessage() );                               \
     }                                                                  
   //=====================================================================
 
@@ -282,9 +242,9 @@ namespace creaImageIO
       }
     catch (CppSQLite3Exception& e)
       {
-       std::cerr << "Opening '"<<GetFileName()<<"' : "
-                 << e.errorCode() << ":" 
-                 << e.errorMessage() << std::endl;
+       GimmickError("Opening '"<<GetFileName()<<"' : "
+                    << e.errorCode() << ":" 
+                    << e.errorMessage());
        return false;
       }
     // IMPORT TREE DESCRIPTION (AND TEST DB VALIDITY)
@@ -307,9 +267,8 @@ namespace creaImageIO
 
     if (boost::filesystem::exists(GetFileName())) 
       {
-       creaMessage("Gimmick!",1,
-                   "[Gimmick!] !! ERROR '"<<GetFileName()<<"' : "
-                   << "file already exists"<<std::endl);
+       GimmickError(GetFileName()<<"' : "
+                    << "file already exists");
        return false;
       }
     
@@ -320,113 +279,113 @@ namespace creaImageIO
       }
     catch (CppSQLite3Exception& e)
       {
-       creaMessage("Gimmick!",1,
-                   "[Gimmick!] !! ERROR '"
-                   << e.errorCode() << ":" 
-                   << e.errorMessage() <<std::endl);
+       GimmickError(e.errorCode() << ":" 
+                    << e.errorMessage() <<std::endl);
        return false;
       }
     
+     
     // CREATING TABLES
-    try
+    
+    std::string command;
+    // Create LEVELS table
+    command = "create table LEVELS\n";
+    command += "( Name text )\n";
+    UPDATEDB(command);
+    
+    // Iterate the Levels
+    for (int l=0; l<GetTree().GetNumberOfLevels(); ++l)
       {
-       std::string command;
-       // Create LEVELS table
-       command = "create table LEVELS\n";
-       command += "( Name text )\n";
+       command = "INSERT INTO LEVELS (Name) VALUES ('";
+       command += GetTree().GetLevelDescriptor(l).GetName();
+       command += "')";
        UPDATEDB(command);
-
-       // Iterate the Levels
-       for (int l=0; l<GetTree().GetNumberOfLevels(); ++l)
+       
+       // Create table of level (for level>0, i.e. not Root)
+       if (l>=0)
          {
-           command = "INSERT INTO LEVELS (Name) VALUES ('";
+           command = "CREATE TABLE ";
            command += GetTree().GetLevelDescriptor(l).GetName();
-           command += "')";
+           command += "\n(\nID INTEGER PRIMARY KEY";
+           if (l>1) 
+             {
+               command += ",\nPARENT_ID int not null"; 
+             }
+           SQLAppendAttributesDefinition(l,command);
+           if (l>1) 
+             {
+               command += ",\nconstraint FK_PARENT foreign key (PARENT_ID) references ";
+               command += GetTree().GetLevelDescriptor(l-1).GetName();
+               command += "(ID) on delete restrict on update restrict";
+             }
+           command += "\n)";
            UPDATEDB(command);
            
-           // Create table of level (for level>0, i.e. not Root)
-           if (l>0)
+           
+           // Add Attribute 'ID' to Description
+           GetTree().GetLevelDescriptor(l).Add
+             (AttributeDescriptor( "ID",
+                                   "Database Identifier",
+                                   0,0,
+                                   AttributeDescriptor::PRIVATE
+                                   ));
+           
+           if (l>1) 
              {
-               command = "CREATE TABLE ";
-               command += GetTree().GetLevelDescriptor(l).GetName();
-               command += "\n(\nID INTEGER PRIMARY KEY";
-               if (l>1) 
-                 {
-                   command += ",\nPARENT_ID int not null";     
-                 }
-               AppendAttributesSQLDefinition(l,command);
-               if (l>1) 
-                 {
-                   command += ",\nconstraint FK_PARENT foreign key (PARENT_ID) references ";
-                   command += GetTree().GetLevelDescriptor(l-1).GetName();
-                   command += "(ID) on delete restrict on update restrict";
-                 }
-               command += "\n)";
-               UPDATEDB(command);
-
-
-               // Add Attribute 'ID' to Description
-               GetTree().GetAttributeDescriptorList(l).push_back
-                 (AttributeDescriptor( "ID",
-                                       "Database Identifier",
+               // Add Attribute 'PARENT_ID' to Description
+               GetTree().GetLevelDescriptor(l).Add
+                 (AttributeDescriptor( "PARENT_ID",
+                                       "Database Parent Identifier",
                                        0,0,
                                        AttributeDescriptor::PRIVATE
                                        ));
-
-               if (l>1) 
-                 {
-                   // Add Attribute 'PARENT_ID' to Description
-                   GetTree().GetAttributeDescriptorList(l).push_back
-                     (AttributeDescriptor( "PARENT_ID",
-                                           "Database Parent Identifier",
-                                           0,0,
-                                           AttributeDescriptor::PRIVATE
-                                           ));
-                 }
-               
              }
            
-           // Create table *_ATTRIBUTES
+         }
+       
+       // Create table *_ATTRIBUTES
+       
+       command = "CREATE TABLE ";
+       command += GetTree().GetLevelDescriptor(l).GetName();
+       command += "_Attributes\n(\n";
+       command += "Key text,\n";
+       command += "Name text,\n";          
+       command += "DicomGroup int,\n";
+       command += "DicomElement int,\n";           
+       command += "Flags int\n";           
+       command += "\n)";
+       UPDATEDB(command);
+       
+       
+       // Fill the table *_ATTRIBUTES
+       LevelDescriptor::AttributeDescriptorListType::const_iterator i;
+       for (i  = GetTree().GetAttributeDescriptorList(l).begin();
+            i != GetTree().GetAttributeDescriptorList(l).end();
+            ++i)
+         {
            
-           command = "CREATE TABLE ";
-           command += GetTree().GetLevelDescriptor(l).GetName();
-           command += "_Attributes\n(\n";
-           command += "Key text,\n";
-           command += "Name text,\n";      
-           command += "DicomGroup int,\n";
-           command += "DicomElement int,\n";       
-           command += "Flags int\n";       
-           command += "\n)";
-           UPDATEDB(command);
-         
-  
-           // Fill the table *_ATTRIBUTES
-           LevelDescriptor::AttributeDescriptorListType::const_iterator i;
-           for (i  = GetTree().GetAttributeDescriptorList(l).begin();
-                i != GetTree().GetAttributeDescriptorList(l).end();
-                ++i)
-             {
-               
-               std::stringstream insert;
-               insert << "INSERT INTO "
-                      << GetTree().GetLevelDescriptor(l).GetName()
-                      << "_Attributes (Key,Name,DicomGroup,DicomElement,Flags) "
-                      << "VALUES ('"
-                      << i->GetKey() << "','"
-                      << i->GetName() << "',"
-                      << i->GetGroup() << ","
-                      << i->GetElement() << ","
-                      << i->GetFlags() << ");";
-               
-               UPDATEDB(insert.str());
-             }
+           std::stringstream insert;
+           insert << "INSERT INTO "
+                  << GetTree().GetLevelDescriptor(l).GetName()
+                  << "_Attributes (Key,Name,DicomGroup,DicomElement,Flags) "
+                  << "VALUES ('"
+                  << i->GetKey() << "','"
+                  << i->GetName() << "',"
+                  << i->GetGroup() << ","
+                  << i->GetElement() << ","
+                  << i->GetFlags() << ");";
+           
+           UPDATEDB(insert.str());
          }
-      }
-    catch (std::exception)
-      {
-       return false;
-      }
 
+      } // For l=0...
+
+    // Initialize the root attributes
+    GetTree().InitializeAttributeMap();
+    // Insert the root in the level 0 table 
+    DBInsert(GetTree().GetTree());
+    
+    
     GetTree().SetChildrenLoaded(true);
     GimmickMessage(1,"Creating SQLite database '"<<GetFileName()
                   <<"' ... OK"<<std::endl);
@@ -435,7 +394,7 @@ namespace creaImageIO
   //=====================================================================
   
   //=====================================================================
-  void SQLiteTreeHandler::AppendAttributesSQLDefinition(int level,
+  void SQLiteTreeHandler::SQLAppendAttributesDefinition(int level,
                                                        std::string& s)
   {
     LevelDescriptor::AttributeDescriptorListType::const_iterator i;
@@ -517,7 +476,7 @@ namespace creaImageIO
            std::string name(q.getStringField(1));
            GimmickMessage(2,"  - Importing attribute '"<<key<<"' '"<<name
                           <<"'"<<std::endl);
-           desc.GetAttributeDescriptorList(level).push_back
+           desc.GetLevelDescriptor(level).Add
              (AttributeDescriptor( key, // Key
                                    name, // Name
                                    q.getIntField(2), // Group
@@ -545,6 +504,36 @@ namespace creaImageIO
          }
       }
 
+
+    // Create the attributes table for Root (i.e. Tree)
+    LevelDescriptor::AttributeDescriptorListType::const_iterator a;
+    for (a = GetTree().GetAttributeDescriptorList(0).begin();
+        a!= GetTree().GetAttributeDescriptorList(0).end();
+        ++a)
+      {
+       /*
+       std::string v;
+       AttributeMapType::const_iterator i = attr.find(a->GetKey());
+       if ( i != attr.end() )  
+         {
+           v = i->second;
+         }
+       */
+       GetTree().UnsafeSetAttribute( a->GetKey(), "" );
+      }
+
+    // Reading Root attributes
+    // Query DB
+    query = "SELECT * FROM ";
+    query += GetTree().GetLevelDescriptor(0).GetName();
+    QUERYDB(query,q);
+
+    for (int fld = 0; fld < q.numFields(); fld++)
+      {
+       GetTree().UnsafeSetAttribute(q.fieldName(fld),
+                                    q.getStringField(fld));        
+      }
+
     GimmickMessage(1,"Importing tree description from database ... OK"
                   <<std::endl);
     return true;
@@ -565,6 +554,60 @@ namespace creaImageIO
 
 
 
+
+
+  //========================================================================
+  /// 
+  std::string& SQLformat(std::string& str)
+  {
+    // quote must be doubled
+    boost::algorithm::replace_all(str,"'","''");
+    // Found strange strings which contained NULL char INSIDE string 
+    int i,size=str.size();
+    for (i=0;i<size;++i) 
+      {
+       if (str[i]==0) 
+         {
+           str = str.substr(0,i);
+           break;
+         }
+      }
+    //    if (i<str.size())
+    return str;
+  }
+  //========================================================================
+  
+  //=====================================================================
+  void SQLiteTreeHandler::SQLAppendAttributesValues(tree::Node* n, 
+                                                   std::string& str)
+  {
+    GimmickMessage(4,"SQLAppendAttributesValues"<<std::endl);
+    std::string atts="";
+    std::string values="";
+    tree::Node::AttributeMapType::iterator i;
+    for (i =  n->GetAttributeMap().begin();
+        i != n->GetAttributeMap().end();
+        i++)
+      {
+       if (i->first=="ID") 
+         {
+           continue;
+         }
+       //      std::cout << "("<<i->first<<","<<i->second<<")"<<std::endl;
+       atts += "'" + i->first + "'";
+       values += "'" + SQLformat(i->second) + "'"; 
+       atts += ",";
+       values += ",";
+       GimmickMessage(4,"'"<<i->first<<"' = '"<<i->second<<"'"<<std::endl);
+      }
+    atts[atts.size()-1]=' ';
+    values[values.size()-1]=' ';
+
+    str = "("+atts+") VALUES ("+values+")";
+    GimmickMessage(4,"Result = '"<<str<<"'"<<std::endl);
+  }
+  //=====================================================================
+
   //=====================================================================
   tree::Node* SQLiteTreeHandler::DBGetParent( const AttributeMapType& attr) 
   {
@@ -585,6 +628,7 @@ namespace creaImageIO
              {
                go_down = true;
                parent = *i;
+               break;
              }
          }     
       }
@@ -595,19 +639,40 @@ namespace creaImageIO
 
 
   //=====================================================================
-  int SQLiteTreeHandler::DBLoadChildren(tree::Node* parent
+  int SQLiteTreeHandler::DBLoadChildren(tree::Node* node
                                        int numberoflevels)
   {
+    if (node->GetLevel()+1 >= node->GetTree()->GetNumberOfLevels() ) 
+      return 0;
+
+    GimmickMessage(2,"Loading children of '"<<node->GetLabel()
+                  <<"'"<<std::endl);
+
     int nbloaded = 0;
-    if (parent->GetChildrenLoaded()) return nbloaded;
+    // If children loaded we do not have to do it but we need to recurse
+    // in order to load the children's children if necessary, and so on...
+    if (node->GetChildrenLoaded()) 
+      {
+       // Iterate the children 
+       tree::Node::ChildrenListType::iterator i;
+       for (i = node->GetChildrenList().begin();
+            i!= node->GetChildrenList().end();
+            ++i)
+         {
+           nbloaded += DBLoadChildren(*i,numberoflevels-1);
+         }
+       return nbloaded;
+      }
+    
+    /// If children not loaded : do it and recurse
 
     // Query DB
-    int level = parent->GetLevel();
+    int level = node->GetLevel();
     std::string query = "SELECT * FROM ";
     query += GetTree().GetLevelDescriptor(level+1).GetName();
-    if (level>1)
+    if (level>0)
       {
-       query += " WHERE PARENT_ID='" + parent->UnsafeGetAttribute("ID") 
+       query += " WHERE PARENT_ID='" + node->UnsafeGetAttribute("ID") 
          + "'";
       }
     CppSQLite3Query q;
@@ -616,7 +681,7 @@ namespace creaImageIO
     while (!q.eof())
       {
        nbloaded++;
-       Node* n = new Node(parent);
+       Node* n = new Node(node);
        for (int fld = 0; fld < q.numFields(); fld++)
          {
            n->UnsafeSetAttribute(q.fieldName(fld),q.getStringField(fld));          
@@ -629,7 +694,7 @@ namespace creaImageIO
        mTypeIdToNodeMap[ti] = n;
        */
        // recurse 
-       if ( numberoflevels > 1 ) 
+       if ( numberoflevels != 1 ) 
          {
            //  msw[2].Pause();
            nbloaded += DBLoadChildren(n, numberoflevels-1);
@@ -639,88 +704,113 @@ namespace creaImageIO
        q.nextRow();
       }
 
-    parent->SetChildrenLoaded(true);
+    node->SetChildrenLoaded(true);
     
     //    msw[2].Pause();
     return nbloaded;
+  }
+  //=====================================================================
 
-    //    std::cout << "SQLiteTreeHandler::DBLoadChildren("<<parent<<","<<maxlevel
-    //      << ")"<<std::endl;
-    /*
-    int nbloaded = 0;
-    if (parent == GetTree()) { parent = 0; }
-    Node* xparent = parent;
-    if ( xparent==0 ) xparent = GetTree();
-    if ( xparent->ChildrenLoaded() ) 
-      {
-       //      std::cout << "--> Children already loaded"<<std::endl;
-       return nbloaded;
-      }
-    if ( xparent->GetType() == Node::Image ) 
-      {
-       return nbloaded;
-      }
-    if ( xparent->GetType() >= maxlevel ) 
-      {
-       return nbloaded;
-      }
-   
-    //    msw[2].Pause();
-    //    msw[2].Resume();
-
-    Node::Type type = xparent->GetType()+1;
-
-    // Query DB
-
-    std::string query = "SELECT * FROM ";
-    query += GetTree().GetDescriptor().GetLevelDescriptor(level).GetName();
-      //SQLiteTreeHandlerStructure::Table(type);
-    if (parent!=0)
-      {
-       query += " WHERE PARENT_ID='" + parent->GetFieldValue("ID") + "'";
-      }
-
-    //    std::cout << "** SQL = '"<<query<<"'"<<std::endl;
+  //======================================================================
+  void SQLiteTreeHandler::DBInsert(tree::Node* n)
+  {
+    GimmickMessage(2,"Inserting in DB '"<<n->GetLabel()
+                  <<"'"<<std::endl);
+    std::string val;
+    SQLAppendAttributesValues(n,val);
+    std::string insert("INSERT INTO ");
+    insert += GetTree().GetLevelDescriptor(n->GetLevel()).GetName();
+    insert += " " + val + ";";
+    UPDATEDB(insert);
+       
+    // Store DB id of newly created node;
+    long lastrow = mDB->lastRowId();
+    std::stringstream ri;
+    ri << mDB->lastRowId();
+    n->SetAttribute("ID",ri.str());
+  }
+  //======================================================================
 
-    CppSQLite3Query q;
-    QUERYDB(query,q);
+  //======================================================================
+  /// Graft the branch defined by the attributes to the parent
+  void SQLiteTreeHandler::DBGraftToParent( tree::Node* parent, 
+                                           const AttributeMapType& attr)
+  {
+    GimmickMessage(2,"Grafting to parent '"<<parent->GetLabel()
+                  <<"'"<<std::endl);
 
-    while (!q.eof())
+    for (int level = parent->GetLevel()+1;
+        level < GetTree().GetNumberOfLevels();
+        level++)
       {
-       nbloaded++;
-       Node* n = new Node(type,
-                          this,xparent);
-       for (int fld = 0; fld < q.numFields(); fld++)
-         {
-           n->SetFieldValue(q.fieldName(fld),q.getStringField(fld));       
-         }
-       // Index 
+       // Create Node
+       tree::Node* child = new tree::Node(parent,attr);
+       
+       // Set PARENT_ID if necessary 
+       if ( parent->GetLevel()>0 )
+         child->SetAttribute("PARENT_ID",parent->GetAttribute("ID"));
+       
+       // Insert in DB
+       DBInsert(child);
+       /*
+       std::string val;
+       SQLAppendAttributesValues(child,val);
+       std::string insert("INSERT INTO ");
+       insert += GetTree().GetLevelDescriptor(child->GetLevel()).GetName();
+       insert += " " + val + ";";
+       UPDATEDB(insert);
+       
+       // Store DB id of newly created node;
+       long lastrow = mDB->lastRowId();
+       std::stringstream ri;
+       ri << mDB->lastRowId();
+       child->SetAttribute("ID",ri.str());
+       */
+       // Down one level
+       parent = child;
+       
+       /*
+       // Insert in TypeId map
        TypeId ti;
-       ti.type = type;
-       ti.id = n->GetFieldValue("ID");    
-       mTypeIdToNodeMap[ti] = n;
-       // recurse 
-       if ( type < maxlevel ) 
-         {
-           msw[2].Pause();
-           nbloaded += DBLoadChildren(n,maxlevel);
-           msw[2].Resume();
-         }
-       // next entry in db
-       q.nextRow();
+       ti.type = node->GetType();
+       ti.id = node_id;
+       mTypeIdToNodeMap[ti] = node;
+       //    std::cout << "== Insert TypeId ("<<ti.type<<","<<ti.id<<")"<<std::endl; 
+       // 
+       msw[2].Pause();
+       
+       if (node->GetType()==Node::Patient) summary.added_patients++;
+       if (node->GetType()==Node::Study) summary.added_studies++;
+       if (node->GetType()==Node::Series) summary.added_series++;
+       if (node->GetType()==Node::Image) summary.added_images++;
+       */
       }
-
-    xparent->SetChildrenLoaded(true);
-    
-    //    msw[2].Pause();
-    return nbloaded;
-    */
   }
-  //=====================================================================
-
-
+  //======================================================================
 
 
+  //===================================================================== 
+  /// Sets an attribute of a Node
+  bool SQLiteTreeHandler::DBSetAttribute(tree::Node* n, 
+                                        const std::string& key,
+                                        const std::string& value)
+  {
+    GimmickMessage(3,"Setting Attribute of '"<<n->GetLabel()<<
+                  "' "<<key<<"='"<<value<<"'"<<std::endl);
+
+    n->SetAttribute(key,value);
+    std::string sql = "UPDATE ";
+    sql += GetTree().GetLevelDescriptor(n->GetLevel()).GetName();
+    sql += " SET ";
+    sql += key;
+    sql += "='";
+    sql += value;
+    sql += "' WHERE ID=";
+    sql += n->GetAttribute("ID");
+    //    sql += " LIMIT 1";
+    UPDATEDB(sql);
+  }
+  //===================================================================== 
 
   /*
   //=====================================================================
@@ -1070,57 +1160,8 @@ namespace creaImageIO
   }
   //=====================================================================
  
-  //========================================================================
-  std::string& format_sql2(std::string& str)
-  {
-    // quote must be doubled
-    //    crea::Utils::Replace( str, "'", "''" );
-    boost::algorithm::replace_all(str,"'","''");
-    // Found strange strings which contained NULL char INSIDE string 
-    int i,size=str.size();
-    for (i=0;i<size;++i) 
-      {
-       if (str[i]==0) 
-         {
-           str = str.substr(0,i);
-           break;
-         }
-      }
-    //    if (i<str.size())
-    return str;
-  }
-   //========================================================================
-
-  //=====================================================================
-  void SQLiteTreeHandler::BuildSQLFieldsValues(Node* n,
-                                       std::string& str)
-  {
-    //    std::cout << "BuildSQLFieldsValues('"<<n->GetLabel()<<"')"<<std::endl;
-
-    std::string atts="";
-    std::string values="";
-    Node::FieldValueMapType::iterator i;
-    for (i =  n->GetFieldValueMap().begin();
-        i != n->GetFieldValueMap().end();
-        i++)
-      {
-       if (i->first=="ID") 
-         {
-           continue;
-         }
-       //      std::cout << "("<<i->first<<","<<i->second<<")"<<std::endl;
-       atts += "'" + i->first + "'";
-       values += "'" + format_sql2(i->second) + "'"; 
-       atts += ",";
-       values += ",";
-      }
-    atts[atts.size()-1]=' ';
-    values[values.size()-1]=' ';
-
-    str = "("+atts+") VALUES ("+values+")";
 
-  }
-  //=====================================================================
 */
 
 
index 341b81bb014fc0de2060c664f96237d1d6d120c6..c1ada2d266ed1ac3b85401272632fe4ec31dc56b 100644 (file)
@@ -8,9 +8,10 @@ class CppSQLite3DB;
 namespace creaImageIO
 {
 
-/**
-       * \ingroup Model
-       */
+  
+  /**
+   * \ingroup Model
+   */
   //=======================================================================
   /// Concrete TreeHandler which manages a tree stored in a sqlite database
   class SQLiteTreeHandler : virtual public TreeHandler
@@ -95,6 +96,10 @@ namespace creaImageIO
     virtual int AddBranch( const AttributeMapType& attr );
     /// Removes the node and its descendants 
     virtual bool Remove(tree::Node*);
+    /// Sets an attribute of a Node
+    virtual bool SetAttribute(tree::Node*, 
+                             const std::string& key,
+                             const std::string& value);
     //====================================================================
     
 
@@ -111,17 +116,42 @@ namespace creaImageIO
     /// Creates a new database on disk and the tables
     bool DBCreate();
     /// Appends to string s the SQL command to create the attributes of a given level
-    void AppendAttributesSQLDefinition(int level, std::string& s);
+    void SQLAppendAttributesDefinition(int level, std::string& s);
     //======================================================================
 
     //======================================================================
+    /// Returns the parent to which the branch defined by the attributes 
+    /// provided must be grafted 
     tree::Node* DBGetParent( const AttributeMapType& attr);
     //======================================================================
 
     //======================================================================
+    /// Loads the children of Node parent
+    /// Can recurse to numberoflevels levels
+    /// \return The total number of Node loaded (may be at different levels)
     int DBLoadChildren( tree::Node* parent, int numberoflevels = 1);
     //======================================================================
 
+    //======================================================================
+    /// Appends to string s the SQL command to set the attributes values 
+    /// of node n
+    void SQLAppendAttributesValues(tree::Node* n, std::string& s);
+    //======================================================================
+
+    //======================================================================
+    /// Graft the branch defined by the attributes to the parent
+    void DBGraftToParent( tree::Node* parent, const AttributeMapType& attr);
+    //======================================================================
+    //======================================================================
+    /// Sets an attribute of a Node and updates the database
+    bool DBSetAttribute(tree::Node*, 
+                       const std::string& key,
+                       const std::string& value);
+    //======================================================================
+    //======================================================================
+    /// Inserts the Node in the database
+    void DBInsert(tree::Node* n);
+    //======================================================================
     /*
     /// 
     int DBQueryNumberOfChildren(tree::Node* n);
index df2bdd1fb0c17524cca258efcee32d75d2cbd0ad..9b8900218550be4bbee296d7aa2ca70812c6ed44 100644 (file)
@@ -20,6 +20,7 @@
   creaMessage("Gimmick!",LEV,"[Gimmick!] "<<MESS);
 #define GimmickDebugMessage(LEV,MESS) \
   creaDebugMessage("Gimmick!",LEV,"[Gimmick!] "<<MESS);
-
+#define GimmickError(MESS)                             \
+  creaError("[Gimmick!] "<<MESS);
 #endif
 
index f4f1becea51b69978e916e274f910c0454a768d4..8eb2b9033978023395e5b61d205109f3214548d4 100644 (file)
@@ -1,5 +1,5 @@
 #include <creaImageIOTree.h>
-
+#include <creaImageIOSystem.h>
 
 namespace creaImageIO
 {
@@ -9,7 +9,9 @@ namespace creaImageIO
     Tree::Tree()
       : Node(0)
     {
-      
+      GimmickMessage(5,"Default Tree constructor"
+                    << std::endl);
+    
     }
     
     Tree::~Tree()
@@ -17,6 +19,15 @@ namespace creaImageIO
       
     }
 
-
+    void Tree::Print() const
+    {
+      GimmickMessage(1,GetLabel()<<std::endl);
+      ChildrenListType::const_iterator i;
+      for (i=GetChildrenList().begin(); i!=GetChildrenList().end(); i++)
+       {
+         (*i)->Print();
+       }
+      
+    }
   }
 }
index fe928ac25911f925fbd2bdf150087558b20dc65b..031c20510cfc451a3efe478d8a502965acd93d3e 100644 (file)
@@ -62,10 +62,11 @@ namespace creaImageIO
       GetAttributeDescriptorList(int level) const
       { return GetDescriptor().GetAttributeDescriptorList(level); }
       /// Returns the AttributeDescriptorList of a given level (ref)
-      LevelDescriptor::AttributeDescriptorListType& 
-      GetAttributeDescriptorList(int level) 
-      { return GetDescriptor().GetAttributeDescriptorList(level); }
+      //LevelDescriptor::AttributeDescriptorListType& 
+      //GetAttributeDescriptorList(int level) 
+      //{ return GetDescriptor().GetAttributeDescriptorList(level); }
   
+      virtual void Print() const;
 
     private:
       Descriptor mDescriptor;
index 5a3e5b47f6559dd09c95709b3a611c89ce320a40..13616ce47fe574973d642066e3eb508a44e4129a 100644 (file)
@@ -60,13 +60,11 @@ namespace creaImageIO
       //GDCM_NAME_SPACE::TagKey tag(group,element);
       char ctag[12];
       sprintf(ctag,"D%04x_%04x",group,element);
-      std::string tag(ctag);
+      mKey = ctag;
 
-      GimmickDebugMessage(3,"AttributeDescriptor : '"<<tag
+      GimmickDebugMessage(3,"AttributeDescriptor : '"<<mKey
                          <<"' ["<<flags<<"]"<<std::endl);
 
-      mKey = "D" + tag;
-
       // Retrieve the name from gdcm dict
       GDCM_NAME_SPACE::DictEntry* entry =
        GDCM_NAME_SPACE::Global::GetDicts()
@@ -80,7 +78,7 @@ namespace creaImageIO
        }
       else
        {
-         GimmickMessage(1,"!! WARNING : tag '"<<tag
+         GimmickMessage(1,"!! WARNING : tag '"<<mKey
                         <<"' is not in DICOM dictionnary ! "
                         <<"Considering it as a user attribute"
                         << std::endl);
@@ -103,7 +101,16 @@ namespace creaImageIO
           (key[0] == 'D') &&
           (key[5] == '_') )
        {
-         sscanf(key.c_str(),"D%04x_%04x",&group,&elem);
+         std::string g = key.substr(1,4);
+         sscanf(key.c_str(),"D %04x _ %04x ",&group,&elem);  
+         sscanf(g.c_str(),"%04x",&group);
+         GimmickMessage(5,"GetDicomGroupElementFromKey '"<<g<<"' : "
+                        <<group<<"|"<<elem<<std::endl);
+       }
+      else 
+       { 
+         GimmickMessage(5,"GetDicomGroupElementFromKey '"<<key<<"' : "
+                        <<" not a DICOM key format"<<std::endl);
        }
       return;
     }
index f48a4c09234ec3c7e18f9c0d8ba03a991f48ab63..3226f5290d88642ac1e85f202f863270c633f13e 100644 (file)
@@ -20,8 +20,8 @@ namespace creaImageIO
       /// Flags
       /// The attribute is hidden (not visible to user)
       static const unsigned int PRIVATE;
-      /// The attribute enters in unique identifier constitution (KEY)
-      static const unsigned int KEY;
+      /// The attribute enters in unique identifier constitution 
+      static const unsigned int IDENTIFIER;
       /// The attribute enters in label constitution (for printing)
       static const unsigned int LABEL;
 
@@ -87,16 +87,7 @@ namespace creaImageIO
 } // EO namespace creaImageIO
 
 
-/*
-//=====================================================================
-inline std::ostream& operator<<(std::ostream& s, 
-const creaImageIO::tree::AttributeDescriptor& d)
-{
-s << "[" << d.key << ":" << d.name << "]";
-return s;
-}
-//=====================================================================
-*/
+
 
 
 #endif // #ifndef __creaImageIOTreeAttributeDescriptor_h_INCLUDED__
diff --git a/src2/creaImageIOTreeAttributeMapType.h b/src2/creaImageIOTreeAttributeMapType.h
new file mode 100644 (file)
index 0000000..65c94fa
--- /dev/null
@@ -0,0 +1,36 @@
+#ifndef __creaImageIOTreeAttributeMapType_h_INCLUDED__
+#define __creaImageIOTreeAttributeMapType_h_INCLUDED__
+
+#include <map>
+#include <string>
+#include <iostream>
+
+namespace creaImageIO
+{
+
+  namespace tree
+  {
+    typedef std::map<std::string,std::string> AttributeMapType;
+
+
+
+
+  }
+
+}
+
+//=====================================================================
+inline std::ostream& operator<<(std::ostream& s, 
+                               const creaImageIO::tree::AttributeMapType& d)
+{
+  creaImageIO::tree::AttributeMapType::const_iterator i;
+  for (i=d.begin();i!=d.end();++i)
+    {
+      s << "'" << i->first << "'='" << i->second << "'" << std::endl;
+    }
+  return s;
+}
+//=====================================================================
+
+
+#endif
index c9a4e009c824ebf2b7051aa03254fd10d2c34780..03cfa41289ee328d6f590e0cafb3e12d75c469f7 100644 (file)
@@ -10,8 +10,8 @@ namespace creaImageIO
     //==================================================================
     /// The attribute is hidden (not visible to user)
     const unsigned int AttributeDescriptor::PRIVATE = 1;
-    /// The attribute enters in unique identifier constitution (KEY)
-    const unsigned int AttributeDescriptor::KEY = 2;
+    /// The attribute enters in unique identifier constitution 
+    const unsigned int AttributeDescriptor::IDENTIFIER = 2;
     const unsigned int AttributeDescriptor::LABEL = 4;
     //==================================================================
 
@@ -45,85 +45,88 @@ namespace creaImageIO
       // Creates the level 0 descriptor 
       CreateLevel0Descriptor();
       // Creates the attribute "Name"
-      GetAttributeDescriptorList(0).push_back(AttributeDescriptor("Name","Name"));
+      GetLevelDescriptor(0).Add(AttributeDescriptor("Name","Name",
+                                                   AttributeDescriptor::LABEL));
       
       // Patient level
       GetLevelDescriptorList().push_back(LevelDescriptor("Patient"));
-      GetAttributeDescriptorList(1).push_back(AttributeDescriptor(0x0010,0x0010,   // Patient name
+      GetLevelDescriptor(1).Add(AttributeDescriptor(0x0010,0x0010,   // Patient name
                                                                   AttributeDescriptor::LABEL));
-      GetAttributeDescriptorList(1).push_back(AttributeDescriptor(0x0010,0x0040)); // Patient sex
-      GetAttributeDescriptorList(1).push_back(AttributeDescriptor(0x0010,0x0030)); // Patient birthday
-      GetAttributeDescriptorList(1).push_back(AttributeDescriptor(0x0010,0x0020,   // Patient ID
-                                                                 AttributeDescriptor::KEY));
+      GetLevelDescriptor(1).Add(AttributeDescriptor(0x0010,0x0040)); // Patient sex
+      GetLevelDescriptor(1).Add(AttributeDescriptor(0x0010,0x0030)); // Patient birthday
+      GetLevelDescriptor(1).Add(AttributeDescriptor(0x0010,0x0020,   // Patient ID
+                                                                 AttributeDescriptor::IDENTIFIER));
  
       // Study-series level
       GetLevelDescriptorList().push_back(LevelDescriptor("Series"));
-      GetAttributeDescriptorList(2).push_back(AttributeDescriptor(0x0008,0x0060,    // Modality
-                                                                 AttributeDescriptor::LABEL));
-      GetAttributeDescriptorList(2).push_back(AttributeDescriptor(0x0008,0x1030)); // Study Description
-      GetAttributeDescriptorList(2).push_back(AttributeDescriptor(0x0008,0x103E)); // Description
-      GetAttributeDescriptorList(2).push_back(AttributeDescriptor(0x0008,0x0080)); // Institution Name
-      GetAttributeDescriptorList(2).push_back(AttributeDescriptor(0x0008,0x0081)); // Institution Adress
-      GetAttributeDescriptorList(2).push_back(AttributeDescriptor(0x0008,0x1010)); // Station Name
-      GetAttributeDescriptorList(2).push_back(AttributeDescriptor(0x0008,0x1048)); // Physician of Record
-      GetAttributeDescriptorList(2).push_back(AttributeDescriptor(0x0008,0x1050)); // Performing Physician's Name
-      GetAttributeDescriptorList(2).push_back(AttributeDescriptor(0x0018,0x1030)); // Protocol Name
-
-      GetAttributeDescriptorList(2).push_back(AttributeDescriptor(0x0020,0x0010)); // Study ID
-      GetAttributeDescriptorList(2).push_back(AttributeDescriptor(0x0008,0x0020)); // Study Date
-      GetAttributeDescriptorList(2).push_back(AttributeDescriptor(0x0008,0x0030)); // Study Time
-      GetAttributeDescriptorList(2).push_back(AttributeDescriptor(0x0008,0x0050)); // Study Accession Number
-      GetAttributeDescriptorList(2).push_back(AttributeDescriptor(0x0008,0x0005)); // Specific character set
-      GetAttributeDescriptorList(2).push_back(AttributeDescriptor(0x0008,0x0021)); // Series Date
-      GetAttributeDescriptorList(2).push_back(AttributeDescriptor(0x0008,0x0031)); // Series time
-
-      GetAttributeDescriptorList(2).push_back(AttributeDescriptor(0x0020,0x000D,   // Study Instance UID  
-                                                                 AttributeDescriptor::KEY));
-      GetAttributeDescriptorList(2).push_back(AttributeDescriptor(0x0020,0x000E,   // Series Instance UID  
-                                                                 AttributeDescriptor::KEY |
-                                                                 AttributeDescriptor::LABEL));
+      GetLevelDescriptor(2).Add(AttributeDescriptor(0x0008,0x0060,    // Modality
+                                                   AttributeDescriptor::LABEL));
+      GetLevelDescriptor(2).Add(AttributeDescriptor(0x0008,0x1030)); // Study Description
+      GetLevelDescriptor(2).Add(AttributeDescriptor(0x0008,0x103E)); // Description
+      GetLevelDescriptor(2).Add(AttributeDescriptor(0x0008,0x0080)); // Institution Name
+      GetLevelDescriptor(2).Add(AttributeDescriptor(0x0008,0x0081)); // Institution Adress
+      GetLevelDescriptor(2).Add(AttributeDescriptor(0x0008,0x1010)); // Station Name
+      GetLevelDescriptor(2).Add(AttributeDescriptor(0x0008,0x1048)); // Physician of Record
+      GetLevelDescriptor(2).Add(AttributeDescriptor(0x0008,0x1050)); // Performing Physician's Name
+      GetLevelDescriptor(2).Add(AttributeDescriptor(0x0018,0x1030)); // Protocol Name
+
+      GetLevelDescriptor(2).Add(AttributeDescriptor(0x0020,0x0010)); // Study ID
+      GetLevelDescriptor(2).Add(AttributeDescriptor(0x0008,0x0020)); // Study Date
+      GetLevelDescriptor(2).Add(AttributeDescriptor(0x0008,0x0030)); // Study Time
+      GetLevelDescriptor(2).Add(AttributeDescriptor(0x0008,0x0050)); // Study Accession Number
+      GetLevelDescriptor(2).Add(AttributeDescriptor(0x0008,0x0005)); // Specific character set
+      GetLevelDescriptor(2).Add(AttributeDescriptor(0x0008,0x0021)); // Series Date
+      GetLevelDescriptor(2).Add(AttributeDescriptor(0x0008,0x0031)); // Series time
+
+      GetLevelDescriptor(2).Add(AttributeDescriptor(0x0020,0x000D   // Study Instance UID  
+                                                   ));//AttributeDescriptor::IDENTIFIER));
+      GetLevelDescriptor(2).Add(AttributeDescriptor(0x0020,0x000E,   // Series Instance UID  
+                                                   AttributeDescriptor::IDENTIFIER));
+      // |
+      //                                                   AttributeDescriptor::LABEL));
      
 
       // Image level
       GetLevelDescriptorList().push_back(LevelDescriptor("Image"));
 
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor(0x0020,0x0013)); // Image Number
+      GetLevelDescriptor(3).Add(AttributeDescriptor(0x0020,0x0013)); // Image Number
 
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor(0x0028,0x0010)); // Rows
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor(0x0028,0x0011)); // Columns
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor(0x0028,0x0012)); // Planes
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor(0x0028,0x0002)); // Sample per pixels
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor(0x0028,0x0008)); // Number of Frames 
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor(0x0028,0x0004)); // Photometric Interpretation
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor(0x0028,0x0103)); // Pixel Representation
+      GetLevelDescriptor(3).Add(AttributeDescriptor(0x0028,0x0010)); // Rows
+      GetLevelDescriptor(3).Add(AttributeDescriptor(0x0028,0x0011)); // Columns
+      GetLevelDescriptor(3).Add(AttributeDescriptor(0x0028,0x0012)); // Planes
+      GetLevelDescriptor(3).Add(AttributeDescriptor(0x0028,0x0002)); // Sample per pixels
+      GetLevelDescriptor(3).Add(AttributeDescriptor(0x0028,0x0008)); // Number of Frames 
+      GetLevelDescriptor(3).Add(AttributeDescriptor(0x0028,0x0004)); // Photometric Interpretation
+      GetLevelDescriptor(3).Add(AttributeDescriptor(0x0028,0x0103)); // Pixel Representation
 
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor(0x0020,0x0032)); // Image Position Patient
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor(0x0020,0x0037)); // Image Orientation Patient
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor(0x0020,0x1041)); // Slice Location
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor(0x0028,0x0006)); // Planar Configuration
+      GetLevelDescriptor(3).Add(AttributeDescriptor(0x0020,0x0032)); // Image Position Patient
+      GetLevelDescriptor(3).Add(AttributeDescriptor(0x0020,0x0037)); // Image Orientation Patient
+      GetLevelDescriptor(3).Add(AttributeDescriptor(0x0020,0x1041)); // Slice Location
+      GetLevelDescriptor(3).Add(AttributeDescriptor(0x0028,0x0006)); // Planar Configuration
 
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor(0x0028,0x0030)); // Pixel Spacing
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor(0x0028,0x0100)); // AlocatedBits
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor(0x0028,0x0101)); // StoredBits
+      GetLevelDescriptor(3).Add(AttributeDescriptor(0x0028,0x0030)); // Pixel Spacing
+      GetLevelDescriptor(3).Add(AttributeDescriptor(0x0028,0x0100)); // AlocatedBits
+      GetLevelDescriptor(3).Add(AttributeDescriptor(0x0028,0x0101)); // StoredBits
 
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor(0x0008,0x0008)); // Image Type
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor(0x0008,0x0023)); // Content Date
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor(0x0008,0x0033)); // Content Time
+      GetLevelDescriptor(3).Add(AttributeDescriptor(0x0008,0x0008)); // Image Type
+      GetLevelDescriptor(3).Add(AttributeDescriptor(0x0008,0x0023)); // Content Date
+      GetLevelDescriptor(3).Add(AttributeDescriptor(0x0008,0x0033)); // Content Time
 
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor(0x0020,0x4000)); // Image Comments
+      GetLevelDescriptor(3).Add(AttributeDescriptor(0x0020,0x4000)); // Image Comments
 
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor(0x0004,0x1500,   // File Name
-                                                                 AttributeDescriptor::LABEL));
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor(0x0028,0x1052)); // Rescale Intercept
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor(0x0028,0x1053)); // Rescale Slope
+      GetLevelDescriptor(3).Add(AttributeDescriptor(0x0004,0x1500,   // File Name
+                                                   AttributeDescriptor::LABEL));
+      GetLevelDescriptor(3).Add(AttributeDescriptor(0x0028,0x1052)); // Rescale Intercept
+      GetLevelDescriptor(3).Add(AttributeDescriptor(0x0028,0x1053)); // Rescale Slope
 
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor(0x0050,0x0004)); // Calibration Image
+      GetLevelDescriptor(3).Add(AttributeDescriptor(0x0050,0x0004)); // Calibration Image
 
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor(0x0020,0x0052,   // Frame Reference UID
-                                                                 AttributeDescriptor::KEY));
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor(0x0008,0x0016)); // SOP Class UID
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor("FullFileName",  // Full file name
-                                                                 "Full file name")); 
+      GetLevelDescriptor(3).Add(AttributeDescriptor(0x0020,0x0052   // Frame Reference UID
+                                                   ));
+      GetLevelDescriptor(3).Add(AttributeDescriptor(0x0008,0x0016)); // SOP Class UID
+      GetLevelDescriptor(3).Add(AttributeDescriptor("FullFileName",  // Full file name
+                                                   "Full file name",
+                                                   AttributeDescriptor::IDENTIFIER)); 
                                                                  
      
     }
@@ -144,7 +147,7 @@ namespace creaImageIO
               a!= l->GetAttributeDescriptorList().end();
               ++a)
            {
-             map[a->GetName()]="";
+             map[a->GetKey()]="";
            }
        }
     }
index 29f0ba88b7d9f33cc2afaea99d88d40d7ae87890..101db65c0de0f2dea3a810d28e8282d35843406f 100644 (file)
@@ -1,23 +1,25 @@
 #ifndef __creaImageIOTreeDescriptor_h_INCLUDED__
 #define __creaImageIOTreeDescriptor_h_INCLUDED__
 
+#include <creaImageIOTreeAttributeMapType.h>
 #include <creaImageIOTreeLevelDescriptor.h>
-#include <map>
+
 
 namespace creaImageIO
 {
 
   namespace tree
   {
-
-         /**
-       * \ingroup Model
-       */
+    
+    /**
+     * \ingroup Model
+     */
     //=====================================================================
-    /// Descriptor of the structure a tree 
-/// (number of levels, descriptors of each level, ...).
-/// Any tree has at least one level (level 0) of name "Root"
-class Descriptor
+    /** Descriptor of the structure a tree 
+     * (number of levels, descriptors of each level, ...).
+     * Any tree has at least one level (level 0) of name "Root"
+     */
+    class Descriptor
     {
     public:
       /// Ctor : creates the mandatory level 0 descriptor called "Root"
@@ -46,13 +48,13 @@ class Descriptor
       GetAttributeDescriptorList(int level) const
       { return mLevelDescriptorList[level].GetAttributeDescriptorList(); }
       /// Returns the AttributeDescriptorList of a given level (ref)
-      LevelDescriptor::AttributeDescriptorListType& 
-      GetAttributeDescriptorList(int level) 
-      { return mLevelDescriptorList[level].GetAttributeDescriptorList(); }
+      //LevelDescriptor::AttributeDescriptorListType& 
+      //GetAttributeDescriptorList(int level) 
+      //{ return mLevelDescriptorList[level].GetAttributeDescriptorList(); }
   
 
       /// Builds the key to value map of all the attributes of the tree
-      void BuildAttributeMap( std::map<std::string,std::string>&) const;
+      void BuildAttributeMap( AttributeMapType& ) const;
 
       /// The type of LevelDescriptor container
       typedef std::vector<LevelDescriptor> LevelDescriptorListType;
index 2986ab4acfbd2b8cd4cedff0a3adb79b3726d2e8..a454116a17ca9559128cc7c6bceec7f0828a6a81 100644 (file)
@@ -6,14 +6,23 @@
 namespace creaImageIO
 {
 
-/**
-       * \ingroup Model
-       */
+
+  //=======================================================================
+  //class TreeHandlerStatistics;
+  //=======================================================================
+  /**
+   * \ingroup Model
+   */
   //=======================================================================
   /// Abstract class which 'handles' a Tree structure 
   class TreeHandler
   {
   public:
+
+    ///====================================================================
+    //  typedef TreeHandlerStatistics Statistics;
+    ///====================================================================
+
     ///====================================================================
     /// Ctor
     TreeHandler() {}
@@ -72,6 +81,7 @@ namespace creaImageIO
     ///====================================================================
     /// Recursively loads the children of node 'parent' until maxlevel 
     /// is reached.
+    /// If maxlevel <= 0 then loads all the sub-tree rooted at parent 
     /// If parent == NULL or parent == tree then starts with the 'children' of 
     /// the tree itself.
     /// Returns the total number of children loaded.
@@ -96,7 +106,11 @@ namespace creaImageIO
     /// Of course the branch is loaded on exit
     virtual int AddBranch( const AttributeMapType& ) { return -1; }
     /// Removes the node and its descendants 
-    bool Remove(tree::Node*)  { return false; }
+    virtual bool Remove(tree::Node*)  { return false; }
+    /// Sets an attribute of a Node
+    virtual bool SetAttribute(tree::Node*, 
+                             const std::string& key,
+                             const std::string& value) { return false; }
     ///====================================================================
 
 
@@ -107,7 +121,38 @@ namespace creaImageIO
   };
   // EO class TreeHandler
   //=======================================================================
-
+  /*
+  //=======================================================================
+  /// Memorizes statistics on operations done by a tree handler
+  /// (nodes created, removed, ...)
+  class TreeHandlerStatistics
+  {
+  public:
+    ///====================================================================
+    /// Ctor
+    TreeHandler(TreeHandler* tree) : mTreeHandler(tree) { Reset(); }
+    /// Dtor
+    ~TreeHandler() {}
+    /// Resets the stats
+    void Reset();
+    /// Prints the stats
+    void Print();
+
+    /// 
+    void CreateNode(int level) { mNumberCreatedNode[level]++; }
+    void DeleteNode(int level) { mNumberDeletedNode[level]++; }
+
+  protected:
+      TreeHandler* mTreeHandler;
+    std::vector<int> mNumberCreatedNode;
+    std::vector<int> mNumberDeletedNode;
+    
+    
+    ///====================================================================
+  };
+  // EO class TreeHandlerStatistics
+  //=======================================================================
+  */
 
 } // EO namespace creaImageIO
 
index 7cdd9fd4c2e49288e35e6b1878bc0eee65011e43..bd0feca7d9c612b0e16f26fb496e53f55e9a30a6 100644 (file)
@@ -1,10 +1,29 @@
 #include <creaImageIOTreeLevelDescriptor.h>
+#include <creaImageIOSystem.h>
 
 namespace creaImageIO
 {
   namespace tree
   {
-    
+      /// Adds the AttributeDescriptor to the list
+      void LevelDescriptor::Add(AttributeDescriptor a)
+      {
+       GimmickMessage(5,"Adding Attribute Descriptor '"<<a.GetKey()
+                      <<"' to LevelDescriptor"
+                      <<std::endl);
+       mAttributeDescriptorList.push_back(a);
+       if ( a.GetFlags() & AttributeDescriptor::IDENTIFIER )
+         {
+           GimmickMessage(6,"Is an IDENTIFIER"<<std::endl);
+           mIdentifierList.push_back(a.GetKey());
+         }
+       if ( a.GetFlags() & AttributeDescriptor::LABEL )
+         {
+           GimmickMessage(6,"Is a LABEL"<<std::endl);
+           mLabelList.push_back(a.GetKey());
+         }
+      }
+
   }
 }
 
index 905a7e45ea30304d836ca73d1789f4fc54727722..693933e415adc4a0c3eedd002e8554e0f7dd89e0 100644 (file)
@@ -29,19 +29,34 @@ namespace creaImageIO
       unsigned int GetNumberOfAttributes() 
       { return mAttributeDescriptorList.size(); }
 
+      /// Adds the AttributeDescriptor to the list
+      /// WARNING : You MUST use this method and NOT push_back directly in list
+      /// ad IdentifierList and LabelList are also updated
+      void Add(AttributeDescriptor);
+
       /// The type of attribute container
       typedef std::vector<AttributeDescriptor> AttributeDescriptorListType;
       /// Returns the list of AttributeDescriptor
-      AttributeDescriptorListType& GetAttributeDescriptorList() 
-      { return mAttributeDescriptorList; }
+      //AttributeDescriptorListType& GetAttributeDescriptorList() 
+      //{ return mAttributeDescriptorList; }
       /// Returns the list of AttributeDescriptor (const)
       const AttributeDescriptorListType& GetAttributeDescriptorList() const 
       { return mAttributeDescriptorList; }
 
+     /// \return The list of attributes with flag IDENTIFIER set
+     const std::vector<std::string>& GetIdentifierList() const 
+      { return mIdentifierList; }
+      /// \return The list of attributes with flag LABEL set
+      const std::vector<std::string>& GetLabelList() const 
+      { return mLabelList; }
+
     private:
       std::string mName;
       AttributeDescriptorListType mAttributeDescriptorList;
-
+      /// The list of attributes with flag IDENTIFIER set
+      std::vector<std::string> mIdentifierList;
+      /// The list of attributes with flag LABEL set
+      std::vector<std::string> mLabelList;
 
     };
     // EO class LevelDescriptor
index 6bb7d3a7d8bc42ce3d0eda23e3ef8332691f2171..4335dfe05b365e30de98d43ee5c4737e014854fd 100644 (file)
@@ -1,5 +1,6 @@
 #include <creaImageIOTreeNode.h>
 #include <creaImageIOTree.h>
+#include <creaImageIOSystem.h>
 #include <creaMessageManager.h>
 #include <algorithm>
 
@@ -17,16 +18,16 @@ namespace creaImageIO
     {
       if (parent) 
        {
+         GimmickMessage(5,"Default Node constructor (level "<<GetLevel()<<")"
+                        << std::endl);
          // Insert into parent's children list
          parent->GetChildrenList().push_back(this);
-         // Initialize attributes
-         LevelDescriptor::AttributeDescriptorListType::const_iterator a;
-         for (a = GetTree()->GetAttributeDescriptorList(GetLevel()).begin();
-              a!= GetTree()->GetAttributeDescriptorList(GetLevel()).end();
-              ++a)
-           {
-             UnsafeSetAttribute( a->GetKey(), "" );
-           }
+         InitializeAttributeMap();
+       }
+      else
+       {
+         GimmickMessage(5,"Default Node constructor without parent"    
+                        << std::endl);
        }
     }
     //=============================================================
@@ -38,7 +39,9 @@ namespace creaImageIO
        mData(0),
        mChildrenLoaded(false)
     {
-      if (parent) 
+      GimmickMessage(5,"Node constructor (level "<<GetLevel()<<")"
+                    << std::endl);
+     if (parent) 
        {
          // Insert into parent's children list
          parent->GetChildrenList().push_back(this);
@@ -48,7 +51,15 @@ namespace creaImageIO
               a!= GetTree()->GetAttributeDescriptorList(GetLevel()).end();
               ++a)
            {
-             UnsafeSetAttribute( a->GetKey(), attr[a->GetKey()] );
+             std::string v;
+             AttributeMapType::const_iterator i = attr.find(a->GetKey());
+             if ( i != attr.end() )  
+               {
+                 v = i->second;
+               }
+             GimmickMessage(5,"Setting attribute '"<<a->GetName()<<"' = '"
+                            <<v<<"'"<<std::endl);
+             UnsafeSetAttribute( a->GetKey(), v );
            }
        }
       
@@ -59,6 +70,8 @@ namespace creaImageIO
     //=============================================================
     Node::~Node()
     {
+      GimmickMessage(5,"Node destructor"
+                    << std::endl);
       ChildrenListType::iterator i;
       for (i=GetChildrenList().begin(); i!=GetChildrenList().end(); i++)
        {
@@ -72,7 +85,31 @@ namespace creaImageIO
     }
     //=============================================================
 
-  //=============================================================
+
+    //=============================================================
+    /// Initializes the attribute map i.e. creates the entries
+    void Node::InitializeAttributeMap()
+    {
+      // Initialize attributes
+      LevelDescriptor::AttributeDescriptorListType::const_iterator a;
+      for (a = GetTree()->GetAttributeDescriptorList(GetLevel()).begin();
+          a!= GetTree()->GetAttributeDescriptorList(GetLevel()).end();
+          ++a)
+       {
+         UnsafeSetAttribute( a->GetKey(), "" );
+       }
+    }
+    //=============================================================
+
+    //=============================================================
+    /// Returns the level descriptor of the node
+    const LevelDescriptor& Node::GetLevelDescriptor() const
+    { 
+      return GetTree()->GetLevelDescriptor(GetLevel()); 
+    }
+    //=============================================================
+
+    //=============================================================
     void Node::RemoveChildrenFromList(Node* node)
     {
       ChildrenListType::iterator i = find(GetChildrenList().begin(),
@@ -118,12 +155,70 @@ namespace creaImageIO
     //=============================================================
 
     //=============================================================
-    bool Node::Matches(  const AttributeMapType& ) const
+    bool Node::Matches(  const AttributeMapType& ) const
     {
-      // TO DO 
-      return false;
+      GimmickMessage(2,"'"<<GetLabel()<<"' matching..."<<std::endl);
+      const std::vector<std::string>& id 
+       = GetLevelDescriptor().GetIdentifierList();
+      std::vector<std::string>::const_iterator i;
+      for (i = id.begin(); i != id.end(); ++i)
+       {
+         if (mAttributeMap.find(*i)->second != m.find(*i)->second ) 
+           {
+             GimmickMessage(2,"IDENTIFIER '"<<*i<<"' values do not match"<<std::endl);
+             return false;
+           }
+         GimmickMessage(2,"IDENTIFIER '"<<*i<<"' values match"<<std::endl);
+       }
+      return true;
+    }
+    //=============================================================
+    
+    //=============================================================
+    void Node::Print() const
+    {
+      std::string mess;
+      for (int i = 0; i<GetLevel(); ++i) mess += " ";
+      mess += "|--" + GetLabel();
+      GimmickMessage(1,mess<<std::endl);
+      ChildrenListType::const_iterator i;
+      for (i=GetChildrenList().begin(); i!=GetChildrenList().end(); i++)
+       {
+         (*i)->Print();
+       } 
     }
     //=============================================================
+
+    //=============================================================
+    std::string Node::GetLabel() const
+    {
+      std::string l;
+      const std::vector<std::string>& label 
+       = GetLevelDescriptor().GetLabelList();
+      
+      std::vector<std::string>::const_iterator i;
+      for (i = label.begin(); i != label.end(); )
+       {
+         GimmickMessage(3,"LABEL '"<<*i<<"'"<<std::endl);
+         AttributeMapType::const_iterator j = mAttributeMap.find(*i);
+         if (j != mAttributeMap.end())
+           {
+             l += j->second;
+             ++i;
+             if (i != label.end()) l += "|";
+           }
+         else 
+           {
+             GimmickError("Node::GetLabel() : LABEL attribute '"
+                          <<*i
+                          <<"' is not in node attribute map (should be!)" );
+           }
+       }
+      if (l.size()==0) l="?";
+      return l;
+    }
+    //=============================================================
+
   }
 
 }
index 2b18acd2ca1e8d3cb84fb6801ecef8ba24c73c79..d69051bbe89cdfadb65ac25060231e841fd5cc25 100644 (file)
@@ -44,6 +44,8 @@ namespace creaImageIO
       /// Virtual destructor
       virtual ~Node();
 
+      /// Initializes the attribute map i.e. creates the entries
+      void InitializeAttributeMap();
  
       /// Returns the level descriptor of the node
       const LevelDescriptor& GetLevelDescriptor() const;
@@ -110,9 +112,10 @@ namespace creaImageIO
       /// Sorts the children of the node 
       void SortChildren(const LexicographicalComparator&);
 
-      /*
-     virtual void Print() const;
+
+      virtual void Print() const;
       std::string GetLabel() const;
+      /*
        int ImageGetRows() const;
        int ImageGetColumns() const;
        int ImageGetFrames() const;
index 44afa2a64dbd55d37d403da1f0f7c181553194fb..af8e0fbfd35d224b70a96a0282edf7ead9fa59c4 100644 (file)
@@ -160,7 +160,7 @@ MULTILINE_CPP_IS_BRIEF = NO
 # If set to NO, the detailed description appears after the member 
 # documentation.
 
-DETAILS_AT_TOP         = NO
+DETAILS_AT_TOP         = NO
 
 # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 
 # member inherits the documentation from any documented member that it