changeset 1028:733768d67f00

Working version of dicomserver.
author neelin <neelin>
date Tue, 11 Mar 1997 13:10:48 +0000
parents 92de6278840e
children 29c2fbed8966
files conversion/dicomserver/dicom_element_defs.h conversion/dicomserver/dicom_prototypes.h conversion/dicomserver/dicomserver.c conversion/dicomserver/dicomserver.h conversion/dicomserver/siemens_dicom_read.c conversion/dicomserver/spi_element_defs.h conversion/dicomserver/use_the_files.c
diffstat 7 files changed, 245 insertions(+), 86 deletions(-) [+]
line wrap: on
line diff
--- a/conversion/dicomserver/dicom_element_defs.h
+++ b/conversion/dicomserver/dicom_element_defs.h
@@ -57,63 +57,63 @@
 #define ACR_MODALITY_MR "MR"
 
 /* Element id's for DICOM */
-GLOBAL_ELEMENT(ACR_Affected_SOP_class_UID    , 0x0000, 0x0002);
-GLOBAL_ELEMENT(ACR_Command                   , 0x0000, 0x0100);
-GLOBAL_ELEMENT(ACR_Message_id                , 0x0000, 0x0110);
-GLOBAL_ELEMENT(ACR_Message_id_brt            , 0x0000, 0x0120);
-GLOBAL_ELEMENT(ACR_Priority                  , 0x0000, 0x0700);
-GLOBAL_ELEMENT(ACR_Dataset_type              , 0x0000, 0x0800);
-GLOBAL_ELEMENT(ACR_Status                    , 0x0000, 0x0900);
-GLOBAL_ELEMENT(ACR_Affected_SOP_instance_UID , 0x0000, 0x1000);
-GLOBAL_ELEMENT(ACR_Move_originator_AE_title  , 0x0000, 0x1031);
+GLOBAL_ELEMENT(ACR_Affected_SOP_class_UID    , 0x0000, 0x0002, UI);
+GLOBAL_ELEMENT(ACR_Command                   , 0x0000, 0x0100, US);
+GLOBAL_ELEMENT(ACR_Message_id                , 0x0000, 0x0110, US);
+GLOBAL_ELEMENT(ACR_Message_id_brt            , 0x0000, 0x0120, US);
+GLOBAL_ELEMENT(ACR_Priority                  , 0x0000, 0x0700, US);
+GLOBAL_ELEMENT(ACR_Dataset_type              , 0x0000, 0x0800, US);
+GLOBAL_ELEMENT(ACR_Status                    , 0x0000, 0x0900, US);
+GLOBAL_ELEMENT(ACR_Affected_SOP_instance_UID , 0x0000, 0x1000, UI);
+GLOBAL_ELEMENT(ACR_Move_originator_AE_title  , 0x0000, 0x1031, AE);
 
-GLOBAL_ELEMENT(ACR_Study_date            , 0x0008, 0x0020);
-GLOBAL_ELEMENT(ACR_Acquisition_date      , 0x0008, 0x0022);
-GLOBAL_ELEMENT(ACR_Study_time            , 0x0008, 0x0030);
-GLOBAL_ELEMENT(ACR_Acquisition_time      , 0x0008, 0x0032);
-GLOBAL_ELEMENT(ACR_Modality              , 0x0008, 0x0060);
-GLOBAL_ELEMENT(ACR_Manufacturer          , 0x0008, 0x0070);
-GLOBAL_ELEMENT(ACR_Institution_id        , 0x0008, 0x0080);
-GLOBAL_ELEMENT(ACR_Referring_physician   , 0x0008, 0x0090);
-GLOBAL_ELEMENT(ACR_Station_id            , 0x0008, 0x1010);
-GLOBAL_ELEMENT(ACR_Procedure_description , 0x0008, 0x1030);
-GLOBAL_ELEMENT(ACR_Manufacturer_model    , 0x0008, 0x1090);
+GLOBAL_ELEMENT(ACR_Study_date            , 0x0008, 0x0020, DA);
+GLOBAL_ELEMENT(ACR_Acquisition_date      , 0x0008, 0x0022, DA);
+GLOBAL_ELEMENT(ACR_Study_time            , 0x0008, 0x0030, TM);
+GLOBAL_ELEMENT(ACR_Acquisition_time      , 0x0008, 0x0032, TM);
+GLOBAL_ELEMENT(ACR_Modality              , 0x0008, 0x0060, CS);
+GLOBAL_ELEMENT(ACR_Manufacturer          , 0x0008, 0x0070, LO);
+GLOBAL_ELEMENT(ACR_Institution_id        , 0x0008, 0x0080, LO);
+GLOBAL_ELEMENT(ACR_Referring_physician   , 0x0008, 0x0090, PN);
+GLOBAL_ELEMENT(ACR_Station_id            , 0x0008, 0x1010, SH);
+GLOBAL_ELEMENT(ACR_Procedure_description , 0x0008, 0x1030, LO);
+GLOBAL_ELEMENT(ACR_Manufacturer_model    , 0x0008, 0x1090, LO);
 
-GLOBAL_ELEMENT(ACR_Patient_name          , 0x0010, 0x0010);
-GLOBAL_ELEMENT(ACR_Patient_identification, 0x0010, 0x0020);
-GLOBAL_ELEMENT(ACR_Patient_birth_date    , 0x0010, 0x0030);
-GLOBAL_ELEMENT(ACR_Patient_sex           , 0x0010, 0x0040);
-GLOBAL_ELEMENT(ACR_Patient_weight        , 0x0010, 0x1030);
+GLOBAL_ELEMENT(ACR_Patient_name          , 0x0010, 0x0010, PN);
+GLOBAL_ELEMENT(ACR_Patient_identification, 0x0010, 0x0020, LO);
+GLOBAL_ELEMENT(ACR_Patient_birth_date    , 0x0010, 0x0030, DA);
+GLOBAL_ELEMENT(ACR_Patient_sex           , 0x0010, 0x0040, CS);
+GLOBAL_ELEMENT(ACR_Patient_weight        , 0x0010, 0x1030, DS);
 
-GLOBAL_ELEMENT(ACR_Scanning_sequence     , 0x0018, 0x0020);
-GLOBAL_ELEMENT(ACR_Slice_thickness       , 0x0018, 0x0050);
-GLOBAL_ELEMENT(ACR_Repetition_time       , 0x0018, 0x0080);
-GLOBAL_ELEMENT(ACR_Echo_time             , 0x0018, 0x0081);
-GLOBAL_ELEMENT(ACR_Inversion_time        , 0x0018, 0x0082);
-GLOBAL_ELEMENT(ACR_Nr_of_averages        , 0x0018, 0x0083);
-GLOBAL_ELEMENT(ACR_Imaging_frequency     , 0x0018, 0x0084);
-GLOBAL_ELEMENT(ACR_Imaged_nucleus        , 0x0018, 0x0085);
-GLOBAL_ELEMENT(ACR_Echo_number           , 0x0018, 0x0086);
-GLOBAL_ELEMENT(ACR_Flip_angle            , 0x0018, 0x1314);
-GLOBAL_ELEMENT(ACR_Acq_comments          , 0x0018, 0x4000);
+GLOBAL_ELEMENT(ACR_Scanning_sequence     , 0x0018, 0x0020, CS);
+GLOBAL_ELEMENT(ACR_Slice_thickness       , 0x0018, 0x0050, DS);
+GLOBAL_ELEMENT(ACR_Repetition_time       , 0x0018, 0x0080, DS);
+GLOBAL_ELEMENT(ACR_Echo_time             , 0x0018, 0x0081, DS);
+GLOBAL_ELEMENT(ACR_Inversion_time        , 0x0018, 0x0082, DS);
+GLOBAL_ELEMENT(ACR_Nr_of_averages        , 0x0018, 0x0083, DS);
+GLOBAL_ELEMENT(ACR_Imaging_frequency     , 0x0018, 0x0084, DS);
+GLOBAL_ELEMENT(ACR_Imaged_nucleus        , 0x0018, 0x0085, SH);
+GLOBAL_ELEMENT(ACR_Echo_number           , 0x0018, 0x0086, IS);
+GLOBAL_ELEMENT(ACR_Flip_angle            , 0x0018, 0x1314, DS);
+GLOBAL_ELEMENT(ACR_Acq_comments          , 0x0018, 0x4000, LT);
 
-GLOBAL_ELEMENT(ACR_Study                 , 0x0020, 0x0010);
-GLOBAL_ELEMENT(ACR_Series                , 0x0020, 0x0011);
-GLOBAL_ELEMENT(ACR_Acquisition           , 0x0020, 0x0012);
-GLOBAL_ELEMENT(ACR_Image                 , 0x0020, 0x0013);
-GLOBAL_ELEMENT(ACR_Acquisitions_in_series, 0x0020, 0x1001);
+GLOBAL_ELEMENT(ACR_Study                 , 0x0020, 0x0010, SH);
+GLOBAL_ELEMENT(ACR_Series                , 0x0020, 0x0011, IS);
+GLOBAL_ELEMENT(ACR_Acquisition           , 0x0020, 0x0012, IS);
+GLOBAL_ELEMENT(ACR_Image                 , 0x0020, 0x0013, IS);
+GLOBAL_ELEMENT(ACR_Acquisitions_in_series, 0x0020, 0x1001, IS);
 
-GLOBAL_ELEMENT(ACR_Rows                  , 0x0028, 0x0010);
-GLOBAL_ELEMENT(ACR_Columns               , 0x0028, 0x0011);
-GLOBAL_ELEMENT(ACR_Pixel_size            , 0x0028, 0x0030);
-GLOBAL_ELEMENT(ACR_Bits_allocated        , 0x0028, 0x0100);
-GLOBAL_ELEMENT(ACR_Bits_stored           , 0x0028, 0x0101);
-GLOBAL_ELEMENT(ACR_Smallest_pixel_value  , 0x0028, 0x0106);
-GLOBAL_ELEMENT(ACR_Largest_pixel_value   , 0x0028, 0x0107);
-GLOBAL_ELEMENT(ACR_Image_location        , 0x0028, 0x0200);
-GLOBAL_ELEMENT(ACR_Window_centre         , 0x0028, 0x1050);
-GLOBAL_ELEMENT(ACR_Window_width          , 0x0028, 0x1051);
+GLOBAL_ELEMENT(ACR_Rows                  , 0x0028, 0x0010, US);
+GLOBAL_ELEMENT(ACR_Columns               , 0x0028, 0x0011, US);
+GLOBAL_ELEMENT(ACR_Pixel_size            , 0x0028, 0x0030, DS);
+GLOBAL_ELEMENT(ACR_Bits_allocated        , 0x0028, 0x0100, US);
+GLOBAL_ELEMENT(ACR_Bits_stored           , 0x0028, 0x0101, US);
+GLOBAL_ELEMENT(ACR_Smallest_pixel_value  , 0x0028, 0x0106, US);
+GLOBAL_ELEMENT(ACR_Largest_pixel_value   , 0x0028, 0x0107, US);
+GLOBAL_ELEMENT(ACR_Image_location        , 0x0028, 0x0200, US);
+GLOBAL_ELEMENT(ACR_Window_centre         , 0x0028, 0x1050, DS);
+GLOBAL_ELEMENT(ACR_Window_width          , 0x0028, 0x1051, DS);
 
-GLOBAL_ELEMENT(ACR_Image_data, ACR_ACTUAL_IMAGE_GID, 0x0010);
+GLOBAL_ELEMENT(ACR_Image_data, ACR_ACTUAL_IMAGE_GID, 0x0010, UNKNOWN);
 
 #include <spi_element_defs.h>
--- a/conversion/dicomserver/dicom_prototypes.h
+++ b/conversion/dicomserver/dicom_prototypes.h
@@ -1,3 +1,5 @@
+public void timeout_handler(int sig);
+public Acr_Group skip_command_groups(Acr_Group group_list);
 public void cleanup_files(int num_files, char *file_list[]);
 public void free_list(int num_files, char **file_list, 
                       Data_Object_Info **file_info_list);
@@ -60,6 +62,6 @@
 public void sort_dimensions(General_Info *general_info);
 public int dimension_sort_function(const void *v1, const void *v2);
 public void string_to_filename(char *string, char *filename, int maxlen);
-public void use_the_files(char *project_name, 
+public void use_the_files(char *project_name,
                           int num_files, char *file_list[], 
                           Data_Object_Info *data_info[]);
--- a/conversion/dicomserver/dicomserver.c
+++ b/conversion/dicomserver/dicomserver.c
@@ -4,9 +4,12 @@
 @GLOBALS    : 
 @CREATED    : January 28, 1997 (Peter Neelin)
 @MODIFIED   : $Log: dicomserver.c,v $
-@MODIFIED   : Revision 1.1  1997-03-04 20:56:47  neelin
-@MODIFIED   : Initial revision
+@MODIFIED   : Revision 1.2  1997-03-11 13:10:48  neelin
+@MODIFIED   : Working version of dicomserver.
 @MODIFIED   :
+ * Revision 1.1  1997/03/04  20:56:47  neelin
+ * Initial revision
+ *
 @COPYRIGHT  :
               Copyright 1997 Peter Neelin, McConnell Brain Imaging Centre, 
               Montreal Neurological Institute, McGill University.
@@ -20,11 +23,13 @@
 ---------------------------------------------------------------------------- */
 
 #ifndef lint
-static char rcsid[]="$Header: /private-cvsroot/minc/conversion/dicomserver/dicomserver.c,v 1.1 1997-03-04 20:56:47 neelin Exp $";
+static char rcsid[]="$Header: /private-cvsroot/minc/conversion/dicomserver/dicomserver.c,v 1.2 1997-03-11 13:10:48 neelin Exp $";
 #endif
 
 #include <sys/types.h>
 #include <sys/stat.h>
+#include <sys/wait.h>
+#include <signal.h>
 #include <unistd.h>
 #include <dicomserver.h>
 
@@ -54,6 +59,10 @@
    TRUE;
 #endif
 
+/* Globals for handling connection timeouts */
+int Connection_timeout = FALSE;
+Acr_File *Alarmed_afp = NULL;
+
 int main(int argc, char *argv[])
 {
    char *pname;
@@ -82,6 +91,11 @@
    Acr_VR_encoding_type vr_encoding;
    int pres_context_id;
    long maximum_length;
+   pid_t server_pid, child_pid;
+   int statptr;
+
+   /* Get server process id */
+   server_pid = getpid();
 
    /* Change to tmp directory */
    (void) chdir("/usr/tmp");
@@ -128,6 +142,7 @@
 
    /* Create file prefix. Create the temporary file to avoid file name 
       clashes */
+   temp_dir = NULL;
    if (! Keep_files) {
       (void) tmpnam(file_prefix);
       if (mkdir(file_prefix, (mode_t) 0777)) {
@@ -152,8 +167,20 @@
    num_files = 0;
    while (continue_looping) {
 
+      /* Wait for any children that have finished */
+      while ((child_pid=wait3(&statptr, WNOHANG, NULL)) > 0) {}
+
+      /* If there are children, slow down the processing */
+      if (child_pid == 0) {
+         (void) sleep((unsigned int) SERVER_SLEEP_TIME);
+      }
+
       /* Read in the message */
+      Alarmed_afp = afpin;
+      (void) signal(SIGALRM, timeout_handler);
+      (void) alarm(CONNECTION_TIMEOUT);
       status=acr_input_dicom_message(afpin, &input_message);
+      (void) alarm(0);
 
       /* Check for error */
       if (status != ACR_OK) {
@@ -226,7 +253,7 @@
       case ACR_PDU_DATA_TF:
 
          /* Check command and state */
-         acr_command = acr_find_short(group_list, ACR_Command, ACR_C_STORE_RQ);
+         acr_command = acr_find_short(group_list, ACR_Command, -1);
          if ((state != WAITING_FOR_DATA) || 
              (acr_command != ACR_C_STORE_RQ)) {
             status = ACR_HIGH_LEVEL_ERROR;
@@ -238,12 +265,42 @@
          output_message = data_reply(input_message);
 
          /* Get rid of the command groups */
+         group_list = skip_command_groups(group_list);
          while ((group_list != NULL) &&
                 ((acr_get_group_group(group_list) == DCM_PDU_GRPID) ||
                  (acr_get_group_group(group_list) == ACR_MESSAGE_GID))) {
             group_list = acr_get_group_next(group_list);
          }
-         if (group_list == NULL) break;
+
+         /* Was the data attached to the command? If not, read in the next
+            message - it should contain the data */
+         if (group_list == NULL) {
+
+            /* Read the data and check the status */
+            Alarmed_afp = afpin;
+            (void) signal(SIGALRM, timeout_handler);
+            (void) alarm(CONNECTION_TIMEOUT);
+            status=acr_input_dicom_message(afpin, &input_message);
+            (void) alarm(0);
+            if (status != ACR_OK) {
+               state = DISCONNECTING;
+               break;
+            }
+
+            /* Check that we have a data PDU */
+            group_list = acr_get_message_group_list(input_message);
+            if (acr_find_short(group_list, DCM_PDU_Type, ACR_PDU_DATA_TF)
+                != ACR_PDU_DATA_TF) {
+               status = ACR_HIGH_LEVEL_ERROR;
+               state = DISCONNECTING;
+               break;
+            }
+
+            /* Skip command groups and check for no data */
+            group_list = skip_command_groups(group_list);
+            if (group_list == NULL) break;
+
+         }
 
          /* Extend file list if necessary */
          if (num_files >= num_files_alloc) {
@@ -304,17 +361,50 @@
          /* Check for file from next acquisition */
          if (have_extra_file) num_files--;
 
-         /* Do something with the files */
-         use_the_files(project_name, num_files, file_list, 
-                       file_info_list);
+         /* Fork child to process the files */
+         child_pid = fork();
+         if (child_pid > 0) {      /* Parent process */
+            if (Do_logging >= LOW_LOGGING) {
+               (void) fprintf(stderr, 
+                              "Forked process to create minc files.\n");
+            }
+
+         }                         /* Error forking */
+         else if (child_pid < 0) {
+            (void) fprintf(stderr, 
+                           "Error forking child to create minc file\n");
+            return;
+         }
+         else {                    /* Child process */
+
+            /* Do something with the files */
+            use_the_files(project_name, num_files, file_list, 
+                          file_info_list);
+
+            /* Remove the temporary files */
+            cleanup_files(num_files, file_list);
+
+            /* Remove the temporary directory if the server has finished */
+            if ((temp_dir != NULL) && (kill(server_pid, 0) != 0)) {
+               cleanup_files(1, &temp_dir);
+            }
+
+            /* Print message about child finishing */
+            if (Do_logging >= LOW_LOGGING) {
+               (void) fprintf(stderr, "Minc creation process finished.\n");
+            }
+
+            /* Exit from child */
+            exit(EXIT_SUCCESS);
+
+         }         /* End of child process */
 
          /* Put blank line in log file */
          if (Do_logging >= LOW_LOGGING) {
             (void) fprintf(stderr, "\n");
          }
 
-         /* Remove the temporary files and reset the lists */
-         cleanup_files(num_files, file_list);
+         /* Reset the lists */
          free_list(num_files, file_list, file_info_list);
          if (have_extra_file) {
             file_list[0] = file_list[num_files];
@@ -332,7 +422,11 @@
       }
 
       /* Send reply */
+      Alarmed_afp = afpout;
+      (void) signal(SIGALRM, timeout_handler);
+      (void) alarm(CONNECTION_TIMEOUT);
       status = acr_output_dicom_message(afpout, output_message);
+      (void) alarm(0);
 
       /* Delete output message */
       acr_delete_message(output_message);
@@ -366,10 +460,15 @@
    FREE(file_list);
    FREE(file_info_list);
    
-   /* Remove the file prefix directory */
+   /* Remove the file prefix directory (this only happens if it is empty). */
    cleanup_files(1, &temp_dir);
    FREE(temp_dir);
 
+   /* Check for connection timeout */
+   if (Connection_timeout) {
+      (void) fprintf(stderr, "Connection timed out.\n");
+   }
+
    /* Print final message */
    switch (status) {
    case ACR_OK:
@@ -432,6 +531,51 @@
 }
 
 /* ----------------------------- MNI Header -----------------------------------
+@NAME       : timeout_handler
+@INPUT      : 
+@OUTPUT     : (none)
+@RETURNS    : 
+@DESCRIPTION: Routine to handle connection timeouts.
+@METHOD     : 
+@GLOBALS    : 
+@CALLS      : 
+@CREATED    : March 10, 1997 (Peter Neelin)
+@MODIFIED   : 
+---------------------------------------------------------------------------- */
+/* ARGSUSED */
+public void timeout_handler(int sig)
+{
+   Connection_timeout = TRUE;
+   if (Alarmed_afp != NULL) {
+      acr_dicom_set_eof(Alarmed_afp);
+   }
+   return;
+}
+/* ----------------------------- MNI Header -----------------------------------
+@NAME       : skip_command_groups
+@INPUT      : group_list
+@OUTPUT     : (none)
+@RETURNS    : Pointer to head of group list
+@DESCRIPTION: Skips over command groups in a group list, returning the rest
+              of the list.
+@METHOD     : 
+@GLOBALS    : 
+@CALLS      : 
+@CREATED    : March 7, 1997 (Peter Neelin)
+@MODIFIED   : 
+---------------------------------------------------------------------------- */
+public Acr_Group skip_command_groups(Acr_Group group_list)
+{
+   while ((group_list != NULL) &&
+          ((acr_get_group_group(group_list) == DCM_PDU_GRPID) ||
+           (acr_get_group_group(group_list) == ACR_MESSAGE_GID))) {
+      group_list = acr_get_group_next(group_list);
+   }
+
+   return group_list;
+}
+
+/* ----------------------------- MNI Header -----------------------------------
 @NAME       : cleanup_files
 @INPUT      : num_files - number of files in list
               file_list - array of file names
--- a/conversion/dicomserver/dicomserver.h
+++ b/conversion/dicomserver/dicomserver.h
@@ -5,9 +5,12 @@
 @GLOBALS    : 
 @CREATED    : January 28, 1997 (Peter Neelin)
 @MODIFIED   : $Log: dicomserver.h,v $
-@MODIFIED   : Revision 1.1  1997-03-04 20:56:47  neelin
-@MODIFIED   : Initial revision
+@MODIFIED   : Revision 1.2  1997-03-11 13:10:48  neelin
+@MODIFIED   : Working version of dicomserver.
 @MODIFIED   :
+ * Revision 1.1  1997/03/04  20:56:47  neelin
+ * Initial revision
+ *
 @COPYRIGHT  :
               Copyright 1997 Peter Neelin, McConnell Brain Imaging Centre, 
               Montreal Neurological Institute, McGill University.
@@ -53,6 +56,13 @@
 
 #define FILE_ALLOC_INCREMENT 10
 
+/* Connection timeout length in seconds */
+#define CONNECTION_TIMEOUT (60*5)
+
+/* Time to sleep between image reads when a child process is running.
+   This prevents the server from outrunning its children. */
+#define SERVER_SLEEP_TIME 3
+
 /* Define logging constants */
 #define NO_LOGGING   0
 #define LOW_LOGGING  1
--- a/conversion/dicomserver/siemens_dicom_read.c
+++ b/conversion/dicomserver/siemens_dicom_read.c
@@ -6,9 +6,12 @@
 @CALLS      : 
 @CREATED    : January 28, 1997 (Peter Neelin)
 @MODIFIED   : $Log: siemens_dicom_read.c,v $
-@MODIFIED   : Revision 1.1  1997-03-04 20:56:47  neelin
-@MODIFIED   : Initial revision
+@MODIFIED   : Revision 1.2  1997-03-11 13:10:48  neelin
+@MODIFIED   : Working version of dicomserver.
 @MODIFIED   :
+ * Revision 1.1  1997/03/04  20:56:47  neelin
+ * Initial revision
+ *
 @COPYRIGHT  :
               Copyright 1997 Peter Neelin, McConnell Brain Imaging Centre, 
               Montreal Neurological Institute, McGill University.
@@ -626,11 +629,9 @@
       acr_find_string(group_list, ACR_Referring_physician, ""), maxlen);
    (void) strncpy(general_info->study.procedure, 
       acr_find_string(group_list, ACR_Procedure_description, ""), maxlen);
-   (void) sprintf(general_info->study.study_id, "%d",
-      acr_find_int(group_list, ACR_Study_date, 0));
+   (void) sprintf(general_info->study.study_id, "%d", general_info->study_id);
    (void) sprintf(general_info->study.acquisition_id, "%d_%d",
-      acr_find_int(group_list, ACR_Series, 0),
-      acr_find_int(group_list, ACR_Study_time, 0));
+      acr_find_int(group_list, ACR_Series, 0), general_info->acq_id);
 
    /* Get acquisition information */
    string = acr_find_string(group_list, SPI_Sequence_file_name, "");
--- a/conversion/dicomserver/spi_element_defs.h
+++ b/conversion/dicomserver/spi_element_defs.h
@@ -30,14 +30,14 @@
 #define SPI_CORONAL_ORIENTATION    3
 
 /* Element id's for SPI */
-GLOBAL_ELEMENT(SPI_Sequence_file_name                 , 0x0019, 0x1511);
-GLOBAL_ELEMENT(SPI_Image_position                     , 0x0021, 0x1160);
-GLOBAL_ELEMENT(SPI_Image_normal                       , 0x0021, 0x1161);
-GLOBAL_ELEMENT(SPI_Image_row                          , 0x0021, 0x116a);
-GLOBAL_ELEMENT(SPI_Image_column                       , 0x0021, 0x116b);
-GLOBAL_ELEMENT(SPI_Number_of_3D_raw_partitions_nominal, 0x0021, 0x1330);
-GLOBAL_ELEMENT(SPI_Actual_3D_partition_number         , 0x0021, 0x1336);
-GLOBAL_ELEMENT(SPI_Number_of_slices_nominal           , 0x0021, 0x1340);
-GLOBAL_ELEMENT(SPI_Current_slice_number               , 0x0021, 0x1342);
-GLOBAL_ELEMENT(SPI_Number_of_echoes                   , 0x0021, 0x1370);
+GLOBAL_ELEMENT(SPI_Sequence_file_name                 , 0x0019, 0x1511, LO);
+GLOBAL_ELEMENT(SPI_Image_position                     , 0x0021, 0x1160, DS);
+GLOBAL_ELEMENT(SPI_Image_normal                       , 0x0021, 0x1161, DS);
+GLOBAL_ELEMENT(SPI_Image_row                          , 0x0021, 0x116a, DS);
+GLOBAL_ELEMENT(SPI_Image_column                       , 0x0021, 0x116b, DS);
+GLOBAL_ELEMENT(SPI_Number_of_3D_raw_partitions_nominal, 0x0021, 0x1330, IS);
+GLOBAL_ELEMENT(SPI_Actual_3D_partition_number         , 0x0021, 0x1336, IS);
+GLOBAL_ELEMENT(SPI_Number_of_slices_nominal           , 0x0021, 0x1340, IS);
+GLOBAL_ELEMENT(SPI_Current_slice_number               , 0x0021, 0x1342, IS);
+GLOBAL_ELEMENT(SPI_Number_of_echoes                   , 0x0021, 0x1370, IS);
 
--- a/conversion/dicomserver/use_the_files.c
+++ b/conversion/dicomserver/use_the_files.c
@@ -6,9 +6,12 @@
 @CALLS      : 
 @CREATED    : January 28, 1997 (Peter Neelin)
 @MODIFIED   : $Log: use_the_files.c,v $
-@MODIFIED   : Revision 1.1  1997-03-04 20:56:47  neelin
-@MODIFIED   : Initial revision
+@MODIFIED   : Revision 1.2  1997-03-11 13:10:48  neelin
+@MODIFIED   : Working version of dicomserver.
 @MODIFIED   :
+ * Revision 1.1  1997/03/04  20:56:47  neelin
+ * Initial revision
+ *
 @COPYRIGHT  :
               Copyright 1997 Peter Neelin, McConnell Brain Imaging Centre, 
               Montreal Neurological Institute, McGill University.
@@ -43,7 +46,7 @@
 @CREATED    : November 23, 1993 (Peter Neelin)
 @MODIFIED   : 
 ---------------------------------------------------------------------------- */
-public void use_the_files(char *project_name, 
+public void use_the_files(char *project_name,
                           int num_files, char *file_list[], 
                           Data_Object_Info *data_info[])
 {
@@ -179,5 +182,4 @@
    FREE(acq_file_list);
    FREE(used_file);
 
-   return;
 }