From cb4a46e7fbe62d788e66ed6121c717a2d22a4d7c Mon Sep 17 00:00:00 2001 From: watcherhd Date: Thu, 21 Apr 2011 14:14:52 +0000 Subject: svn.miranda.im is moving to a new home! git-svn-id: http://miranda-plugins.googlecode.com/svn/trunk@7 e753b5eb-9565-29b2-b5c5-2cc6f99dfbcb --- miranda-wine/src/modules/utils/bmpfilter.c | 180 +++++++++++++ miranda-wine/src/modules/utils/colourpicker.c | 107 ++++++++ miranda-wine/src/modules/utils/hyperlink.c | 183 +++++++++++++ miranda-wine/src/modules/utils/openurl.c | 228 ++++++++++++++++ miranda-wine/src/modules/utils/path.c | 83 ++++++ miranda-wine/src/modules/utils/resizer.c | 152 +++++++++++ miranda-wine/src/modules/utils/utf.c | 165 ++++++++++++ miranda-wine/src/modules/utils/utils.c | 364 ++++++++++++++++++++++++++ miranda-wine/src/modules/utils/windowlist.c | 107 ++++++++ 9 files changed, 1569 insertions(+) create mode 100644 miranda-wine/src/modules/utils/bmpfilter.c create mode 100644 miranda-wine/src/modules/utils/colourpicker.c create mode 100644 miranda-wine/src/modules/utils/hyperlink.c create mode 100644 miranda-wine/src/modules/utils/openurl.c create mode 100644 miranda-wine/src/modules/utils/path.c create mode 100644 miranda-wine/src/modules/utils/resizer.c create mode 100644 miranda-wine/src/modules/utils/utf.c create mode 100644 miranda-wine/src/modules/utils/utils.c create mode 100644 miranda-wine/src/modules/utils/windowlist.c (limited to 'miranda-wine/src/modules/utils') diff --git a/miranda-wine/src/modules/utils/bmpfilter.c b/miranda-wine/src/modules/utils/bmpfilter.c new file mode 100644 index 0000000..eb20d33 --- /dev/null +++ b/miranda-wine/src/modules/utils/bmpfilter.c @@ -0,0 +1,180 @@ +/* + +Miranda IM: the free IM client for Microsoft* Windows* + +Copyright 2000-2006 Miranda ICQ/IM project, +all portions of this codebase are copyrighted to the people +listed in contributors.txt. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ +#include "commonheaders.h" +#include +#include + +#include "m_png.h" + +static int BmpFilterLoadBitmap(WPARAM wParam,LPARAM lParam) +{ + IPicture *pic; + HBITMAP hBmp,hBmpCopy; + HBITMAP hOldBitmap, hOldBitmap2; + BITMAP bmpInfo; + WCHAR pszwFilename[MAX_PATH]; + HDC hdc,hdcMem1,hdcMem2; + short picType; + const char *szFile=(const char *)lParam; + char szFilename[MAX_PATH]; + int filenameLen; + + if (!CallService(MS_UTILS_PATHTOABSOLUTE, (WPARAM)szFile, (LPARAM)szFilename)) + mir_snprintf(szFilename, SIZEOF(szFilename), "%s", szFile); + filenameLen=lstrlenA(szFilename); + if(filenameLen>4) { + char* pszExt = szFilename+filenameLen-4; + if ( !lstrcmpiA( pszExt,".bmp" ) || !lstrcmpiA( pszExt, ".rle" )) { + //LoadImage can do this much faster + return (int)LoadImageA( GetModuleHandle(NULL), szFilename, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE ); + } + + if ( !lstrcmpiA( pszExt, ".png" )) { + HANDLE hFile, hMap = NULL; + BYTE* ppMap = NULL; + long cbFileSize = 0; + BITMAPINFOHEADER* pDib; + BYTE* pDibBits; + + if ( !ServiceExists( MS_PNG2DIB )) { + MessageBox( NULL, TranslateT( "You need the png2dib plugin v. 0.1.3.x or later to process PNG images" ), TranslateT( "Error" ), MB_OK ); + return (int)(HBITMAP)NULL; + } + + if (( hFile = CreateFileA( szFilename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL )) != INVALID_HANDLE_VALUE ) + if (( hMap = CreateFileMapping( hFile, NULL, PAGE_READONLY, 0, 0, NULL )) != NULL ) + if (( ppMap = ( BYTE* )MapViewOfFile( hMap, FILE_MAP_READ, 0, 0, 0 )) != NULL ) + cbFileSize = GetFileSize( hFile, NULL ); + + if ( cbFileSize != 0 ) { + PNG2DIB param; + param.pSource = ppMap; + param.cbSourceSize = cbFileSize; + param.pResult = &pDib; + if ( CallService( MS_PNG2DIB, 0, ( LPARAM )¶m )) + pDibBits = ( BYTE* )( pDib+1 ); + else + cbFileSize = 0; + } + + if ( ppMap != NULL ) UnmapViewOfFile( ppMap ); + if ( hMap != NULL ) CloseHandle( hMap ); + if ( hFile != NULL ) CloseHandle( hFile ); + + if ( cbFileSize == 0 ) + return (int)(HBITMAP)NULL; + + { HDC sDC = GetDC( NULL ); + HBITMAP hBitmap = CreateDIBitmap( sDC, pDib, CBM_INIT, pDibBits, ( BITMAPINFO* )pDib, DIB_PAL_COLORS ); + SelectObject( sDC, hBitmap ); + ReleaseDC( NULL, sDC ); + GlobalFree( pDib ); + return (int)hBitmap; + } } } + + OleInitialize(NULL); + MultiByteToWideChar(CP_ACP,0,szFilename,-1,pszwFilename,MAX_PATH); + if(S_OK!=OleLoadPicturePath(pszwFilename,NULL,0,0,&IID_IPicture,(PVOID*)&pic)) { + OleUninitialize(); + return (int)(HBITMAP)NULL; + } + pic->lpVtbl->get_Type(pic,&picType); + if(picType!=PICTYPE_BITMAP) { + pic->lpVtbl->Release(pic); + OleUninitialize(); + return (int)(HBITMAP)NULL; + } + pic->lpVtbl->get_Handle(pic,(OLE_HANDLE*)&hBmp); + GetObject(hBmp,sizeof(bmpInfo),&bmpInfo); + + //need to copy bitmap so we can free the IPicture + hdc=GetDC(NULL); + hdcMem1=CreateCompatibleDC(hdc); + hdcMem2=CreateCompatibleDC(hdc); + hOldBitmap=SelectObject(hdcMem1,hBmp); + hBmpCopy=CreateCompatibleBitmap(hdcMem1,bmpInfo.bmWidth,bmpInfo.bmHeight); + hOldBitmap2=SelectObject(hdcMem2,hBmpCopy); + BitBlt(hdcMem2,0,0,bmpInfo.bmWidth,bmpInfo.bmHeight,hdcMem1,0,0,SRCCOPY); + SelectObject(hdcMem1,hOldBitmap); + SelectObject(hdcMem2,hOldBitmap2); + DeleteDC(hdcMem2); + DeleteDC(hdcMem1); + ReleaseDC(NULL,hdc); + + DeleteObject(hBmp); + pic->lpVtbl->Release(pic); + OleUninitialize(); + return (int)hBmpCopy; +} + +static int BmpFilterGetStrings(WPARAM wParam,LPARAM lParam) +{ + int bytesLeft=wParam; + char *filter=(char*)lParam,*pfilter; + + lstrcpynA(filter,Translate("All Bitmaps"),bytesLeft); bytesLeft-=lstrlenA(filter); + strncat(filter," (*.bmp;*.jpg;*.gif;*.png)",bytesLeft); + pfilter=filter+lstrlenA(filter)+1; bytesLeft=wParam-(pfilter-filter); + lstrcpynA(pfilter,"*.BMP;*.RLE;*.JPG;*.JPEG;*.GIF;*.PNG",bytesLeft); + pfilter+=lstrlenA(pfilter)+1; bytesLeft=wParam-(pfilter-filter); + + lstrcpynA(pfilter,Translate("Windows Bitmaps"),bytesLeft); bytesLeft-=lstrlenA(pfilter); + strncat(pfilter," (*.bmp;*.rle)",bytesLeft); + pfilter+=lstrlenA(pfilter)+1; bytesLeft=wParam-(pfilter-filter); + lstrcpynA(pfilter,"*.BMP;*.RLE",bytesLeft); + pfilter+=lstrlenA(pfilter)+1; bytesLeft=wParam-(pfilter-filter); + + lstrcpynA(pfilter,Translate("JPEG Bitmaps"),bytesLeft); bytesLeft-=lstrlenA(pfilter); + strncat(pfilter," (*.jpg;*.jpeg)",bytesLeft); + pfilter+=lstrlenA(pfilter)+1; bytesLeft=wParam-(pfilter-filter); + lstrcpynA(pfilter,"*.JPG;*.JPEG",bytesLeft); + pfilter+=lstrlenA(pfilter)+1; bytesLeft=wParam-(pfilter-filter); + + lstrcpynA(pfilter,Translate("GIF Bitmaps"),bytesLeft); bytesLeft-=lstrlenA(pfilter); + strncat(pfilter," (*.gif)",bytesLeft); + pfilter+=lstrlenA(pfilter)+1; bytesLeft=wParam-(pfilter-filter); + lstrcpynA(pfilter,"*.GIF",bytesLeft); + pfilter+=lstrlenA(pfilter)+1; bytesLeft=wParam-(pfilter-filter); + + lstrcpynA(pfilter,Translate("PNG Bitmaps"),bytesLeft); bytesLeft-=lstrlenA(pfilter); + strncat(pfilter," (*.png)",bytesLeft); + pfilter+=lstrlenA(pfilter)+1; bytesLeft=wParam-(pfilter-filter); + lstrcpynA(pfilter,"*.PNG",bytesLeft); + pfilter+=lstrlenA(pfilter)+1; bytesLeft=wParam-(pfilter-filter); + + lstrcpynA(pfilter,Translate("All Files"),bytesLeft); bytesLeft-=lstrlenA(pfilter); + strncat(pfilter," (*)",bytesLeft); + pfilter+=lstrlenA(pfilter)+1; bytesLeft=wParam-(pfilter-filter); + lstrcpynA(pfilter,"*",bytesLeft); + pfilter+=lstrlenA(pfilter)+1; bytesLeft=wParam-(pfilter-filter); + + if(bytesLeft) *pfilter='\0'; + return 0; +} + +int InitBitmapFilter(void) +{ + CreateServiceFunction(MS_UTILS_LOADBITMAP,BmpFilterLoadBitmap); + CreateServiceFunction(MS_UTILS_GETBITMAPFILTERSTRINGS,BmpFilterGetStrings); + return 0; +} diff --git a/miranda-wine/src/modules/utils/colourpicker.c b/miranda-wine/src/modules/utils/colourpicker.c new file mode 100644 index 0000000..4192e62 --- /dev/null +++ b/miranda-wine/src/modules/utils/colourpicker.c @@ -0,0 +1,107 @@ +/* + +Miranda IM: the free IM client for Microsoft* Windows* + +Copyright 2000-2006 Miranda ICQ/IM project, +all portions of this codebase are copyrighted to the people +listed in contributors.txt. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ +#include "commonheaders.h" + +static LRESULT CALLBACK ColourPickerWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) +{ + switch(message) { + case WM_CREATE: + SetWindowLong(hwnd,0,0); + SetWindowLong(hwnd,sizeof(COLORREF),0); + break; + case CPM_SETDEFAULTCOLOUR: + SetWindowLong(hwnd,sizeof(COLORREF),lParam); + break; + case CPM_GETDEFAULTCOLOUR: + return GetWindowLong(hwnd,sizeof(COLORREF)); + case CPM_SETCOLOUR: + SetWindowLong(hwnd,0,lParam); + InvalidateRect(hwnd,NULL,FALSE); + break; + case CPM_GETCOLOUR: + return GetWindowLong(hwnd,0); + case WM_LBUTTONUP: + { + CHOOSECOLOR cc={0}; + COLORREF custColours[16]={0}; + custColours[0]=GetWindowLong(hwnd,sizeof(COLORREF)); + cc.lStructSize=sizeof(CHOOSECOLOR); + cc.hwndOwner=hwnd; + cc.hInstance=(HWND)GetModuleHandle(NULL); + cc.rgbResult=GetWindowLong(hwnd,0); + cc.lpCustColors=custColours; + cc.Flags=CC_ANYCOLOR|CC_FULLOPEN|CC_RGBINIT; + if(ChooseColor(&cc)) { + SetWindowLong(hwnd,0,cc.rgbResult); + SendMessage(GetParent(hwnd),WM_COMMAND,MAKEWPARAM(GetDlgCtrlID(hwnd),CPN_COLOURCHANGED),(LPARAM)hwnd); + InvalidateRect(hwnd,NULL,FALSE); + } + break; + } + case WM_ENABLE: + InvalidateRect(hwnd,NULL,FALSE); + break; + case WM_NCPAINT: + case WM_PAINT: + { PAINTSTRUCT ps; + HDC hdc1; + RECT rc; + HBRUSH hBrush; + + hdc1=BeginPaint(hwnd,&ps); + GetClientRect(hwnd,&rc); + DrawEdge(hdc1,&rc,EDGE_ETCHED,BF_RECT); + InflateRect(&rc,-2,-2); + if(IsWindowEnabled(hwnd)) + hBrush=CreateSolidBrush(GetWindowLong(hwnd,0)); + else + hBrush=CreateHatchBrush(HS_BDIAGONAL,GetSysColor(COLOR_GRAYTEXT)); + SetBkColor(hdc1,GetSysColor(COLOR_BTNFACE)); + FillRect(hdc1,&rc,hBrush); + DeleteObject(hBrush); + EndPaint(hwnd,&ps); + break; + } + case WM_DESTROY: + break; + } + return DefWindowProc(hwnd,message,wParam,lParam); +} + +int InitColourPicker(void) +{ + WNDCLASS wcl; + + wcl.lpfnWndProc=ColourPickerWndProc; + wcl.cbClsExtra=0; + wcl.cbWndExtra=sizeof(COLORREF)*2; + wcl.hInstance=GetModuleHandle(NULL); + wcl.hCursor=NULL; + wcl.lpszClassName=WNDCLASS_COLOURPICKER; + wcl.hbrBackground=(HBRUSH)(COLOR_BTNFACE+1); + wcl.hIcon=NULL; + wcl.lpszMenuName=NULL; + wcl.style=CS_HREDRAW|CS_VREDRAW|CS_GLOBALCLASS; + RegisterClass(&wcl); + return 0; +} diff --git a/miranda-wine/src/modules/utils/hyperlink.c b/miranda-wine/src/modules/utils/hyperlink.c new file mode 100644 index 0000000..affc1ff --- /dev/null +++ b/miranda-wine/src/modules/utils/hyperlink.c @@ -0,0 +1,183 @@ +/* + +Miranda IM: the free IM client for Microsoft* Windows* + +Copyright 2000-2006 Miranda ICQ/IM project, +all portions of this codebase are copyrighted to the people +listed in contributors.txt. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ +#include "commonheaders.h" + +static HCURSOR hHandCursor; + +struct HyperlinkWndData { + HFONT hFont; + HFONT hSetFont; + RECT rcText; + DWORD enableColor; + DWORD disableColor; +}; +#define IM_MEASURETEXT (WM_USER+1) +#define HLK_INVALIDATE (WM_USER+2) +static LRESULT CALLBACK HyperlinkWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) +{ + struct HyperlinkWndData *dat; + dat=(struct HyperlinkWndData*)GetWindowLong(hwnd,0); + switch(message) { + case WM_CREATE: + dat=(struct HyperlinkWndData*)mir_alloc(sizeof(struct HyperlinkWndData)); + SetWindowLong(hwnd,0,(LONG)dat); + dat->hFont=NULL; + dat->hSetFont=NULL; + dat->enableColor=GetSysColor(COLOR_HOTLIGHT); + if(dat->enableColor==0 && GetLastError()!=ERROR_SUCCESS) dat->enableColor=RGB(0,0,255); + dat->disableColor=GetSysColor(COLOR_GRAYTEXT); + SendMessage(hwnd,IM_MEASURETEXT,0,0); + break; + case WM_LBUTTONDOWN: + { POINT pt; + pt.x=(short)LOWORD(lParam); pt.y=(short)HIWORD(lParam); + if(PtInRect(&dat->rcText,pt)) + SendMessage(GetParent(hwnd),WM_COMMAND,MAKEWPARAM(GetDlgCtrlID(hwnd),STN_CLICKED),(LPARAM)hwnd); + break; + } + case WM_SETFONT: + { LOGFONT lf; + dat->hSetFont=(HFONT)wParam; + GetObject(dat->hSetFont,sizeof(lf),&lf); + lf.lfUnderline=1; + dat->hFont=CreateFontIndirect(&lf); + if(LOWORD(lParam)) SendMessage(hwnd,HLK_INVALIDATE,0,0); + SendMessage(hwnd,IM_MEASURETEXT,0,0); + break; + } + case WM_ERASEBKGND: return(1); break; + case HLK_INVALIDATE: // invalidate + { + RECT rcWnd; + POINT pt; + GetWindowRect(hwnd,&rcWnd); + pt.x = rcWnd.left; + pt.y = rcWnd.top; + ScreenToClient(GetParent(hwnd),&pt); + rcWnd.right = pt.x + (rcWnd.right-rcWnd.left); + rcWnd.bottom = pt.y + (rcWnd.bottom-rcWnd.top); + rcWnd.left = pt.x; + rcWnd.top = pt.y; + + InvalidateRect(GetParent(hwnd),&rcWnd,TRUE); + break; + } + case WM_GETFONT: + return (LRESULT)dat->hSetFont; + case IM_MEASURETEXT: + { char text[256]; + GetWindowTextA(hwnd,text,SIZEOF(text)); + lParam=(LPARAM)text; + //fall thru + case WM_SETTEXT: + { HFONT hoFont; + SIZE textSize; + RECT rc; + + HDC hdc1=GetDC(hwnd); + if(dat->hFont!=NULL) hoFont=(HFONT)SelectObject(hdc1,dat->hFont); + GetTextExtentPoint32(hdc1,(const TCHAR*)lParam,lstrlen((const TCHAR*)lParam),&textSize); + dat->rcText.top=0; dat->rcText.bottom=dat->rcText.top+textSize.cy; + GetClientRect(hwnd,&rc); + if(GetWindowLong(hwnd,GWL_STYLE)&SS_CENTER) dat->rcText.left=(rc.right-textSize.cx)/2; + else if(GetWindowLong(hwnd,GWL_STYLE)&SS_RIGHT) dat->rcText.left=rc.right-textSize.cx; + else dat->rcText.left=0; + dat->rcText.right=dat->rcText.left+textSize.cx; + if(dat->hFont!=NULL) SelectObject(hdc1,hoFont); + ReleaseDC(hwnd,hdc1); + SendMessage(hwnd,HLK_INVALIDATE,0,0); + break; + }} + case WM_SETCURSOR: + { POINT pt; + GetCursorPos(&pt); + ScreenToClient(hwnd,&pt); + if(PtInRect(&dat->rcText,pt)) SetCursor(hHandCursor); + else SetCursor(LoadCursor(NULL,IDC_ARROW)); + return TRUE; + } + case HLK_SETENABLECOLOUR: + if ((DWORD)wParam) dat->enableColor = (DWORD)wParam; + break; + case HLK_SETDISABLECOLOUR: + if ((DWORD)wParam) dat->disableColor = (DWORD)wParam; + break; + case WM_NCPAINT: + case WM_PAINT: + { + HFONT hoFont; + RECT rc; + TCHAR text[256]; + int alignFlag; + DWORD textColour; + + PAINTSTRUCT ps; + HDC hdc1=BeginPaint(hwnd,&ps); + if(IsWindowEnabled(hwnd)) { + hoFont=(HFONT)SelectObject(hdc1,dat->hFont); + textColour=dat->enableColor; + } + else { + hoFont=(HFONT)SelectObject(hdc1,dat->hSetFont); + textColour=dat->disableColor; + } + SetTextColor(hdc1,textColour); + SetBkMode(hdc1,TRANSPARENT); + if(GetWindowLong(hwnd,GWL_STYLE)&SS_CENTER) alignFlag=DT_CENTER; + else if(GetWindowLong(hwnd,GWL_STYLE)&SS_RIGHT) alignFlag=DT_RIGHT; + else alignFlag=DT_LEFT; + GetClientRect(hwnd,&rc); + GetWindowText(hwnd,text,SIZEOF(text)); + DrawText(hdc1,text,-1,&rc,alignFlag|DT_NOPREFIX|DT_SINGLELINE|DT_TOP); + SelectObject(hdc1,hoFont); + EndPaint(hwnd,&ps); + break; + } + case WM_DESTROY: + if(dat->hFont!=NULL) DeleteObject(dat->hFont); + mir_free(dat); dat=NULL; + SetWindowLong(hwnd,0,(LONG)dat); + break; + } + return DefWindowProc(hwnd,message,wParam,lParam); +} + +int InitHyperlink(void) +{ + WNDCLASS wcl; + + if(IsWinVer2000Plus()) hHandCursor=LoadCursor(NULL,IDC_HAND); + else hHandCursor=LoadCursor(GetModuleHandle(NULL),MAKEINTRESOURCE(IDC_HYPERLINKHAND)); + wcl.lpfnWndProc=HyperlinkWndProc; + wcl.cbClsExtra=0; + wcl.cbWndExtra=sizeof(void*); + wcl.hInstance=GetModuleHandle(NULL); + wcl.hCursor=NULL; + wcl.lpszClassName=WNDCLASS_HYPERLINK; + wcl.hbrBackground=NULL; + wcl.hIcon=NULL; + wcl.lpszMenuName=NULL; + wcl.style=CS_HREDRAW|CS_VREDRAW|CS_GLOBALCLASS|CS_PARENTDC; + RegisterClass(&wcl); + return 0; +} diff --git a/miranda-wine/src/modules/utils/openurl.c b/miranda-wine/src/modules/utils/openurl.c new file mode 100644 index 0000000..02c415c --- /dev/null +++ b/miranda-wine/src/modules/utils/openurl.c @@ -0,0 +1,228 @@ +/* + +Miranda IM: the free IM client for Microsoft* Windows* + +Copyright 2000-2006 Miranda ICQ/IM project, +all portions of this codebase are copyrighted to the people +listed in contributors.txt. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ +#include "commonheaders.h" +#include + +#define DDEMESSAGETIMEOUT 1000 +#define WNDCLASS_DDEMSGWINDOW _T("MirandaDdeMsgWindow") + +struct DdeMsgWindowData { + int fAcked,fData; + HWND hwndDde; +}; + +static LRESULT CALLBACK DdeMessageWindow(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) +{ + struct DdeMsgWindowData *dat; + ATOM hSzItem; + HGLOBAL hDdeData; + + dat=(struct DdeMsgWindowData*)GetWindowLong(hwnd,0); + switch(msg) { + case WM_DDE_ACK: + dat->fAcked=1; + dat->hwndDde=(HWND)wParam; + return 0; + case WM_DDE_DATA: + UnpackDDElParam(msg,lParam,(PUINT)&hDdeData,(PUINT)&hSzItem); + dat->fData=1; + if(hDdeData) { + DDEDATA *data; + int release; + data=(DDEDATA*)GlobalLock(hDdeData); + if(data->fAckReq) { + DDEACK ack={0}; + PostMessage((HWND)wParam,WM_DDE_ACK,(WPARAM)hwnd,PackDDElParam(WM_DDE_ACK,*(PUINT)&ack,(UINT)hSzItem)); + } + else GlobalDeleteAtom(hSzItem); + release=data->fRelease; + GlobalUnlock(hDdeData); + if(release) GlobalFree(hDdeData); + } + else GlobalDeleteAtom(hSzItem); + return 0; + } + return DefWindowProc(hwnd,msg,wParam,lParam); +} + +static int DoDdeRequest(const char *szItemName,HWND hwndDdeMsg) +{ + ATOM hSzItemName; + DWORD timeoutTick,thisTick; + MSG msg; + struct DdeMsgWindowData *dat=(struct DdeMsgWindowData*)GetWindowLong(hwndDdeMsg,0); + + hSzItemName=GlobalAddAtomA(szItemName); + if(!PostMessage(dat->hwndDde,WM_DDE_REQUEST,(WPARAM)hwndDdeMsg,MAKELPARAM(CF_TEXT,hSzItemName))) { + GlobalDeleteAtom(hSzItemName); + return 1; + } + timeoutTick=GetTickCount()+5000; + dat->fData=0; dat->fAcked=0; + do { + if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + if(dat->fData || dat->fAcked) break; + thisTick=GetTickCount(); + if(thisTick>timeoutTick) break; + } while(MsgWaitForMultipleObjects(0,NULL,FALSE,timeoutTick-thisTick,QS_ALLINPUT)==WAIT_OBJECT_0); + + if(!dat->fData) { + GlobalDeleteAtom(hSzItemName); + return 1; + } + return 0; +} + +//see Q160957 and http://developer.netscape.com/docs/manuals/communicator/DDE/index.htm +static int DdeOpenUrl(const char *szBrowser,char *szUrl,int newWindow,HWND hwndDdeMsg) +{ + ATOM hSzBrowser,hSzTopic; + DWORD dwResult; + char *szItemName; + struct DdeMsgWindowData *dat=(struct DdeMsgWindowData*)GetWindowLong(hwndDdeMsg,0); + + hSzBrowser=GlobalAddAtomA(szBrowser); + hSzTopic=GlobalAddAtomA("WWW_OpenURL"); + dat->fAcked=0; + if(!SendMessageTimeout(HWND_BROADCAST,WM_DDE_INITIATE,(WPARAM)hwndDdeMsg,MAKELPARAM(hSzBrowser,hSzTopic),SMTO_ABORTIFHUNG|SMTO_NORMAL,DDEMESSAGETIMEOUT,&dwResult) + || !dat->fAcked) { + GlobalDeleteAtom(hSzTopic); + GlobalDeleteAtom(hSzBrowser); + return 1; + } + szItemName=(char*)mir_alloc(lstrlenA(szUrl)+7); + wsprintfA(szItemName,"\"%s\",,%d",szUrl,newWindow?0:-1); + if(DoDdeRequest(szItemName,hwndDdeMsg)) { + mir_free(szItemName); + GlobalDeleteAtom(hSzTopic); + GlobalDeleteAtom(hSzBrowser); + return 1; + } + PostMessage(dat->hwndDde,WM_DDE_TERMINATE,(WPARAM)hwndDdeMsg,0); + GlobalDeleteAtom(hSzTopic); + GlobalDeleteAtom(hSzBrowser); + mir_free(szItemName); + return 0; +} + +typedef struct { + char *szUrl; + int newWindow; +} TOpenUrlInfo; + +static void OpenURLThread(void *arg) +{ + TOpenUrlInfo *hUrlInfo = (TOpenUrlInfo*)arg; + char *szResult; + HWND hwndDdeMsg; + struct DdeMsgWindowData msgWndData={0}; + char *pszProtocol; + HKEY hKey; + char szSubkey[80]; + char szCommandName[MAX_PATH]; + DWORD dataLength; + int success=0; + + if (!hUrlInfo->szUrl) return; + hwndDdeMsg=CreateWindow(WNDCLASS_DDEMSGWINDOW,_T(""),0,0,0,0,0,NULL,NULL,GetModuleHandle(NULL),NULL); + SetWindowLong(hwndDdeMsg,0,(LONG)&msgWndData); + + if(!_strnicmp(hUrlInfo->szUrl,"ftp:",4) || !_strnicmp(hUrlInfo->szUrl,"ftp.",4)) pszProtocol="ftp"; + if(!_strnicmp(hUrlInfo->szUrl,"mailto:",7)) pszProtocol="mailto"; + if(!_strnicmp(hUrlInfo->szUrl,"news:",5)) pszProtocol="news"; + else pszProtocol="http"; + wsprintfA(szSubkey,"%s\\shell\\open\\command",pszProtocol); + if(RegOpenKeyExA(HKEY_CURRENT_USER,szSubkey,0,KEY_QUERY_VALUE,&hKey)==ERROR_SUCCESS + || RegOpenKeyExA(HKEY_CLASSES_ROOT,szSubkey,0,KEY_QUERY_VALUE,&hKey)==ERROR_SUCCESS) { + dataLength=SIZEOF(szCommandName); + if(RegQueryValueEx(hKey,NULL,NULL,NULL,(PBYTE)szCommandName,&dataLength)==ERROR_SUCCESS) { + _strlwr(szCommandName); + if(strstr(szCommandName,"mozilla") || strstr(szCommandName,"netscape")) + success=(DdeOpenUrl("mozilla",hUrlInfo->szUrl,hUrlInfo->newWindow,hwndDdeMsg)==0 || DdeOpenUrl("netscape",hUrlInfo->szUrl,hUrlInfo->newWindow,hwndDdeMsg)==0); + else if(strstr(szCommandName,"iexplore") || strstr(szCommandName,"msimn")) + success=0==DdeOpenUrl("iexplore",hUrlInfo->szUrl,hUrlInfo->newWindow,hwndDdeMsg); + else if(strstr(szCommandName,"opera")) + success=0==DdeOpenUrl("opera",hUrlInfo->szUrl,hUrlInfo->newWindow,hwndDdeMsg); + //opera's the default anyway + } + RegCloseKey(hKey); + } + + DestroyWindow(hwndDdeMsg); + if(success) return; + + //wack a protocol on it + if((isalpha(hUrlInfo->szUrl[0]) && hUrlInfo->szUrl[1]==':') || hUrlInfo->szUrl[0]=='\\') { + szResult=(char*)mir_alloc(lstrlenA(hUrlInfo->szUrl)+9); + wsprintfA(szResult,"file:///%s",hUrlInfo->szUrl); + } + else { + int i; + for(i=0;isalpha(hUrlInfo->szUrl[i]);i++); + if(hUrlInfo->szUrl[i]==':') szResult=mir_strdup(hUrlInfo->szUrl); + else { + if(!_strnicmp(hUrlInfo->szUrl,"ftp.",4)) { + szResult=(char*)mir_alloc(lstrlenA(hUrlInfo->szUrl)+7); + wsprintfA(szResult,"ftp://%s",hUrlInfo->szUrl); + } + else { + szResult=(char*)mir_alloc(lstrlenA(hUrlInfo->szUrl)+8); + wsprintfA(szResult,"http://%s",hUrlInfo->szUrl); + } + } + } + ShellExecuteA(NULL, "open", szResult, NULL, NULL, SW_SHOW); + mir_free(szResult); + mir_free(hUrlInfo->szUrl); + mir_free(hUrlInfo); + return; +} + +static int OpenURL(WPARAM wParam,LPARAM lParam) { + TOpenUrlInfo *hUrlInfo = (TOpenUrlInfo*)mir_alloc(sizeof(TOpenUrlInfo)); + hUrlInfo->szUrl = (char*)lParam?mir_strdup((char*)lParam):NULL; + hUrlInfo->newWindow = (int)wParam; + forkthread(OpenURLThread, 0, (void*)hUrlInfo); + return 0; +} + +int InitOpenUrl(void) +{ + WNDCLASS wcl; + wcl.lpfnWndProc=DdeMessageWindow; + wcl.cbClsExtra=0; + wcl.cbWndExtra=sizeof(void*); + wcl.hInstance=GetModuleHandle(NULL); + wcl.hCursor=NULL; + wcl.lpszClassName=WNDCLASS_DDEMSGWINDOW; + wcl.hbrBackground=NULL; + wcl.hIcon=NULL; + wcl.lpszMenuName=NULL; + wcl.style=0; + RegisterClass(&wcl); + CreateServiceFunction(MS_UTILS_OPENURL,OpenURL); + return 0; +} diff --git a/miranda-wine/src/modules/utils/path.c b/miranda-wine/src/modules/utils/path.c new file mode 100644 index 0000000..ba7caee --- /dev/null +++ b/miranda-wine/src/modules/utils/path.c @@ -0,0 +1,83 @@ +/* + +Miranda IM: the free IM client for Microsoft* Windows* + +Copyright 2000-2006 Miranda ICQ/IM project, +all portions of this codebase are copyrighted to the people +listed in contributors.txt. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ +#include "commonheaders.h" + +static char szMirandaPath[MAX_PATH]; + +static int pathIsAbsolute(char *path) +{ + if (!path||!strlen(path)>2) return 0; + if ((path[1]==':'&&path[2]=='\\')||(path[0]=='\\'&&path[1]=='\\')) return 1; + return 0; +} + +static int pathToRelative(WPARAM wParam, LPARAM lParam) +{ + char *pSrc = (char*)wParam; + char *pOut = (char*)lParam; + if (!pSrc||!strlen(pSrc)||strlen(pSrc)>MAX_PATH) return 0; + if (!pathIsAbsolute(pSrc)) { + mir_snprintf(pOut, MAX_PATH, "%s", pSrc); + return strlen(pOut); + } + else { + char szTmp[MAX_PATH]; + + mir_snprintf(szTmp, SIZEOF(szTmp), "%s", pSrc); + _strlwr(szTmp); + if (strstr(szTmp, szMirandaPath)) { + mir_snprintf(pOut, MAX_PATH, "%s", pSrc+strlen(szMirandaPath)); + return strlen(pOut); + } + else { + mir_snprintf(pOut, MAX_PATH, "%s", pSrc); + return strlen(pOut); + } + } +} + +static int pathToAbsolute(WPARAM wParam, LPARAM lParam) { + char *pSrc = (char*)wParam; + char *pOut = (char*)lParam; + if (!pSrc||!strlen(pSrc)||strlen(pSrc)>MAX_PATH) return 0; + if (pathIsAbsolute(pSrc)||!isalnum(pSrc[0])) { + mir_snprintf(pOut, MAX_PATH, "%s", pSrc); + return strlen(pOut); + } + else { + mir_snprintf(pOut, MAX_PATH, "%s%s", szMirandaPath, pSrc); + return strlen(pOut); + } +} + +int InitPathUtils(void) +{ + char *p = 0; + GetModuleFileNameA(GetModuleHandle(NULL), szMirandaPath, SIZEOF(szMirandaPath)); + p=strrchr(szMirandaPath,'\\'); + if (p&&p+1) *(p+1)=0; + _strlwr(szMirandaPath); + CreateServiceFunction(MS_UTILS_PATHTORELATIVE, pathToRelative); + CreateServiceFunction(MS_UTILS_PATHTOABSOLUTE, pathToAbsolute); + return 0; +} diff --git a/miranda-wine/src/modules/utils/resizer.c b/miranda-wine/src/modules/utils/resizer.c new file mode 100644 index 0000000..06e79d3 --- /dev/null +++ b/miranda-wine/src/modules/utils/resizer.c @@ -0,0 +1,152 @@ +/* + +Miranda IM: the free IM client for Microsoft* Windows* + +Copyright 2000-2006 Miranda ICQ/IM project, +all portions of this codebase are copyrighted to the people +listed in contributors.txt. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ +#include "commonheaders.h" + +typedef struct { + DWORD helpID; + DWORD exStyle; + DWORD style; + short x; + short y; + short cx; + short cy; + WORD id; +} START_OF_DLGITEMTEMPLATEEX; + +typedef struct { + WORD dlgVer; + WORD signature; + DWORD helpID; + DWORD exStyle; + DWORD style; + WORD cDlgItems; + short x; + short y; + short cx; + short cy; +} START_OF_DLGTEMPLATEEX; + +int ResizeDialog(WPARAM wParam,LPARAM lParam) +{ + UTILRESIZEDIALOG *urd=(UTILRESIZEDIALOG*)lParam; + HDWP hDwp; + int i; + DLGITEMTEMPLATE *pItem; + START_OF_DLGITEMTEMPLATEEX *pItemEx; + RECT rc; + PWORD pWord; + DLGTEMPLATE *pTemplate; + START_OF_DLGTEMPLATEEX *pTemplateEx; + UTILRESIZECONTROL urc; + int procResult; + int extendedDlg,itemCount; + + if(urd==NULL||urd->cbSize!=sizeof(UTILRESIZEDIALOG)) return 1; + pTemplate=(DLGTEMPLATE*)LockResource(LoadResource(urd->hInstance,FindResourceA(urd->hInstance,urd->lpTemplate,MAKEINTRESOURCEA(5)))); + pTemplateEx=(START_OF_DLGTEMPLATEEX*)pTemplate; + extendedDlg=pTemplateEx->signature==0xFFFF; + if(extendedDlg && pTemplateEx->dlgVer!=1) + return 1; + + if(extendedDlg) pWord=(PWORD)(pTemplateEx+1); + else pWord=(PWORD)(pTemplate+1); + if(*pWord==0xFFFF) pWord+=2; else while(*pWord++); //menu + if(*pWord==0xFFFF) pWord+=2; else while(*pWord++); //class + while(*pWord++); //title + if(extendedDlg) { + if(pTemplateEx->style&DS_SETFONT) { + pWord+=3; //font size,weight,italic + while(*pWord++); //font name + } + } + else { + if(pTemplate->style&DS_SETFONT) { + pWord++; //font size + while(*pWord++); //font name + } + } + + urc.cbSize=sizeof(UTILRESIZECONTROL); + rc.left=0; rc.top=0; + if(extendedDlg) {rc.right=pTemplateEx->cx; rc.bottom=pTemplateEx->cy;} + else {rc.right=pTemplate->cx; rc.bottom=pTemplate->cy;} + MapDialogRect(urd->hwndDlg,&rc); + urc.dlgOriginalSize.cx=rc.right; urc.dlgOriginalSize.cy=rc.bottom; + GetClientRect(urd->hwndDlg,&rc); + urc.dlgNewSize.cx=rc.right; urc.dlgNewSize.cy=rc.bottom; + + if(extendedDlg) itemCount=pTemplateEx->cDlgItems; + else itemCount=pTemplate->cdit; + hDwp=BeginDeferWindowPos(itemCount); + for(i=0;iid; + urc.rcItem.left=pItemEx->x; urc.rcItem.top=pItemEx->y; + urc.rcItem.right=urc.rcItem.left+pItemEx->cx; urc.rcItem.bottom=urc.rcItem.top+pItemEx->cy; + } + else { + pItem=(DLGITEMTEMPLATE*)pWord; + pWord=(PWORD)(pItem+1); + + urc.wId=pItem->id; + urc.rcItem.left=pItem->x; urc.rcItem.top=pItem->y; + urc.rcItem.right=urc.rcItem.left+pItem->cx; urc.rcItem.bottom=urc.rcItem.top+pItem->cy; + } + if(*pWord==0xFFFF) pWord+=2; else while(*pWord++); //menu + if(*pWord==0xFFFF) pWord+=2; else while(*pWord++); //class + pWord+=1+(1+*pWord)/2; //creation data + + if(urc.wId==65535) continue; //using this breaks the dwp, so just ignore it + + MapDialogRect(urd->hwndDlg,&urc.rcItem); + procResult=(urd->pfnResizer)(urd->hwndDlg,urd->lParam,&urc); + if(procResult&RD_ANCHORX_RIGHT) { + urc.rcItem.left+=urc.dlgNewSize.cx-urc.dlgOriginalSize.cx; + urc.rcItem.right+=urc.dlgNewSize.cx-urc.dlgOriginalSize.cx; + } + else if(procResult&RD_ANCHORX_WIDTH) + urc.rcItem.right+=urc.dlgNewSize.cx-urc.dlgOriginalSize.cx; + else if(procResult&RD_ANCHORX_CENTRE) { + urc.rcItem.left+=(urc.dlgNewSize.cx-urc.dlgOriginalSize.cx)/2; + urc.rcItem.right+=(urc.dlgNewSize.cx-urc.dlgOriginalSize.cx)/2; + } + if(procResult&RD_ANCHORY_BOTTOM) { + urc.rcItem.top+=urc.dlgNewSize.cy-urc.dlgOriginalSize.cy; + urc.rcItem.bottom+=urc.dlgNewSize.cy-urc.dlgOriginalSize.cy; + } + else if(procResult&RD_ANCHORY_HEIGHT) + urc.rcItem.bottom+=urc.dlgNewSize.cy-urc.dlgOriginalSize.cy; + else if(procResult&RD_ANCHORY_CENTRE) { + urc.rcItem.top+=(urc.dlgNewSize.cy-urc.dlgOriginalSize.cy)/2; + urc.rcItem.bottom+=(urc.dlgNewSize.cy-urc.dlgOriginalSize.cy)/2; + } + hDwp=DeferWindowPos(hDwp,GetDlgItem(urd->hwndDlg,extendedDlg?pItemEx->id:pItem->id),0,urc.rcItem.left,urc.rcItem.top,urc.rcItem.right-urc.rcItem.left,urc.rcItem.bottom-urc.rcItem.top,SWP_NOZORDER); + } + EndDeferWindowPos(hDwp); + return 0; +} diff --git a/miranda-wine/src/modules/utils/utf.c b/miranda-wine/src/modules/utils/utf.c new file mode 100644 index 0000000..57f72c8 --- /dev/null +++ b/miranda-wine/src/modules/utils/utf.c @@ -0,0 +1,165 @@ +/* + +Miranda IM: the free IM client for Microsoft* Windows* + +Copyright 2000-2006 Miranda ICQ/IM project, +all portions of this codebase are copyrighted to the people +listed in contributors.txt. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include "commonheaders.h" + +///////////////////////////////////////////////////////////////////////////////////////// +// Utf8Decode - converts UTF8-encoded string to the UCS2/MBCS format + +void Utf8Decode( char* str, wchar_t** ucs2 ) +{ + int len; + wchar_t* tempBuf; + + if ( str == NULL ) + return; + + len = strlen( str ); + if ( len < 2 ) { + if ( ucs2 != NULL ) { + *ucs2 = ( wchar_t* )mir_alloc(( len+1 )*sizeof( wchar_t )); + MultiByteToWideChar( CP_ACP, 0, str, len, *ucs2, len ); + ( *ucs2 )[ len ] = 0; + } + return; + } + + tempBuf = ( wchar_t* )alloca(( len+1 )*sizeof( wchar_t )); + { + wchar_t* d = tempBuf; + BYTE* s = ( BYTE* )str; + + while( *s ) + { + if (( *s & 0x80 ) == 0 ) { + *d++ = *s++; + continue; + } + + if (( s[0] & 0xE0 ) == 0xE0 && ( s[1] & 0xC0 ) == 0x80 && ( s[2] & 0xC0 ) == 0x80 ) { + *d++ = (( WORD )( s[0] & 0x0F) << 12 ) + ( WORD )(( s[1] & 0x3F ) << 6 ) + ( WORD )( s[2] & 0x3F ); + s += 3; + continue; + } + + if (( s[0] & 0xE0 ) == 0xC0 && ( s[1] & 0xC0 ) == 0x80 ) { + *d++ = ( WORD )(( s[0] & 0x1F ) << 6 ) + ( WORD )( s[1] & 0x3F ); + s += 2; + continue; + } + + *d++ = *s++; + } + + *d = 0; + } + + if ( ucs2 != NULL ) { + int fullLen = ( len+1 )*sizeof( wchar_t ); + *ucs2 = ( wchar_t* )mir_alloc( fullLen ); + memcpy( *ucs2, tempBuf, fullLen ); + } + + WideCharToMultiByte( CP_ACP, 0, tempBuf, -1, str, len, NULL, NULL ); +} + +///////////////////////////////////////////////////////////////////////////////////////// +// Utf8Encode - converts MBCS string to the UTF8-encoded format + +char* Utf8Encode( const char* src ) +{ + int len; + char* result; + wchar_t* tempBuf; + + if ( src == NULL ) + return NULL; + + len = strlen( src ); + result = ( char* )mir_alloc( len*3 + 1 ); + if ( result == NULL ) + return NULL; + + tempBuf = ( wchar_t* )alloca(( len+1 )*sizeof( wchar_t )); + MultiByteToWideChar( CP_ACP, 0, src, -1, tempBuf, len ); + tempBuf[ len ] = 0; + { + wchar_t* s = tempBuf; + BYTE* d = ( BYTE* )result; + + while( *s ) { + int U = *s++; + + if ( U < 0x80 ) { + *d++ = ( BYTE )U; + } + else if ( U < 0x800 ) { + *d++ = 0xC0 + (( U >> 6 ) & 0x3F ); + *d++ = 0x80 + ( U & 0x003F ); + } + else { + *d++ = 0xE0 + ( U >> 12 ); + *d++ = 0x80 + (( U >> 6 ) & 0x3F ); + *d++ = 0x80 + ( U & 0x3F ); + } } + + *d = 0; + } + + return result; +} + +///////////////////////////////////////////////////////////////////////////////////////// +// Utf8Encode - converts UCS2 string to the UTF8-encoded format + +char* Utf8EncodeUcs2( const wchar_t* src ) +{ + int len = wcslen( src ); + char* result = ( char* )mir_alloc( len*3 + 1 ); + if ( result == NULL ) + return NULL; + + { const wchar_t* s = src; + BYTE* d = ( BYTE* )result; + + while( *s ) { + int U = *s++; + + if ( U < 0x80 ) { + *d++ = ( BYTE )U; + } + else if ( U < 0x800 ) { + *d++ = 0xC0 + (( U >> 6 ) & 0x3F ); + *d++ = 0x80 + ( U & 0x003F ); + } + else { + *d++ = 0xE0 + ( U >> 12 ); + *d++ = 0x80 + (( U >> 6 ) & 0x3F ); + *d++ = 0x80 + ( U & 0x3F ); + } } + + *d = 0; + } + + return result; +} diff --git a/miranda-wine/src/modules/utils/utils.c b/miranda-wine/src/modules/utils/utils.c new file mode 100644 index 0000000..5f72a56 --- /dev/null +++ b/miranda-wine/src/modules/utils/utils.c @@ -0,0 +1,364 @@ +/* + +Miranda IM: the free IM client for Microsoft* Windows* + +Copyright 2000-2006 Miranda ICQ/IM project, +all portions of this codebase are copyrighted to the people +listed in contributors.txt. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ +#include "commonheaders.h" + +int ResizeDialog(WPARAM wParam,LPARAM lParam); +int InitOpenUrl(void); +int InitWindowList(void); +int InitHyperlink(void); +int InitColourPicker(void); +int InitBitmapFilter(void); +int InitPathUtils(void); + +static struct CountryListEntry countries[]={ + {0 ,"Unspecified"}, + {9999,"Other"}, + {0xFFFF,"Unknown"}, + {93 ,"Afghanistan"}, + {355 ,"Albania"}, + {213 ,"Algeria"}, + {684 ,"American Samoa"}, + {376 ,"Andorra"}, + {244 ,"Angola"}, + {101 ,"Anguilla"}, + {102 ,"Antigua and Barbuda"}, + {5902,"Antilles"}, + {54 ,"Argentina"}, + {374 ,"Armenia"}, + {297 ,"Aruba"}, + {247 ,"Ascension Island"}, + {61 ,"Australia"}, + {43 ,"Austria"}, + {994 ,"Azerbaijan"}, + {103 ,"Bahamas"}, + {973 ,"Bahrain"}, + {880 ,"Bangladesh"}, + {104 ,"Barbados"}, + {120 ,"Barbuda"}, + {375 ,"Belarus"}, + {32 ,"Belgium"}, + {501 ,"Belize"}, + {229 ,"Benin"}, + {105 ,"Bermuda"}, + {975 ,"Bhutan"}, + {591 ,"Bolivia"}, + {387 ,"Bosnia and Herzegovina"}, + {267 ,"Botswana"}, + {55 ,"Brazil"}, + {106 ,"British Virgin Islands"}, + {673 ,"Brunei"}, + {359 ,"Bulgaria"}, + {226 ,"Burkina Faso"}, + {257 ,"Burundi"}, + {855 ,"Cambodia"}, + {237 ,"Cameroon"}, + {107 ,"Canada"}, + {178 ,"Canary Islands"}, + {238 ,"Cape Verde Islands"}, + {108 ,"Cayman Islands"}, + {236 ,"Central African Republic"}, + {235 ,"Chad"}, + {56 ,"Chile, Republic of"}, + {86 ,"China"}, + {672 ,"Christmas Island"}, + {6101,"Cocos-Keeling Islands"}, + {6102,"Cocos (Keeling) Islands"}, + {57 ,"Colombia"}, + {2691,"Comoros"}, + {243 ,"Congo, Democratic Republic of (Zaire)"}, + {242 ,"Congo, Republic of the"}, + {682 ,"Cook Islands"}, + {506 ,"Costa Rica"}, + {225 ,"Cote d'Ivoire (Ivory Coast)"}, + {385 ,"Croatia"}, + {53 ,"Cuba"}, + {357 ,"Cyprus"}, + {420 ,"Czech Republic"}, + {45 ,"Denmark"}, + {246 ,"Diego Garcia"}, + {253 ,"Djibouti"}, + {109 ,"Dominica"}, + {110 ,"Dominican Republic"}, + {593 ,"Ecuador"}, + {20 ,"Egypt"}, + {503 ,"El Salvador"}, + {240 ,"Equatorial Guinea"}, + {291 ,"Eritrea"}, + {372 ,"Estonia"}, + {251 ,"Ethiopia"}, + {298 ,"Faeroe Islands"}, + {500 ,"Falkland Islands"}, + {679 ,"Fiji"}, + {358 ,"Finland"}, + {33 ,"France"}, + {5901,"French Antilles"}, + {594 ,"French Guiana"}, + {689 ,"French Polynesia"}, + {241 ,"Gabon"}, + {220 ,"Gambia"}, + {995 ,"Georgia"}, + {49 ,"Germany"}, + {233 ,"Ghana"}, + {350 ,"Gibraltar"}, + {30 ,"Greece"}, + {299 ,"Greenland"}, + {111 ,"Grenada"}, + {590 ,"Guadeloupe"}, + {671 ,"Guam, US Territory of"}, + {502 ,"Guatemala"}, + {224 ,"Guinea"}, + {245 ,"Guinea-Bissau"}, + {592 ,"Guyana"}, + {509 ,"Haiti"}, + {504 ,"Honduras"}, + {852 ,"Hong Kong"}, + {36 ,"Hungary"}, + {354 ,"Iceland"}, + {91 ,"India"}, + {62 ,"Indonesia"}, + {98 ,"Iran (Islamic Republic of)"}, + {964 ,"Iraq"}, + {353 ,"Ireland"}, + {972 ,"Israel"}, + {39 ,"Italy"}, + {112 ,"Jamaica"}, + {81 ,"Japan"}, + {962 ,"Jordan"}, + {705 ,"Kazakhstan"}, + {254 ,"Kenya"}, + {686 ,"Kiribati"}, + {850 ,"Korea, North"}, + {82 ,"Korea, South"}, + {965 ,"Kuwait"}, + {706 ,"Kyrgyzstan"}, + {856 ,"Laos"}, + {371 ,"Latvia"}, + {961 ,"Lebanon"}, + {266 ,"Lesotho"}, + {231 ,"Liberia"}, + {218 ,"Libyan Arab Jamahiriya"}, + {4101,"Liechtenstein"}, + {370 ,"Lithuania"}, + {352 ,"Luxembourg"}, + {853 ,"Macau"}, + {389 ,"Macedonia (F.Y.R.O.M.)"}, + {261 ,"Madagascar"}, + {265 ,"Malawi"}, + {60 ,"Malaysia"}, + {960 ,"Maldives"}, + {223 ,"Mali"}, + {356 ,"Malta"}, + {692 ,"Marshall Islands"}, + {596 ,"Martinique"}, + {222 ,"Mauritania"}, + {230 ,"Mauritius"}, + {269 ,"Mayotte Island"}, + {52 ,"Mexico"}, + {691 ,"Micronesia, Federated States of"}, + {373 ,"Moldova, Republic of"}, + {377 ,"Monaco"}, + {976 ,"Mongolia"}, + {113 ,"Montserrat"}, + {212 ,"Morocco"}, + {258 ,"Mozambique"}, + {95 ,"Myanmar"}, + {264 ,"Namibia"}, + {674 ,"Nauru"}, + {977 ,"Nepal"}, + {31 ,"Netherlands"}, + {599 ,"Netherlands Antilles"}, + {114 ,"Nevis"}, + {687 ,"New Caledonia"}, + {64 ,"New Zealand"}, + {505 ,"Nicaragua"}, + {227 ,"Niger"}, + {234 ,"Nigeria"}, + {683 ,"Niue"}, + {6722,"Norfolk Island"}, + {47 ,"Norway"}, + {968 ,"Oman"}, + {92 ,"Pakistan"}, + {680 ,"Palau"}, + {507 ,"Panama"}, + {675 ,"Papua New Guinea"}, + {595 ,"Paraguay"}, + {51 ,"Peru"}, + {63 ,"Philippines"}, + {48 ,"Poland"}, + {351 ,"Portugal"}, + {121 ,"Puerto Rico"}, + {974 ,"Qatar"}, + {262 ,"Reunion Island"}, + {40 ,"Romania"}, + {6701,"Rota Island"}, + {7 ,"Russia"}, + {250 ,"Rwanda"}, + {290 ,"Saint Helena"}, + {115 ,"Saint Kitts"}, + {1141,"Saint Kitts and Nevis"}, + {122 ,"Saint Lucia"}, + {508 ,"Saint Pierre and Miquelon"}, + {116 ,"Saint Vincent and the Grenadines"}, + {670 ,"Saipan Island"}, + {378 ,"San Marino"}, + {239 ,"Sao Tome and Principe"}, + {966 ,"Saudi Arabia"}, + {442 ,"Scotland"}, + {221 ,"Senegal"}, + {248 ,"Seychelles"}, + {232 ,"Sierra Leone"}, + {65 ,"Singapore"}, + {421 ,"Slovakia"}, + {386 ,"Slovenia"}, + {677 ,"Solomon Islands"}, + {252 ,"Somalia"}, + {27 ,"South Africa"}, + {34 ,"Spain"}, + {94 ,"Sri Lanka"}, + {249 ,"Sudan"}, + {597 ,"Suriname"}, + {268 ,"Swaziland"}, + {46 ,"Sweden"}, + {41 ,"Switzerland"}, + {963 ,"Syrian Arab Republic"}, + {886 ,"Taiwan"}, + {708 ,"Tajikistan"}, + {255 ,"Tanzania"}, + {66 ,"Thailand"}, + {6702,"Tinian Island"}, + {228 ,"Togo"}, + {690 ,"Tokelau"}, + {676 ,"Tonga"}, + {117 ,"Trinidad and Tobago"}, + {216 ,"Tunisia"}, + {90 ,"Turkey"}, + {709 ,"Turkmenistan"}, + {118 ,"Turks and Caicos Islands"}, + {688 ,"Tuvalu"}, + {256 ,"Uganda"}, + {380 ,"Ukraine"}, + {971 ,"United Arab Emirates"}, + {44 ,"United Kingdom"}, + {598 ,"Uruguay"}, + {1 ,"USA"}, + {711 ,"Uzbekistan"}, + {678 ,"Vanuatu"}, + {379 ,"Vatican City"}, + {58 ,"Venezuela"}, + {84 ,"Vietnam"}, + {123 ,"Virgin Islands (USA)"}, + {441 ,"Wales"}, + {681 ,"Wallis and Futuna Islands"}, + {685 ,"Western Samoa"}, + {967 ,"Yemen"}, + {381 ,"Yugoslavia"}, + {3811,"Yugoslavia - Serbia"}, + {382 ,"Yugoslavia - Montenegro"}, + {260 ,"Zambia"}, + {263 ,"Zimbabwe"}, +}; + + +static int SaveWindowPosition(WPARAM wParam,LPARAM lParam) +{ + SAVEWINDOWPOS *swp=(SAVEWINDOWPOS*)lParam; + WINDOWPLACEMENT wp; + char szSettingName[64]; + + wp.length=sizeof(wp); + GetWindowPlacement(swp->hwnd,&wp); + wsprintfA(szSettingName,"%sx",swp->szNamePrefix); + DBWriteContactSettingDword(swp->hContact,swp->szModule,szSettingName,wp.rcNormalPosition.left); + wsprintfA(szSettingName,"%sy",swp->szNamePrefix); + DBWriteContactSettingDword(swp->hContact,swp->szModule,szSettingName,wp.rcNormalPosition.top); + wsprintfA(szSettingName,"%swidth",swp->szNamePrefix); + DBWriteContactSettingDword(swp->hContact,swp->szModule,szSettingName,wp.rcNormalPosition.right-wp.rcNormalPosition.left); + wsprintfA(szSettingName,"%sheight",swp->szNamePrefix); + DBWriteContactSettingDword(swp->hContact,swp->szModule,szSettingName,wp.rcNormalPosition.bottom-wp.rcNormalPosition.top); + return 0; +} + +static int RestoreWindowPosition(WPARAM wParam,LPARAM lParam) +{ + SAVEWINDOWPOS *swp=(SAVEWINDOWPOS*)lParam; + WINDOWPLACEMENT wp; + char szSettingName[64]; + int x,y; + + wp.length=sizeof(wp); + GetWindowPlacement(swp->hwnd,&wp); + wsprintfA(szSettingName,"%sx",swp->szNamePrefix); + x=DBGetContactSettingDword(swp->hContact,swp->szModule,szSettingName,-1); + wsprintfA(szSettingName,"%sy",swp->szNamePrefix); + y=(int)DBGetContactSettingDword(swp->hContact,swp->szModule,szSettingName,-1); + if(x==-1) return 1; + if(wParam&RWPF_NOSIZE) { + OffsetRect(&wp.rcNormalPosition,x-wp.rcNormalPosition.left,y-wp.rcNormalPosition.top); + } + else { + wp.rcNormalPosition.left=x; + wp.rcNormalPosition.top=y; + wsprintfA(szSettingName,"%swidth",swp->szNamePrefix); + wp.rcNormalPosition.right=wp.rcNormalPosition.left+DBGetContactSettingDword(swp->hContact,swp->szModule,szSettingName,-1); + wsprintfA(szSettingName,"%sheight",swp->szNamePrefix); + wp.rcNormalPosition.bottom=wp.rcNormalPosition.top+DBGetContactSettingDword(swp->hContact,swp->szModule,szSettingName,-1); + } + wp.flags=0; + if(wParam&RWPF_NOACTIVATE) + wp.showCmd = SW_SHOWNOACTIVATE; + + SetWindowPlacement(swp->hwnd,&wp); + return 0; +} + +static int GetCountryByNumber(WPARAM wParam,LPARAM lParam) +{ + int i; + + for(i=0; i < SIZEOF(countries); i++ ) + if((int)wParam==countries[i].id) return (int)countries[i].szName; + return (int)(char*)NULL; +} + +static int GetCountryList(WPARAM wParam,LPARAM lParam) +{ + *(int*)wParam = SIZEOF(countries); + *(struct CountryListEntry**)lParam=countries; + return 0; +} + +int LoadUtilsModule(void) +{ + CreateServiceFunction(MS_UTILS_RESIZEDIALOG,ResizeDialog); + CreateServiceFunction(MS_UTILS_SAVEWINDOWPOSITION,SaveWindowPosition); + CreateServiceFunction(MS_UTILS_RESTOREWINDOWPOSITION,RestoreWindowPosition); + CreateServiceFunction(MS_UTILS_GETCOUNTRYBYNUMBER,GetCountryByNumber); + CreateServiceFunction(MS_UTILS_GETCOUNTRYLIST,GetCountryList); + InitOpenUrl(); + InitWindowList(); + InitHyperlink(); + InitColourPicker(); + InitBitmapFilter(); + InitPathUtils(); + return 0; +} diff --git a/miranda-wine/src/modules/utils/windowlist.c b/miranda-wine/src/modules/utils/windowlist.c new file mode 100644 index 0000000..d8f53b4 --- /dev/null +++ b/miranda-wine/src/modules/utils/windowlist.c @@ -0,0 +1,107 @@ +/* + +Miranda IM: the free IM client for Microsoft* Windows* + +Copyright 2000-2006 Miranda ICQ/IM project, +all portions of this codebase are copyrighted to the people +listed in contributors.txt. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ +#include "commonheaders.h" + +static WINDOWLISTENTRY *windowList=NULL; +static int windowListCount=0; +static int nextWindowListId=1; + +static int AllocWindowList(WPARAM wParam,LPARAM lParam) +{ + return nextWindowListId++; +} + +static int AddToWindowList(WPARAM wParam,LPARAM lParam) +{ + windowList=(WINDOWLISTENTRY*)mir_realloc(windowList,sizeof(WINDOWLISTENTRY)*(windowListCount+1)); + windowList[windowListCount++]=*(WINDOWLISTENTRY*)lParam; + return 0; +} + +static int RemoveFromWindowList(WPARAM wParam,LPARAM lParam) +{ + int i; + for(i=0;imessage,msg->wParam,msg->lParam); + return 0; +} + +static int BroadcastToWindowListAsync(WPARAM wParam,LPARAM lParam) +{ + int i; + MSG *msg=(MSG*)lParam; + for(i=0;imessage,msg->wParam,msg->lParam); + return 0; +} + +static int FreeWindowList(WPARAM wParam,LPARAM lParam) +{ + if (windowList) mir_free(windowList); + windowList=NULL; + windowListCount=0; + nextWindowListId=1; + return 0; +} + +static int HookShutdown(WPARAM wParam, LPARAM lParam) +{ + HookEvent(ME_SYSTEM_SHUTDOWN,FreeWindowList); + return 0; +} + +int InitWindowList(void) +{ + CreateServiceFunction(MS_UTILS_ALLOCWINDOWLIST,AllocWindowList); + CreateServiceFunction(MS_UTILS_ADDTOWINDOWLIST,AddToWindowList); + CreateServiceFunction(MS_UTILS_REMOVEFROMWINDOWLIST,RemoveFromWindowList); + CreateServiceFunction(MS_UTILS_BROADCASTTOWINDOWLIST,BroadcastToWindowList); + CreateServiceFunction(MS_UTILS_BROADCASTTOWINDOWLIST_ASYNC,BroadcastToWindowListAsync); + CreateServiceFunction(MS_UTILS_FINDWINDOWINLIST,FindInWindowList); + HookEvent(ME_SYSTEM_MODULESLOADED,HookShutdown); + return 0; +} -- cgit v1.2.3