/*
 * PROJECT:     ReactOS Management Console
 * LICENSE:     GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
 * PURPOSE:     Snapin cache entry class
 * COPYRIGHT:   Copyright 2026 Eric Kohl (eric.kohl@reactos.org)
 */

#include "precomp.h"

#define NDEBUG
#include <debug.h>

#define IID_PPV_ARG(Itype, ppType) IID_##Itype, reinterpret_cast<void**>((static_cast<Itype**>(ppType)))

CSnapinCacheEntry::CSnapinCacheEntry(const CAtlString& guidString, const CAtlString& aboutGuidString, const CAtlString& name, HIMAGELIST hImageList)
    :m_GuidString(guidString), m_AboutGuidString(aboutGuidString), m_Name(name), m_Loaded(FALSE)
{
    ::CLSIDFromString(m_GuidString, &m_Guid);
    ::CLSIDFromString(m_AboutGuidString, &m_AboutGuid);

    CComPtr<ISnapinAbout> pSnapinAbout;
    HRESULT hr = CoCreateInstance(m_AboutGuid, NULL, CLSCTX_INPROC, IID_PPV_ARG(ISnapinAbout, &pSnapinAbout));
    DPRINT("CoCreateInstance %lx\n", hr);
    if (SUCCEEDED(hr))
    {
        LPOLESTR Str;

        hr = pSnapinAbout->GetProvider(&Str);
        DPRINT("GetProvider %lx\n", hr);
        if (SUCCEEDED(hr))
        {
            m_Provider = Str;
            CoTaskMemFree(Str);
        }

        hr = pSnapinAbout->GetSnapinDescription(&Str);
        DPRINT("GetDescription %lx\n", hr);
        if (SUCCEEDED(hr))
        {
            m_Description = Str;
            CoTaskMemFree(Str);
        }

        hr = pSnapinAbout->GetSnapinVersion(&Str);
        DPRINT("GetVersion %lx\n", hr);
        if (SUCCEEDED(hr))
        {
            m_Version = Str;
            CoTaskMemFree(Str);
        }

        HBITMAP hSmallImage, hSmallImageOpen, hLargeImage;
        COLORREF colorMask;

        hr = pSnapinAbout->GetStaticFolderImage(&hSmallImage,
                                                &hSmallImageOpen,
                                                &hLargeImage,
                                                &colorMask);
        if (SUCCEEDED(hr))
        {
            m_ImageNormal = ImageList_AddMasked(hImageList,
                                                hSmallImage,
                                                colorMask);

            m_ImageOpen = ImageList_AddMasked(hImageList,
                                              hSmallImageOpen,
                                              colorMask);

            DeleteObject(hSmallImage);
            DeleteObject(hSmallImageOpen);
            DeleteObject(hLargeImage);
        }

        hr = pSnapinAbout->GetSnapinImage(&m_hIcon);
    }
}

CSnapinCacheEntry::~CSnapinCacheEntry()
{
    DeleteObject(m_hIcon);
}