@@ -579,6 +579,29 @@ static DcmDataSet *dcm_filehandle_read_file_meta(DcmError **error,
579579}
580580
581581
582+ static bool dcm_filehandle_set_transfer_syntax (DcmError * * error ,
583+ DcmFilehandle * filehandle ,
584+ const char * transfer_syntax_uid )
585+ {
586+ if (filehandle -> transfer_syntax_uid ) {
587+ free (filehandle -> transfer_syntax_uid );
588+ }
589+
590+ filehandle -> transfer_syntax_uid = dcm_strdup (error , transfer_syntax_uid );
591+ if (filehandle -> transfer_syntax_uid == NULL ) {
592+ return false;
593+ }
594+
595+ if (strcmp (filehandle -> transfer_syntax_uid , "1.2.840.10008.1.2" ) == 0 ) {
596+ filehandle -> implicit = true;
597+ }
598+
599+ filehandle -> desc .transfer_syntax_uid = filehandle -> transfer_syntax_uid ;
600+
601+ return true;
602+ }
603+
604+
582605const DcmDataSet * dcm_filehandle_get_file_meta (DcmError * * error ,
583606 DcmFilehandle * filehandle )
584607{
@@ -610,19 +633,13 @@ const DcmDataSet *dcm_filehandle_get_file_meta(DcmError **error,
610633 return NULL ;
611634 }
612635
613- filehandle -> transfer_syntax_uid =
614- dcm_strdup ( error , transfer_syntax_uid );
615- if ( filehandle -> transfer_syntax_uid == NULL ) {
636+ if (! dcm_filehandle_set_transfer_syntax ( error ,
637+ filehandle ,
638+ transfer_syntax_uid ) ) {
616639 dcm_dataset_destroy (file_meta );
617640 return NULL ;
618641 }
619642
620- if (strcmp (filehandle -> transfer_syntax_uid , "1.2.840.10008.1.2" ) == 0 ) {
621- filehandle -> implicit = true;
622- }
623-
624- filehandle -> desc .transfer_syntax_uid = filehandle -> transfer_syntax_uid ;
625-
626643 filehandle -> file_meta = file_meta ;
627644 } else {
628645 // move the read point to the start of the slide metadata
@@ -1503,7 +1520,15 @@ static bool print_element_create(DcmError **error,
15031520{
15041521 DcmFilehandle * filehandle = (DcmFilehandle * ) client ;
15051522
1506- USED (error );
1523+ // we must record the transfer syntax in the file meta since we need it
1524+ // to determine implicit/explicit encoding
1525+ if (tag == TAG_TRANSFER_SYNTAX_UID &&
1526+ vr == DCM_VR_UI &&
1527+ value &&
1528+ length > 10 &&
1529+ !dcm_filehandle_set_transfer_syntax (error , filehandle , value )) {
1530+ return false;
1531+ }
15071532
15081533 printf ("%*.*s(%04x,%04x) " ,
15091534 filehandle -> indent * 2 ,
@@ -1615,8 +1640,7 @@ bool dcm_filehandle_print(DcmError **error,
16151640 dcm_log_info ("Read metadata" );
16161641 if (!dcm_parse_dataset (error ,
16171642 filehandle -> io ,
1618- // FIXME we should check transfer syntax for this
1619- false,
1643+ filehandle -> implicit ,
16201644 & parse ,
16211645 filehandle )) {
16221646 return false;
0 commit comments