| Quintiq file version 2.0 | 
| #parent: #root | 
| Method SendDataByChunkOnSuccess (NamedValueTree nvt_i, LibDEF_DataTransfer dataTransfer_i, String messageKind_i,  | 
|   String messageType_i) | 
| { | 
|   Description: 'Send a Data (by chunk) message with the chunked payload of a Set.' | 
|   TextBody: | 
|   [* | 
|     // Jacky CHAN Aug-2-2016 (created) | 
|     event  := dataTransfer_i.IntegrationEvent(); | 
|     isInit := LibDEF_DataAccessor::GetDataHeaderPropertyAsBoolean( nvt_i, LibDEF_DataAccessor::HEADER_ISINIT() ); | 
|      | 
|     if( isInit ) | 
|     { | 
|       // if set updated, chunking already done before sending the data transfer, thus no need to be done | 
|       if( not messageType_i = LibDEF_DataAccessor::TYPE_DATA_SETUPDATEDCHUNKED()  | 
|           and not messageType_i = LibDEF_DataAccessor::TYPE_DATA_SETCREATEDCHUNKED() ) | 
|       { | 
|         // Get the payload to be chunked | 
|         nvtPayload := null( NamedValueTree, owning ); | 
|         if( LibDEF_DataAccessor::GetInternalMessageHeaderPropertyAsString( nvt_i, LibDEF_DataAccessor::HEADER_TYPE() ) = LibDEF_DataAccessor::TYPE_INTERNALMESSAGE_PAYLOADTOCHUNK() ) | 
|         { | 
|           nvtPayload := LibDEF_DataAccessor::GetInternalMessageBodyNvt( nvt_i ); | 
|         } | 
|          | 
|         // Give error if there is no payload to be chunked | 
|         if( isnull( nvtPayload ) ) | 
|         { | 
|           LibDEF_Util::EventLogError( event, | 
|                                       "Failed to chunk payload.", | 
|                                       "The given NVT payload is null. Please check that the InternalMessage in the NVT is filled in with the payload to be chunked." ); | 
|         } | 
|         else | 
|         { | 
|           // Chunk the payload and create data pieces | 
|           LibDEF_Util::EventLog( dataTransfer_i.IntegrationEvent(), "Preparing data pieces (chunking NVT)." ); | 
|           dataTransfer_i.CreateDataPieces( nvtPayload ); | 
|         } | 
|       } | 
|     } | 
|     else | 
|     { | 
|       // mark the last DataPiece as completed | 
|       lastSeqNr     := LibDEF_DataAccessor::GetDataHeaderPropertyAsNumber( nvt_i, LibDEF_DataAccessor::HEADER_SEQUENCENR() ); | 
|       lastDataPiece := select( dataTransfer_i, DataPiece, piece, | 
|                                piece.SequenceNr() = lastSeqNr ); | 
|       if( not isnull( lastDataPiece ) ) | 
|       { | 
|         lastDataPiece.IsCompleted( true ); | 
|       } | 
|     } | 
|      | 
|     if( dataTransfer_i.CanExecute() ) | 
|     { | 
|       // get the chunk of payload using SubString | 
|       nextDataPiece := dataTransfer_i.GetNextDataPiece(); | 
|        | 
|       if( not isnull( nextDataPiece ) ) | 
|       { | 
|         // send the next DataPiece | 
|         nvt := LibDEF_DataAccessor::CreateMessageData(); | 
|          | 
|         // Fill in the body of NVT with the next data piece. | 
|         LibDEF_DataAccessor::SetDataBodyProperty( nvt, LibDEF_DataAccessor::HEADER_CHUNKDATA(), nextDataPiece.Payload() ); | 
|          | 
|         // add headers | 
|         datasetMDSID := LibDEF_DataAccessor::GetDataHeaderPropertyAsKey( nvt_i, LibDEF_DataAccessor::HEADER_DATASETMDSID() ); | 
|         datasetDTD := LibDEF_DataAccessor::GetDataHeaderPropertyAsKey( nvt_i, LibDEF_DataAccessor::HEADER_DATASETDTD() ); | 
|         datasetType := LibDEF_DataAccessor::GetDataHeaderPropertyAsString( nvt_i, LibDEF_DataAccessor::HEADER_DATASETMODELTYPE() ); | 
|         LibDEF_DataAccessor::SetDataHeaderProperty( nvt, LibDEF_DataAccessor::HEADER_TYPE(), messageType_i ); | 
|         LibDEF_DataAccessor::SetDataHeaderProperty( nvt, LibDEF_DataAccessor::HEADER_SETTYPEGUID(), dataTransfer_i.SetMeta().SetTypeMeta().GUID() ); | 
|         LibDEF_DataAccessor::SetDataHeaderProperty( nvt, LibDEF_DataAccessor::HEADER_SETGUID(), dataTransfer_i.SetMeta().GUID() ); | 
|         LibDEF_DataAccessor::SetDataHeaderProperty( nvt, LibDEF_DataAccessor::HEADER_SETLASTUPDATED(), dataTransfer_i.SetMeta().LastUpdated() ); | 
|         LibDEF_DataAccessor::SetDataHeaderProperty( nvt, LibDEF_DataAccessor::HEADER_DATASETMDSID(), datasetMDSID ); | 
|         LibDEF_DataAccessor::SetDataHeaderProperty( nvt, LibDEF_DataAccessor::HEADER_DATASETDTD(), datasetDTD ); | 
|         LibDEF_DataAccessor::SetDataHeaderProperty( nvt, LibDEF_DataAccessor::HEADER_DATASETMODELTYPE(), datasetType ); | 
|          | 
|         // add extra Header related to chunking | 
|         LibDEF_DataAccessor::SetDataHeaderProperty( nvt, LibDEF_DataAccessor::HEADER_ISINIT(),           false ); | 
|         LibDEF_DataAccessor::SetDataHeaderProperty( nvt, LibDEF_DataAccessor::HEADER_DATATRANSFERGUID(), dataTransfer_i.GUID() ); | 
|         LibDEF_DataAccessor::SetDataHeaderProperty( nvt, LibDEF_DataAccessor::HEADER_SEQUENCENR(),       nextDataPiece.SequenceNr() ); | 
|         LibDEF_DataAccessor::SetDataHeaderProperty( nvt, LibDEF_DataAccessor::HEADER_CHUNK_CHECKSUM(),   nextDataPiece.PayloadChecksum() ); | 
|          | 
|         // use ChannelMeta of the sender | 
|         channelName := dataTransfer_i.SetMeta().ChannelName(); | 
|         channelMeta := select( this, DataBroker.SystemLocal.ChannelMeta, localCM, | 
|                                localCM.Name() = channelName ); | 
|         eventTitle  := "Sending GetSet data piece sequence-nr #" + [String]nextDataPiece.SequenceNr() + ", total number of pieces is " + [String]dataTransfer_i.GetNumberOfDataPieces() + "."; | 
|          | 
|         if( not isnull( channelMeta ) ) | 
|         { | 
|           LibDEF_Util::EventLog( event, eventTitle ); | 
|            | 
|           // send the data-chunk message | 
|           this.DataBroker().SendData( this, nvt, messageKind_i, event, channelMeta.Name(), channelMeta.MajorVersion(), channelMeta.MinorVersion() ); | 
|         } | 
|         else | 
|         { | 
|           LibDEF_Util::EventLogError( event, eventTitle, "Failed due to Channel " + channelName + " not found." ); | 
|         } | 
|       } | 
|       else | 
|       { | 
|         // all pieces have been sent | 
|         LibDEF_Util::EventLog( event, "Sending of Set [GUID: "  + dataTransfer_i.SetMeta().GUID() + | 
|                                       "] to the System [GUID: " + dataTransfer_i.ExternalSystem().GUID() + | 
|                                       "] in Chunked mode has completed." ); | 
|      | 
|         LibDEF_IntegrationEvent::EventComplete( event ); | 
|       } | 
|     } | 
|     else | 
|     { | 
|       // log error and terminate subsequent sending | 
|       LibDEF_Util::EventLogError( event, "Data transfer failed.", | 
|                                          "Data transfer of sending Set [GUID: " + dataTransfer_i.SetMeta().GUID() + | 
|                                          "] to System [GUID: "                  + dataTransfer_i.ExternalSystem().GUID() + | 
|                                          "] is interrupted." ); | 
|     } | 
|   *] | 
| } |