Hello,
This may be a silly question but I was wondering if I could "add" a file within an XML file.
I'm working in a development where I need to "attach" some files to an existing XML file to be later transferred to another system.
I was thinking (and I've already done some steps) of creating some extra nodes in the XML file and just use the method
MEMPTR-TO-NODE-VALUE( ) from the x-noderef class.
However, in the receiving system, I'm having some issues when splitting the file into the original part and those "attachments".
At first, in the sending side I just did:
COPY-LOB FROM FILE 'myfile.pdf' TO mData. where mData is a memptr. Afterwards, I ran the memptr-to-node-value() and the try to split the file in the receiving side, but the file I was able to create seem corrupted and for sure had a smaller size..I couldn't open it.
In my second attempt I added an BASE64-ENCODE(mData) and the memptr I passed to the x-noderef was binary data in the sending side. However, when trying to split the file I get "Invalid character data found in MEMPTR for codepage ISO8859-1 (12012)".
Does someone know how I could fix this keeping in mind that my goal is just to send everything in this same XML file?
Thanks in advance!
Hello Brian,
Thanks for your quick response.
I've done something as follows:
Sending side:
COPY-LOB FROM FILE 'myfile.pdf' TO mData. (mData is a memptr)
lv_pdfFile = BASE64-ENCODE(mData). (lv_pdfFile is a longchar)
COPY-LOB FROM lv_pdfFile TO mb64Data. (mb64Data is a memptr)
....
hxdoc:CREATE-NODE(hNoderefValue, "", "CDATA-SECTION").
hNoderefChild2:APPEND-CHILD(hNoderefValue).
hNoderefValue:MEMPTR-TO-NODE-VALUE(mb64Data).
Receiving side:
...
hNodeAttach_cont:NODE-VALUE-TO-MEMPTR(hNodeContent). (hNodeContent is a memptr)
COPY-LOB FROM hNodeContent to lv_pdfFile. (lv_pdfFile is memptr and lv_pdfFile is a longchar)
lv_mData = BASE64-DECODE(lv_pdfFile). (lv_mData is a memptr)
COPY-LOB FROM lv_mData to FILE "myreceivedfile.pdf".
Still receiving the error "Invalid character data found in MEMPTR for codepage ISO8859-1" in the yellow-highlighted line
I've tried to use the CONVERT, NO-CONVERT expressions without any success..
Any idea?
Sending side:
define variable lv_mData as memptr no-undo.
define variable lv_mb64Data as memptr no-undo.
define variable lv_pdfFile as longchar no-undo.
define variable iph_xdocument as handle no-undo.
define variable hNodeRef as handle no-undo.
define variable hNoderefChild as handle no-undo.
define variable hNoderefChild2 as handle no-undo.
define variable hNoderefValue as handle no-undo.
create x-noderef hNodeRef.
create x-noderef hNoderefChild.
create x-noderef hNoderefChild2.
create x-noderef hNoderefValue.
/* File to memptr */
COPY-LOB FROM FILE 'myFile.pdf' TO lv_mData.
lv_pdfFile = BASE64-ENCODE(lv_mData).
COPY-LOB FROM lv_pdfFile TO lv_mb64Data.
/* Create the structure
<Attachment>
<Name> file_name </name>
<Content> FILE CONTENT HERE </content>
</Attachment>
*/
iph_xdocument:CREATE-NODE(hNoderefChild, "Attachment", "ELEMENT").
iph_Root:APPEND-CHILD(hNoderefChild).
iph_xdocument:CREATE-NODE(hNoderefChild2, "Name", "ELEMENT").
hNoderefChild:APPEND-CHILD(hNoderefChild2).
iph_xdocument:CREATE-NODE(hNoderefValue, "", "TEXT").
hNoderefChild2:APPEND-CHILD(hNoderefValue).
hNoderefValue:NODE-VALUE = "myFile.pdf".
iph_xdocument:CREATE-NODE(hNoderefChild2, "Content", "ELEMENT").
hNoderefChild:APPEND-CHILD(hNoderefChild2).
iph_xdocument:CREATE-NODE(hNoderefValue, "", "CDATA-SECTION").
hNoderefChild2:APPEND-CHILD(hNoderefValue).
hNoderefValue:MEMPTR-TO-NODE-VALUE(lv_mb64Data).
Receiving side:
define input parameter iph_hNodeRef as handle no-undo.
define variable hNodeAttach as handle no-undo.
define variable hNodeContent as memptr no-undo.
define variable hNodeAttach_cont as handle no-undo.
define variable lv_pdfFile as longchar no-undo.
define variable lv_mData as memptr no-undo.
create x-noderef hNodeAttach.
create x-noderef hNodeAttach_cont.
....
if (hNodeAttach:LOCAL-NAME) = "Content" then do:
hNodeAttach:GET-CHILD(hNodeAttach_cont, 1).
hNodeAttach_cont:NODE-VALUE-TO-MEMPTR(hNodeContent).
COPY-LOB FROM hNodeContent to lv_pdfFile.
lv_mData = BASE64-DECODE(lv_pdfFile).
COPY-LOB FROM lv_mData to FILE "myreceivedfile.pdf".
end.
I've changed somethings cause the code is split in different procedures etc..so I tried to not miss any of the key parts.
Hi again, I've tried working with the SAX-writer / SAX-reader, but eventually I end up with the same "Invalid character data found in MEMPTR for codepage ISO8859-1" error.
At some point, because of the BASE64-ENCODE/DECODE and the usage of the copy-lob I have an issue with the codepage ..
Any suggestion?
I'd say it's some kind of bug / really crap default handling on copy-lob from memptr to longchar. The memptr is null terminated, the null is screwing up the copy-lob.
If you change:
COPY-LOB FROM hNodeContent to lv_pdfFile.
to:
COPY-LOB FROM hNodeContent starting at 1 for get-size( hnodecontent ) - 1 to lv_pdfFile.
Then you should be fine (it worked for me).
BTW next time, please add a abldojo.services.progress.com/ snippet or a snippet that actually compiles. It lowers the barrier for anyone wanting to actually look at your issue.