Partager via


4.1.10.5.20 TransformOutput

 procedure TransformOutput(
   msgOut: DRS_MSG_GETCHGREPLY_NATIVE,
   flags: DRS_OPTIONS,
   pdwOutVersion: ADDRESS OF DWORD,
   pmsgOut: ADDRESS OF DRS_MSG_GETCHGREPLY): ULONG

Informative summary of behavior: The TransformOutput procedure transforms the native reply (a superset of all supported reply messages) into the reply version supported by the client, optionally compressing it. The compression algorithms used for the DRS_COMP_ALG_WIN2K3 algorithm type are specified in section 4.1.10.5.21. The compression algorithm used for the DRS_COMP_ALG_MSZIP algorithm type is specified in [RFC1951].

 pickled: sequence of BYTE
 compressed: sequence of BYTE
 allowedAlgs: set of DRS_COMP_ALG_TYPE
 compressAlg: DRS_COMP_ALG_TYPE
 compress: boolean
  
 /* The SMTP transport [MS-SRPL] performs its own compression. */
 compress := DRS_USE_COMPRESSION in flags 
             and not DRS_MAIL_REP in flags
  
 if pdwOutVersion^ < dc.minimumGetChangesReplyVersion
     return ERROR_REVISION_MISMATCH
  
 if pdwOutVersion^ = 9 or pdwOutVesion^ = 6 then
   if pdwOutVersion^ = 9 then
     /* Convert to V9.*/
     pdwOutVersion^ := 9
     pmsgOut^.V9 := msgOut
   else if pdwOutVersion^ = 6 then
     /* Convert to V6. */         
     pdwOutVersion^ := 6
     pmsgOut^.V6 := msgOut
     pmsgOut^.V6.rgValues := ReplValInfV1ListFromReplValInfNativeList(msgOut.rgValues) 
   endif
  
   if compress then
     /* Note that the only difference between the compression processing of a V2 and  */
     /* a V7 message is that a V7 message can use the DRS_COMP_ALG_WIN2K3 compression */
     /* algorithm and a V2 message can not.                                           */
     /* Return V7 (compressed V6 or V9). */
     if not DRS_EXT_GETCHGREPLY_V7 in ext.dwFlags then
       return ERROR_REVISION_MISMATCH
     endif
  
     /* Serialize msgOut into a byte stream. */
     pickled := Pickling of pmsgOut^.V6 or pmsgOut^.V9, as specified by
         [C311] Part 2, "IDL/NDR Pickles", and
         [MS-RPCE] sections 2.2.6 and 2.2.7, "Type Serialization
         Version 1" and "Type Serialization Version 2"
  
     /* Select a compression algorithm. */
     allowedAlgs := {DRS_COMP_ALG_NONE, DRS_COMP_ALG_MSZIP}
     if DRS_EXT_W2K3_DEFLATE in ext.dwFlags then
       allowedAlgs := allowedAlgs + {DRS_COMP_ALG_WIN2K3}
     endif
     compressAlg := One of allowedAlgs, selected by an
         implementation-defined policy.
  
     /* Compress the serialized msgOut. */
     if (compressionAlg = DRS_COMP_ALG_MSZIP) then
       compressed :=
         Compress pickled in accordance
         with [RFC1951].
     else
       CompressOrDecompressWin2k3(pickled, compressed, pickled.length, TRUE)
     endif
     pmsgOut^.V7.dwCompressedVersion := pdwOutVersion^
     pmsgOut^.V7.CompressionAlg := compressAlg
     pmsgOut^.V7.CompressedAny.cbUncompressedSize := pickled.length
     pmsgOut^.V7.CompressedAny.cbCompressedSize := compressed.length
     pmsgOut^.V7.CompressedAny.pbCompressedData := bytes in compressed
     pdwOutVersion^ := 7
   endif
 else
   /* Return V1 (uncompressed) or V2 (compressed V1). */ 
   /* First, convert to V1. */
   pdwOutVersion^ := 1
   pmsgOut^.V1 := msgOut
   pmsgOut^.V1.pUpToDateVecSrc := Convert msgOut.pUpToDateVecSrc (of
       type UPTODATE_VECTOR_V1_EXT) to UPTODATE_VECTOR_V2_EXT by
       creating a new UPTODATE_VECTOR_V1_EXT with a V1 cursor for each
       V2 cursor, sans the timeLastSyncSuccess field.
   /* V1 has the NC size in the ulExtendedRet field. */
   if msgOut.cNumNcSizeObjects > 0 then
     pmsgOut^.V1.ulExtendedRet := msgOut.cNumNcSizeObjects
   endif
  
   if compress then
     /* Serialize msgOut into a byte stream. */
     pickled := Pickling of pmsgOut^.V1, as specified by
         [C311] Part 2, "IDL/NDR Pickles" and
         [MS-RPCE] sections 2.2.6 and 2.2.7, "Type Serialization
         Version 1" and "Type Serialization Version 2"
  
     /* Select a compression algorithm. */
     allowedAlgs := {DRS_COMP_ALG_NONE, DRS_COMP_ALG_MSZIP}
     compressAlg := One of allowedAlgs, selected by an 
                    implementation-defined policy.
  
     /* Compress the serialized msgOut. */
     if (compressionAlg = DRS_COMP_ALG_MSZIP) then
       compressed :=
         Compress pickled in accordance
         with [RFC1951].
     else
       CompressOrDecompressWin2k3(pickled, compressed, pickled.length, TRUE)
     endif
     pdwOutVersion^ := 2
     pmsgOut^.V2.CompressedV1.cbUncompressedSize := pickled.length
     pmsgOut^.V2.CompressedV1.cbCompressedSize := compressed.length
     pmsgOut^.V2.CompressedV1.pbCompressedData := bytes in compressed
   endif
 endif
  
 return 0