# GenSeqs.cxx

    /*=========================================================================

      Program: GDCM (Grassroots DICOM). A DICOM library
      Module:  $URL$

      Copyright (c) 2006-2009 Mathieu Malaterre
      All rights reserved.
      See Copyright.txt or http://gdcm.sourceforge.net/Copyright.html for details.

         This software is distributed WITHOUT ANY WARRANTY; without even
         the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
         PURPOSE.  See the above copyright notice for more information.

    =========================================================================*/
    #include "gdcmReader.h"
    #include "gdcmWriter.h"
    #include "gdcmItem.h"
    #include "gdcmImageReader.h"
    #include "gdcmSequenceOfItems.h"
    #include "gdcmFile.h"
    #include "gdcmTag.h"

    /*
     * This example is used to generate the file:
     *
     * gdcmConformanceTests/SequenceWithUndefinedLengthNotConvertibleToDefinedLength.dcm
     *
     * There is a flaw in the DICOM design were it is assumed that Sequence can be
     * either represented as undefined length or defined length. This should work
     * in most case, but the undefined length is a little more general and can
     * store sequence of items that a defined length cannot.
     * Deflated syntax was used in this case since this synthetic example can be
     * nicely compressed using this transfer syntax.
     *
     * Warning: do not try to compute the group length elements !
     */
    int main(int argc, char *argv[])
    {
      if( argc < 3 )
        {
        std::cerr << argv[0] << " input.dcm output.dcm" << std::endl;
        return 1;
        }
      const char *filename = argv[1];
      const char *outfilename = argv[2];
      gdcm::Reader reader;
      reader.SetFileName( filename );
      if( !reader.Read() )
        {
        return 1;
        }

      gdcm::File &file = reader.GetFile();
      gdcm::DataSet &ds = file.GetDataSet();

      const unsigned int nitems = 1000;
      const unsigned int ptr_len = 42; /*94967296 / nitems; */
      //assert( ptr_len == 42949672 );
      char *ptr = new char[ptr_len];
      memset(ptr,0,ptr_len);

      // Create a Sequence
      gdcm::SmartPointer<gdcm::SequenceOfItems> sq = new gdcm::SequenceOfItems();
      sq->SetLengthToUndefined();

      const char owner_str[] = "GDCM CONFORMANCE TESTS";
      gdcm::DataElement owner( gdcm::Tag(0x4d4d, 0x10) );
      owner.SetByteValue(owner_str, strlen(owner_str));
      owner.SetVR( gdcm::VR::LO );

      for(unsigned int idx = 0; idx < 10/* nitems*/; ++idx)
        {
        // Create a dataelement
        gdcm::DataElement de( gdcm::Tag(0x4d4d, 0x1002) );
        de.SetByteValue(ptr, ptr_len);
        de.SetVR( gdcm::VR::OB );

        // Create an item
        gdcm::Item it;
        it.SetVLToUndefined();
        gdcm::DataSet &nds = it.GetNestedDataSet();
        nds.Insert(owner);
        nds.Insert(de);

        sq->AddItem(it);
        }

      // Insert sequence into data set
      gdcm::DataElement des( gdcm::Tag(0x4d4d,0x1001) );
      des.SetVR(gdcm::VR::SQ);
      des.SetValue(*sq);
      des.SetVLToUndefined();

      ds.Insert(owner);
      ds.Insert(des);

      gdcm::Writer w;
      w.SetFile( file );
      //w.SetCheckFileMetaInformation( true );
      w.SetFileName( outfilename );
      if (!w.Write() )
        {
        return 1;
        }

      return 0;
    }