ReactOS 0.4.15-dev-7788-g1ad9096
inputprocessor.c
Go to the documentation of this file.
1/*
2 * ITfInputProcessorProfiles implementation
3 *
4 * Copyright 2009 Aric Stewart, CodeWeavers
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 */
20
21#include <stdarg.h>
22
23#define COBJMACROS
24
25#include "wine/debug.h"
26#include "windef.h"
27#include "winbase.h"
28#include "winreg.h"
29#include "winuser.h"
30#ifdef __REACTOS__
31#include <wchar.h>
32#include <winnls.h>
33#endif
34#include "shlwapi.h"
35#include "winerror.h"
36#include "objbase.h"
37#include "olectl.h"
38
39#include "msctf.h"
40#include "msctf_internal.h"
41
43
44static const WCHAR szwLngp[] = {'L','a','n','g','u','a','g','e','P','r','o','f','i','l','e',0};
45static const WCHAR szwEnable[] = {'E','n','a','b','l','e',0};
46static const WCHAR szwTipfmt[] = {'%','s','\\','%','s',0};
47static const WCHAR szwFullLangfmt[] = {'%','s','\\','%','s','\\','%','s','\\','0','x','%','0','8','x','\\','%','s',0};
48
49static const WCHAR szwAssemblies[] = {'A','s','s','e','m','b','l','i','e','s',0};
50static const WCHAR szwDefault[] = {'D','e','f','a','u','l','t',0};
51static const WCHAR szwProfile[] = {'P','r','o','f','i','l','e',0};
52static const WCHAR szwDefaultFmt[] = {'%','s','\\','%','s','\\','0','x','%','0','8','x','\\','%','s',0};
53
55 ITfInputProcessorProfiles ITfInputProcessorProfiles_iface;
57 ITfInputProcessorProfileMgr ITfInputProcessorProfileMgr_iface;
58 /* const ITfInputProcessorProfilesExVtbl *InputProcessorProfilesExVtbl; */
59 /* const ITfInputProcessorProfileSubstituteLayoutVtbl *InputProcessorProfileSubstituteLayoutVtbl; */
61
63
66
67typedef struct tagProfilesEnumGuid {
70
74
78
82
85
89
90typedef struct {
94
97
99{
100 return CONTAINING_RECORD(iface, EnumTfInputProcessorProfiles, IEnumTfInputProcessorProfiles_iface);
101}
102
104 REFIID riid, void **ppv)
105{
107
109 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
110 *ppv = &This->IEnumTfInputProcessorProfiles_iface;
111 }else if(IsEqualGUID(riid, &IID_IEnumTfInputProcessorProfiles)) {
112 TRACE("(%p)->(IID_IEnumTfInputProcessorProfiles %p)\n", This, ppv);
113 *ppv = &This->IEnumTfInputProcessorProfiles_iface;
114 }else {
115 *ppv = NULL;
116 WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
117 return E_NOINTERFACE;
118 }
119
120 IUnknown_AddRef((IUnknown*)*ppv);
121 return S_OK;
122}
123
125{
128
129 TRACE("(%p) ref=%d\n", This, ref);
130
131 return ref;
132}
133
135{
138
139 TRACE("(%p) ref=%d\n", This, ref);
140
141 if(!ref)
143
144 return ref;
145}
146
149{
151 FIXME("(%p)->(%p)\n", This, ret);
152 return E_NOTIMPL;
153}
154
157{
159
160 FIXME("(%p)->(%u %p %p)\n", This, count, profile, fetch);
161
162 if(fetch)
163 *fetch = 0;
164 return S_FALSE;
165}
166
168{
170 FIXME("(%p)\n", This);
171 return E_NOTIMPL;
172}
173
175{
177 FIXME("(%p)->(%u)\n", This, count);
178 return E_NOTIMPL;
179}
180
181static const IEnumTfInputProcessorProfilesVtbl EnumTfInputProcessorProfilesVtbl = {
189};
190
191static inline InputProcessorProfiles *impl_from_ITfInputProcessorProfiles(ITfInputProcessorProfiles *iface)
192{
193 return CONTAINING_RECORD(iface, InputProcessorProfiles, ITfInputProcessorProfiles_iface);
194}
195
197{
198 return CONTAINING_RECORD(iface, InputProcessorProfiles, ITfSource_iface);
199}
200
202{
203 return CONTAINING_RECORD(iface, ProfilesEnumGuid, IEnumGUID_iface);
204}
205
207{
208 return CONTAINING_RECORD(iface, EnumTfLanguageProfiles, IEnumTfLanguageProfiles_iface);
209}
210
212{
213 TRACE("destroying %p\n", This);
214
215 free_sinks(&This->LanguageProfileNotifySink);
217}
218
219static void add_userkey( REFCLSID rclsid, LANGID langid,
221{
222 HKEY key;
223 WCHAR buf[39];
224 WCHAR buf2[39];
225 WCHAR fullkey[168];
226 DWORD disposition = 0;
227 ULONG res;
228
229 TRACE("\n");
230
231 StringFromGUID2(rclsid, buf, 39);
232 StringFromGUID2(guidProfile, buf2, 39);
234
235 res = RegCreateKeyExW(HKEY_CURRENT_USER,fullkey, 0, NULL, 0,
236 KEY_READ | KEY_WRITE, NULL, &key, &disposition);
237
238 if (!res && disposition == REG_CREATED_NEW_KEY)
239 {
240 DWORD zero = 0x0;
242 }
243
244 if (!res)
246}
247
248static HRESULT WINAPI InputProcessorProfiles_QueryInterface(ITfInputProcessorProfiles *iface, REFIID iid, void **ppv)
249{
251
252 if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfInputProcessorProfiles))
253 {
254 *ppv = &This->ITfInputProcessorProfiles_iface;
255 }
256 else if (IsEqualIID(iid, &IID_ITfInputProcessorProfileMgr))
257 {
258 *ppv = &This->ITfInputProcessorProfileMgr_iface;
259 }
260 else if (IsEqualIID(iid, &IID_ITfSource))
261 {
262 *ppv = &This->ITfSource_iface;
263 }
264 else
265 {
266 *ppv = NULL;
267 WARN("unsupported interface: %s\n", debugstr_guid(iid));
268 return E_NOINTERFACE;
269 }
270
271 ITfInputProcessorProfiles_AddRef(iface);
272 return S_OK;
273}
274
275static ULONG WINAPI InputProcessorProfiles_AddRef(ITfInputProcessorProfiles *iface)
276{
278 return InterlockedIncrement(&This->refCount);
279}
280
281static ULONG WINAPI InputProcessorProfiles_Release(ITfInputProcessorProfiles *iface)
282{
284 ULONG ret;
285
286 ret = InterlockedDecrement(&This->refCount);
287 if (ret == 0)
289 return ret;
290}
291
292/*****************************************************
293 * ITfInputProcessorProfiles functions
294 *****************************************************/
296 ITfInputProcessorProfiles *iface, REFCLSID rclsid)
297{
299 HKEY tipkey;
300 WCHAR buf[39];
301 WCHAR fullkey[68];
302
303 TRACE("(%p) %s\n",This,debugstr_guid(rclsid));
304
305 StringFromGUID2(rclsid, buf, 39);
307
308 if (RegCreateKeyExW(HKEY_LOCAL_MACHINE,fullkey, 0, NULL, 0,
309 KEY_READ | KEY_WRITE, NULL, &tipkey, NULL) != ERROR_SUCCESS)
310 return E_FAIL;
311
312 RegCloseKey(tipkey);
313
314 return S_OK;
315}
316
318 ITfInputProcessorProfiles *iface, REFCLSID rclsid)
319{
321 WCHAR buf[39];
322 WCHAR fullkey[68];
323
324 TRACE("(%p) %s\n",This,debugstr_guid(rclsid));
325
326 StringFromGUID2(rclsid, buf, 39);
328
331
332 return S_OK;
333}
334
336 ITfInputProcessorProfiles *iface, REFCLSID rclsid,
337 LANGID langid, REFGUID guidProfile, const WCHAR *pchDesc,
338 ULONG cchDesc, const WCHAR *pchIconFile, ULONG cchFile,
339 ULONG uIconIndex)
340{
342 HKEY tipkey,fmtkey;
343 WCHAR buf[39];
344 WCHAR fullkey[100];
345 ULONG res;
346 DWORD disposition = 0;
347
348 static const WCHAR fmt2[] = {'%','s','\\','0','x','%','0','8','x','\\','%','s',0};
349 static const WCHAR desc[] = {'D','e','s','c','r','i','p','t','i','o','n',0};
350 static const WCHAR icnf[] = {'I','c','o','n','F','i','l','e',0};
351 static const WCHAR icni[] = {'I','c','o','n','I','n','d','e','x',0};
352
353 TRACE("(%p) %s %x %s %s %s %i\n",This,debugstr_guid(rclsid), langid,
354 debugstr_guid(guidProfile), debugstr_wn(pchDesc,cchDesc),
355 debugstr_wn(pchIconFile,cchFile),uIconIndex);
356
357 StringFromGUID2(rclsid, buf, 39);
359
361 &tipkey ) != ERROR_SUCCESS)
362 return E_FAIL;
363
365 swprintf(fullkey,fmt2,szwLngp,langid,buf);
366
367 res = RegCreateKeyExW(tipkey,fullkey, 0, NULL, 0, KEY_READ | KEY_WRITE,
368 NULL, &fmtkey, &disposition);
369
370 if (!res)
371 {
372 DWORD zero = 0x0;
373 RegSetValueExW(fmtkey, desc, 0, REG_SZ, (const BYTE*)pchDesc, cchDesc * sizeof(WCHAR));
374 RegSetValueExW(fmtkey, icnf, 0, REG_SZ, (const BYTE*)pchIconFile, cchFile * sizeof(WCHAR));
375 RegSetValueExW(fmtkey, icni, 0, REG_DWORD, (LPBYTE)&uIconIndex, sizeof(DWORD));
376 if (disposition == REG_CREATED_NEW_KEY)
377 RegSetValueExW(fmtkey, szwEnable, 0, REG_DWORD, (LPBYTE)&zero, sizeof(DWORD));
378 RegCloseKey(fmtkey);
379
381 }
382 RegCloseKey(tipkey);
383
384 if (!res)
385 return S_OK;
386 else
387 return E_FAIL;
388}
389
391 ITfInputProcessorProfiles *iface, REFCLSID rclsid, LANGID langid,
393{
395 FIXME("STUB:(%p)\n",This);
396 return E_NOTIMPL;
397}
398
400 ITfInputProcessorProfiles *iface, IEnumGUID **ppEnum)
401{
403 TRACE("(%p) %p\n",This,ppEnum);
404 return ProfilesEnumGuid_Constructor(ppEnum);
405}
406
408 ITfInputProcessorProfiles *iface, LANGID langid, REFGUID catid,
409 CLSID *pclsid, GUID *pguidProfile)
410{
412 WCHAR fullkey[168];
413 WCHAR buf[39];
414 HKEY hkey;
415 DWORD count;
416 ULONG res;
417
418 TRACE("%p) %x %s %p %p\n",This, langid, debugstr_guid(catid),pclsid,pguidProfile);
419
420 if (!catid || !pclsid || !pguidProfile)
421 return E_INVALIDARG;
422
425
427 &hkey ) != ERROR_SUCCESS)
428 return S_FALSE;
429
430 count = sizeof(buf);
432 if (res != ERROR_SUCCESS)
433 {
434 RegCloseKey(hkey);
435 return S_FALSE;
436 }
437 CLSIDFromString(buf,pclsid);
438
440 if (res == ERROR_SUCCESS)
441 CLSIDFromString(buf,pguidProfile);
442
443 RegCloseKey(hkey);
444
445 return S_OK;
446}
447
449 ITfInputProcessorProfiles *iface, LANGID langid, REFCLSID rclsid,
450 REFGUID guidProfiles)
451{
453 WCHAR fullkey[168];
454 WCHAR buf[39];
455 HKEY hkey;
456 GUID catid;
457 HRESULT hr;
458 ITfCategoryMgr *catmgr;
459 static const GUID * tipcats[3] = { &GUID_TFCAT_TIP_KEYBOARD,
462
463 TRACE("%p) %x %s %s\n",This, langid, debugstr_guid(rclsid),debugstr_guid(guidProfiles));
464
465 if (!rclsid || !guidProfiles)
466 return E_INVALIDARG;
467
469
470 if (FAILED(hr))
471 return hr;
472
473 if (ITfCategoryMgr_FindClosestCategory(catmgr, rclsid,
474 &catid, tipcats, 3) != S_OK)
475 hr = ITfCategoryMgr_FindClosestCategory(catmgr, rclsid,
476 &catid, NULL, 0);
477 ITfCategoryMgr_Release(catmgr);
478
479 if (FAILED(hr))
480 return E_FAIL;
481
484
486 NULL, &hkey, NULL ) != ERROR_SUCCESS)
487 return E_FAIL;
488
489 StringFromGUID2(rclsid, buf, 39);
490 RegSetValueExW(hkey, szwDefault, 0, REG_SZ, (LPBYTE)buf, sizeof(buf));
491 StringFromGUID2(guidProfiles, buf, 39);
492 RegSetValueExW(hkey, szwProfile, 0, REG_SZ, (LPBYTE)buf, sizeof(buf));
493 RegCloseKey(hkey);
494
495 return S_OK;
496}
497
499 ITfInputProcessorProfiles *iface, REFCLSID rclsid, LANGID langid,
500 REFGUID guidProfiles)
501{
503 HRESULT hr;
505 TF_LANGUAGEPROFILE LanguageProfile;
506
507 TRACE("(%p) %s %x %s\n",This,debugstr_guid(rclsid),langid,debugstr_guid(guidProfiles));
508
509 if (langid != This->currentLanguage) return E_INVALIDARG;
510
511 if (get_active_textservice(rclsid,NULL))
512 {
513 TRACE("Already Active\n");
514 return E_FAIL;
515 }
516
517 hr = ITfInputProcessorProfiles_IsEnabledLanguageProfile(iface, rclsid,
518 langid, guidProfiles, &enabled);
519 if (FAILED(hr) || !enabled)
520 {
521 TRACE("Not Enabled\n");
522 return E_FAIL;
523 }
524
525 LanguageProfile.clsid = *rclsid;
526 LanguageProfile.langid = langid;
527 LanguageProfile.guidProfile = *guidProfiles;
528 LanguageProfile.fActive = TRUE;
529
530 return add_active_textservice(&LanguageProfile);
531}
532
534 ITfInputProcessorProfiles *iface, REFCLSID rclsid, LANGID *plangid,
535 GUID *pguidProfile)
536{
539
540 TRACE("(%p) %s %p %p\n",This,debugstr_guid(rclsid),plangid,pguidProfile);
541
542 if (!rclsid || !plangid || !pguidProfile)
543 return E_INVALIDARG;
544
545 if (get_active_textservice(rclsid, &profile))
546 {
547 *plangid = profile.langid;
548 *pguidProfile = profile.guidProfile;
549 return S_OK;
550 }
551 else
552 {
553 *pguidProfile = GUID_NULL;
554 return S_FALSE;
555 }
556}
557
559 ITfInputProcessorProfiles *iface, REFCLSID rclsid, LANGID langid,
560 REFGUID guidProfile, BSTR *pbstrProfile)
561{
563 FIXME("STUB:(%p)\n",This);
564 return E_NOTIMPL;
565}
566
568 ITfInputProcessorProfiles *iface, LANGID *plangid)
569{
571 TRACE("(%p) 0x%x\n",This,This->currentLanguage);
572
573 if (!plangid)
574 return E_INVALIDARG;
575
576 *plangid = This->currentLanguage;
577
578 return S_OK;
579}
580
582 ITfInputProcessorProfiles *iface, LANGID langid)
583{
586 struct list *cursor;
587 BOOL accept;
588
589 FIXME("STUB:(%p)\n",This);
590
591 SINK_FOR_EACH(cursor, &This->LanguageProfileNotifySink, ITfLanguageProfileNotifySink, sink)
592 {
593 accept = TRUE;
594 ITfLanguageProfileNotifySink_OnLanguageChange(sink, langid, &accept);
595 if (!accept)
596 return E_FAIL;
597 }
598
599 /* TODO: On successful language change call OnLanguageChanged sink */
600 return E_NOTIMPL;
601}
602
604 ITfInputProcessorProfiles *iface, LANGID **ppLangId, ULONG *pulCount)
605{
607 FIXME("Semi-STUB:(%p)\n",This);
608 *ppLangId = CoTaskMemAlloc(sizeof(LANGID));
609 **ppLangId = This->currentLanguage;
610 *pulCount = 1;
611 return S_OK;
612}
613
615 ITfInputProcessorProfiles *iface, LANGID langid,
617{
619 EnumTfLanguageProfiles *profenum;
620 HRESULT hr;
621
622 TRACE("(%p) %x %p\n",This,langid,ppEnum);
623
624 if (!ppEnum)
625 return E_INVALIDARG;
627 *ppEnum = &profenum->IEnumTfLanguageProfiles_iface;
628
629 return hr;
630}
631
633 ITfInputProcessorProfiles *iface, REFCLSID rclsid, LANGID langid,
634 REFGUID guidProfile, BOOL fEnable)
635{
637 HKEY key;
638 WCHAR buf[39];
639 WCHAR buf2[39];
640 WCHAR fullkey[168];
641 ULONG res;
642
643 TRACE("(%p) %s %x %s %i\n",This, debugstr_guid(rclsid), langid, debugstr_guid(guidProfile), fEnable);
644
645 StringFromGUID2(rclsid, buf, 39);
646 StringFromGUID2(guidProfile, buf2, 39);
648
650
651 if (!res)
652 {
653 RegSetValueExW(key, szwEnable, 0, REG_DWORD, (LPBYTE)&fEnable, sizeof(DWORD));
655 }
656 else
657 return E_FAIL;
658
659 return S_OK;
660}
661
663 ITfInputProcessorProfiles *iface, REFCLSID rclsid, LANGID langid,
664 REFGUID guidProfile, BOOL *pfEnable)
665{
667 HKEY key;
668 WCHAR buf[39];
669 WCHAR buf2[39];
670 WCHAR fullkey[168];
671 ULONG res;
672
673 TRACE("(%p) %s, %i, %s, %p\n",This,debugstr_guid(rclsid),langid,debugstr_guid(guidProfile),pfEnable);
674
675 if (!pfEnable)
676 return E_INVALIDARG;
677
678 StringFromGUID2(rclsid, buf, 39);
679 StringFromGUID2(guidProfile, buf2, 39);
681
683
684 if (!res)
685 {
686 DWORD count = sizeof(DWORD);
687 res = RegQueryValueExW(key, szwEnable, 0, NULL, (LPBYTE)pfEnable, &count);
689 }
690
691 if (res) /* Try Default */
692 {
694
695 if (!res)
696 {
697 DWORD count = sizeof(DWORD);
698 res = RegQueryValueExW(key, szwEnable, 0, NULL, (LPBYTE)pfEnable, &count);
700 }
701 }
702
703 if (!res)
704 return S_OK;
705 else
706 return E_FAIL;
707}
708
710 ITfInputProcessorProfiles *iface, REFCLSID rclsid, LANGID langid,
711 REFGUID guidProfile, BOOL fEnable)
712{
714 HKEY key;
715 WCHAR buf[39];
716 WCHAR buf2[39];
717 WCHAR fullkey[168];
718 ULONG res;
719
720 TRACE("(%p) %s %x %s %i\n",This,debugstr_guid(rclsid),langid,debugstr_guid(guidProfile),fEnable);
721
722 StringFromGUID2(rclsid, buf, 39);
723 StringFromGUID2(guidProfile, buf2, 39);
725
727
728 if (!res)
729 {
730 RegSetValueExW(key, szwEnable, 0, REG_DWORD, (LPBYTE)&fEnable, sizeof(DWORD));
732 }
733 else
734 return E_FAIL;
735
736 return S_OK;
737}
738
740 ITfInputProcessorProfiles *iface, REFCLSID rclsid, LANGID langid,
742{
744 FIXME("STUB:(%p)\n",This);
745 return E_NOTIMPL;
746}
747
748static const ITfInputProcessorProfilesVtbl InputProcessorProfilesVtbl =
749{
771};
772
773static inline InputProcessorProfiles *impl_from_ITfInputProcessorProfileMgr(ITfInputProcessorProfileMgr *iface)
774{
775 return CONTAINING_RECORD(iface, InputProcessorProfiles, ITfInputProcessorProfileMgr_iface);
776}
777
778static HRESULT WINAPI InputProcessorProfileMgr_QueryInterface(ITfInputProcessorProfileMgr *iface, REFIID riid, void **ppv)
779{
781 return ITfInputProcessorProfiles_QueryInterface(&This->ITfInputProcessorProfiles_iface, riid, ppv);
782}
783
784static ULONG WINAPI InputProcessorProfileMgr_AddRef(ITfInputProcessorProfileMgr *iface)
785{
787 return ITfInputProcessorProfiles_AddRef(&This->ITfInputProcessorProfiles_iface);
788}
789
790static ULONG WINAPI InputProcessorProfileMgr_Release(ITfInputProcessorProfileMgr *iface)
791{
793 return ITfInputProcessorProfiles_Release(&This->ITfInputProcessorProfiles_iface);
794}
795
796static HRESULT WINAPI InputProcessorProfileMgr_ActivateProfile(ITfInputProcessorProfileMgr *iface, DWORD dwProfileType,
798{
800 FIXME("(%p)->(%d %x %s %s %p %x)\n", This, dwProfileType, langid, debugstr_guid(clsid),
802 return E_NOTIMPL;
803}
804
805static HRESULT WINAPI InputProcessorProfileMgr_DeactivateProfile(ITfInputProcessorProfileMgr *iface, DWORD dwProfileType,
807{
809 FIXME("(%p)->(%d %x %s %s %p %x)\n", This, dwProfileType, langid, debugstr_guid(clsid),
811 return E_NOTIMPL;
812}
813
814static HRESULT WINAPI InputProcessorProfileMgr_GetProfile(ITfInputProcessorProfileMgr *iface, DWORD dwProfileType,
816{
818 FIXME("(%p)->(%d %x %s %s %p %p)\n", This, dwProfileType, langid, debugstr_guid(clsid),
819 debugstr_guid(guidProfile), hkl, pProfile);
820 return E_NOTIMPL;
821}
822
823static HRESULT WINAPI InputProcessorProfileMgr_EnumProfiles(ITfInputProcessorProfileMgr *iface, LANGID langid,
825{
827 EnumTfInputProcessorProfiles *enum_profiles;
828
829 TRACE("(%p)->(%x %p)\n", This, langid, ppEnum);
830
831 enum_profiles = HeapAlloc(GetProcessHeap(), 0, sizeof(*enum_profiles));
832 if(!enum_profiles)
833 return E_OUTOFMEMORY;
834
836 enum_profiles->ref = 1;
837
838 *ppEnum = &enum_profiles->IEnumTfInputProcessorProfiles_iface;
839 return S_OK;
840}
841
842static HRESULT WINAPI InputProcessorProfileMgr_ReleaseInputProcessor(ITfInputProcessorProfileMgr *iface, REFCLSID rclsid,
844{
846 FIXME("(%p)->(%s %x)\n", This, debugstr_guid(rclsid), dwFlags);
847 return E_NOTIMPL;
848}
849
850static HRESULT WINAPI InputProcessorProfileMgr_RegisterProfile(ITfInputProcessorProfileMgr *iface, REFCLSID rclsid,
851 LANGID langid, REFGUID guidProfile, const WCHAR *pchDesc, ULONG cchDesc, const WCHAR *pchIconFile,
852 ULONG cchFile, ULONG uIconIndex, HKL hklsubstitute, DWORD dwPreferredLayout, BOOL bEnabledByDefault,
854{
856 FIXME("(%p)->(%s %x %s %s %d %s %u %u %p %x %x %x)\n", This, debugstr_guid(rclsid), langid, debugstr_guid(guidProfile),
857 debugstr_w(pchDesc), cchDesc, debugstr_w(pchIconFile), cchFile, uIconIndex, hklsubstitute, dwPreferredLayout,
858 bEnabledByDefault, dwFlags);
859 return E_NOTIMPL;
860}
861
862static HRESULT WINAPI InputProcessorProfileMgr_UnregisterProfile(ITfInputProcessorProfileMgr *iface, REFCLSID rclsid,
864{
866 FIXME("(%p)->(%s %x %s %x)\n", This, debugstr_guid(rclsid), langid, debugstr_guid(guidProfile), dwFlags);
867 return E_NOTIMPL;
868}
869
870static HRESULT WINAPI InputProcessorProfileMgr_GetActiveProfile(ITfInputProcessorProfileMgr *iface, REFGUID catid,
871 TF_INPUTPROCESSORPROFILE *pProfile)
872{
874 FIXME("(%p)->(%s %p)\n", This, debugstr_guid(catid), pProfile);
875 return E_NOTIMPL;
876}
877
878static const ITfInputProcessorProfileMgrVtbl InputProcessorProfileMgrVtbl = {
890};
891
892/*****************************************************
893 * ITfSource functions
894 *****************************************************/
896{
898 return ITfInputProcessorProfiles_QueryInterface(&This->ITfInputProcessorProfiles_iface, iid, ppvOut);
899}
900
902{
904 return ITfInputProcessorProfiles_AddRef(&This->ITfInputProcessorProfiles_iface);
905}
906
908{
910 return ITfInputProcessorProfiles_Release(&This->ITfInputProcessorProfiles_iface);
911}
912
914 REFIID riid, IUnknown *punk, DWORD *pdwCookie)
915{
917
918 TRACE("(%p) %s %p %p\n",This,debugstr_guid(riid),punk,pdwCookie);
919
920 if (!riid || !punk || !pdwCookie)
921 return E_INVALIDARG;
922
923 if (IsEqualIID(riid, &IID_ITfLanguageProfileNotifySink))
924 return advise_sink(&This->LanguageProfileNotifySink, &IID_ITfLanguageProfileNotifySink,
925 COOKIE_MAGIC_IPPSINK, punk, pdwCookie);
926
927 FIXME("(%p) Unhandled Sink: %s\n",This,debugstr_guid(riid));
928 return E_NOTIMPL;
929}
930
932{
934
935 TRACE("(%p) %x\n",This,pdwCookie);
936
938 return E_INVALIDARG;
939
940 return unadvise_sink(pdwCookie);
941}
942
943static const ITfSourceVtbl InputProcessorProfilesSourceVtbl =
944{
950};
951
953{
955 if (pUnkOuter)
957
959 if (This == NULL)
960 return E_OUTOFMEMORY;
961
962 This->ITfInputProcessorProfiles_iface.lpVtbl= &InputProcessorProfilesVtbl;
963 This->ITfSource_iface.lpVtbl = &InputProcessorProfilesSourceVtbl;
964 This->ITfInputProcessorProfileMgr_iface.lpVtbl = &InputProcessorProfileMgrVtbl;
965 This->refCount = 1;
966 This->currentLanguage = GetUserDefaultLCID();
967
968 list_init(&This->LanguageProfileNotifySink);
969
970 *ppOut = (IUnknown *)&This->ITfInputProcessorProfiles_iface;
971 TRACE("returning %p\n", *ppOut);
972 return S_OK;
973}
974
975/**************************************************
976 * IEnumGUID implementation for ITfInputProcessorProfiles::EnumInputProcessorInfo
977 **************************************************/
979{
980 TRACE("destroying %p\n", This);
981 RegCloseKey(This->key);
983}
984
986{
988 *ppvOut = NULL;
989
990 if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_IEnumGUID))
991 {
992 *ppvOut = &This->IEnumGUID_iface;
993 }
994
995 if (*ppvOut)
996 {
997 IEnumGUID_AddRef(iface);
998 return S_OK;
999 }
1000
1001 WARN("unsupported interface: %s\n", debugstr_guid(iid));
1002 return E_NOINTERFACE;
1003}
1004
1006{
1008 return InterlockedIncrement(&This->refCount);
1009}
1010
1012{
1014 ULONG ret;
1015
1016 ret = InterlockedDecrement(&This->refCount);
1017 if (ret == 0)
1019 return ret;
1020}
1021
1022/*****************************************************
1023 * IEnumGuid functions
1024 *****************************************************/
1025static HRESULT WINAPI ProfilesEnumGuid_Next( LPENUMGUID iface,
1026 ULONG celt, GUID *rgelt, ULONG *pceltFetched)
1027{
1029 ULONG fetched = 0;
1030
1031 TRACE("(%p)\n",This);
1032
1033 if (rgelt == NULL) return E_POINTER;
1034
1035 if (This->key) while (fetched < celt)
1036 {
1037 LSTATUS res;
1038 HRESULT hr;
1039 WCHAR catid[39];
1040 DWORD cName = 39;
1041
1042 res = RegEnumKeyExW(This->key, This->next_index, catid, &cName,
1043 NULL, NULL, NULL, NULL);
1044 if (res != ERROR_SUCCESS && res != ERROR_MORE_DATA) break;
1045 ++(This->next_index);
1046
1047 hr = CLSIDFromString(catid, rgelt);
1048 if (FAILED(hr)) continue;
1049
1050 ++fetched;
1051 ++rgelt;
1052 }
1053
1054 if (pceltFetched) *pceltFetched = fetched;
1055 return fetched == celt ? S_OK : S_FALSE;
1056}
1057
1058static HRESULT WINAPI ProfilesEnumGuid_Skip( LPENUMGUID iface, ULONG celt)
1059{
1061 TRACE("(%p)\n",This);
1062
1063 This->next_index += celt;
1064 return S_OK;
1065}
1066
1067static HRESULT WINAPI ProfilesEnumGuid_Reset( LPENUMGUID iface)
1068{
1070 TRACE("(%p)\n",This);
1071 This->next_index = 0;
1072 return S_OK;
1073}
1074
1075static HRESULT WINAPI ProfilesEnumGuid_Clone( LPENUMGUID iface,
1076 IEnumGUID **ppenum)
1077{
1079 HRESULT res;
1080
1081 TRACE("(%p)\n",This);
1082
1083 if (ppenum == NULL) return E_POINTER;
1084
1086 if (SUCCEEDED(res))
1087 {
1088 ProfilesEnumGuid *new_This = impl_from_IEnumGUID(*ppenum);
1089 new_This->next_index = This->next_index;
1090 }
1091 return res;
1092}
1093
1094static const IEnumGUIDVtbl EnumGUIDVtbl =
1095{
1103};
1104
1106{
1108
1110 if (This == NULL)
1111 return E_OUTOFMEMORY;
1112
1113 This->IEnumGUID_iface.lpVtbl= &EnumGUIDVtbl;
1114 This->refCount = 1;
1115
1118 {
1120 return E_FAIL;
1121 }
1122
1123 *ppOut = &This->IEnumGUID_iface;
1124 TRACE("returning %p\n", *ppOut);
1125 return S_OK;
1126}
1127
1128/**************************************************
1129 * IEnumTfLanguageProfiles implementation
1130 **************************************************/
1132{
1133 TRACE("destroying %p\n", This);
1134 RegCloseKey(This->tipkey);
1135 if (This->langkey)
1136 RegCloseKey(This->langkey);
1137 ITfCategoryMgr_Release(This->catmgr);
1139}
1140
1142{
1144
1145 *ppvOut = NULL;
1146
1147 if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_IEnumTfLanguageProfiles))
1148 {
1149 *ppvOut = &This->IEnumTfLanguageProfiles_iface;
1150 }
1151
1152 if (*ppvOut)
1153 {
1154 IEnumTfLanguageProfiles_AddRef(iface);
1155 return S_OK;
1156 }
1157
1158 WARN("unsupported interface: %s\n", debugstr_guid(iid));
1159 return E_NOINTERFACE;
1160}
1161
1163{
1165 return InterlockedIncrement(&This->refCount);
1166}
1167
1169{
1171 ULONG ret;
1172
1173 ret = InterlockedDecrement(&This->refCount);
1174 if (ret == 0)
1176 return ret;
1177}
1178
1179/*****************************************************
1180 * IEnumGuid functions
1181 *****************************************************/
1183{
1184 WCHAR fullkey[168];
1185 ULONG res;
1186 WCHAR profileid[39];
1187 DWORD cName = 39;
1188 GUID profile;
1189
1190 static const WCHAR fmt[] = {'%','s','\\','%','s','\\','0','x','%','0','8','x',0};
1191
1192 if (This->langkey == NULL)
1193 {
1194 swprintf(fullkey,fmt,This->szwCurrentClsid,szwLngp,This->langid);
1195 res = RegOpenKeyExW(This->tipkey, fullkey, 0, KEY_READ | KEY_WRITE, &This->langkey);
1196 if (res)
1197 {
1198 This->langkey = NULL;
1199 return -1;
1200 }
1201 This->lang_index = 0;
1202 }
1203 res = RegEnumKeyExW(This->langkey, This->lang_index, profileid, &cName,
1204 NULL, NULL, NULL, NULL);
1205 if (res != ERROR_SUCCESS && res != ERROR_MORE_DATA)
1206 {
1207 RegCloseKey(This->langkey);
1208 This->langkey = NULL;
1209 return -1;
1210 }
1211 ++(This->lang_index);
1212
1213 if (tflp)
1214 {
1215 static const GUID * tipcats[3] = { &GUID_TFCAT_TIP_KEYBOARD,
1218 res = CLSIDFromString(profileid, &profile);
1219 if (FAILED(res)) return 0;
1220
1221 tflp->clsid = clsid;
1222 tflp->langid = This->langid;
1224 tflp->guidProfile = profile;
1225 if (ITfCategoryMgr_FindClosestCategory(This->catmgr, &clsid,
1226 &tflp->catid, tipcats, 3) != S_OK)
1227 ITfCategoryMgr_FindClosestCategory(This->catmgr, &clsid,
1228 &tflp->catid, NULL, 0);
1229 }
1230
1231 return 1;
1232}
1233
1235 ULONG ulCount, TF_LANGUAGEPROFILE *pProfile, ULONG *pcFetch)
1236{
1238 ULONG fetched = 0;
1239
1240 TRACE("(%p)\n",This);
1241
1242 if (pProfile == NULL) return E_POINTER;
1243
1244 if (This->tipkey) while (fetched < ulCount)
1245 {
1246 LSTATUS res;
1247 HRESULT hr;
1248 DWORD cName = 39;
1249 GUID clsid;
1250
1251 res = RegEnumKeyExW(This->tipkey, This->tip_index,
1252 This->szwCurrentClsid, &cName, NULL, NULL, NULL, NULL);
1253 if (res != ERROR_SUCCESS && res != ERROR_MORE_DATA) break;
1254 ++(This->tip_index);
1255 hr = CLSIDFromString(This->szwCurrentClsid, &clsid);
1256 if (FAILED(hr)) continue;
1257
1258 while ( fetched < ulCount)
1259 {
1260 INT res = next_LanguageProfile(This, clsid, pProfile);
1261 if (res == 1)
1262 {
1263 ++fetched;
1264 ++pProfile;
1265 }
1266 else if (res == -1)
1267 break;
1268 else
1269 continue;
1270 }
1271 }
1272
1273 if (pcFetch) *pcFetch = fetched;
1274 return fetched == ulCount ? S_OK : S_FALSE;
1275}
1276
1278{
1280 FIXME("STUB (%p)\n",This);
1281 return E_NOTIMPL;
1282}
1283
1285{
1287 TRACE("(%p)\n",This);
1288 This->tip_index = 0;
1289 if (This->langkey)
1290 RegCloseKey(This->langkey);
1291 This->langkey = NULL;
1292 This->lang_index = 0;
1293 return S_OK;
1294}
1295
1297 IEnumTfLanguageProfiles **ppenum)
1298{
1300 EnumTfLanguageProfiles *new_This;
1301 HRESULT res;
1302
1303 TRACE("(%p)\n",This);
1304
1305 if (ppenum == NULL) return E_POINTER;
1306
1307 res = EnumTfLanguageProfiles_Constructor(This->langid, &new_This);
1308 if (SUCCEEDED(res))
1309 {
1310 new_This->tip_index = This->tip_index;
1311 lstrcpynW(new_This->szwCurrentClsid,This->szwCurrentClsid,39);
1312
1313 if (This->langkey)
1314 {
1315 WCHAR fullkey[168];
1316 static const WCHAR fmt[] = {'%','s','\\','%','s','\\','0','x','%','0','8','x',0};
1317
1318 swprintf(fullkey,fmt,This->szwCurrentClsid,szwLngp,This->langid);
1319 res = RegOpenKeyExW(new_This->tipkey, fullkey, 0, KEY_READ | KEY_WRITE, &This->langkey);
1320 new_This->lang_index = This->lang_index;
1321 }
1322 *ppenum = &new_This->IEnumTfLanguageProfiles_iface;
1323 }
1324 return res;
1325}
1326
1327static const IEnumTfLanguageProfilesVtbl EnumTfLanguageProfilesVtbl =
1328{
1336};
1337
1339{
1340 HRESULT hr;
1342
1344 if (This == NULL)
1345 return E_OUTOFMEMORY;
1346
1347 This->IEnumTfLanguageProfiles_iface.lpVtbl= &EnumTfLanguageProfilesVtbl;
1348 This->refCount = 1;
1349 This->langid = langid;
1350
1352 if (FAILED(hr))
1353 {
1355 return hr;
1356 }
1357
1359 KEY_READ | KEY_WRITE, NULL, &This->tipkey, NULL) != ERROR_SUCCESS)
1360 {
1362 return E_FAIL;
1363 }
1364
1365 *out = This;
1366 TRACE("returning %p\n", *out);
1367 return S_OK;
1368}
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
static void list_init(struct list_entry *head)
Definition: list.h:51
const GUID IID_IUnknown
#define FIXME(fmt,...)
Definition: debug.h:111
#define WARN(fmt,...)
Definition: debug.h:112
#define RegCloseKey(hKey)
Definition: registry.h:49
HRESULT CategoryMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut)
Definition: categorymgr.c:413
Definition: list.h:37
LSTATUS WINAPI RegDeleteTreeW(_In_ HKEY, _In_opt_ LPCWSTR)
#define ERROR_MORE_DATA
Definition: dderror.h:13
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
#define ERROR_SUCCESS
Definition: deptool.c:10
static LSTATUS(WINAPI *pRegDeleteTreeW)(HKEY
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
LONG WINAPI RegCreateKeyExW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey, _In_ DWORD Reserved, _In_opt_ LPWSTR lpClass, _In_ DWORD dwOptions, _In_ REGSAM samDesired, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _Out_ PHKEY phkResult, _Out_opt_ LPDWORD lpdwDisposition)
Definition: reg.c:1096
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3362
LONG WINAPI RegEnumKeyExW(_In_ HKEY hKey, _In_ DWORD dwIndex, _Out_ LPWSTR lpName, _Inout_ LPDWORD lpcbName, _Reserved_ LPDWORD lpReserved, _Out_opt_ LPWSTR lpClass, _Inout_opt_ LPDWORD lpcbClass, _Out_opt_ PFILETIME lpftLastWriteTime)
Definition: reg.c:2533
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
Definition: reg.c:4911
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4132
#define GetProcessHeap()
Definition: compat.h:736
#define HeapAlloc
Definition: compat.h:733
OLECHAR * BSTR
Definition: compat.h:2293
#define HeapFree(x, y, z)
Definition: compat.h:735
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
#define lstrcpynW
Definition: compat.h:738
static const WCHAR szwProfile[]
static HRESULT WINAPI InputProcessorProfileMgr_RegisterProfile(ITfInputProcessorProfileMgr *iface, REFCLSID rclsid, LANGID langid, REFGUID guidProfile, const WCHAR *pchDesc, ULONG cchDesc, const WCHAR *pchIconFile, ULONG cchFile, ULONG uIconIndex, HKL hklsubstitute, DWORD dwPreferredLayout, BOOL bEnabledByDefault, DWORD dwFlags)
static const WCHAR szwDefault[]
static const WCHAR szwAssemblies[]
static HRESULT WINAPI InputProcessorProfileMgr_UnregisterProfile(ITfInputProcessorProfileMgr *iface, REFCLSID rclsid, LANGID langid, REFGUID guidProfile, DWORD dwFlags)
static EnumTfInputProcessorProfiles * impl_from_IEnumTfInputProcessorProfiles(IEnumTfInputProcessorProfiles *iface)
static const ITfInputProcessorProfilesVtbl InputProcessorProfilesVtbl
static ULONG WINAPI IPPSource_AddRef(ITfSource *iface)
static HRESULT WINAPI InputProcessorProfileMgr_EnumProfiles(ITfInputProcessorProfileMgr *iface, LANGID langid, IEnumTfInputProcessorProfiles **ppEnum)
static const WCHAR szwLngp[]
static HRESULT WINAPI InputProcessorProfileMgr_GetProfile(ITfInputProcessorProfileMgr *iface, DWORD dwProfileType, LANGID langid, REFCLSID clsid, REFGUID guidProfile, HKL hkl, TF_INPUTPROCESSORPROFILE *pProfile)
static HRESULT WINAPI EnumTfLanguageProfiles_QueryInterface(IEnumTfLanguageProfiles *iface, REFIID iid, LPVOID *ppvOut)
static HRESULT WINAPI InputProcessorProfiles_GetLanguageList(ITfInputProcessorProfiles *iface, LANGID **ppLangId, ULONG *pulCount)
static HRESULT WINAPI InputProcessorProfiles_ChangeCurrentLanguage(ITfInputProcessorProfiles *iface, LANGID langid)
static const WCHAR szwTipfmt[]
static HRESULT WINAPI InputProcessorProfiles_EnableLanguageProfile(ITfInputProcessorProfiles *iface, REFCLSID rclsid, LANGID langid, REFGUID guidProfile, BOOL fEnable)
struct tagInputProcessorProfiles InputProcessorProfiles
static ULONG WINAPI EnumTfInputProcessorProfiles_AddRef(IEnumTfInputProcessorProfiles *iface)
static HRESULT WINAPI ProfilesEnumGuid_QueryInterface(IEnumGUID *iface, REFIID iid, LPVOID *ppvOut)
static HRESULT WINAPI EnumTfLanguageProfiles_Next(IEnumTfLanguageProfiles *iface, ULONG ulCount, TF_LANGUAGEPROFILE *pProfile, ULONG *pcFetch)
static const WCHAR szwEnable[]
static ULONG WINAPI InputProcessorProfiles_AddRef(ITfInputProcessorProfiles *iface)
static HRESULT WINAPI ProfilesEnumGuid_Clone(LPENUMGUID iface, IEnumGUID **ppenum)
static ULONG WINAPI ProfilesEnumGuid_AddRef(IEnumGUID *iface)
static HRESULT WINAPI InputProcessorProfiles_RemoveLanguageProfile(ITfInputProcessorProfiles *iface, REFCLSID rclsid, LANGID langid, REFGUID guidProfile)
static HRESULT WINAPI InputProcessorProfileMgr_ActivateProfile(ITfInputProcessorProfileMgr *iface, DWORD dwProfileType, LANGID langid, REFCLSID clsid, REFGUID guidProfile, HKL hkl, DWORD dwFlags)
static HRESULT WINAPI InputProcessorProfileMgr_GetActiveProfile(ITfInputProcessorProfileMgr *iface, REFGUID catid, TF_INPUTPROCESSORPROFILE *pProfile)
static HRESULT ProfilesEnumGuid_Constructor(IEnumGUID **ppOut)
struct tagProfilesEnumGuid ProfilesEnumGuid
static HRESULT WINAPI EnumTfInputProcessorProfiles_Reset(IEnumTfInputProcessorProfiles *iface)
static ULONG WINAPI InputProcessorProfileMgr_AddRef(ITfInputProcessorProfileMgr *iface)
static void add_userkey(REFCLSID rclsid, LANGID langid, REFGUID guidProfile)
static void InputProcessorProfiles_Destructor(InputProcessorProfiles *This)
static HRESULT WINAPI InputProcessorProfiles_SetDefaultLanguageProfile(ITfInputProcessorProfiles *iface, LANGID langid, REFCLSID rclsid, REFGUID guidProfiles)
static HRESULT WINAPI InputProcessorProfiles_GetLanguageProfileDescription(ITfInputProcessorProfiles *iface, REFCLSID rclsid, LANGID langid, REFGUID guidProfile, BSTR *pbstrProfile)
static HRESULT WINAPI EnumTfLanguageProfiles_Clone(IEnumTfLanguageProfiles *iface, IEnumTfLanguageProfiles **ppenum)
static const ITfSourceVtbl InputProcessorProfilesSourceVtbl
static void ProfilesEnumGuid_Destructor(ProfilesEnumGuid *This)
static HRESULT WINAPI InputProcessorProfiles_AddLanguageProfile(ITfInputProcessorProfiles *iface, REFCLSID rclsid, LANGID langid, REFGUID guidProfile, const WCHAR *pchDesc, ULONG cchDesc, const WCHAR *pchIconFile, ULONG cchFile, ULONG uIconIndex)
static const WCHAR szwDefaultFmt[]
static ULONG WINAPI InputProcessorProfileMgr_Release(ITfInputProcessorProfileMgr *iface)
static HRESULT WINAPI ProfilesEnumGuid_Next(LPENUMGUID iface, ULONG celt, GUID *rgelt, ULONG *pceltFetched)
static ULONG WINAPI ProfilesEnumGuid_Release(IEnumGUID *iface)
static ULONG WINAPI EnumTfInputProcessorProfiles_Release(IEnumTfInputProcessorProfiles *iface)
static HRESULT WINAPI InputProcessorProfiles_Unregister(ITfInputProcessorProfiles *iface, REFCLSID rclsid)
static InputProcessorProfiles * impl_from_ITfSource(ITfSource *iface)
HRESULT InputProcessorProfiles_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut)
static HRESULT WINAPI InputProcessorProfileMgr_ReleaseInputProcessor(ITfInputProcessorProfileMgr *iface, REFCLSID rclsid, DWORD dwFlags)
static HRESULT WINAPI EnumTfInputProcessorProfiles_QueryInterface(IEnumTfInputProcessorProfiles *iface, REFIID riid, void **ppv)
static HRESULT WINAPI EnumTfInputProcessorProfiles_Skip(IEnumTfInputProcessorProfiles *iface, ULONG count)
static INT next_LanguageProfile(EnumTfLanguageProfiles *This, CLSID clsid, TF_LANGUAGEPROFILE *tflp)
static const IEnumTfInputProcessorProfilesVtbl EnumTfInputProcessorProfilesVtbl
static InputProcessorProfiles * impl_from_ITfInputProcessorProfiles(ITfInputProcessorProfiles *iface)
static HRESULT WINAPI EnumTfLanguageProfiles_Skip(IEnumTfLanguageProfiles *iface, ULONG celt)
static InputProcessorProfiles * impl_from_ITfInputProcessorProfileMgr(ITfInputProcessorProfileMgr *iface)
static void EnumTfLanguageProfiles_Destructor(EnumTfLanguageProfiles *This)
static HRESULT WINAPI InputProcessorProfiles_Register(ITfInputProcessorProfiles *iface, REFCLSID rclsid)
struct tagEnumTfLanguageProfiles EnumTfLanguageProfiles
static HRESULT WINAPI InputProcessorProfiles_GetDefaultLanguageProfile(ITfInputProcessorProfiles *iface, LANGID langid, REFGUID catid, CLSID *pclsid, GUID *pguidProfile)
static HRESULT WINAPI IPPSource_AdviseSink(ITfSource *iface, REFIID riid, IUnknown *punk, DWORD *pdwCookie)
static HRESULT WINAPI IPPSource_QueryInterface(ITfSource *iface, REFIID iid, LPVOID *ppvOut)
static HRESULT WINAPI IPPSource_UnadviseSink(ITfSource *iface, DWORD pdwCookie)
static const IEnumGUIDVtbl EnumGUIDVtbl
static HRESULT WINAPI EnumTfInputProcessorProfiles_Next(IEnumTfInputProcessorProfiles *iface, ULONG count, TF_INPUTPROCESSORPROFILE *profile, ULONG *fetch)
static ULONG WINAPI IPPSource_Release(ITfSource *iface)
static HRESULT WINAPI ProfilesEnumGuid_Reset(LPENUMGUID iface)
static HRESULT WINAPI EnumTfLanguageProfiles_Reset(IEnumTfLanguageProfiles *iface)
static const IEnumTfLanguageProfilesVtbl EnumTfLanguageProfilesVtbl
static HRESULT EnumTfLanguageProfiles_Constructor(LANGID langid, EnumTfLanguageProfiles **out)
static HRESULT WINAPI InputProcessorProfileMgr_QueryInterface(ITfInputProcessorProfileMgr *iface, REFIID riid, void **ppv)
static const WCHAR szwFullLangfmt[]
static HRESULT WINAPI ProfilesEnumGuid_Skip(LPENUMGUID iface, ULONG celt)
static HRESULT WINAPI InputProcessorProfiles_ActivateLanguageProfile(ITfInputProcessorProfiles *iface, REFCLSID rclsid, LANGID langid, REFGUID guidProfiles)
static HRESULT WINAPI InputProcessorProfileMgr_DeactivateProfile(ITfInputProcessorProfileMgr *iface, DWORD dwProfileType, LANGID langid, REFCLSID clsid, REFGUID guidProfile, HKL hkl, DWORD dwFlags)
static HRESULT WINAPI InputProcessorProfiles_IsEnabledLanguageProfile(ITfInputProcessorProfiles *iface, REFCLSID rclsid, LANGID langid, REFGUID guidProfile, BOOL *pfEnable)
static ProfilesEnumGuid * impl_from_IEnumGUID(IEnumGUID *iface)
static HRESULT WINAPI InputProcessorProfiles_EnumLanguageProfiles(ITfInputProcessorProfiles *iface, LANGID langid, IEnumTfLanguageProfiles **ppEnum)
static HRESULT WINAPI InputProcessorProfiles_EnableLanguageProfileByDefault(ITfInputProcessorProfiles *iface, REFCLSID rclsid, LANGID langid, REFGUID guidProfile, BOOL fEnable)
static ULONG WINAPI InputProcessorProfiles_Release(ITfInputProcessorProfiles *iface)
static ULONG WINAPI EnumTfLanguageProfiles_Release(IEnumTfLanguageProfiles *iface)
static HRESULT WINAPI InputProcessorProfiles_SubstituteKeyboardLayout(ITfInputProcessorProfiles *iface, REFCLSID rclsid, LANGID langid, REFGUID guidProfile, HKL hKL)
static ULONG WINAPI EnumTfLanguageProfiles_AddRef(IEnumTfLanguageProfiles *iface)
static HRESULT WINAPI InputProcessorProfiles_GetActiveLanguageProfile(ITfInputProcessorProfiles *iface, REFCLSID rclsid, LANGID *plangid, GUID *pguidProfile)
static HRESULT WINAPI InputProcessorProfiles_GetCurrentLanguage(ITfInputProcessorProfiles *iface, LANGID *plangid)
static HRESULT WINAPI InputProcessorProfiles_QueryInterface(ITfInputProcessorProfiles *iface, REFIID iid, void **ppv)
static const ITfInputProcessorProfileMgrVtbl InputProcessorProfileMgrVtbl
static EnumTfLanguageProfiles * impl_from_IEnumTfLanguageProfiles(IEnumTfLanguageProfiles *iface)
static HRESULT WINAPI InputProcessorProfiles_EnumInputProcessorInfo(ITfInputProcessorProfiles *iface, IEnumGUID **ppEnum)
static HRESULT WINAPI EnumTfInputProcessorProfiles_Clone(IEnumTfInputProcessorProfiles *iface, IEnumTfInputProcessorProfiles **ret)
HRESULT WINAPI CLSIDFromString(LPCOLESTR idstr, LPCLSID id)
Definition: compobj.c:2338
INT WINAPI StringFromGUID2(REFGUID id, LPOLESTR str, INT cmax)
Definition: compobj.c:2434
#define swprintf
Definition: precomp.h:40
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLenum GLenum GLsizei const GLuint GLboolean enabled
Definition: glext.h:7750
GLuint res
Definition: glext.h:9613
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLsizei GLenum GLboolean sink
Definition: glext.h:5672
const char cursor[]
Definition: icontest.c:13
LPVOID WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: ifs.c:426
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
#define debugstr_guid
Definition: kernel32.h:35
#define profile
Definition: kernel32.h:12
#define debugstr_wn
Definition: kernel32.h:33
#define debugstr_w
Definition: kernel32.h:32
#define GUID_NULL
Definition: ks.h:106
LCID WINAPI GetUserDefaultLCID(void)
Definition: lang.c:778
#define REG_SZ
Definition: layer.c:22
USHORT LANGID
Definition: mui.h:9
static const WCHAR desc[]
Definition: protectdata.c:36
DWORD get_Cookie_magic(DWORD id)
Definition: msctf.c:233
BOOL get_active_textservice(REFCLSID rclsid, TF_LANGUAGEPROFILE *profile)
Definition: msctf.c:459
HRESULT add_active_textservice(TF_LANGUAGEPROFILE *lp)
Definition: msctf.c:395
HRESULT unadvise_sink(DWORD cookie)
Definition: msctf.c:312
const WCHAR szwSystemCTFKey[]
Definition: msctf.c:77
void free_sinks(struct list *sink_list)
Definition: msctf.c:324
const WCHAR szwSystemTIPKey[]
Definition: msctf.c:76
REFCLSID clsid
Definition: msctf.c:82
HRESULT advise_sink(struct list *sink_list, REFIID riid, DWORD cookie_magic, IUnknown *unk, DWORD *cookie)
Definition: msctf.c:285
GUID guidProfile
Definition: msctf.idl:646
HKL hkl
Definition: msctf.idl:650
UINT_PTR HKL
Definition: msctf.idl:143
TF_INPUTPROCESSORPROFILE
Definition: msctf.idl:652
GUID catid
Definition: msctf.idl:647
EXTERN_C const GUID GUID_TFCAT_TIP_KEYBOARD
Definition: msctf.idl:99
EXTERN_C const GUID GUID_TFCAT_TIP_SPEECH
Definition: msctf.idl:100
EXTERN_C const GUID GUID_TFCAT_TIP_HANDWRITING
Definition: msctf.idl:101
LANGID langid
Definition: msctf.idl:644
#define SINK_FOR_EACH(cursor, list, type, elem)
#define COOKIE_MAGIC_IPPSINK
#define KEY_READ
Definition: nt_native.h:1023
#define REG_CREATED_NEW_KEY
Definition: nt_native.h:1084
#define KEY_WRITE
Definition: nt_native.h:1031
#define DWORD
Definition: nt_native.h:44
long LONG
Definition: pedump.c:60
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define REFIID
Definition: guiddef.h:118
#define REFCLSID
Definition: guiddef.h:117
static FILE * out
Definition: regtests2xml.c:44
#define REG_DWORD
Definition: sdbapi.c:596
int zero
Definition: sehframes.cpp:29
HRESULT hr
Definition: shlfolder.c:183
SOCKET WSAAPI accept(IN SOCKET s, OUT LPSOCKADDR addr, OUT INT FAR *addrlen)
Definition: socklife.c:23
#define TRACE(s)
Definition: solgame.cpp:4
IEnumTfInputProcessorProfiles IEnumTfInputProcessorProfiles_iface
Definition: scsiwmi.h:51
Definition: dsound.c:943
Definition: copy.c:22
Definition: send.c:48
ITfCategoryMgr * catmgr
IEnumTfLanguageProfiles IEnumTfLanguageProfiles_iface
ITfInputProcessorProfiles ITfInputProcessorProfiles_iface
ITfInputProcessorProfileMgr ITfInputProcessorProfileMgr_iface
struct list LanguageProfileNotifySink
IEnumGUID IEnumGUID_iface
unsigned char * LPBYTE
Definition: typedefs.h:53
int32_t INT
Definition: typedefs.h:58
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
int ret
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176
#define WINAPI
Definition: msvc.h:6
#define S_FALSE
Definition: winerror.h:2357
#define E_NOINTERFACE
Definition: winerror.h:2364
#define CLASS_E_NOAGGREGATION
Definition: winerror.h:2662
#define E_POINTER
Definition: winerror.h:2365
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
#define HKEY_CURRENT_USER
Definition: winreg.h:11
__wchar_t WCHAR
Definition: xmlstorage.h:180
unsigned char BYTE
Definition: xxhash.c:193