From 2bd72b117cd7b19d91edb7eb664df246c632f739 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Wed, 19 Sep 2018 14:19:33 +0300 Subject: [PATCH] opcservices: Write package parts. Signed-off-by: Nikolay Sivov Signed-off-by: Alexandre Julliard --- dlls/opcservices/package.c | 66 +++++++++++++++++++++++++++++++++++++- 1 file changed, 65 insertions(+), 1 deletion(-) diff --git a/dlls/opcservices/package.c b/dlls/opcservices/package.c index f3503945b5b..5c338f7c13a 100644 --- a/dlls/opcservices/package.c +++ b/dlls/opcservices/package.c @@ -1493,7 +1493,69 @@ static HRESULT opc_package_write_contenttypes(struct zip_archive *archive, IXmlW return hr; } -HRESULT opc_package_write(IOpcPackage *input, OPC_WRITE_FLAGS flags, IStream *stream) +static HRESULT opc_package_write_part(struct zip_archive *archive, IOpcPart *part) +{ + OPC_COMPRESSION_OPTIONS options = OPC_COMPRESSION_NORMAL; + IStream *content = NULL; + IOpcPartUri *name; + BSTR uri = NULL; + HRESULT hr; + + if (FAILED(hr = IOpcPart_GetName(part, &name))) + return hr; + + hr = IOpcPartUri_GetRawUri(name, &uri); + if (SUCCEEDED(hr)) + hr = IOpcPart_GetCompressionOptions(part, &options); + if (SUCCEEDED(hr)) + hr = IOpcPart_GetContentStream(part, &content); + if (SUCCEEDED(hr)) + { + /* Part names always start with root '/', skip it. */ + hr = compress_add_file(archive, uri + 1, content, options); + } + + SysFreeString(uri); + if (content) + IStream_Release(content); + + return hr; +} + +static HRESULT opc_package_write_parts(struct zip_archive *archive, IOpcPackage *package) +{ + IOpcPartEnumerator *parts; + IOpcPartSet *part_set; + BOOL got_next; + HRESULT hr; + + if (FAILED(hr = IOpcPackage_GetPartSet(package, &part_set))) + return hr; + + hr = IOpcPartSet_GetEnumerator(part_set, &parts); + IOpcPartSet_Release(part_set); + if (FAILED(hr)) + return hr; + + while (IOpcPartEnumerator_MoveNext(parts, &got_next) == S_OK && got_next) + { + IOpcPart *part; + + if (FAILED(hr = IOpcPartEnumerator_GetCurrent(parts, &part))) + break; + + hr = opc_package_write_part(archive, part); + IOpcPart_Release(part); + if (FAILED(hr)) + break; + } + + IOpcPartEnumerator_Release(parts); + + return hr; +} + +HRESULT opc_package_write(IOpcPackage *package, OPC_WRITE_FLAGS flags, IStream *stream) { struct zip_archive *archive; IXmlWriter *writer; @@ -1513,6 +1575,8 @@ HRESULT opc_package_write(IOpcPackage *input, OPC_WRITE_FLAGS flags, IStream *st /* [Content_Types].xml */ hr = opc_package_write_contenttypes(archive, writer); + if (SUCCEEDED(hr)) + hr = opc_package_write_parts(archive, package); compress_finalize_archive(archive); IXmlWriter_Release(writer);