From: Vibhav Pant <vibhavp(a)gmail.com> --- dlls/opcservices/compress.c | 7 +++++++ dlls/opcservices/factory.c | 21 ++++++++++++++++++--- dlls/opcservices/opc_private.h | 7 ++++++- dlls/opcservices/package.c | 22 +++++++++++++++++++++- dlls/opcservices/tests/opcservices.c | 10 ++++++++-- include/opcbase.idl | 2 ++ 6 files changed, 62 insertions(+), 7 deletions(-) diff --git a/dlls/opcservices/compress.c b/dlls/opcservices/compress.c index abfa8aa6912..fcdbe8654f6 100644 --- a/dlls/opcservices/compress.c +++ b/dlls/opcservices/compress.c @@ -560,3 +560,10 @@ HRESULT compress_add_file(struct zip_archive *archive, const WCHAR *path, return S_OK; } + +HRESULT compress_open_archive(IOpcFactory *factory, IStream *stream, struct opc_part_set *part_set) +{ + FIXME("(%p, %p, %p) stub\n", factory, stream, part_set); + + return S_OK; +} diff --git a/dlls/opcservices/factory.c b/dlls/opcservices/factory.c index fcebb977c1d..fef1a190483 100644 --- a/dlls/opcservices/factory.c +++ b/dlls/opcservices/factory.c @@ -369,15 +369,30 @@ static HRESULT WINAPI opc_factory_CreatePackage(IOpcFactory *iface, IOpcPackage { TRACE("iface %p, package %p.\n", iface, package); - return opc_package_create(iface, package); + return opc_package_create(iface, NULL, package); } static HRESULT WINAPI opc_factory_ReadPackageFromStream(IOpcFactory *iface, IStream *stream, OPC_READ_FLAGS flags, IOpcPackage **package) { - FIXME("iface %p, stream %p, flags %#x, package %p stub!\n", iface, stream, flags, package); + struct opc_part_set *part_set; + HRESULT hr; - return E_NOTIMPL; + TRACE("iface %p, stream %p, flags %#x, package %p\n", iface, stream, flags, package); + + if (flags) + FIXME("Unsupported flags: %#x\n", flags); + + if (FAILED(hr = opc_part_set_create(&part_set))) + return hr; + if (FAILED(hr = compress_open_archive(iface, stream, part_set))) + { + opc_part_set_release(part_set); + return hr; + } + hr = opc_package_create(iface, part_set, package); + opc_part_set_release(part_set); + return hr; } static HRESULT WINAPI opc_factory_WritePackageToStream(IOpcFactory *iface, IOpcPackage *package, OPC_WRITE_FLAGS flags, diff --git a/dlls/opcservices/opc_private.h b/dlls/opcservices/opc_private.h index 8365916eebb..0147a28f923 100644 --- a/dlls/opcservices/opc_private.h +++ b/dlls/opcservices/opc_private.h @@ -56,16 +56,21 @@ struct opc_uri IUri *rels_part_uri; struct opc_uri *source_uri; }; +struct opc_part_set; -extern HRESULT opc_package_create(IOpcFactory *factory, IOpcPackage **package); +extern HRESULT opc_package_create(IOpcFactory *factory, struct opc_part_set *part_set, IOpcPackage **package); extern HRESULT opc_part_uri_create(IUri *uri, struct opc_uri *source_uri, IOpcPartUri **part_uri); extern HRESULT opc_root_uri_create(IOpcUri **opc_uri); extern HRESULT opc_package_write(IOpcPackage *package, OPC_WRITE_FLAGS flags, IStream *stream); +extern HRESULT opc_part_set_create(struct opc_part_set **part_set); +extern void opc_part_set_release(struct opc_part_set *part_set); + struct zip_archive; extern HRESULT compress_create_archive(IStream *output, bool zip64, struct zip_archive **archive); extern HRESULT compress_add_file(struct zip_archive *archive, const WCHAR *path, IStream *content, OPC_COMPRESSION_OPTIONS options); extern HRESULT compress_finalize_archive(struct zip_archive *archive); extern void compress_release_archive(struct zip_archive *archive); +extern HRESULT compress_open_archive(IOpcFactory *factory, IStream *stream, struct opc_part_set *part_set); diff --git a/dlls/opcservices/package.c b/dlls/opcservices/package.c index b5a8537bb3d..847f917103e 100644 --- a/dlls/opcservices/package.c +++ b/dlls/opcservices/package.c @@ -1513,7 +1513,7 @@ static const IOpcPackageVtbl opc_package_vtbl = opc_package_GetRelationshipSet, }; -HRESULT opc_package_create(IOpcFactory *factory, IOpcPackage **out) +HRESULT opc_package_create(IOpcFactory *factory, struct opc_part_set *part_set, IOpcPackage **out) { struct opc_package *package; HRESULT hr; @@ -1529,6 +1529,8 @@ HRESULT opc_package_create(IOpcFactory *factory, IOpcPackage **out) free(package); return hr; } + if (part_set) + IOpcPartSet_AddRef((package->part_set = &part_set->IOpcPartSet_iface)); *out = &package->IOpcPackage_iface; TRACE("Created package %p.\n", *out); @@ -2054,3 +2056,21 @@ HRESULT opc_package_write(IOpcPackage *package, OPC_WRITE_FLAGS flags, IStream * return hr; } + +HRESULT opc_part_set_create(struct opc_part_set **out) +{ + struct opc_part_set *part_set; + + if (!(part_set = calloc(1, sizeof(*part_set)))) + return E_OUTOFMEMORY; + + part_set->IOpcPartSet_iface.lpVtbl = &opc_part_set_vtbl; + part_set->refcount = 1; + *out = part_set; + return S_OK; +} + +void opc_part_set_release(struct opc_part_set *part_set) +{ + IOpcPartSet_Release(&part_set->IOpcPartSet_iface); +} diff --git a/dlls/opcservices/tests/opcservices.c b/dlls/opcservices/tests/opcservices.c index 9ead97f9c62..aca7f91c8cf 100644 --- a/dlls/opcservices/tests/opcservices.c +++ b/dlls/opcservices/tests/opcservices.c @@ -1319,7 +1319,7 @@ static void test_read_package(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = IOpcFactory_ReadPackageFromStream(factory, stream, OPC_READ_DEFAULT, &package); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); IStream_Release(stream); if (FAILED(hr)) goto done; @@ -1338,7 +1338,13 @@ static void test_read_package(void) hr = IOpcFactory_CreatePartUri(factory, parts[i].uri, &uri); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = IOpcPartSet_GetPart(partset, uri, &part); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + if (FAILED(hr)) + { + IOpcPartUri_Release(uri); + winetest_pop_context(); + continue; + } hr = IOpcPart_GetContentType(part, &type); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); diff --git a/include/opcbase.idl b/include/opcbase.idl index a34c4ec27c1..c8419d3c623 100644 --- a/include/opcbase.idl +++ b/include/opcbase.idl @@ -53,3 +53,5 @@ cpp_quote("#define OPC_E_ENUM_CANNOT_MOVE_NEXT MAKE_HRESULT(SEVERITY_ERROR, FACI cpp_quote("#define OPC_E_ENUM_CANNOT_MOVE_PREVIOUS MAKE_HRESULT(SEVERITY_ERROR, FACILITY_OPC, 0x52)") cpp_quote("#define OPC_E_ENUM_INVALID_POSITION MAKE_HRESULT(SEVERITY_ERROR, FACILITY_OPC, 0x53)") cpp_quote("#define OPC_E_ZIP_COMPRESSION_FAILED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_OPC, 0x1003)") +cpp_quote("#define OPC_E_ZIP_CORRUPTED_ARCHIVE MAKE_HRESULT(SEVERITY_ERROR, FACILITY_OPC, 0x1002)") +cpp_quote("#define OPC_E_ZIP_DUPLICATE_NAME MAKE_HRESULT(SEVERITY_ERROR, FACILITY_OPC, 0x100b)") -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/8837