open-insight/SYSPROG/STPROC/RTI_DECOMPRESS_STRING.txt
2024-03-25 15:17:34 -07:00

98 lines
3.3 KiB
Plaintext

function rti_decompress_string(inString, status)
*#!Precompile
/*
* This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without
* written permission from Revelation Technologies, Inc.
!
* No warranties, express or implied, are conveyed by the use of this routine
!
* VERSION : 1.0
*
*
* AUTHOR : Bryan Shumsky
*
* CREATED : February 16, 2022
*
*
!
*
* REVISION HISTORY (Most CURRENT first) :
*
* DATE IMPLEMENTOR FUNCTION
* -------- ----------- --------
*
*/
$Insert RevDotNetEquates
If Assigned(inString) Else inString = ""
Status = 0
rslt = ""
If inString = "" Then
Status = "-2"
Return rslt
End
dotNetHandle = ""
dotNetVersion = "4.0"
oNet = StartDotNet("", dotNetVersion, dotNetHandle)
if Get_Status(errcode) Then
Goto returnErr
End
netLocn = CheckDotNet(dotNetVersion)
If netLocn <> "0" And netLocn <> "" Then
If netLocn[-1,1] <> "\" Then netLocn := "\"
End Else netLocn = ""
oiLocn = drive()
If oiLocn[-1,1] <> "\" Then oiLocn := "\"
x = set_property.net(oNet, "AssemblyName", netLocn:"System.dll":@fm:netLocn:"mscorlib.dll", dotNetHandle)
If Get_Status(errcode) Then Goto returnErr
* step 1: convert from base64 string to an array of bytes
oConverter = create_class.net(oNet, "System.Convert", 0, "", "", dotNetHandle)
If Get_Status(errcode) Then Goto returnErr
oBytes = send_message.net(oConverter, "FromBase64String", inString, "", 1, dotNetHandle)
If Get_Status(errcode) Then Goto returnErr
* step 2: make a "memory stream" from that byte array
oInputStream = create_class.net(oNet, "System.IO.MemoryStream", 0, oBytes, "", dotNetHandle)
If Get_Status(errcode) Then Goto returnErr
* step 3: use gzipstream to decompress the incoming memory stream to an outgoing memory stream
oOutputStream = create_class.net(oNet, "System.IO.MemoryStream", 0, "", "", dotNetHandle)
If Get_Status(errcode) Then Goto returnErr
oCompressor = create_class.net(oNet, "System.IO.Compression.GZipStream", 0, oInputStream:@FM:"0":@FM:"True", "":@FM:"System.IO.Compression.CompressionMode":@FM:"System.Boolean", dotNetHandle)
If Get_Status(errcode) Then Goto returnErr
dummy = send_message.net(oCompressor, "CopyTo", oOutputStream, "", 0, dotNetHandle)
If Get_Status(errcode) Then Goto returnErr
* note: must close the gzipstream to "flush" the contents
dummy = send_message.net(oCompressor, "Close", "", "", 0, dotNetHandle)
If Get_Status(errcode) Then Goto returnErr
* step 4: turn the outgoing memory stream into an array of bytes
oDecompressed = send_message.net(oOutputStream, "ToArray", "", "", 1, dotNetHandle)
If Get_Status(errcode) Then Goto returnErr
* note: must close the streams
dummy = send_message.net(oOutputStream, "Close", "", "", 0, dotNetHandle)
dummy = send_message.net(oInputStream, "Close", "", "", 0, dotNetHandle)
* step 5: turn the array of bytes into a UTF8 string
oEncoding = create_class.net(oNet, "System.Text.UTF8Encoding", 0, "", "", dotNetHandle)
If Get_Status(errcode) Then Goto returnErr
rslt = send_message.net(oEncoding, "GetString", oDecompressed, "", 0, dotNetHandle)
If Get_Status(errcode) Then Goto returnErr
Goto wrapup
returnErr:
* error handling here
* Do something With errcode
Status = "-1"
wrapup:
free_class.net("", dotNetHandle)
Return rslt