ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

txtsrv.c
Go to the documentation of this file.
00001 /*
00002  * RichEdit - functions and interfaces around CreateTextServices
00003  *
00004  * Copyright 2005, 2006, Maarten Lankhorst
00005  *
00006  * This library is free software; you can redistribute it and/or
00007  * modify it under the terms of the GNU Lesser General Public
00008  * License as published by the Free Software Foundation; either
00009  * version 2.1 of the License, or (at your option) any later version.
00010  *
00011  * This library is distributed in the hope that it will be useful,
00012  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014  * Lesser General Public License for more details.
00015  *
00016  * You should have received a copy of the GNU Lesser General Public
00017  * License along with this library; if not, write to the Free Software
00018  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
00019  */
00020 
00021 #include "config.h"
00022 #include "wine/port.h"
00023 
00024 #define NONAMELESSSTRUCT
00025 #define NONAMELESSUNION
00026 #define COBJMACROS
00027 
00028 #include "editor.h"
00029 #include "ole2.h"
00030 #include "oleauto.h"
00031 #include "richole.h"
00032 #include "imm.h"
00033 #include "textserv.h"
00034 #include "wine/debug.h"
00035 #include "editstr.h"
00036 
00037 #ifdef __i386__  /* thiscall functions are i386-specific */
00038 
00039 #define THISCALL(func) __thiscall_ ## func
00040 #define DEFINE_THISCALL_WRAPPER(func,args) \
00041    extern typeof(func) THISCALL(func); \
00042    __ASM_STDCALL_FUNC(__thiscall_ ## func, args, \
00043                    "popl %eax\n\t" \
00044                    "pushl %ecx\n\t" \
00045                    "pushl %eax\n\t" \
00046                    "jmp " __ASM_NAME(#func) __ASM_STDCALL(args) )
00047 #else /* __i386__ */
00048 
00049 #define THISCALL(func) func
00050 #define DEFINE_THISCALL_WRAPPER(func,args) /* nothing */
00051 
00052 #endif /* __i386__ */
00053 
00054 WINE_DEFAULT_DEBUG_CHANNEL(richedit);
00055 
00056 typedef struct ITextServicesImpl {
00057    IUnknown IUnknown_inner;
00058    ITextServices ITextServices_iface;
00059    IUnknown *outer_unk;
00060    LONG ref;
00061    ITextHost *pMyHost;
00062    CRITICAL_SECTION csTxtSrv;
00063    ME_TextEditor *editor;
00064    char spare[256];
00065 } ITextServicesImpl;
00066 
00067 static inline ITextServicesImpl *impl_from_IUnknown(IUnknown *iface)
00068 {
00069    return CONTAINING_RECORD(iface, ITextServicesImpl, IUnknown_inner);
00070 }
00071 
00072 static HRESULT WINAPI ITextServicesImpl_QueryInterface(IUnknown *iface, REFIID riid, void **ppv)
00073 {
00074    ITextServicesImpl *This = impl_from_IUnknown(iface);
00075 
00076    TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ppv);
00077 
00078    if (IsEqualIID(riid, &IID_IUnknown))
00079       *ppv = &This->IUnknown_inner;
00080    else if IsEqualIID(riid, &IID_ITextServices)
00081       *ppv = &This->ITextServices_iface;
00082    else {
00083       *ppv = NULL;
00084       FIXME("Unknown interface: %s\n", debugstr_guid(riid));
00085       return E_NOINTERFACE;
00086    }
00087 
00088    IUnknown_AddRef((IUnknown*)*ppv);
00089    return S_OK;
00090 }
00091 
00092 static ULONG WINAPI ITextServicesImpl_AddRef(IUnknown *iface)
00093 {
00094    ITextServicesImpl *This = impl_from_IUnknown(iface);
00095    LONG ref = InterlockedIncrement(&This->ref);
00096 
00097    TRACE("(%p) ref=%d\n", This, ref);
00098 
00099    return ref;
00100 }
00101 
00102 static ULONG WINAPI ITextServicesImpl_Release(IUnknown *iface)
00103 {
00104    ITextServicesImpl *This = impl_from_IUnknown(iface);
00105    LONG ref = InterlockedDecrement(&This->ref);
00106 
00107    TRACE("(%p) ref=%d\n", This, ref);
00108 
00109    if (!ref)
00110    {
00111       ITextHost_Release(This->pMyHost);
00112       This->csTxtSrv.DebugInfo->Spare[0] = 0;
00113       DeleteCriticalSection(&This->csTxtSrv);
00114       CoTaskMemFree(This);
00115    }
00116    return ref;
00117 }
00118 
00119 static const IUnknownVtbl textservices_inner_vtbl =
00120 {
00121    ITextServicesImpl_QueryInterface,
00122    ITextServicesImpl_AddRef,
00123    ITextServicesImpl_Release
00124 };
00125 
00126 static inline ITextServicesImpl *impl_from_ITextServices(ITextServices *iface)
00127 {
00128    return CONTAINING_RECORD(iface, ITextServicesImpl, ITextServices_iface);
00129 }
00130 
00131 static HRESULT WINAPI fnTextSrv_QueryInterface(ITextServices *iface, REFIID riid, void **ppv)
00132 {
00133    ITextServicesImpl *This = impl_from_ITextServices(iface);
00134    return IUnknown_QueryInterface(This->outer_unk, riid, ppv);
00135 }
00136 
00137 static ULONG WINAPI fnTextSrv_AddRef(ITextServices *iface)
00138 {
00139    ITextServicesImpl *This = impl_from_ITextServices(iface);
00140    return IUnknown_AddRef(This->outer_unk);
00141 }
00142 
00143 static ULONG WINAPI fnTextSrv_Release(ITextServices *iface)
00144 {
00145    ITextServicesImpl *This = impl_from_ITextServices(iface);
00146    return IUnknown_Release(This->outer_unk);
00147 }
00148 
00149 DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxSendMessage(ITextServices *iface, UINT msg, WPARAM wparam,
00150                                        LPARAM lparam, LRESULT *plresult)
00151 {
00152    ITextServicesImpl *This = impl_from_ITextServices(iface);
00153    HRESULT hresult;
00154    LRESULT lresult;
00155 
00156    lresult = ME_HandleMessage(This->editor, msg, wparam, lparam, TRUE, &hresult);
00157    if (plresult) *plresult = lresult;
00158    return hresult;
00159 }
00160 
00161 DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxDraw(ITextServices *iface, DWORD dwDrawAspect, LONG lindex,
00162                                 void *pvAspect, DVTARGETDEVICE *ptd, HDC hdcDraw, HDC hdcTargetDev,
00163                                 LPCRECTL lprcBounds, LPCRECTL lprcWBounds, LPRECT lprcUpdate,
00164                                 BOOL (CALLBACK * pfnContinue)(DWORD), DWORD dwContinue,
00165                                 LONG lViewId)
00166 {
00167    ITextServicesImpl *This = impl_from_ITextServices(iface);
00168 
00169    FIXME("%p: STUB\n", This);
00170    return E_NOTIMPL;
00171 }
00172 
00173 DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxGetHScroll(ITextServices *iface, LONG *plMin, LONG *plMax, LONG *plPos,
00174                                       LONG *plPage, BOOL *pfEnabled)
00175 {
00176    ITextServicesImpl *This = impl_from_ITextServices(iface);
00177 
00178    *plMin = This->editor->horz_si.nMin;
00179    *plMax = This->editor->horz_si.nMax;
00180    *plPos = This->editor->horz_si.nPos;
00181    *plPage = This->editor->horz_si.nPage;
00182    *pfEnabled = (This->editor->styleFlags & WS_HSCROLL) != 0;
00183    return S_OK;
00184 }
00185 
00186 DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxGetVScroll(ITextServices *iface, LONG *plMin, LONG *plMax, LONG *plPos,
00187                                       LONG *plPage, BOOL *pfEnabled)
00188 {
00189    ITextServicesImpl *This = impl_from_ITextServices(iface);
00190 
00191    *plMin = This->editor->vert_si.nMin;
00192    *plMax = This->editor->vert_si.nMax;
00193    *plPos = This->editor->vert_si.nPos;
00194    *plPage = This->editor->vert_si.nPage;
00195    *pfEnabled = (This->editor->styleFlags & WS_VSCROLL) != 0;
00196    return S_OK;
00197 }
00198 
00199 DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_OnTxSetCursor(ITextServices *iface, DWORD dwDrawAspect, LONG lindex,
00200                                        void *pvAspect, DVTARGETDEVICE *ptd, HDC hdcDraw,
00201                                        HDC hicTargetDev, LPCRECT lprcClient, INT x, INT y)
00202 {
00203    ITextServicesImpl *This = impl_from_ITextServices(iface);
00204 
00205    FIXME("%p: STUB\n", This);
00206    return E_NOTIMPL;
00207 }
00208 
00209 DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxQueryHitPoint(ITextServices *iface, DWORD dwDrawAspect, LONG lindex,
00210                                          void *pvAspect, DVTARGETDEVICE *ptd, HDC hdcDraw,
00211                                          HDC hicTargetDev, LPCRECT lprcClient, INT x, INT y,
00212                                          DWORD *pHitResult)
00213 {
00214    ITextServicesImpl *This = impl_from_ITextServices(iface);
00215 
00216    FIXME("%p: STUB\n", This);
00217    return E_NOTIMPL;
00218 }
00219 
00220 DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_OnTxInplaceActivate(ITextServices *iface, LPCRECT prcClient)
00221 {
00222    ITextServicesImpl *This = impl_from_ITextServices(iface);
00223 
00224    FIXME("%p: STUB\n", This);
00225    return E_NOTIMPL;
00226 }
00227 
00228 DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_OnTxInplaceDeactivate(ITextServices *iface)
00229 {
00230    ITextServicesImpl *This = impl_from_ITextServices(iface);
00231 
00232    FIXME("%p: STUB\n", This);
00233    return E_NOTIMPL;
00234 }
00235 
00236 DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_OnTxUIActivate(ITextServices *iface)
00237 {
00238    ITextServicesImpl *This = impl_from_ITextServices(iface);
00239 
00240    FIXME("%p: STUB\n", This);
00241    return E_NOTIMPL;
00242 }
00243 
00244 DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_OnTxUIDeactivate(ITextServices *iface)
00245 {
00246    ITextServicesImpl *This = impl_from_ITextServices(iface);
00247 
00248    FIXME("%p: STUB\n", This);
00249    return E_NOTIMPL;
00250 }
00251 
00252 DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxGetText(ITextServices *iface, BSTR *pbstrText)
00253 {
00254    ITextServicesImpl *This = impl_from_ITextServices(iface);
00255    int length;
00256 
00257    length = ME_GetTextLength(This->editor);
00258    if (length)
00259    {
00260       ME_Cursor start;
00261       BSTR bstr;
00262       bstr = SysAllocStringByteLen(NULL, length * sizeof(WCHAR));
00263       if (bstr == NULL)
00264          return E_OUTOFMEMORY;
00265 
00266       ME_CursorFromCharOfs(This->editor, 0, &start);
00267       ME_GetTextW(This->editor, bstr, length, &start, INT_MAX, FALSE);
00268       *pbstrText = bstr;
00269    } else {
00270       *pbstrText = NULL;
00271    }
00272 
00273    return S_OK;
00274 }
00275 
00276 DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxSetText(ITextServices *iface, LPCWSTR pszText)
00277 {
00278    ITextServicesImpl *This = impl_from_ITextServices(iface);
00279    ME_Cursor cursor;
00280 
00281    ME_SetCursorToStart(This->editor, &cursor);
00282    ME_InternalDeleteText(This->editor, &cursor,
00283                          ME_GetTextLength(This->editor), FALSE);
00284    ME_InsertTextFromCursor(This->editor, 0, pszText, -1,
00285                            This->editor->pBuffer->pDefaultStyle);
00286    ME_SetSelection(This->editor, 0, 0);
00287    This->editor->nModifyStep = 0;
00288    OleFlushClipboard();
00289    ME_EmptyUndoStack(This->editor);
00290    ME_UpdateRepaint(This->editor, FALSE);
00291 
00292    return S_OK;
00293 }
00294 
00295 DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxGetCurrentTargetX(ITextServices *iface, LONG *x)
00296 {
00297    ITextServicesImpl *This = impl_from_ITextServices(iface);
00298 
00299    FIXME("%p: STUB\n", This);
00300    return E_NOTIMPL;
00301 }
00302 
00303 DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxGetBaseLinePos(ITextServices *iface, LONG *x)
00304 {
00305    ITextServicesImpl *This = impl_from_ITextServices(iface);
00306 
00307    FIXME("%p: STUB\n", This);
00308    return E_NOTIMPL;
00309 }
00310 
00311 DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxGetNaturalSize(ITextServices *iface, DWORD dwAspect, HDC hdcDraw,
00312                                           HDC hicTargetDev, DVTARGETDEVICE *ptd, DWORD dwMode,
00313                                           const SIZEL *psizelExtent, LONG *pwidth, LONG *pheight)
00314 {
00315    ITextServicesImpl *This = impl_from_ITextServices(iface);
00316 
00317    FIXME("%p: STUB\n", This);
00318    return E_NOTIMPL;
00319 }
00320 
00321 DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxGetDropTarget(ITextServices *iface, IDropTarget **ppDropTarget)
00322 {
00323    ITextServicesImpl *This = impl_from_ITextServices(iface);
00324 
00325    FIXME("%p: STUB\n", This);
00326    return E_NOTIMPL;
00327 }
00328 
00329 DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_OnTxPropertyBitsChange(ITextServices *iface, DWORD dwMask, DWORD dwBits)
00330 {
00331    ITextServicesImpl *This = impl_from_ITextServices(iface);
00332 
00333    FIXME("%p: STUB\n", This);
00334    return E_NOTIMPL;
00335 }
00336 
00337 DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxGetCachedSize(ITextServices *iface, DWORD *pdwWidth, DWORD *pdwHeight)
00338 {
00339    ITextServicesImpl *This = impl_from_ITextServices(iface);
00340 
00341    FIXME("%p: STUB\n", This);
00342    return E_NOTIMPL;
00343 }
00344 
00345 DEFINE_THISCALL_WRAPPER(fnTextSrv_TxSendMessage,20)
00346 DEFINE_THISCALL_WRAPPER(fnTextSrv_TxDraw,52)
00347 DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetHScroll,24)
00348 DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetVScroll,24)
00349 DEFINE_THISCALL_WRAPPER(fnTextSrv_OnTxSetCursor,40)
00350 DEFINE_THISCALL_WRAPPER(fnTextSrv_TxQueryHitPoint,44)
00351 DEFINE_THISCALL_WRAPPER(fnTextSrv_OnTxInplaceActivate,8)
00352 DEFINE_THISCALL_WRAPPER(fnTextSrv_OnTxInplaceDeactivate,4)
00353 DEFINE_THISCALL_WRAPPER(fnTextSrv_OnTxUIActivate,4)
00354 DEFINE_THISCALL_WRAPPER(fnTextSrv_OnTxUIDeactivate,4)
00355 DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetText,8)
00356 DEFINE_THISCALL_WRAPPER(fnTextSrv_TxSetText,8)
00357 DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetCurrentTargetX,8)
00358 DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetBaseLinePos,8)
00359 DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetNaturalSize,36)
00360 DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetDropTarget,8)
00361 DEFINE_THISCALL_WRAPPER(fnTextSrv_OnTxPropertyBitsChange,12)
00362 DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetCachedSize,12)
00363 
00364 static const ITextServicesVtbl textservices_vtbl =
00365 {
00366    fnTextSrv_QueryInterface,
00367    fnTextSrv_AddRef,
00368    fnTextSrv_Release,
00369    THISCALL(fnTextSrv_TxSendMessage),
00370    THISCALL(fnTextSrv_TxDraw),
00371    THISCALL(fnTextSrv_TxGetHScroll),
00372    THISCALL(fnTextSrv_TxGetVScroll),
00373    THISCALL(fnTextSrv_OnTxSetCursor),
00374    THISCALL(fnTextSrv_TxQueryHitPoint),
00375    THISCALL(fnTextSrv_OnTxInplaceActivate),
00376    THISCALL(fnTextSrv_OnTxInplaceDeactivate),
00377    THISCALL(fnTextSrv_OnTxUIActivate),
00378    THISCALL(fnTextSrv_OnTxUIDeactivate),
00379    THISCALL(fnTextSrv_TxGetText),
00380    THISCALL(fnTextSrv_TxSetText),
00381    THISCALL(fnTextSrv_TxGetCurrentTargetX),
00382    THISCALL(fnTextSrv_TxGetBaseLinePos),
00383    THISCALL(fnTextSrv_TxGetNaturalSize),
00384    THISCALL(fnTextSrv_TxGetDropTarget),
00385    THISCALL(fnTextSrv_OnTxPropertyBitsChange),
00386    THISCALL(fnTextSrv_TxGetCachedSize)
00387 };
00388 
00389 /******************************************************************
00390  *        CreateTextServices (RICHED20.4)
00391  */
00392 HRESULT WINAPI CreateTextServices(IUnknown  *pUnkOuter, ITextHost *pITextHost, IUnknown  **ppUnk)
00393 {
00394    ITextServicesImpl *ITextImpl;
00395    HRESULT hres;
00396    TRACE("%p %p --> %p\n", pUnkOuter, pITextHost, ppUnk);
00397    if (pITextHost == NULL)
00398       return E_POINTER;
00399 
00400    ITextImpl = CoTaskMemAlloc(sizeof(*ITextImpl));
00401    if (ITextImpl == NULL)
00402       return E_OUTOFMEMORY;
00403    InitializeCriticalSection(&ITextImpl->csTxtSrv);
00404    ITextImpl->csTxtSrv.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": ITextServicesImpl.csTxtSrv");
00405    ITextImpl->ref = 1;
00406    ITextHost_AddRef(pITextHost);
00407    ITextImpl->pMyHost = pITextHost;
00408    ITextImpl->IUnknown_inner.lpVtbl = &textservices_inner_vtbl;
00409    ITextImpl->ITextServices_iface.lpVtbl = &textservices_vtbl;
00410    ITextImpl->editor = ME_MakeEditor(pITextHost, FALSE);
00411    ITextImpl->editor->exStyleFlags = 0;
00412    ITextImpl->editor->rcFormat.left = 0;
00413    ITextImpl->editor->rcFormat.top = 0;
00414    ITextImpl->editor->rcFormat.right = 0;
00415    ITextImpl->editor->rcFormat.bottom = 0;
00416 
00417    ME_HandleMessage(ITextImpl->editor, WM_CREATE, 0, 0, TRUE, &hres);
00418 
00419    if (pUnkOuter)
00420       ITextImpl->outer_unk = pUnkOuter;
00421    else
00422       ITextImpl->outer_unk = &ITextImpl->IUnknown_inner;
00423 
00424    *ppUnk = &ITextImpl->IUnknown_inner;
00425    return S_OK;
00426 }

Generated on Sat May 26 2012 04:24:32 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.