Quintiq file version 2.0 
 | 
#parent: #root 
 | 
Method SendDataRequestSetChunkedTransmission (LibDEF_Systems targets_i, LibDEF_Set set_i, Boolean isNewSet_i,  
 | 
  NamedValueTree cachedSetNvt_i) 
 | 
{ 
 | 
  Description: 
 | 
  [* 
 | 
    Send a Data-Request message of that Set which has been updated in DataRepository in chunked transmission mode. 
 | 
    This code is to initialize the chunked transmission. 
 | 
    The rest of the chunked transmission will be done asynchronously afterward. 
 | 
  *] 
 | 
  TextBody: 
 | 
  [* 
 | 
    headerType := ifexpr( isNewSet_i, 
 | 
                          LibDEF_DataAccessor::TYPE_DATA_SETCREATEDCHUNKED(), 
 | 
                          LibDEF_DataAccessor::TYPE_DATA_SETUPDATEDCHUNKED() ); 
 | 
    // some local variables 
 | 
    dataBroker := this.DataBroker(); 
 | 
     
 | 
    // Export the Set into NVT. 
 | 
    // If the cached Set NVT exists, then just clone it instead to save performance cost of re-exporting the Set. 
 | 
    setNvt := ifexpr( not isnull( cachedSetNvt_i ), 
 | 
                      cachedSetNvt_i.Clone(), 
 | 
                      NamedValueTreeIO::Export( set_i ) ); 
 | 
     
 | 
    // Create the data transfer object for each target 
 | 
    // and send the data transfer to each chunked transmission target for initialization 
 | 
    totalContentLength := LibDEF_NamedValueTreeProcessor::GetCumulativeNumberOfChildren( setNvt.Root() ); 
 | 
    setMeta     := LibDEF_SetMeta::FindSetMeta( dataBroker, dataBroker.SystemLocal().GUID(), 
 | 
                                                set_i.ChannelName(), set_i.SetTypeName(), set_i.Name() ); 
 | 
    dataTransfers := construct( LibDEF_DataTransfers ); 
 | 
     
 | 
    traverse( targets_i, Elements, target ) 
 | 
    { 
 | 
      event := dataBroker.EventCreate( target, false ); 
 | 
     
 | 
      // create a DataTransfer 
 | 
      transfer := LibDEF_DataTransfer::Create( dataBroker.QueueOutbox(), 
 | 
                                               totalContentLength, 
 | 
                                               "", 
 | 
                                               setMeta, 
 | 
                                               target, 
 | 
                                               event ); 
 | 
      dataTransfers.Add( transfer ); 
 | 
       
 | 
      // create initialization message 
 | 
      nvt := LibDEF_DataAccessor::CreateMessageData(); 
 | 
       
 | 
      // add extra Header 
 | 
      LibDEF_DataAccessor::SetDataHeaderProperty( nvt, LibDEF_DataAccessor::HEADER_TYPE(),    headerType ); 
 | 
      LibDEF_DataAccessor::SetDataHeaderProperty( nvt, LibDEF_DataAccessor::HEADER_ISINIT(),  true ); 
 | 
      LibDEF_DataAccessor::SetDataHeaderProperty( nvt, LibDEF_DataAccessor::HEADER_SETGUID(), transfer.SetMeta().GUID() ); 
 | 
      LibDEF_DataAccessor::SetDataHeaderProperty( nvt, LibDEF_DataAccessor::HEADER_SETLASTUPDATED(), set_i.LastUpdated() ); 
 | 
      LibDEF_DataAccessor::SetDataHeaderProperty( nvt, LibDEF_DataAccessor::HEADER_DATATRANSFERGUID(), transfer.GUID() ); 
 | 
     
 | 
      // export the DataTransfer into NVT 
 | 
      LibDEF_DataAccessor::SetDataBody( nvt, NamedValueTreeIO::Export( transfer ) ); 
 | 
     
 | 
      // send the initialization message 
 | 
      event := transfer.IntegrationEvent(); 
 | 
      channel := set_i.SetType().Channel(); 
 | 
      LibDEF_Util::EventLog( event, "Sending " + headerType + " (by chunk) request to system '" + target.Name() + "'" ); 
 | 
      dataBroker.SendData( target, nvt, LibDEF_DataAccessor::KIND_REQUEST(), 
 | 
                           event, channel.Name(), channel.MajorVersion(), channel.MinorVersion() ); 
 | 
    } 
 | 
     
 | 
    // Now create the data pieces for all the data transfers above. 
 | 
    // The algorithm below is used to save performance by avoiding redundant data chunking. 
 | 
    LibDEF_DataTransfer::CreateDataPieces( dataTransfers, setNvt ); 
 | 
  *] 
 | 
  InterfaceProperties { Accessibility: 'Module' } 
 | 
} 
 |