BOOL TRecvDlg::EndRecvFile(BOOL manual_suspend) { if (fileObj->hThread) { HANDLE hThread = fileObj->hThread; fileObj->hThread = 0; // 中断の合図 WaitForSingleObject(hThread, INFINITE); ::CloseHandle(hThread); } fileObj->lastTick = fileObj->conInfo->lastTick = ::GetTickCount(); SetTransferButtonText(); int target = ShareMng::GetFileInfoNo(shareInfo, fileObj->fileInfo); FileInfo *fileInfo = fileObj->fileInfo; BOOL isSingleTrans = fileObj->startTick == fileObj->conInfo->startTick; ::closesocket(fileObj->conInfo->sd); delete [] fileObj->recvBuf; delete fileObj->conInfo; fileObj->conInfo = NULL; if (fileObj->status == FS_COMPLETE) { for (int cnt=0; cnt < shareInfo->fileCnt; cnt++) { if (shareInfo->fileInfo[cnt]->IsSelected() && shareInfo->fileInfo[cnt] != fileInfo) { FreeDecodeShareMsgFile(shareInfo, target); return SaveFile(); } } } int ret = manual_suspend ? IDCANCEL : RecvTransEndDlg(fileObj, this).Exec(); if (ret == EXEC_BUTTON || ret == FOLDER_BUTTON && fileObj->isDir && isSingleTrans) { char buf[MAX_BUF]; MakePath(buf, fileObj->saveDir, fileInfo->Fname()); ShellExecuteU8(NULL, NULL, buf, 0, 0, SW_SHOW); } else if (ret == FOLDER_BUTTON) ShellExecuteU8(NULL, NULL, fileObj->saveDir, 0, 0, SW_SHOW); if (ret == IDOK || ret == FOLDER_BUTTON || ret == EXEC_BUTTON) FreeDecodeShareMsgFile(shareInfo, target); SetFileButton(this, FILE_BUTTON, shareInfo); EvSize(SIZE_RESTORED, 0, 0); if (ret == IDRETRY) PostMessage(WM_COMMAND, FILE_BUTTON, 0); return TRUE; }
LRESULT TWin::WinProc(UINT uMsg, WPARAM wParam, LPARAM lParam) { BOOL done = FALSE; LRESULT result = 0; switch(uMsg) { case WM_CREATE: GetWindowRect(&orgRect); done = EvCreate(lParam); break; case WM_CLOSE: done = EvClose(); break; case WM_COMMAND: done = EvCommand(HIWORD(wParam), LOWORD(wParam), lParam); break; case WM_SYSCOMMAND: done = EvSysCommand(wParam, MAKEPOINTS(lParam)); break; case WM_TIMER: done = EvTimer(wParam, (TIMERPROC)lParam); break; case WM_DESTROY: done = EvDestroy(); break; case WM_NCDESTROY: if (!::IsIconic(hWnd)) GetWindowRect(&rect); if (!EvNcDestroy()) // hWndを0にする前に呼び出す DefWindowProc(uMsg, wParam, lParam); done = TRUE; TApp::GetApp()->DelWin(this); hWnd = 0; break; case WM_QUERYENDSESSION: result = EvQueryEndSession((BOOL)wParam, (BOOL)lParam); done = TRUE; break; case WM_ENDSESSION: done = EvEndSession((BOOL)wParam, (BOOL)lParam); break; case WM_QUERYOPEN: result = EvQueryOpen(); done = TRUE; break; case WM_PAINT: done = EvPaint(); break; case WM_NCPAINT: done = EvNcPaint((HRGN)wParam); break; case WM_SIZE: done = EvSize((UINT)wParam, LOWORD(lParam), HIWORD(lParam)); break; case WM_MOVE: done = EvMove(LOWORD(lParam), HIWORD(lParam)); break; case WM_SHOWWINDOW: done = EvShowWindow((BOOL)wParam, (int)lParam); break; case WM_GETMINMAXINFO: done = EvGetMinMaxInfo((MINMAXINFO *)lParam); break; case WM_SETCURSOR: result = done = EvSetCursor((HWND)wParam, LOWORD(lParam), HIWORD(lParam)); break; case WM_MOUSEMOVE: done = EvMouseMove((UINT)wParam, MAKEPOINTS(lParam)); break; case WM_NCHITTEST: done = EvNcHitTest(MAKEPOINTS(lParam), &result); break; case WM_MEASUREITEM: result = done = EvMeasureItem((UINT)wParam, (LPMEASUREITEMSTRUCT)lParam); break; case WM_DRAWITEM: result = done = EvDrawItem((UINT)wParam, (LPDRAWITEMSTRUCT)lParam); break; case WM_NOTIFY: result = done = EvNotify((UINT)wParam, (LPNMHDR)lParam); break; case WM_CONTEXTMENU: result = done = EvContextMenu((HWND)wParam, MAKEPOINTS(lParam)); break; case WM_HOTKEY: result = done = EvHotKey((int)wParam); break; case WM_ACTIVATEAPP: done = EvActivateApp((BOOL)wParam, (DWORD)lParam); break; case WM_ACTIVATE: EvActivate(LOWORD(wParam), HIWORD(wParam), (HWND)lParam); break; case WM_DROPFILES: done = EvDropFiles((HDROP)wParam); break; case WM_CHAR: done = EvChar((WCHAR)wParam, lParam); break; case WM_WINDOWPOSCHANGING: done = EvWindowPosChanging((WINDOWPOS *)lParam); break; case WM_WINDOWPOSCHANGED: done = EvWindowPosChanged((WINDOWPOS *)lParam); break; case WM_LBUTTONUP: case WM_RBUTTONUP: case WM_NCLBUTTONUP: case WM_NCRBUTTONUP: case WM_LBUTTONDOWN: case WM_RBUTTONDOWN: case WM_NCLBUTTONDOWN: case WM_NCRBUTTONDOWN: case WM_LBUTTONDBLCLK: case WM_RBUTTONDBLCLK: case WM_NCLBUTTONDBLCLK: case WM_NCRBUTTONDBLCLK: done = EventButton(uMsg, (int)wParam, MAKEPOINTS(lParam)); break; case WM_KEYUP: case WM_KEYDOWN: done = EventKey(uMsg, (int)wParam, (LONG)lParam); break; case WM_HSCROLL: case WM_VSCROLL: done = EventScrollWrapper(uMsg, LOWORD(wParam), HIWORD(wParam), (HWND)lParam); break; case WM_ENTERMENULOOP: case WM_EXITMENULOOP: done = EventMenuLoop(uMsg, (BOOL)wParam); break; case WM_INITMENU: case WM_INITMENUPOPUP: done = EventInitMenu(uMsg, (HMENU)wParam, LOWORD(lParam), (BOOL)HIWORD(lParam)); break; case WM_MENUSELECT: done = EvMenuSelect(LOWORD(wParam), HIWORD(wParam), (HMENU)lParam); break; case WM_CTLCOLORBTN: case WM_CTLCOLORDLG: case WM_CTLCOLOREDIT: case WM_CTLCOLORLISTBOX: case WM_CTLCOLORMSGBOX: case WM_CTLCOLORSCROLLBAR: case WM_CTLCOLORSTATIC: done = EventCtlColor(uMsg, (HDC)wParam, (HWND)lParam, (HBRUSH *)&result); break; case WM_KILLFOCUS: case WM_SETFOCUS: done = EventFocus(uMsg, (HWND)wParam); break; default: if (uMsg >= WM_APP && uMsg <= 0xBFFF) { result = done = EventApp(uMsg, wParam, lParam); } else if (uMsg >= WM_USER && uMsg < WM_APP || uMsg >= 0xC000 && uMsg <= 0xFFFF) { result = done = EventUser(uMsg, wParam, lParam); } else { result = done = EventSystem(uMsg, wParam, lParam); } break; } return done ? result : DefWindowProc(uMsg, wParam, lParam); }
LRESULT TDlg::WinProc(UINT uMsg, WPARAM wParam, LPARAM lParam) { LRESULT result = 0; switch (uMsg) { case WM_INITDIALOG: if (rect.left != CW_USEDEFAULT && !(::GetWindowLong(hWnd, GWL_STYLE) & WS_CHILD)) { MoveWindow(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top,FALSE); } if (rect.left == CW_USEDEFAULT) { GetWindowRect(&orgRect); } return EvCreate(lParam); case WM_CLOSE: EvClose(); return 0; case WM_COMMAND: EvCommand(HIWORD(wParam), LOWORD(wParam), lParam); return 0; case WM_SYSCOMMAND: EvSysCommand(wParam, MAKEPOINTS(lParam)); return 0; case WM_TIMER: EvTimer(wParam, (TIMERPROC)lParam); return 0; case WM_DESTROY: EvDestroy(); return 0; case WM_NCDESTROY: if (!::IsIconic(hWnd)) GetWindowRect(&rect); EvNcDestroy(); TApp::GetApp()->DelWin(this); hWnd = 0; return 0; case WM_QUERYENDSESSION: result = EvQueryEndSession((BOOL)wParam, (BOOL)lParam); SetWindowLong(DWL_MSGRESULT, result); return 0; case WM_ENDSESSION: EvEndSession((BOOL)wParam, (BOOL)lParam); return 0; case WM_QUERYOPEN: result = EvQueryOpen(); SetWindowLong(DWL_MSGRESULT, result); return result; case WM_PAINT: EvPaint(); return 0; case WM_NCPAINT: EvNcPaint((HRGN)wParam); return 0; case WM_SIZE: EvSize((UINT)wParam, LOWORD(lParam), HIWORD(lParam)); return 0; case WM_MOVE: EvMove(LOWORD(lParam), HIWORD(lParam)); return 0; case WM_SHOWWINDOW: EvShowWindow((BOOL)wParam, (int)lParam); return 0; case WM_GETMINMAXINFO: EvGetMinMaxInfo((MINMAXINFO *)lParam); return 0; case WM_SETCURSOR: result = EvSetCursor((HWND)wParam, LOWORD(lParam), HIWORD(lParam)); SetWindowLong(DWL_MSGRESULT, result); return result; case WM_MOUSEMOVE: return EvMouseMove((UINT)wParam, MAKEPOINTS(lParam)); case WM_NCHITTEST: EvNcHitTest(MAKEPOINTS(lParam), &result); SetWindowLong(DWL_MSGRESULT, result); return result; case WM_MEASUREITEM: result = EvMeasureItem((UINT)wParam, (LPMEASUREITEMSTRUCT)lParam); SetWindowLong(DWL_MSGRESULT, result); return result; case WM_DRAWITEM: result = EvDrawItem((UINT)wParam, (LPDRAWITEMSTRUCT)lParam); SetWindowLong(DWL_MSGRESULT, result); return result; case WM_NOTIFY: result = EvNotify((UINT)wParam, (LPNMHDR)lParam); SetWindowLong(DWL_MSGRESULT, result); return result; case WM_CONTEXTMENU: result = EvContextMenu((HWND)wParam, MAKEPOINTS(lParam)); SetWindowLong(DWL_MSGRESULT, result); return result; case WM_HOTKEY: result = EvHotKey((int)wParam); SetWindowLong(DWL_MSGRESULT, result); return result; case WM_ACTIVATEAPP: EvActivateApp((BOOL)wParam, (DWORD)lParam); break; case WM_ACTIVATE: EvActivate(LOWORD(wParam), HIWORD(wParam), (HWND)lParam); break; case WM_DROPFILES: EvDropFiles((HDROP)wParam); return 0; case WM_CHAR: EvChar((WCHAR)wParam, lParam); SetWindowLong(DWL_MSGRESULT, 0); return 0; case WM_WINDOWPOSCHANGING: EvWindowPosChanging((WINDOWPOS *)lParam); SetWindowLong(DWL_MSGRESULT, 0); return 0; case WM_WINDOWPOSCHANGED: EvWindowPosChanged((WINDOWPOS *)lParam); SetWindowLong(DWL_MSGRESULT, 0); return 0; case WM_LBUTTONUP: case WM_RBUTTONUP: case WM_NCLBUTTONUP: case WM_NCRBUTTONUP: case WM_LBUTTONDOWN: case WM_RBUTTONDOWN: case WM_NCLBUTTONDOWN: case WM_NCRBUTTONDOWN: case WM_LBUTTONDBLCLK: case WM_RBUTTONDBLCLK: case WM_NCLBUTTONDBLCLK: case WM_NCRBUTTONDBLCLK: EventButton(uMsg, (int)wParam, MAKEPOINTS(lParam)); return 0; case WM_KEYUP: case WM_KEYDOWN: EventKey(uMsg, (int)wParam, (LONG)lParam); return 0; case WM_HSCROLL: case WM_VSCROLL: EventScroll(uMsg, LOWORD(wParam), HIWORD(wParam), (HWND)lParam); return 0; case WM_ENTERMENULOOP: case WM_EXITMENULOOP: EventMenuLoop(uMsg, (BOOL)wParam); break; case WM_INITMENU: case WM_INITMENUPOPUP: EventInitMenu(uMsg, (HMENU)wParam, LOWORD(lParam), (BOOL)HIWORD(lParam)); return 0; case WM_MENUSELECT: EvMenuSelect(LOWORD(wParam), (BOOL)HIWORD(wParam), (HMENU)lParam); return 0; case WM_CTLCOLORBTN: case WM_CTLCOLORDLG: case WM_CTLCOLOREDIT: case WM_CTLCOLORLISTBOX: case WM_CTLCOLORMSGBOX: case WM_CTLCOLORSCROLLBAR: case WM_CTLCOLORSTATIC: EventCtlColor(uMsg, (HDC)wParam, (HWND)lParam, (HBRUSH *)&result); SetWindowLong(DWL_MSGRESULT, result); return result; case WM_KILLFOCUS: case WM_SETFOCUS: EventFocus(uMsg, (HWND)wParam); return 0; default: if (uMsg >= WM_APP && uMsg <= 0xBFFF) { result = EventApp(uMsg, wParam, lParam); } else if (uMsg >= WM_USER && uMsg < WM_APP || uMsg >= 0xC000 && uMsg <= 0xFFFF) { result = EventUser(uMsg, wParam, lParam); } else { result = EventSystem(uMsg, wParam, lParam); } SetWindowLong(DWL_MSGRESULT, result); return result; } return FALSE; }
BOOL TRecvDlg::EvCommand(WORD wNotifyCode, WORD wID, LPARAM hWndCtl) { switch (wID) { case IDOK: if (openFlg && ::IsDlgButtonChecked(hWnd, QUOTE_CHECK)) { CHARRANGE cr; editSub.SendMessageW(EM_EXGETSEL, 0, (LPARAM)&cr); // GT_SELECTION + GT_USECRLF の組み合わせには、バグがあるため、使えない → 自前で "\r" -> "\r\n" に変換 DynBuf buf(MAX_UDPBUF); editSub.ExGetText(buf.Buf(), buf.Size(), (cr.cpMin == cr.cpMax ? GT_DEFAULT : GT_SELECTION)); int i=0, j=0; for ( ; buf.Buf()[i] && j < MAX_UDPBUF; i++, j++) { if ((msg.msgBuf[j] = buf.Buf()[i]) == '\r') { msg.msgBuf[++j] = '\n'; } } msg.msgBuf[j] = 0; } else *msg.msgBuf = 0; ::PostMessage(GetMainWnd(), WM_SENDDLG_OPEN, (WPARAM)hWnd, (LPARAM)&msg); return TRUE; case IDCANCEL: if ((GetAsyncKeyState(VK_ESCAPE) & 0x8000) == 0) { if (fileObj && fileObj->conInfo) return EvCommand(0, FILE_BUTTON, 0), TRUE; if (timerID == 0) ::PostMessage(GetMainWnd(), WM_RECVDLG_EXIT, 0, (LPARAM)this); else TWin::Show(SW_HIDE); } return TRUE; case MISC_ACCEL: case HIDE_ACCEL: ::PostMessage(GetMainWnd(), WM_COMMAND, wID, 0); return TRUE; case ALLSELECT_ACCEL: editSub.SendMessage(EM_SETSEL, 0, (LPARAM)-1); return TRUE; case OPEN_BUTTON: if (openFlg) return TRUE; if (msg.command & IPMSG_PASSWORDOPT) { TPasswordDlg dlg(cfg, this); if (dlg.Exec() != TRUE) return TRUE; if (cfg->PasswdLogCheck) logmng->WriteRecvMsg(&msg, hosts, shareInfo); } openFlg = TRUE; editSub.ShowWindow(SW_SHOW); ::ShowWindow(GetDlgItem(QUOTE_CHECK), SW_SHOW); ::ShowWindow(GetDlgItem(OPEN_BUTTON), SW_HIDE); ::EnableWindow(GetDlgItem(OPEN_BUTTON), FALSE); if (shareInfo) SetFileButton(this, FILE_BUTTON, shareInfo), EvSize(SIZE_RESTORED, 0, 0); if (msg.command & IPMSG_SECRETOPT) { char buf[MAX_LISTBUF]; wsprintf(buf, "%ld", msg.packetNo); packetNo = msgMng->MakeMsg(readMsgBuf, IPMSG_READMSG|(msg.command & IPMSG_READCHECKOPT), buf); msgMng->UdpSend(msg.hostSub.addr, msg.hostSub.portNo, readMsgBuf); if (msg.command & IPMSG_READCHECKOPT) timerID = ::SetTimer(hWnd, IPMSG_RECV_TIMER, cfg->RetryMSec, NULL); } return TRUE; case FILE_BUTTON: if (fileObj && fileObj->conInfo) { if (fileObj->hThread) ::SuspendThread(fileObj->hThread); int ret = MessageBoxU8(GetLoadStrU8(IDS_TRANSSTOP), MSG_STR, MB_OKCANCEL); if (fileObj->hThread) ::ResumeThread(fileObj->hThread); if (ret == IDOK) if (fileObj->conInfo) EndRecvFile(TRUE); } else if (fileObj) { TSaveCommonDlg dlg(shareInfo, cfg, this); if (dlg.Exec()) { memset(fileObj, 0, sizeof(RecvFileObj)); strncpyz(fileObj->saveDir, cfg->lastSaveDir, MAX_PATH_U8); SaveFile(); } } break; case MENU_SAVEPOS: if ((cfg->RecvSavePos = !cfg->RecvSavePos) != 0) { GetWindowRect(&rect); cfg->RecvXpos = rect.left; cfg->RecvYpos = rect.top; } cfg->WriteRegistry(CFG_WINSIZE); return TRUE; case MENU_SAVESIZE: GetWindowRect(&rect); cfg->RecvXdiff = (rect.right - rect.left) - (orgRect.right - orgRect.left); cfg->RecvYdiff = (rect.bottom - rect.top) - (orgRect.bottom - orgRect.top); cfg->WriteRegistry(CFG_WINSIZE); return TRUE; case MENU_NORMALSIZE: GetWindowRect(&rect); MoveWindow(rect.left, rect.top, orgRect.right - orgRect.left, orgRect.bottom - orgRect.top, TRUE); return TRUE; case MENU_EDITFONT: case MENU_HEADFONT: CHOOSEFONT cf; LOGFONT tmpFont, *targetFont; targetFont = wID == MENU_EDITFONT ? &cfg->RecvEditFont : &cfg->RecvHeadFont; memset(&cf, 0, sizeof(cf)); cf.lStructSize = sizeof(cf); cf.hwndOwner = hWnd; cf.lpLogFont = &(tmpFont = *targetFont); cf.Flags = CF_SCREENFONTS | CF_INITTOLOGFONTSTRUCT | CF_SHOWHELP; cf.nFontType = SCREEN_FONTTYPE; if (::ChooseFont(&cf)) { *targetFont = tmpFont; SetFont(); ::InvalidateRgn(hWnd, NULL, TRUE); } cfg->WriteRegistry(CFG_FONT); return TRUE; case MENU_DEFAULTFONT: cfg->RecvHeadFont = orgFont; cfg->RecvEditFont = orgFont; SetFont(); ::InvalidateRgn(hWnd, NULL, TRUE); cfg->WriteRegistry(CFG_FONT); return TRUE; } return FALSE; }
BOOL TRecvDlg::EvCreate(LPARAM lParam) { editSub.AttachWnd(GetDlgItem(RECV_EDIT)); editSub.SendMessage(EM_AUTOURLDETECT, 1, 0); editSub.SendMessage(EM_SETBKGNDCOLOR, FALSE, ::GetSysColor(COLOR_3DFACE)); editSub.SendMessage(EM_SETTARGETDEVICE, 0, 0); // 折り返し SetDlgIcon(hWnd); SetDlgItemTextU8(RECV_HEAD, head); if (msg.command & IPMSG_BROADCASTOPT) SetDlgItemTextU8(RECV_TITLE, GetLoadStrU8(IDS_BROADCAST)); else if (msg.command & IPMSG_MULTICASTOPT) SetDlgItemTextU8(RECV_TITLE, GetLoadStrU8(IDS_MULTICAST)); else SetDlgItemTextU8(RECV_TITLE, GetLoadStrU8(IDS_UNICAST)); if (msg.command & IPMSG_AUTORETOPT) SetDlgItemTextU8(RECV_TITLE, GetLoadStrU8(IDS_UNIABSENCE)); char buf[MAX_LISTBUF]; if (msg.command & IPMSG_ENCRYPTOPT) { GetWindowText(buf, sizeof(buf)); strcat(buf, (cryptCapa & IPMSG_BLOWFISH_128) ? " +" : " -"); SetWindowText(buf); } wsprintf(head, "at %s", Ctime(&recvTime)); SetDlgItemTextU8(RECV_HEAD2, head); editSub.ExSetText(msg.msgBuf); if (msg.command & IPMSG_SECRETOPT) editSub.ShowWindow(SW_HIDE), ::ShowWindow(GetDlgItem(QUOTE_CHECK), SW_HIDE); else { ::ShowWindow(GetDlgItem(OPEN_BUTTON), SW_HIDE), openFlg = TRUE; if (shareInfo) SetFileButton(this, FILE_BUTTON, shareInfo); } if (msg.command & IPMSG_FILEATTACHOPT) { GetDlgItemTextU8(OPEN_BUTTON, buf, sizeof(buf)); strcat(buf, " "); strcat(buf, GetLoadStrU8(IDS_FILEATTACH)); SetDlgItemTextU8(OPEN_BUTTON, buf); } if (msg.command & IPMSG_PASSWORDOPT) { GetDlgItemTextU8(OPEN_BUTTON, buf, sizeof(buf)); strcat(buf, GetLoadStrU8(IDS_KEYOPEN)); SetDlgItemTextU8(OPEN_BUTTON, buf); } if (cfg->QuoteCheck) SendDlgItemMessage(QUOTE_CHECK, BM_SETCHECK, cfg->QuoteCheck, 0); if (cfg->AbnormalButton) SetDlgItemTextU8(IDOK, GetLoadStrU8(IDS_INTERCEPT)); SetFont(); SetSize(); HMENU hMenu = ::GetSystemMenu(hWnd, FALSE); AppendMenuU8(hMenu, MF_SEPARATOR, NULL, NULL); SetMainMenu(hMenu); if (IsNewShell() != TRUE) { ULONG style = GetWindowLong(GWL_STYLE); style &= 0xffffff0f; style |= 0x00000080; SetWindowLong(GWL_STYLE, style); } SetForegroundWindow(); if (msg.command & IPMSG_NOADDLISTOPT) ::EnableWindow(GetDlgItem(IDOK), FALSE); EvSize(SIZE_RESTORED, 0, 0); return TRUE; }