#define UNICODE #include #include "dllMain.h" #include "storage.h" #include "backend.h" #include "internal.h" #include "virtualBuffer.h" LRESULT VBufInternal_isWindowPrepared(HWND hwnd, LPARAM lParam) { return 1; } LRESULT VBufInternal_prepareWindow(HWND hwnd, LPARAM lParam) { wchar_t moduleFileName[1024]; long oldWndProc=GetWindowLong(hwnd,GWL_WNDPROC); SetWindowLong(hwnd,GWL_WNDPROC,(long)VBufInternal_wndProc); SetProp(hwnd,L"VBufInternal_oldWndProc",(HANDLE)oldWndProc); GetModuleFileNameW(VBuf_moduleHandle,moduleFileName,1024); LoadLibraryW(moduleFileName); return 0; } LRESULT VBufInternal_unprepareWindow(HWND hwnd, LPARAM lParam) { long oldWndProc=(long)GetProp(hwnd,L"VBufInternal_oldWndProc"); RemoveProp(hwnd,L"VBufInternal_oldWndProc"); SetWindowLong(hwnd,GWL_WNDPROC,oldWndProc); FreeLibrary(VBuf_moduleHandle); return 0; } LRESULT VBufInternal_createBuffer(HWND hwnd, LPARAM lParam) { HINSTANCE backendHandle=LoadLibrary((wchar_t*)lParam); VBufBackend_initialize_t backendInitialize=(VBufBackend_initialize_t)GetProcAddress(backendHandle,"VBufBackend_initialize"); VBufStorage_bufferNode_t* storageBuf=VBufStorage_createBuffer(); VBufInternal_bufContainer_t* bufContainer=(VBufInternal_bufContainer_t*)malloc(sizeof(VBufInternal_bufContainer_t)); bufContainer->hwnd=hwnd; bufContainer->backendHandle=backendHandle; bufContainer->storageBuf=storageBuf; bufContainer->criticalSectionHandle=(CRITICAL_SECTION*)malloc(sizeof(CRITICAL_SECTION)); InitializeCriticalSection(bufContainer->criticalSectionHandle); CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)backendInitialize,bufContainer,0,NULL); return (LRESULT)bufContainer; } LRESULT VBufInternal_destroyBuffer(HWND hwnd, LPARAM lParam) { VBufInternal_bufContainer_t* bufContainer=(VBufInternal_bufContainer_t*)lParam; VBufBackend_terminate_t backendTerminate=(VBufBackend_terminate_t)GetProcAddress(bufContainer->backendHandle,"VBufBackend_terminate"); backendTerminate(bufContainer); EnterCriticalSection(bufContainer->criticalSectionHandle); FreeLibrary(bufContainer->backendHandle); VBufStorage_destroyBuffer(bufContainer->storageBuf); DeleteCriticalSection(bufContainer->criticalSectionHandle); free(bufContainer->criticalSectionHandle); free(bufContainer); return 0; } LRESULT VBufInternal_getFieldIdentifierFromBufferOffset(HWND hwnd, LPARAM lParam) { LRESULT res; VBufInternal_lParam_getFieldIdentifierFromBufferOffset* args=(VBufInternal_lParam_getFieldIdentifierFromBufferOffset*)lParam; EnterCriticalSection(args->bufContainer->criticalSectionHandle); res=(LRESULT)VBufStorage_getFieldIdentifierFromBufferOffset(args->bufContainer->storageBuf,args->offset,&(args->foundDocHandle),&(args->foundID)); LeaveCriticalSection(args->bufContainer->criticalSectionHandle); return res; } LRESULT VBufInternal_getBufferOffsetsFromFieldIdentifier(HWND hwnd, LPARAM lParam) { LRESULT res; VBufInternal_lParam_getBufferOffsetsFromFieldIdentifier* args=(VBufInternal_lParam_getBufferOffsetsFromFieldIdentifier*)lParam; EnterCriticalSection(args->bufContainer->criticalSectionHandle); res=(LRESULT)VBufStorage_getBufferOffsetsFromFieldIdentifier(args->bufContainer->storageBuf,args->docHandle,args->ID,&(args->startOffset),&(args->endOffset)); LeaveCriticalSection(args->bufContainer->criticalSectionHandle); return res; } LRESULT VBufInternal_findBufferFieldIdentifierByProperties(HWND hwnd, LPARAM lParam) { LRESULT res; VBufInternal_lParam_findBufferFieldIdentifierByProperties* args=(VBufInternal_lParam_findBufferFieldIdentifierByProperties*)lParam; EnterCriticalSection(args->bufContainer->criticalSectionHandle); res=(LRESULT)VBufStorage_findBufferFieldIdentifierByProperties(args->bufContainer->storageBuf,args->direction,args->startOffset,args->attribs,args->numAttribs,&(args->foundDocHandle),&(args->foundID)); LeaveCriticalSection(args->bufContainer->criticalSectionHandle); return res; } LRESULT VBufInternal_getBufferTextLength(HWND hwnd, LPARAM lParam) { LRESULT res; VBufInternal_bufContainer_t* bufContainer=(VBufInternal_bufContainer_t*)lParam; EnterCriticalSection(bufContainer->criticalSectionHandle); res=(LRESULT)VBufStorage_getBufferTextLength(bufContainer->storageBuf); LeaveCriticalSection(bufContainer->criticalSectionHandle); return res; } LRESULT VBufInternal_getBufferFieldCount(HWND hwnd, LPARAM lParam) { LRESULT res; VBufInternal_bufContainer_t* bufContainer=(VBufInternal_bufContainer_t*)lParam; EnterCriticalSection(bufContainer->criticalSectionHandle); res=(LRESULT)VBufStorage_getBufferFieldCount(bufContainer->storageBuf); LeaveCriticalSection(bufContainer->criticalSectionHandle); return res; } LRESULT VBufInternal_findBufferText(HWND hwnd, LPARAM lParam) { LRESULT res; VBufInternal_lParam_findBufferText* args=(VBufInternal_lParam_findBufferText*)lParam; EnterCriticalSection(args->bufContainer->criticalSectionHandle); res=(LRESULT)VBufStorage_findBufferText(args->bufContainer->storageBuf,args->text,args->startOffset, args->direction,args->flags); LeaveCriticalSection(args->bufContainer->criticalSectionHandle); return res; } LRESULT VBufInternal_getBufferTextByOffsets(HWND hwnd, LPARAM lParam) { LRESULT res; VBufInternal_lParam_getBufferTextByOffsets* args=(VBufInternal_lParam_getBufferTextByOffsets*)lParam; EnterCriticalSection(args->bufContainer->criticalSectionHandle); res=(LRESULT)VBufStorage_getBufferTextByOffsets(args->bufContainer->storageBuf,args->startOffset,args->endOffset,args->text); LeaveCriticalSection(args->bufContainer->criticalSectionHandle); return res; } LRESULT VBufInternal_getXMLContextAtBufferOffset(HWND hwnd, LPARAM lParam) { LRESULT res; VBufInternal_lParam_getXMLContextAtBufferOffset* args=(VBufInternal_lParam_getXMLContextAtBufferOffset*)lParam; EnterCriticalSection(args->bufContainer->criticalSectionHandle); res=(LRESULT)VBufStorage_getXMLContextAtBufferOffset(args->bufContainer->storageBuf,args->offset,args->text); LeaveCriticalSection(args->bufContainer->criticalSectionHandle); return res; } LRESULT VBufInternal_getXMLBufferTextByOffsets(HWND hwnd, LPARAM lParam) { LRESULT res; VBufInternal_lParam_getXMLBufferTextByOffsets* args=(VBufInternal_lParam_getXMLBufferTextByOffsets*)lParam; EnterCriticalSection(args->bufContainer->criticalSectionHandle); res=(LRESULT)VBufStorage_getXMLBufferTextByOffsets(args->bufContainer->storageBuf,args->startOffset,args->endOffset,args->text); LeaveCriticalSection(args->bufContainer->criticalSectionHandle); return res; } LRESULT VBufInternal_activateBufferFieldByID(HWND hwnd, LPARAM lParam) { VBufInternal_lParam_activateBufferFieldByID* args=(VBufInternal_lParam_activateBufferFieldByID*)lParam; VBufBackend_activateBufferFieldByID_t backendActivate=(VBufBackend_activateBufferFieldByID_t)GetProcAddress(args->bufContainer->backendHandle,"VBufBackend_activateBufferFieldByID"); backendActivate(args->bufContainer,args->ID,args->activationType); return 0; } LRESULT VBufInternal_getBufferLineOffsets(HWND hwnd, LPARAM lParam) { LRESULT res; VBufInternal_lParam_getBufferLineOffsets* args=(VBufInternal_lParam_getBufferLineOffsets*)lParam; EnterCriticalSection(args->bufContainer->criticalSectionHandle); res=(LRESULT)VBufStorage_getBufferLineOffsets(args->bufContainer->storageBuf,args->offset,args->maxLineLength,args->useScreenLayout,&(args->startOffset),&(args->endOffset)); LeaveCriticalSection(args->bufContainer->criticalSectionHandle); return res; } LRESULT VBufInternal_getBufferSelectionOffsets(HWND hwnd, LPARAM lParam) { LRESULT res; VBufInternal_lParam_getBufferSelectionOffsets* args=(VBufInternal_lParam_getBufferSelectionOffsets*)lParam; EnterCriticalSection(args->bufContainer->criticalSectionHandle); res=(LRESULT)VBufStorage_getBufferSelectionOffsets(args->bufContainer->storageBuf,&(args->startOffset),&(args->endOffset)); LeaveCriticalSection(args->bufContainer->criticalSectionHandle); return res; } LRESULT VBufInternal_setBufferSelectionOffsets(HWND hwnd, LPARAM lParam) { LRESULT res; VBufInternal_lParam_setBufferSelectionOffsets* args=(VBufInternal_lParam_setBufferSelectionOffsets*)lParam; EnterCriticalSection(args->bufContainer->criticalSectionHandle); res=(LRESULT)VBufStorage_setBufferSelectionOffsets(args->bufContainer->storageBuf,args->startOffset,args->endOffset); LeaveCriticalSection(args->bufContainer->criticalSectionHandle); return res; } LRESULT CALLBACK VBufInternal_windowPreparationHook(int code, WPARAM wParam,LPARAM lParam) { CWPSTRUCT* pcwp=(CWPSTRUCT*)lParam; if((code==HC_ACTION)&&(pcwp->message==VBuf_wm_execInternalFunc)&&(pcwp->wParam==(long)VBufInternal_prepareWindow)) { VBufInternal_prepareWindow(pcwp->hwnd,pcwp->lParam); return 1; } return CallNextHookEx(VBuf_windowPreparationHookID,code,wParam,lParam); } LRESULT CALLBACK VBufInternal_wndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) { if(msg==VBuf_wm_execInternalFunc) { return ((VBufInternal_func_t)wParam)(hwnd,lParam); } return ((WNDPROC)GetProp(hwnd,L"VBufInternal_oldWndProc"))(hwnd,msg,wParam,lParam); }