Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

241 lines
6.0 KiB

//
// assembly.h
//
#ifndef ASSEMBLY_H
#define ASSEMBLY_H
#include "strary.h"
#include "ptrary.h"
class CAssemblyList;
#define MAX_LANGPROFILENAME 256
typedef struct tag_ASSEMBLYITEM
{
CLSID clsid;
GUID catid;
GUID guidProfile;
CAlignWinHKL hkl;
CAlignWinHKL hklSubstitute;
BOOL fActive : 1;
BOOL fActiveNoCic : 1;
BOOL fEnabled : 1;
BOOL fInitIconIndex : 1;
BOOL fSkipToActivate : 1;
BOOL fSkipToNotify : 1;
BOOL fDisabledOnTransitory : 1;
ULONG uIconIndex;
WCHAR szProfile[MAX_LANGPROFILENAME];
void InitIconIndex()
{
uIconIndex = (ULONG)(-1);
fInitIconIndex = FALSE;
}
BOOL IsEqual(tag_ASSEMBLYITEM *pItem)
{
return IsEqual(pItem->hkl, pItem->clsid, pItem->guidProfile);
}
BOOL IsEqual(HKL hklIn, REFCLSID rclsidIn, REFGUID rguidProfileIn)
{
if ((hkl == hklIn) &&
IsEqualGUID(clsid, rclsidIn) &&
IsEqualGUID(guidProfile, rguidProfileIn))
return TRUE;
return FALSE;
}
static size_t GetAlignSize() { return Align(sizeof(struct tag_ASSEMBLYITEM)); }
} ASSEMBLYITEM;
//////////////////////////////////////////////////////////////////////////////
//
// CAssembly
//
//////////////////////////////////////////////////////////////////////////////
class CAssembly
{
public:
CAssembly(const TCHAR *pszName);
CAssembly(LANGID langid);
~CAssembly();
BOOL IsEnabled(SYSTHREAD *psfn);
BOOL IsNonCiceroItem();
BOOL IsEnabledKeyboardItem(SYSTHREAD *psfn);
WCHAR *GetLangName() {return _szLangName;}
LANGID GetLangId() {return _langid;}
int Count() {return _rgAsmItem.Count();}
ASSEMBLYITEM *GetItem(int nId)
{
return _rgAsmItem.GetPtr(nId);
}
BOOL IsFEIMEActive();
void RebuildSubstitutedHKLList();
BOOL IsSubstitutedHKL(HKL hkl);
void ClearSubstitutedHKLList()
{
_rghklSubstituted.Clear();
}
ASSEMBLYITEM *GetSubstituteItem(HKL hKL);
ASSEMBLYITEM *FindActiveKeyboardItem();
ASSEMBLYITEM *FindKeyboardLayoutItem(HKL hkl);
#ifdef CHECKFEIMESELECTED
BOOL _fUnknownFEIMESelected;
#endif
private:
friend CAssemblyList;
ASSEMBLYITEM *FindItemByCategory(REFGUID catid);
ASSEMBLYITEM *FindPureKbdTipItem();
BOOL IsEnabledItemByCategory(REFGUID catid);
BOOL IsEnabledItem();
int Find(ASSEMBLYITEM *pItem)
{
ASSEMBLYITEM *pItemTmp;
int nCnt = _rgAsmItem.Count();
int i;
for (i = 0; i < nCnt; i++)
{
pItemTmp = _rgAsmItem.GetPtr(i);
if (pItemTmp->IsEqual(pItem))
return i;
}
return -1;
}
void Add(ASSEMBLYITEM *pItem)
{
ASSEMBLYITEM *pItemTmp;
if (Find(pItem) >= 0)
return;
pItemTmp = _rgAsmItem.Append(1);
if (pItemTmp)
*pItemTmp = *pItem;
}
void Remove(ASSEMBLYITEM *pItem)
{
int nId = Find(pItem);
if (nId >= 0)
{
_rgAsmItem.Remove(nId, 1);
}
}
LANGID _langid;
WCHAR _szLangName[64];
CStructArray<ASSEMBLYITEM> _rgAsmItem;
CStructArray<HKL> _rghklSubstituted;
};
//////////////////////////////////////////////////////////////////////////////
//
// CAssemblyList
//
//////////////////////////////////////////////////////////////////////////////
class CAssemblyList
{
public:
CAssemblyList();
~CAssemblyList();
void ClearAsms();
HRESULT Load();
CAssembly *GetDefaultAssembly();
void AttachOriginalAssembly(CPtrArray<CAssembly> *prgAsmOrg);
int Count() {return _rgAsm.Count();}
CAssembly *GetAssembly(int nId)
{
return _rgAsm.Get(nId);
}
CAssembly *FindAssemblyByLangId(LANGID langid)
{
return FindAssemblyByLangIdInArray(&_rgAsm, langid);
}
static CAssembly *FindAssemblyByLangIdInArray(CPtrArray<CAssembly> *rgAsm, LANGID langid)
{
int nCnt = rgAsm->Count();
int i;
for (i = 0; i < nCnt; i++)
{
CAssembly *pAsm = rgAsm->Get(i);
if (pAsm->_langid == langid)
return pAsm;
}
return NULL;
}
BOOL LoadFromCache();
BOOL SetDefaultTIPInAssemblyInternal(CAssembly *pAsm, ASSEMBLYITEM *pItem, BOOL fChangeDefault);
static BOOL SetDefaultTIPInAssemblyForCache(LANGID langid, REFGUID catid, REFCLSID clsid, HKL hKL, REFGUID guidProfile);
static BOOL InvalidCache();
#ifdef PROFILE_UPDATE_REGISTRY // old code for tip setup.
static BOOL IsUpdated();
static BOOL ClearUpdatedFlag();
#endif
static BOOL GetDefaultTIPInAssembly(LANGID langid, REFGUID catid, CLSID *pclsid, HKL* phKL, GUID *pguidProfile);
static BOOL SetDefaultTIPInAssembly(LANGID langid, REFGUID catid, REFCLSID clsid, HKL hKL, REFGUID guidProfile);
static BOOL IsFEDummyKL(HKL hkl);
static HKL GetProperHKL(LANGID langid, HKL *lphkl, BOOL *pfLoaded);
static BOOL CheckLangSupport(REFCLSID rclsid, LANGID langid);
private:
BOOL CreateCache();
static BOOL GetTIPCategory(REFCLSID clsid, GUID *pcatid, IEnumGUID *pEnumCat);
CPtrArray<CAssembly> _rgAsm;
static CAssembly *FindAndCreateNewAssembly(CPtrArray<CAssembly> *prgAsm, CPtrArray<CAssembly> *prgNutralAsm, LANGID langid);
};
inline BOOL IsIMEHKL(HKL hkl)
{
return ((((DWORD)(LONG_PTR)hkl) & 0xf0000000) == 0xe0000000) ? TRUE : FALSE;
}
inline BOOL IsFELangId(LANGID langid)
{
if ((langid == 0x411) ||
(langid == 0x404) ||
(langid == 0x412) ||
(langid == 0x804))
{
return TRUE;
}
return FALSE;
}
inline BOOL IsPureIMEHKL(HKL hkl)
{
if (!IsIMEHKL(hkl))
return FALSE;
return CAssemblyList::IsFEDummyKL(hkl) ? FALSE : TRUE;
}
BOOL EnsureAsmCacheFileMap();
BOOL UninitAsmCacheFileMap();
BOOL IsAsmCache();
#endif // ASSEMBLY_H