windows-nt/Source/XPSP1/NT/com/ole32/cs/csdrt/csdrtcat.cxx
2020-09-26 16:20:57 +08:00

513 lines
15 KiB
C++
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// csdrtcat.cxx
// This runs the following tests.
// Adds two classes catclsid1, catclsid2
// adds 3 categories
// 1 with 1 desc and locale id.
// 2 with 2 desc and locale id.
// 3 without 1 desc and locale id 2.
//
// register 2 categories in the req. list for catclsid1. (cat1, cat2)
// register 1 impl category in the impl list for catclsid1 (cat3)
//
// register 2 in the the impl for the catclsid2.(cat2, cat3)
//
// unregister 1 cat frm the req list for catclsid1 (cat2)
// register that one for impl list of catclsid1 (cat2)
//
//
// Info tests confirmations as well as tests.
//
// Enumcat result should be two. Match descriptions.
// EnumImplCategories of clsid1 should be 2. (cat2, cat3)
// EnumReqCategories of clsid2 should be zero.
//
// Enumclasses of categories with (req: cat1, cat3) (impl: cat2) should be two.
//
// GetCategoryDesc with the other locale id than the one used in EnumCat. cat2
// with any locale id cat3.
//
// IsClassOfCategories clsid1 impl cat2, req: cat1 answer should be S_OK
//
//
#include "csdrt.hxx"
extern BOOL fVerbose;
GUID catClsid1;
GUID catClsid2;
GUID testCatid1;
GUID testCatid2;
GUID testCatid3;
Sname testCatDesc1, testCatDesc2, testCatDesc21, testCatDesc3, TestCatClassDesc1, TestCatClassDesc2;
Sname testCatPackName1, testCatPackName2;
LCID TestCatLocale1, TestCatLocale2;
LPOLESTR testConstCatDesc1 = L"CS DRT Test Category Desc, 1 (Locale same as Thread)";
LPOLESTR testConstCatDesc2 = L"CS DRT Test Category Desc, 2 (Locale same as Thread)";
LPOLESTR testConstCatDesc21 = L"CS DRT Test Category Desc, 2 (Locale = Thread Locale + 1)";
LPOLESTR testConstCatDesc3 = L"CS DRT Test Category Desc, 3 (Locale = Thread Locale + 1)";
LPOLESTR testConstCatClassDesc1 = L"CS DRT Class id 1 for comcat test";
LPOLESTR testConstCatClassDesc2 = L"CS DRT Class id 2 for comcat test";
LPOLESTR testConstCatPackName1 = L"CS DRT Test Comcat Pack 1";
LPOLESTR testConstCatPackName2 = L"CS DRT Test Comcat Pack 2";
void InitCatTempNames()
{
CreateGuid(&catClsid1);
CreateGuid(&catClsid2);
CreateGuid(&testCatid1);
CreateGuid(&testCatid2);
CreateGuid(&testCatid3);
CreateUnique(testCatDesc1, testConstCatDesc1);
CreateUnique(testCatDesc2, testConstCatDesc2);
CreateUnique(testCatDesc21, testConstCatDesc21);
CreateUnique(testCatDesc3, testConstCatDesc3);
CreateUnique(TestCatClassDesc1, testConstCatClassDesc1);
CreateUnique(TestCatClassDesc2, testConstCatClassDesc2);
TestCatLocale1 = GetThreadLocale();
TestCatLocale2 = 2*TestCatLocale1 + 1;
CreateUnique(testCatPackName1, testConstCatPackName1);
CreateUnique(testCatPackName2, testConstCatPackName2);
}
void ReleaseObj(GUID obj)
{
}
void ReleaseObj(CATEGORYINFO obj)
{
}
HRESULT CreateCatClasses(IClassAdmin *pIClassAdmin1, IClassAdmin *pIClassAdmin2)
{
// CLASSDETAIL ClassDetail;
// PACKAGEDETAIL PackageDetail;
HRESULT hr = S_OK;
// adding classes--------------------------------
InitCatTempNames();
// memset (&ClassDetail, NULL, sizeof (CLASSDETAIL));
// memcpy (&ClassDetail.Clsid, &catClsid1, sizeof (GUID));
//
// memset(&PackageDetail, 0, sizeof(PACKAGEDETAIL));
// PackageDetail.pActInfo->cClasses = 1;
// PackageDetail.pActInfo->pClasses = (CLASSDETAIL *)CoTaskMemAlloc(sizeof(CLASSDETAIL));
// PackageDetail.pActInfo->pClasses[0] = ClassDetail;
//
// hr = pIClassAdmin1->AddPackage(testCatPackName1, &PackageDetail);
// if (!SUCCEEDED(hr))
// {
// printf ("ERROR! 1. NewPackage() in CatTest returned 0x%x.\n", hr);
// return hr;
// }
//
// PackageDetail.pActInfo->pClasses[0].Clsid = catClsid2;
//
// if (pIClassAdmin2)
// hr = pIClassAdmin2->AddPackage(testCatPackName2, &PackageDetail);
// else
// hr = pIClassAdmin1->AddPackage(testCatPackName2, &PackageDetail);
//
// if (!SUCCEEDED(hr))
// {
// printf ("ERROR! 2. NewPackage() in CatTest returned 0x%x.\n", hr);
// return hr;
// }
return hr;
}
HRESULT RegCategories(ICatRegister *pICatRegister1, ICatRegister *pICatRegister2)
{
HRESULT hr;
CATEGORYINFO CategoryInfo;
// adding categories---------------------------
memset (&CategoryInfo, NULL, sizeof (CATEGORYINFO));
memcpy(&CategoryInfo.catid, &testCatid1, sizeof(GUID));
CategoryInfo.lcid = TestCatLocale1;
wcscpy(CategoryInfo.szDescription, testCatDesc1);
hr = pICatRegister1->RegisterCategories(1, &CategoryInfo);
if (FAILED(hr))
{
printf("Error! 1. RegisterCategories in CatTest returned 0x%x.\n", hr);
return hr;
}
memset (&CategoryInfo, NULL, sizeof (CATEGORYINFO));
memcpy(&CategoryInfo.catid, &testCatid2, sizeof(GUID));
CategoryInfo.lcid = TestCatLocale1;
wcscpy(CategoryInfo.szDescription, testCatDesc2);
hr = pICatRegister1->RegisterCategories(1, &CategoryInfo);
if (FAILED(hr))
{
printf("Error! 2. RegisterCategories in CatTest returned 0x%x.\n", hr);
return hr;
}
memset (&CategoryInfo, NULL, sizeof (CATEGORYINFO));
memcpy(&CategoryInfo.catid, &testCatid2, sizeof(GUID));
CategoryInfo.lcid = TestCatLocale2;
wcscpy(CategoryInfo.szDescription, testCatDesc21);
hr = pICatRegister1->RegisterCategories(1, &CategoryInfo);
if (FAILED(hr))
{
printf("Error! 3. RegisterCategories in CatTest returned 0x%x.\n", hr);
return hr;
}
memset (&CategoryInfo, NULL, sizeof (CATEGORYINFO));
memcpy(&CategoryInfo.catid, &testCatid3, sizeof(GUID));
CategoryInfo.lcid = TestCatLocale2;
wcscpy(CategoryInfo.szDescription, testCatDesc3);
if (pICatRegister2)
hr = pICatRegister2->RegisterCategories(1, &CategoryInfo);
else
hr = pICatRegister1->RegisterCategories(1, &CategoryInfo);
if (FAILED(hr))
{
printf("Error! 4. RegisterCategories in CatTest returned 0x%x.\n", hr);
return hr;
}
return hr;
}
HRESULT RegCategoriesWithClasses(ICatRegister *pICatRegister1,
ICatRegister *pICatRegister2)
{
GUID guids[4];
HRESULT hr=S_OK;
// registering implemented and required categories.--------------
guids[0] = testCatid1;
guids[1] = testCatid2;
hr = pICatRegister1->RegisterClassReqCategories(catClsid1, 2, guids);
if (FAILED(hr))
{
printf("Error! 1. RegisterClassReqCategories in CatTest returned 0x%x.\n", hr);
return hr;
}
hr = pICatRegister1->RegisterClassImplCategories(catClsid1, 1, &testCatid3);
if (FAILED(hr))
{
printf("Error! 1. RegisterClassImplCategories in CatTest returned 0x%x.\n", hr);
return hr;
}
guids[0] = testCatid2;
guids[1] = testCatid3;
if (pICatRegister2)
hr = pICatRegister2->RegisterClassImplCategories(catClsid2, 2, guids);
else
hr = pICatRegister1->RegisterClassImplCategories(catClsid2, 2, guids);
if (FAILED(hr))
{
printf("Error! 2. RegisterClassImplCategories in CatTest returned 0x%x.\n", hr);
return hr;
}
hr = pICatRegister1->UnRegisterClassReqCategories(catClsid1, 1, &testCatid2);
if (FAILED(hr))
{
printf("Error! 1. UnRegisterClassReqCategories in CatTest returned 0x%x.\n", hr);
return hr;
}
hr = pICatRegister1->RegisterClassImplCategories(catClsid1, 1, &testCatid2);
if (FAILED(hr))
{
printf("Error! 1. RegisterClassImplCategories in CatTest returned 0x%x.\n", hr);
return hr;
}
return hr;
}
void VerbosePrintObj(CATEGORYINFO catinfo)
{
VerbosePrint("Description %S\n", catinfo.szDescription);
}
void VerbosePrintObj(GUID guid)
{
}
HRESULT DoEnumCatsOfClassesTest(ICatInformation *pICatInformation)
{
HRESULT hr=S_OK;
IEnumGUID *pIEnumGUID = NULL;
GUID guids[4];
LPOLESTR szDesc;
ULONG got;
// Enumerating Implemented Categories-------------------------
hr = pICatInformation->EnumImplCategoriesOfClass(catClsid1, &pIEnumGUID);
if (FAILED(hr))
{
printf("Error! EnumImplCategoriesOfClass in CatTest returned 0x%x\n", hr);
return hr;
}
hr = EnumTests<IEnumGUID, GUID>(pIEnumGUID, 2, NULL, 0, 0, FALSE);
// Enumerating Required Categories-------------------------
hr = pICatInformation->EnumReqCategoriesOfClass(catClsid1, &pIEnumGUID);
if (FAILED(hr))
{
printf("Error! EnumImplCategoriesOfClass in CatTest returned 0x%x\n", hr);
return hr;
}
if (FAILED(hr))
{
printf("Error! EnumReqCategoriesOfClass in CatTest returned 0x%x\n", hr);
return hr;
}
hr = EnumTests<IEnumGUID, GUID>(pIEnumGUID, 1, NULL, 0, 0, FALSE);
return hr;
}
HRESULT DoEnumClassesOfCats(ICatInformation *pICatInformation)
{
HRESULT hr=S_OK;
IEnumGUID *pIEnumGUID = NULL;
GUID guids[4];
ULONG got;
// Enumerating classes of categories--------------------------------
guids[0] = testCatid1;
guids[1] = testCatid3;
hr = pICatInformation->EnumClassesOfCategories(1, &testCatid2, 2, guids, &pIEnumGUID);
if (FAILED(hr))
{
printf("Error! EnumClassesOfCategories in CatTest returned 0x%x\n", hr);
return hr;
}
EnumTests<IEnumGUID, GUID>(pIEnumGUID, 2, NULL, 0, 0, FALSE);
return hr;
}
HRESULT CatCleanup(ICatRegister *pICatRegister1, ICatRegister *pICatRegister2)
{
HRESULT hr;
// Removing the categories at the end of the test.-----------------
hr = pICatRegister1->UnRegisterCategories(1, &testCatid1);
if (FAILED(hr))
printf ("ERROR! 1. UnRegisterCategories() in CatTest returned 0x%x.\n", hr);
hr = pICatRegister1->UnRegisterCategories(1, &testCatid2);
if (FAILED(hr))
printf ("ERROR! 2. UnRegisterCategories() in CatTest returned 0x%x.\n", hr);
if (pICatRegister2)
hr = pICatRegister2->UnRegisterCategories(1, &testCatid3);
else
hr = pICatRegister1->UnRegisterCategories(1, &testCatid3);
if (FAILED(hr))
printf ("ERROR! 3. UnRegisterCategories() in CatTest returned 0x%x.\n", hr);
return hr;
}
HRESULT CatClassCleanup(IClassAdmin *pIClassAdmin1, IClassAdmin *pIClassAdmin2)
{
HRESULT hr;
// Removing the classes and at the end of the test.--------------
// hr = pIClassAdmin1->RemovePackage(testCatPackName1, 0);
// if (FAILED(hr))
// printf ("ERROR! 1. RemovePackage() in CatTest returned 0x%x.\n", hr);
if (pIClassAdmin2)
hr = pIClassAdmin2->RemovePackage(testCatPackName2, 0);
else
hr = pIClassAdmin1->RemovePackage(testCatPackName2, 0);
if (FAILED(hr))
printf ("ERROR! 2. RemovePackage() in CatTest returned 0x%x.\n", hr);
return hr;
}
HRESULT DoCatTests(IClassAdmin *pIClassAdmin1, IClassAdmin *pIClassAdmin2)
{
HRESULT hr=S_OK, hr1=S_OK;
CATEGORYINFO CategoryInfo;
ICatRegister *pICatRegister1=NULL, *pICatRegister2=NULL;
ICatInformation *pICatInformation = NULL;
IEnumGUID *pIEnumGUID = NULL;
GUID guids[4];
LPOLESTR szDesc;
ULONG expected, got=0;
IEnumCATEGORYINFO *pIEnumCATEGORYINFO = NULL;
VerbosePrint("Creating classes for category test\n\n");
hr = CreateCatClasses(pIClassAdmin1, pIClassAdmin2);
if (FAILED(hr))
goto ReleaseAll;
//getting Icatregister interface--------------
hr = pIClassAdmin1->QueryInterface(IID_ICatRegister, (void **)&pICatRegister1);
if (FAILED(hr))
{
printf("Error! QueryInterface failed for ICatRegister in CatTest returned 0x%x.\n", hr);
goto ReleaseAll;
}
if (pIClassAdmin2)
hr = pIClassAdmin2->QueryInterface(IID_ICatRegister, (void **)&pICatRegister2);
if (FAILED(hr))
{
printf("Error! QueryInterface failed for ICatRegister in CatTest returned 0x%x.\n", hr);
goto ReleaseAll;
}
// getting the ICatInformation pointer
hr = CoCreateInstance(CLSID_GblComponentCategoriesMgr, NULL, CLSCTX_INPROC,
IID_ICatInformation, (void **)&pICatInformation);
if (FAILED(hr))
{
printf("**Error! QueryInterface failed for ICatInformation in comcat returned 0x%x.\n", hr);
goto ReleaseAll;
}
VerbosePrint("\nEnumerating Categories for category test before registering\n\n");
hr = pICatInformation->EnumCategories(TestCatLocale1, &pIEnumCATEGORYINFO);
if (FAILED(hr)) {
printf("**Error! EnumCategories failed for ICatInformation in comcat returned 0x%x.\n", hr);
goto ReleaseAll;
}
hr = EnumTests<IEnumCATEGORYINFO, CATEGORYINFO>(pIEnumCATEGORYINFO, 0, &got, 0, 0, FALSE);
if (FAILED(hr))
goto ReleaseAll;
VerbosePrint("\nRegistering Categories for category test\n\n");
hr = RegCategories(pICatRegister1, pICatRegister2);
if (FAILED(hr))
goto ReleaseAll;
VerbosePrint("\nRegistering Categories with classes for category test\n\n");
hr = RegCategoriesWithClasses(pICatRegister1, pICatRegister2);
if (FAILED(hr))
goto ReleaseAll;
VerbosePrint("\nEnumerating Categories for category test after registering\n\n");
hr = pICatInformation->EnumCategories(TestCatLocale1, &pIEnumCATEGORYINFO);
if (FAILED(hr)) {
printf("**Error! EnumCategories failed for ICatInformation in comcat returned 0x%x.\n", hr);
goto ReleaseAll;
}
hr = EnumTests<IEnumCATEGORYINFO, CATEGORYINFO>(pIEnumCATEGORYINFO, got+3, NULL, 0, 0, FALSE);
if (FAILED(hr))
goto ReleaseAll;
VerbosePrint("\nEnumerating Categories of the classes for category test\n\n");
hr = DoEnumCatsOfClassesTest(pICatInformation);
if (FAILED(hr))
goto ReleaseAll;
VerbosePrint("\nEnumerating Classes of the categories for category test\n\n");
hr = DoEnumClassesOfCats(pICatInformation);
if (FAILED(hr))
goto ReleaseAll;
VerbosePrint("\nTesting IsClassOfCategories for category test\n\n");
hr = pICatInformation->IsClassOfCategories(catClsid1, 1, &testCatid2, -1, NULL); // 1, &testCatid1);
if (hr != S_OK)
{
printf("Error! IsClassOfCategories in CatTest returned 0x%x\n", hr);
goto ReleaseAll;
}
// GetCategoryDesc------------------
VerbosePrint("\nCalling GetCategoryDesc for category test\n\n");
hr = pICatInformation->GetCategoryDesc(testCatid2, TestCatLocale2, &szDesc);
if (FAILED(hr))
{
printf("Error!1. GetCategoryDesc in CatTest returned 0x%x\n", hr);
goto ReleaseAll;
}
if (wcscmp(szDesc, testCatDesc21) != 0)
{
printf("Description not matching, Expected: \"%s\", got \"%s\"\n");
goto ReleaseAll;
}
CoTaskMemFree(szDesc);
hr = pICatInformation->GetCategoryDesc(testCatid3, TestCatLocale2, &szDesc);
if (FAILED(hr))
{
printf("Error!2. GetCategoryDesc in CatTest returned 0x%x\n", hr);
goto ReleaseAll;
}
if (wcscmp(szDesc, testCatDesc3) != 0)
{
printf("Error!3. Description not matching, Expected: \"%s\", got \"%s\"\n");
goto ReleaseAll;
}
CoTaskMemFree(szDesc);
VerbosePrint("\nCleaning up the classes and the categories for category test\n\n");
ReleaseAll:
CatCleanup(pICatRegister1, pICatRegister2);
CatClassCleanup(pIClassAdmin1, pIClassAdmin2);
if (pICatRegister1)
pICatRegister1->Release();
if (pICatRegister2)
pICatRegister2->Release();
if (pICatInformation)
pICatInformation->Release();
return hr;
}