// 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 "testing/pdfium_test/win32/com_factory.h"

#include <combaseapi.h>
#include <objbase.h>
#include <winerror.h>
#include <xpsobjectmodel.h>

#include "core/fxcrt/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_;
}
