blob: 7c5fe44fc82d6d65acec09ef3ac0454d36f4681d [file] [log] [blame]
// Copyright 2023 The PDFium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "samples/helpers/win32/com_factory.h"
#include <combaseapi.h>
#include <objbase.h>
#include <winerror.h>
#include <xpsobjectmodel.h>
#include "third_party/base/check_op.h"
ComFactory::ComFactory() = default;
ComFactory::~ComFactory() {
if (xps_om_object_factory_) {
xps_om_object_factory_->Release();
}
if (initialized_) {
CoUninitialize();
}
}
bool ComFactory::Initialize() {
if (!initialized_) {
HRESULT result =
CoInitializeEx(nullptr, COINIT_MULTITHREADED | COINIT_DISABLE_OLE1DDE);
DCHECK_NE(RPC_E_CHANGED_MODE, result);
initialized_ = SUCCEEDED(result);
}
return initialized_;
}
IXpsOMObjectFactory* ComFactory::GetXpsOMObjectFactory() {
if (!xps_om_object_factory_ && Initialize()) {
HRESULT result =
CoCreateInstance(__uuidof(XpsOMObjectFactory), /*pUnkOuter=*/nullptr,
CLSCTX_INPROC_SERVER, __uuidof(IXpsOMObjectFactory),
reinterpret_cast<LPVOID*>(&xps_om_object_factory_));
if (SUCCEEDED(result)) {
DCHECK(xps_om_object_factory_);
} else {
DCHECK(!xps_om_object_factory_);
}
}
return xps_om_object_factory_;
}