ReactOS  0.4.14-dev-384-g5b37caa
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 
44 static const WCHAR szwLngp[] = {'L','a','n','g','u','a','g','e','P','r','o','f','i','l','e',0};
45 static const WCHAR szwEnable[] = {'E','n','a','b','l','e',0};
46 static const WCHAR szwTipfmt[] = {'%','s','\\','%','s',0};
47 static const WCHAR szwFullLangfmt[] = {'%','s','\\','%','s','\\','%','s','\\','0','x','%','0','8','x','\\','%','s',0};
48 
49 static const WCHAR szwAssemblies[] = {'A','s','s','e','m','b','l','i','e','s',0};
50 static const WCHAR szwDefault[] = {'D','e','f','a','u','l','t',0};
51 static const WCHAR szwProfile[] = {'P','r','o','f','i','l','e',0};
52 static const WCHAR szwDefaultFmt[] = {'%','s','\\','%','s','\\','0','x','%','0','8','x','\\','%','s',0};
53 
54 typedef struct tagInputProcessorProfiles {
55  ITfInputProcessorProfiles ITfInputProcessorProfiles_iface;
57  ITfInputProcessorProfileMgr ITfInputProcessorProfileMgr_iface;
58  /* const ITfInputProcessorProfilesExVtbl *InputProcessorProfilesExVtbl; */
59  /* const ITfInputProcessorProfileSubstituteLayoutVtbl *InputProcessorProfileSubstituteLayoutVtbl; */
61 
63 
66 
67 typedef struct tagProfilesEnumGuid {
70 
74 
75 typedef struct tagEnumTfLanguageProfiles {
78 
82 
85 
89 
90 typedef struct {
94 
97 
99 {
100  return CONTAINING_RECORD(iface, EnumTfInputProcessorProfiles, IEnumTfInputProcessorProfiles_iface);
101 }
102 
104  REFIID riid, void **ppv)
105 {
107 
108  if(IsEqualGUID(riid, &IID_IUnknown)) {
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 
181 static const IEnumTfInputProcessorProfilesVtbl EnumTfInputProcessorProfilesVtbl = {
189 };
190 
191 static 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 
219 static 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)
245  RegCloseKey(key);
246 }
247 
248 static 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 
275 static ULONG WINAPI InputProcessorProfiles_AddRef(ITfInputProcessorProfiles *iface)
276 {
278  return InterlockedIncrement(&This->refCount);
279 }
280 
281 static 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 
380  add_userkey(rclsid, langid, guidProfile);
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 
423  StringFromGUID2(catid, buf, 39);
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 
468  hr = CategoryMgr_Constructor(NULL,(IUnknown**)&catmgr);
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 
482  StringFromGUID2(&catid, buf, 39);
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;
504  BOOL enabled;
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,
616  IEnumTfLanguageProfiles **ppEnum)
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));
654  RegCloseKey(key);
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);
688  RegCloseKey(key);
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);
699  RegCloseKey(key);
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));
731  RegCloseKey(key);
732  }
733  else
734  return E_FAIL;
735 
736  return S_OK;
737 }
738 
740  ITfInputProcessorProfiles *iface, REFCLSID rclsid, LANGID langid,
741  REFGUID guidProfile, HKL hKL)
742 {
744  FIXME("STUB:(%p)\n",This);
745  return E_NOTIMPL;
746 }
747 
748 static const ITfInputProcessorProfilesVtbl InputProcessorProfilesVtbl =
749 {
771 };
772 
773 static inline InputProcessorProfiles *impl_from_ITfInputProcessorProfileMgr(ITfInputProcessorProfileMgr *iface)
774 {
775  return CONTAINING_RECORD(iface, InputProcessorProfiles, ITfInputProcessorProfileMgr_iface);
776 }
777 
778 static HRESULT WINAPI InputProcessorProfileMgr_QueryInterface(ITfInputProcessorProfileMgr *iface, REFIID riid, void **ppv)
779 {
781  return ITfInputProcessorProfiles_QueryInterface(&This->ITfInputProcessorProfiles_iface, riid, ppv);
782 }
783 
784 static ULONG WINAPI InputProcessorProfileMgr_AddRef(ITfInputProcessorProfileMgr *iface)
785 {
787  return ITfInputProcessorProfiles_AddRef(&This->ITfInputProcessorProfiles_iface);
788 }
789 
790 static ULONG WINAPI InputProcessorProfileMgr_Release(ITfInputProcessorProfileMgr *iface)
791 {
793  return ITfInputProcessorProfiles_Release(&This->ITfInputProcessorProfiles_iface);
794 }
795 
796 static 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 
805 static 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 
814 static 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 
823 static 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 
842 static HRESULT WINAPI InputProcessorProfileMgr_ReleaseInputProcessor(ITfInputProcessorProfileMgr *iface, REFCLSID rclsid,
843  DWORD dwFlags)
844 {
846  FIXME("(%p)->(%s %x)\n", This, debugstr_guid(rclsid), dwFlags);
847  return E_NOTIMPL;
848 }
849 
850 static 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,
853  DWORD dwFlags)
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 
862 static 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 
870 static 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 
878 static 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 
937  if (get_Cookie_magic(pdwCookie)!=COOKIE_MAGIC_IPPSINK)
938  return E_INVALIDARG;
939 
940  return unadvise_sink(pdwCookie);
941 }
942 
943 static const ITfSourceVtbl InputProcessorProfilesSourceVtbl =
944 {
950 };
951 
953 {
955  if (pUnkOuter)
956  return CLASS_E_NOAGGREGATION;
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  *****************************************************/
1025 static 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 
1058 static 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 
1067 static HRESULT WINAPI ProfilesEnumGuid_Reset( LPENUMGUID iface)
1068 {
1070  TRACE("(%p)\n",This);
1071  This->next_index = 0;
1072  return S_OK;
1073 }
1074 
1075 static 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 
1094 static 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 
1117  KEY_READ | KEY_WRITE, NULL, &This->key, NULL) != ERROR_SUCCESS)
1118  {
1119  HeapFree(GetProcessHeap(), 0, This);
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 
1327 static 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 
1351  hr = CategoryMgr_Constructor(NULL,(IUnknown**)&This->catmgr);
1352  if (FAILED(hr))
1353  {
1355  return hr;
1356  }
1357 
1359  KEY_READ | KEY_WRITE, NULL, &This->tipkey, NULL) != ERROR_SUCCESS)
1360  {
1361  HeapFree(GetProcessHeap(), 0, This);
1362  return E_FAIL;
1363  }
1364 
1365  *out = This;
1366  TRACE("returning %p\n", *out);
1367  return S_OK;
1368 }
const WCHAR szwSystemTIPKey[]
Definition: msctf.c:76
static HRESULT WINAPI EnumTfInputProcessorProfiles_Clone(IEnumTfInputProcessorProfiles *iface, IEnumTfInputProcessorProfiles **ret)
static void ProfilesEnumGuid_Destructor(ProfilesEnumGuid *This)
HRESULT add_active_textservice(TF_LANGUAGEPROFILE *lp)
Definition: msctf.c:395
static HRESULT WINAPI EnumTfInputProcessorProfiles_Next(IEnumTfInputProcessorProfiles *iface, ULONG count, TF_INPUTPROCESSORPROFILE *profile, ULONG *fetch)
#define REFIID
Definition: guiddef.h:118
#define TRUE
Definition: types.h:120
static const WCHAR szwTipfmt[]
static const WCHAR szwLngp[]
#define E_NOINTERFACE
Definition: winerror.h:2364
static HRESULT WINAPI InputProcessorProfiles_SetDefaultLanguageProfile(ITfInputProcessorProfiles *iface, LANGID langid, REFCLSID rclsid, REFGUID guidProfiles)
const WCHAR szwSystemCTFKey[]
Definition: msctf.c:77
#define ERROR_SUCCESS
Definition: deptool.c:10
HRESULT hr
Definition: shlfolder.c:183
Definition: scsiwmi.h:51
static HRESULT WINAPI InputProcessorProfiles_GetLanguageList(ITfInputProcessorProfiles *iface, LANGID **ppLangId, ULONG *pulCount)
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
#define KEY_READ
Definition: nt_native.h:1023
REFIID riid
Definition: precomp.h:44
static const WCHAR szwDefault[]
EXTERN_C const GUID GUID_TFCAT_TIP_SPEECH
Definition: msctf.idl:63
#define REFCLSID
Definition: guiddef.h:117
GLuint GLuint GLsizei count
Definition: gl.h:1545
#define HKEY_CURRENT_USER
Definition: winreg.h:11
void free_sinks(struct list *sink_list)
Definition: msctf.c:324
#define WARN(fmt,...)
Definition: debug.h:111
static HRESULT WINAPI InputProcessorProfiles_IsEnabledLanguageProfile(ITfInputProcessorProfiles *iface, REFCLSID rclsid, LANGID langid, REFGUID guidProfile, BOOL *pfEnable)
#define SINK_FOR_EACH(cursor, list, type, elem)
IEnumGUID IEnumGUID_iface
REFIID LPVOID * ppv
Definition: atlbase.h:39
HRESULT advise_sink(struct list *sink_list, REFIID riid, DWORD cookie_magic, IUnknown *unk, DWORD *cookie)
Definition: msctf.c:285
static const IEnumTfLanguageProfilesVtbl EnumTfLanguageProfilesVtbl
static InputProcessorProfiles * impl_from_ITfInputProcessorProfileMgr(ITfInputProcessorProfileMgr *iface)
struct list LanguageProfileNotifySink
static EnumTfInputProcessorProfiles * impl_from_IEnumTfInputProcessorProfiles(IEnumTfInputProcessorProfiles *iface)
static const WCHAR szwFullLangfmt[]
static ULONG WINAPI InputProcessorProfileMgr_Release(ITfInputProcessorProfileMgr *iface)
WORD LANGID
Definition: typedefs.h:79
LCID WINAPI GetUserDefaultLCID(void)
Definition: lang.c:768
static HRESULT WINAPI InputProcessorProfiles_ChangeCurrentLanguage(ITfInputProcessorProfiles *iface, LANGID langid)
OLECHAR * BSTR
Definition: compat.h:1942
static HRESULT WINAPI InputProcessorProfiles_EnumLanguageProfiles(ITfInputProcessorProfiles *iface, LANGID langid, IEnumTfLanguageProfiles **ppEnum)
DWORD get_Cookie_magic(DWORD id)
Definition: msctf.c:233
static HRESULT WINAPI InputProcessorProfiles_Unregister(ITfInputProcessorProfiles *iface, REFCLSID rclsid)
static const ITfSourceVtbl InputProcessorProfilesSourceVtbl
LANGID langid
Definition: msctf.idl:605
#define E_FAIL
Definition: ddrawi.h:102
#define DWORD
Definition: nt_native.h:44
int32_t INT
Definition: typedefs.h:56
GLenum GLenum GLsizei const GLuint GLboolean enabled
Definition: glext.h:7750
Definition: send.c:47
GLsizei GLenum GLboolean sink
Definition: glext.h:5672
static HRESULT WINAPI IPPSource_AdviseSink(ITfSource *iface, REFIID riid, IUnknown *punk, DWORD *pdwCookie)
static HRESULT WINAPI InputProcessorProfileMgr_ActivateProfile(ITfInputProcessorProfileMgr *iface, DWORD dwProfileType, LANGID langid, REFCLSID clsid, REFGUID guidProfile, HKL hkl, DWORD dwFlags)
static ULONG WINAPI ProfilesEnumGuid_AddRef(IEnumGUID *iface)
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:1091
static HRESULT WINAPI InputProcessorProfiles_GetLanguageProfileDescription(ITfInputProcessorProfiles *iface, REFCLSID rclsid, LANGID langid, REFGUID guidProfile, BSTR *pbstrProfile)
#define lstrcpynW
Definition: compat.h:405
static InputProcessorProfiles * impl_from_ITfSource(ITfSource *iface)
static HRESULT WINAPI EnumTfLanguageProfiles_QueryInterface(IEnumTfLanguageProfiles *iface, REFIID iid, LPVOID *ppvOut)
static HRESULT WINAPI InputProcessorProfiles_Register(ITfInputProcessorProfiles *iface, REFCLSID rclsid)
static HRESULT WINAPI InputProcessorProfileMgr_QueryInterface(ITfInputProcessorProfileMgr *iface, REFIID riid, void **ppv)
static EnumTfLanguageProfiles * impl_from_IEnumTfLanguageProfiles(IEnumTfLanguageProfiles *iface)
static HRESULT WINAPI InputProcessorProfiles_GetDefaultLanguageProfile(ITfInputProcessorProfiles *iface, LANGID langid, REFGUID catid, CLSID *pclsid, GUID *pguidProfile)
static ULONG WINAPI EnumTfInputProcessorProfiles_AddRef(IEnumTfInputProcessorProfiles *iface)
LONG WINAPI RegCloseKey(HKEY hKey)
Definition: reg.c:423
unsigned char * LPBYTE
Definition: typedefs.h:52
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
static ULONG WINAPI InputProcessorProfiles_AddRef(ITfInputProcessorProfiles *iface)
static HRESULT WINAPI InputProcessorProfiles_ActivateLanguageProfile(ITfInputProcessorProfiles *iface, REFCLSID rclsid, LANGID langid, REFGUID guidProfiles)
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60
static HRESULT WINAPI ProfilesEnumGuid_Reset(LPENUMGUID iface)
static const WCHAR desc[]
Definition: protectdata.c:36
#define debugstr_w
Definition: kernel32.h:32
GLenum GLint ref
Definition: glext.h:6028
#define FIXME(fmt,...)
Definition: debug.h:110
EXTERN_C const GUID GUID_TFCAT_TIP_HANDWRITING
Definition: msctf.idl:64
static HRESULT ProfilesEnumGuid_Constructor(IEnumGUID **ppOut)
#define S_FALSE
Definition: winerror.h:2357
static HRESULT WINAPI InputProcessorProfileMgr_GetActiveProfile(ITfInputProcessorProfileMgr *iface, REFGUID catid, TF_INPUTPROCESSORPROFILE *pProfile)
#define E_INVALIDARG
Definition: ddrawi.h:101
static ULONG WINAPI IPPSource_AddRef(ITfSource *iface)
smooth NULL
Definition: ftsmooth.c:416
static HRESULT WINAPI InputProcessorProfileMgr_ReleaseInputProcessor(ITfInputProcessorProfileMgr *iface, REFCLSID rclsid, DWORD dwFlags)
static HRESULT WINAPI EnumTfInputProcessorProfiles_Reset(IEnumTfInputProcessorProfiles *iface)
static HRESULT WINAPI ProfilesEnumGuid_Clone(LPENUMGUID iface, IEnumGUID **ppenum)
GUID catid
Definition: msctf.idl:608
#define REG_CREATED_NEW_KEY
Definition: nt_native.h:1084
static ULONG WINAPI EnumTfInputProcessorProfiles_Release(IEnumTfInputProcessorProfiles *iface)
#define debugstr_guid
Definition: kernel32.h:35
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
IEnumTfInputProcessorProfiles IEnumTfInputProcessorProfiles_iface
static HRESULT WINAPI EnumTfLanguageProfiles_Skip(IEnumTfLanguageProfiles *iface, ULONG celt)
#define KEY_WRITE
Definition: nt_native.h:1031
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:4895
static HRESULT WINAPI InputProcessorProfiles_EnumInputProcessorInfo(ITfInputProcessorProfiles *iface, IEnumGUID **ppEnum)
static HRESULT EnumTfLanguageProfiles_Constructor(LANGID langid, EnumTfLanguageProfiles **out)
HRESULT CategoryMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut)
Definition: categorymgr.c:413
WINE_DEFAULT_DEBUG_CHANNEL(msctf)
#define TRACE(s)
Definition: solgame.cpp:4
#define COOKIE_MAGIC_IPPSINK
#define GetProcessHeap()
Definition: compat.h:403
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
static ULONG WINAPI EnumTfLanguageProfiles_Release(IEnumTfLanguageProfiles *iface)
ITfCategoryMgr * catmgr
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4116
static HRESULT WINAPI InputProcessorProfiles_QueryInterface(ITfInputProcessorProfiles *iface, REFIID iid, void **ppv)
__wchar_t WCHAR
Definition: xmlstorage.h:180
static HRESULT WINAPI InputProcessorProfileMgr_EnumProfiles(ITfInputProcessorProfileMgr *iface, LANGID langid, IEnumTfInputProcessorProfiles **ppEnum)
static HRESULT WINAPI EnumTfLanguageProfiles_Reset(IEnumTfLanguageProfiles *iface)
static HRESULT WINAPI IPPSource_UnadviseSink(ITfSource *iface, DWORD pdwCookie)
LONG HRESULT
Definition: typedefs.h:77
static void EnumTfLanguageProfiles_Destructor(EnumTfLanguageProfiles *This)
const GUID IID_IUnknown
GUID guidProfile
Definition: msctf.idl:607
static HRESULT WINAPI EnumTfLanguageProfiles_Next(IEnumTfLanguageProfiles *iface, ULONG ulCount, TF_LANGUAGEPROFILE *pProfile, ULONG *pcFetch)
#define swprintf(buf, format,...)
Definition: sprintf.c:56
#define WINAPI
Definition: msvc.h:8
INT WINAPI StringFromGUID2(REFGUID id, LPOLESTR str, INT cmax)
Definition: compobj.c:2434
static FILE * out
Definition: regtests2xml.c:44
unsigned long DWORD
Definition: ntddk_ex.h:95
static const IEnumTfInputProcessorProfilesVtbl EnumTfInputProcessorProfilesVtbl
static ProfilesEnumGuid * impl_from_IEnumGUID(IEnumGUID *iface)
static LSTATUS(WINAPI *pRegDeleteTreeW)(HKEY
static ULONG WINAPI InputProcessorProfileMgr_AddRef(ITfInputProcessorProfileMgr *iface)
static ULONG WINAPI IPPSource_Release(ITfSource *iface)
static HRESULT WINAPI InputProcessorProfileMgr_GetProfile(ITfInputProcessorProfileMgr *iface, DWORD dwProfileType, LANGID langid, REFCLSID clsid, REFGUID guidProfile, HKL hkl, TF_INPUTPROCESSORPROFILE *pProfile)
static double zero
Definition: j0_y0.c:96
int ret
ITfInputProcessorProfiles ITfInputProcessorProfiles_iface
REFCLSID clsid
Definition: msctf.c:82
#define InterlockedDecrement
Definition: armddk.h:52
static HRESULT WINAPI InputProcessorProfiles_GetCurrentLanguage(ITfInputProcessorProfiles *iface, LANGID *plangid)
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1175
HKEY key
Definition: reg.c:42
unsigned char BYTE
Definition: mem.h:68
#define GUID_NULL
Definition: ks.h:106
Definition: _list.h:228
static InputProcessorProfiles * impl_from_ITfInputProcessorProfiles(ITfInputProcessorProfiles *iface)
UINT_PTR HKL
Definition: msctf.idl:101
#define CLASS_E_NOAGGREGATION
Definition: winerror.h:2662
SOCKET WSAAPI accept(IN SOCKET s, OUT LPSOCKADDR addr, OUT INT FAR *addrlen)
Definition: socklife.c:23
static HRESULT WINAPI IPPSource_QueryInterface(ITfSource *iface, REFIID iid, LPVOID *ppvOut)
#define ERROR_MORE_DATA
Definition: dderror.h:13
#define debugstr_wn
Definition: kernel32.h:33
IEnumTfLanguageProfiles IEnumTfLanguageProfiles_iface
LSTATUS WINAPI RegDeleteTreeW(HKEY hKey, LPCWSTR lpszSubKey)
Definition: reg.c:1746
static HRESULT WINAPI InputProcessorProfiles_EnableLanguageProfile(ITfInputProcessorProfiles *iface, REFCLSID rclsid, LANGID langid, REFGUID guidProfile, BOOL fEnable)
#define S_OK
Definition: intsafe.h:59
HKL hkl
Definition: msctf.idl:611
TF_INPUTPROCESSORPROFILE
Definition: msctf.idl:613
#define InterlockedIncrement
Definition: armddk.h:53
const char cursor[]
Definition: icontest.c:13
static const ITfInputProcessorProfilesVtbl InputProcessorProfilesVtbl
static const WCHAR szwAssemblies[]
static ULONG WINAPI InputProcessorProfiles_Release(ITfInputProcessorProfiles *iface)
ITfInputProcessorProfileMgr ITfInputProcessorProfileMgr_iface
HRESULT InputProcessorProfiles_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut)
struct tagInputProcessorProfiles InputProcessorProfiles
#define E_NOTIMPL
Definition: ddrawi.h:99
static HRESULT WINAPI InputProcessorProfiles_SubstituteKeyboardLayout(ITfInputProcessorProfiles *iface, REFCLSID rclsid, LANGID langid, REFGUID guidProfile, HKL hKL)
static const IEnumGUIDVtbl EnumGUIDVtbl
BOOL get_active_textservice(REFCLSID rclsid, TF_LANGUAGEPROFILE *profile)
Definition: msctf.c:459
EXTERN_C const GUID GUID_TFCAT_TIP_KEYBOARD
Definition: msctf.idl:62
static HRESULT WINAPI EnumTfInputProcessorProfiles_Skip(IEnumTfInputProcessorProfiles *iface, ULONG count)
static HRESULT WINAPI ProfilesEnumGuid_Next(LPENUMGUID iface, ULONG celt, GUID *rgelt, ULONG *pceltFetched)
static const WCHAR szwEnable[]
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
Definition: compobj.c:4112
static ULONG WINAPI EnumTfLanguageProfiles_AddRef(IEnumTfLanguageProfiles *iface)
static void InputProcessorProfiles_Destructor(InputProcessorProfiles *This)
#define HEAP_ZERO_MEMORY
Definition: compat.h:123
static HRESULT WINAPI InputProcessorProfiles_EnableLanguageProfileByDefault(ITfInputProcessorProfiles *iface, REFCLSID rclsid, LANGID langid, REFGUID guidProfile, BOOL fEnable)
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 HRESULT WINAPI ProfilesEnumGuid_QueryInterface(IEnumGUID *iface, REFIID iid, LPVOID *ppvOut)
static const WCHAR szwDefaultFmt[]
static HRESULT WINAPI InputProcessorProfiles_RemoveLanguageProfile(ITfInputProcessorProfiles *iface, REFCLSID rclsid, LANGID langid, REFGUID guidProfile)
HRESULT unadvise_sink(DWORD cookie)
Definition: msctf.c:312
static ULONG WINAPI ProfilesEnumGuid_Release(IEnumGUID *iface)
struct tagEnumTfLanguageProfiles EnumTfLanguageProfiles
GLuint res
Definition: glext.h:9613
__WINE_SERVER_LIST_INLINE void list_init(struct list *list)
Definition: list.h:149
HRESULT WINAPI CLSIDFromString(LPCOLESTR idstr, LPCLSID id)
Definition: compobj.c:2338
unsigned int ULONG
Definition: retypes.h:1
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3366
static const WCHAR szwProfile[]
static HRESULT WINAPI InputProcessorProfileMgr_DeactivateProfile(ITfInputProcessorProfileMgr *iface, DWORD dwProfileType, LANGID langid, REFCLSID clsid, REFGUID guidProfile, HKL hkl, DWORD dwFlags)
static void add_userkey(REFCLSID rclsid, LANGID langid, REFGUID guidProfile)
#define profile
Definition: kernel32.h:12
static HRESULT WINAPI InputProcessorProfiles_GetActiveLanguageProfile(ITfInputProcessorProfiles *iface, REFCLSID rclsid, LANGID *plangid, GUID *pguidProfile)
static INT next_LanguageProfile(EnumTfLanguageProfiles *This, CLSID clsid, TF_LANGUAGEPROFILE *tflp)
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:2527
static const ITfInputProcessorProfileMgrVtbl InputProcessorProfileMgrVtbl
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)
#define E_POINTER
Definition: winerror.h:2365
#define REG_DWORD
Definition: sdbapi.c:596
static HRESULT WINAPI ProfilesEnumGuid_Skip(LPENUMGUID iface, ULONG celt)
static HRESULT WINAPI EnumTfInputProcessorProfiles_QueryInterface(IEnumTfInputProcessorProfiles *iface, REFIID riid, void **ppv)
LPVOID WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: ifs.c:404
static HRESULT WINAPI EnumTfLanguageProfiles_Clone(IEnumTfLanguageProfiles *iface, IEnumTfLanguageProfiles **ppenum)
Definition: dsound.c:943
#define HeapFree(x, y, z)
Definition: compat.h:402
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
struct tagProfilesEnumGuid ProfilesEnumGuid
#define SUCCEEDED(hr)
Definition: intsafe.h:57
Definition: path.c:42
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
static HRESULT WINAPI InputProcessorProfileMgr_UnregisterProfile(ITfInputProcessorProfileMgr *iface, REFCLSID rclsid, LANGID langid, REFGUID guidProfile, DWORD dwFlags)
#define REG_SZ
Definition: layer.c:22