| 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' } | 
| } |