Cfg::Cfg(Addr _nicAddr, int _portNo) { nicAddr = _nicAddr; portNo = _portNo; AbsenceHead = NULL; AbsenceStr = NULL; FindStr = NULL; int abs_ids[] = { IDS_DEFABSENCE1, IDS_DEFABSENCE2, IDS_DEFABSENCE3, IDS_DEFABSENCE4, IDS_DEFABSENCE5, IDS_DEFABSENCE6, IDS_DEFABSENCE7, IDS_DEFABSENCE8, 0 }; for (int i=0; abs_ids[i] && i < sizeof(DefaultAbsence) / sizeof(char *); i++) { DefaultAbsence[i] = GetLoadStrU8(abs_ids[i]); } int absh_ids[] = { IDS_DEFABSENCEHEAD1, IDS_DEFABSENCEHEAD2, IDS_DEFABSENCEHEAD3, IDS_DEFABSENCEHEAD4, IDS_DEFABSENCEHEAD5, IDS_DEFABSENCEHEAD6, IDS_DEFABSENCEHEAD7, IDS_DEFABSENCEHEAD8, 0 }; for (int i=0; absh_ids[i] && i < sizeof(DefaultAbsenceHead) / sizeof(char *); i++) { DefaultAbsenceHead[i] = GetLoadStrU8(absh_ids[i]); } char buf[MAX_PATH_U8], path[MAX_PATH_U8], *fname = NULL; GetModuleFileNameU8(NULL, buf, MAX_PATH_U8); GetFullPathNameU8(buf, MAX_PATH_U8, path, &fname); fname[-1] = 0; // remove '\\' execDir = strdup(path); }
/* BrowseDlg用サブクラス生成 */ BOOL TBrowseDirDlg::AttachWnd(HWND _hWnd) { BOOL ret = TSubClass::AttachWnd(_hWnd); dirtyFlg = FALSE; // ディレクトリ設定 DWORD attr = GetFileAttributesU8(fileBuf); if (attr == 0xffffffff || (attr & FILE_ATTRIBUTE_DIRECTORY) == 0) GetParentDirU8(fileBuf, fileBuf); SendMessageW(BFFM_SETSELECTIONW, TRUE, (LPARAM)U8toWs(fileBuf)); SetWindowText(IPMSG_FULLNAME); // ボタン作成 RECT tmp_rect; ::GetWindowRect(GetDlgItem(IDOK), &tmp_rect); POINT pt = { tmp_rect.left, tmp_rect.top }; ::ScreenToClient(hWnd, &pt); int cx = (pt.x - 30) / 2, cy = tmp_rect.bottom - tmp_rect.top; ::CreateWindowU8(BUTTON_CLASS, GetLoadStrU8(IDS_MKDIR), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, 10, pt.y, cx, cy, hWnd, (HMENU)MKDIR_BUTTON, TApp::GetInstance(), NULL); ::CreateWindowU8(BUTTON_CLASS, GetLoadStrU8(IDS_RMDIR), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, 18 + cx, pt.y, cx, cy, hWnd, (HMENU)RMDIR_BUTTON, TApp::GetInstance(), NULL); HFONT hDlgFont = (HFONT)SendDlgItemMessage(IDOK, WM_GETFONT, 0, 0L); if (hDlgFont) { SendDlgItemMessage(MKDIR_BUTTON, WM_SETFONT, (UINT)hDlgFont, 0L); SendDlgItemMessage(RMDIR_BUTTON, WM_SETFONT, (UINT)hDlgFont, 0L); } return ret; }
BOOL TSaveCommonDlg::SetInfo(void) { char buf[MAX_BUF], sizestr[MAX_LISTBUF]; Wstr fname_w(shareInfo->fileInfo[offset]->Fname()); ::SetDlgItemTextW(::GetParent(hWnd), 0x480, fname_w.Buf()); if (GET_MODE(shareInfo->fileInfo[offset]->Attr()) == IPMSG_FILE_DIR) strcpy(sizestr, GetLoadStrU8(IDS_DIRSAVE)); else MakeSizeString(sizestr, shareInfo->fileInfo[offset]->Size()); wsprintf(buf, GetLoadStrU8(IDS_FILEINFO), offset + 1, shareInfo->fileCnt, shareInfo->fileInfo[offset]->Fname(), sizestr); SetDlgItemTextU8(RESULT_STATIC, buf); _int64 total_size = 0; for (int i=0; i < shareInfo->fileCnt; i++) total_size += shareInfo->fileInfo[i]->Size(); MakeSizeString(sizestr, total_size); wsprintf(buf, GetLoadStrU8(IDS_LUMPBUTTON), sizestr, shareInfo->fileCnt); SetDlgItemTextU8(LUMP_CHECK, buf); const char *ext = strrchr(shareInfo->fileInfo[offset]->Fname(), '.'); isLinkFile = (ext && stricmp(ext, ".lnk") == 0) ? TRUE : FALSE; return TRUE; }
BOOL TShareDlg::EvCreate(LPARAM lParam) { shareListView.AttachWnd(GetDlgItem(FILE_LIST)); char *title[] = { GetLoadStrU8(IDS_FILENAME), GetLoadStrU8(IDS_SIZE), GetLoadStrU8(IDS_LOCATION), NULL }; int size[] = { 120, 70, 180 }; int fmt[] = { LVCFMT_LEFT, LVCFMT_RIGHT, LVCFMT_LEFT, LVCFMT_LEFT }; int i; for (i=0; title[i]; i++) { shareListView.InsertColumn(i, title[i], size[i], fmt[i]); } for (i=0; i < shareInfo->fileCnt; i++) { AddList(i); } if (rect.left == CW_USEDEFAULT) { GetWindowRect(&rect); int xsize = rect.right - rect.left, ysize = rect.bottom - rect.top; int cx = ::GetSystemMetrics(SM_CXFULLSCREEN), cy = ::GetSystemMetrics(SM_CYFULLSCREEN); int x = (cx - xsize)/2; int y = (cy - ysize)/2; MoveWindow((x < 0) ? 0 : x % (cx - xsize), (y < 0) ? 0 : y % (cy - ysize), xsize, ysize, FALSE); } else MoveWindow(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, FALSE); Show(); ::SetFocus(shareListView.hWnd); return TRUE; }
BOOL TSaveCommonDlg::EvCreate(LPARAM lParam) { RECT ok_rect = { 0, 0, 50, 20 }, cl_rect; HWND pWnd = ::GetParent(hWnd); ::ShowWindow(::GetDlgItem(pWnd, 0x441), SW_HIDE); ::ShowWindow(::GetDlgItem(pWnd, 0x470), SW_HIDE); // if (shareInfo->fileCnt == 1) // return TRUE; if (!::GetWindowRect(::GetDlgItem(pWnd, IDOK), &ok_rect)) return TRUE; int ok_xsize = ok_rect.right - ok_rect.left; int ok_ysize = ok_rect.bottom - ok_rect.top; // ボタン高さの2倍分広げる SetWindowLong(GWL_STYLE, GetWindowLong(GWL_STYLE)|WS_CLIPSIBLINGS); ::GetClientRect(pWnd, &cl_rect); GetWindowRect(&rect); MoveWindow(0, 0, cl_rect.right, (rect.bottom - rect.top) + ok_ysize * 5 / 2, FALSE); GetWindowRect(&rect); int cx = 20, cy = ok_ysize; CreateWindowU8(STATIC_CLASS, "", WS_CHILD|WS_VISIBLE|SS_LEFT, cx, 0, rect.right, ok_ysize, hWnd, (HMENU)RESULT_STATIC, TApp::GetInstance(), NULL); DWORD flg = (shareInfo->fileCnt == 1 ? WS_DISABLED : 0)|WS_CHILD|WS_VISIBLE; CreateWindowU8(BUTTON_CLASS, GetLoadStrU8(IDS_PREVBUTTON), flg | BS_PUSHBUTTON, cx, cy, ok_xsize, ok_ysize, hWnd, (HMENU)PRIOR_BUTTON, TApp::GetInstance(), NULL); CreateWindowU8(BUTTON_CLASS, GetLoadStrU8(IDS_NEXTBUTTON), flg | BS_PUSHBUTTON, cx+=ok_xsize+20, cy, ok_xsize, ok_ysize, hWnd, (HMENU)NEXT_BUTTON, TApp::GetInstance(), NULL); CreateWindowU8(BUTTON_CLASS, "", WS_CHILD|WS_VISIBLE|BS_CHECKBOX, cx+=ok_xsize+20, cy, ok_xsize * 2, ok_ysize, hWnd, (HMENU)LUMP_CHECK, TApp::GetInstance(), NULL); HFONT hDlgFont = (HFONT)::SendDlgItemMessage(pWnd, IDOK, WM_GETFONT, 0, 0L); if (hDlgFont) { SendDlgItemMessage(RESULT_STATIC, WM_SETFONT, (UINT)hDlgFont, 0L); SendDlgItemMessage(PRIOR_BUTTON, WM_SETFONT, (UINT)hDlgFont, 0L); SendDlgItemMessage(NEXT_BUTTON, WM_SETFONT, (UINT)hDlgFont, 0L); SendDlgItemMessage(LUMP_CHECK, WM_SETFONT, (UINT)hDlgFont, 0L); } SetInfo(); if (cfg->LumpCheck) LumpCheck(); return TRUE; }
BOOL TRecvDlg::SaveFile(void) { int target; for (target=0; target < shareInfo->fileCnt; target++) if (shareInfo->fileInfo[target]->IsSelected()) break; if (target == shareInfo->fileCnt) return FALSE; memset(fileObj, 0, (char *)&fileObj->totalTrans - (char *)fileObj); fileObj->conInfo = new ConnectInfo; fileObj->fileInfo = shareInfo->fileInfo[target]; fileObj->isDir = GET_MODE(fileObj->fileInfo->Attr()) == IPMSG_FILE_DIR ? TRUE : FALSE; fileObj->status = fileObj->isDir ? FS_DIRFILESTART : FS_TRANSFILE; fileObj->hFile = INVALID_HANDLE_VALUE; if (fileObj->isDir) strncpyz(fileObj->path, fileObj->saveDir, MAX_PATH_U8); if (ConnectRecvFile()) SetDlgItemTextU8(FILE_BUTTON, GetLoadStrU8(IDS_PREPARETRANS)); else { delete fileObj->conInfo; fileObj->conInfo = NULL; } fileObj->startTick = ::GetTickCount(); return TRUE; }
BOOL TPasswordDlg::EvCommand(WORD wNotifyCode, WORD wID, LPARAM hWndCtl) { switch (wID) { case IDOK: { char _buf[MAX_NAMEBUF]; char *buf = outbuf ? outbuf : _buf; GetDlgItemTextU8(PASSWORD_EDIT, buf, MAX_NAMEBUF); if (cfg) { if (CheckPassword(cfg->PasswordStr, buf)) EndDialog(TRUE); else SetDlgItemTextU8(PASSWORD_EDIT, ""), MessageBoxU8(GetLoadStrU8(IDS_CANTAUTH)); } else EndDialog(TRUE); } return TRUE; case IDCANCEL: EndDialog(FALSE); return TRUE; } return FALSE; }
BOOL TSetupSheet::CheckData() { char buf[MAX_PATH_U8]; int val; if (resId == SETUP_SHEET3) { GetDlgItemTextU8(LRUUSER_EDIT, buf, sizeof(buf)); if ((val = atoi(buf)) > MAX_LRUUSER || val < 0) { MessageBox(FmtStr(GetLoadStr(IDS_TOOMANYLRU), MAX_LRUUSER)); return FALSE; } } else if (resId == SETUP_SHEET4) { GetDlgItemTextU8(LOG_EDIT, buf, sizeof(buf)); if (GetDriveType(NULL) == DRIVE_REMOTE && !SendDlgItemMessage(LOG_CHECK, BM_GETCHECK, 0, 0) && strchr(buf, '\\')) { MessageBox(GetLoadStr(IDS_LOGALERT)); return FALSE; } } else if (resId == SETUP_SHEET5) { char buf1[MAX_NAMEBUF], buf2[MAX_NAMEBUF], buf3[MAX_NAMEBUF]; GetDlgItemTextU8(OLDPASSWORD_EDIT, buf1, sizeof(buf1)); GetDlgItemTextU8(NEWPASSWORD_EDIT, buf2, sizeof(buf2)); GetDlgItemTextU8(NEWPASSWORD_EDIT2, buf3, sizeof(buf3)); if (strcmp(buf2, buf3) != 0) { MessageBoxU8(GetLoadStrU8(IDS_NOTSAMEPASS)); return FALSE; } if (!CheckPassword(cfg->PasswordStr, buf1)) { if (*buf1 || *buf2 || *buf3) { SetDlgItemTextU8(PASSWORD_EDIT, ""); MessageBoxU8(GetLoadStrU8(IDS_CANTAUTH)); return FALSE; } } } return TRUE; }
BOOL TRecvDlg::OpenRecvFile(void) { char path[MAX_BUF]; if (MakePath(path, fileObj->isDir ? fileObj->path : fileObj->saveDir, fileObj->curFileInfo.Fname()) >= MAX_PATH_U8) return MessageBoxU8(path, GetLoadStrU8(IDS_PATHTOOLONG)), FALSE; if (IsSafePath(path, fileObj->curFileInfo.Fname()) == FALSE) return MessageBoxU8(path, GetLoadStrU8(IDS_NOTSAFEPATH)), FALSE; if ((fileObj->hFile = CreateFileU8(path, GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0)) == INVALID_HANDLE_VALUE) return fileObj->isDir ? FALSE : (MessageBoxU8(GetLoadStrU8(IDS_CREATEFAIL), path), FALSE); if (fileObj->curFileInfo.Attr() & IPMSG_FILE_RONLYOPT) SetFileAttributesU8(path, FILE_ATTRIBUTE_READONLY); //::SetFilePointer(fileObj->hFile, OFFSET, 0, FILE_BEGIN); //::SetEndOfFile(fileObj->hFile); return TRUE; }
char *GetLoadStrAsFilterU8(UINT id) { char *ret = GetLoadStrU8(id); if (ret) { for (char *p = ret; *p; p++) { if (*p == '!') { *p = '\0'; } } } return ret; }
BOOL TAboutDlg::EvCommand(WORD wNotifyCode, WORD wID, LPARAM hWndCtl) { switch (wID) { case IDOK: case IDCANCEL: EndDialog(TRUE); return TRUE; case IPMSG_ICON: case IPMSGWEB_BUTTON: if (wID == IPMSGWEB_BUTTON || wNotifyCode == 1) ShellExecuteU8(NULL, NULL, GetLoadStrU8(IDS_IPMSGURL), NULL, NULL, SW_SHOW); return TRUE; } return FALSE; }
void THistDlg::SetHeader() { int title_id[] = { IDS_HISTUSER, IDS_HISTODATE, IDS_HISTSDATE, IDS_HISTID }; int i, offset = 0; int col_num = MAX_HISTWIDTH - (openedMode ? 0 : 1); for (i=0; i < MAX_HISTWIDTH; i++) { histListView.DeleteColumn(0); } for (i=0; i < MAX_HISTWIDTH; i++) { if (!openedMode && i == HW_ODATE) { offset = 1; continue; } histListView.InsertColumn(i-offset, GetLoadStrU8(title_id[i]), cfg->HistWidth[i-offset]); } }
void THistDlg::OpenNotify(HostSub *hostSub, ULONG packetNo, char *notify) { char buf[MAX_BUF]; int len; u_int hash_val; HistObj *obj; int idx; len = MakeHistInfo(hostSub, packetNo, buf); hash_val = MakeHash(buf, len, 0); if (!(obj = (HistObj *)histHash.Search(buf, hash_val))) { SendNotify(hostSub, packetNo); if (!(obj = (HistObj *)histHash.Search(buf, hash_val))) { return; } sprintf(obj->sdate, GetLoadStrU8(IDS_UNKNOWN)); } if (*obj->odate) return; SYSTEMTIME st; ::GetLocalTime(&st); sprintf(obj->odate, "%02d/%02d %02d:%02d", st.wMonth, st.wDay, st.wHour, st.wMinute); if (--unOpenedNum < 0) unOpenedNum = 0; histHash.RegisterLru(obj); if (notify) { strncpyz(obj->sdate, obj->odate, sizeof(obj->sdate)); strncpyz(obj->odate, notify, sizeof(obj->odate)); } if (hWnd) { if (openedMode) { SetData(obj); } else { if ((idx = histListView.FindItem((LPARAM)obj)) >= 0) { histListView.DeleteItem(idx); } } SetTitle(); } }
BOOL TShareDlg::EvCommand(WORD wNotifyCode, WORD wID, LPARAM hWndCtl) { switch (wID) { case IDOK: EndDialog(TRUE); break; case IDCANCEL: EndDialog(FALSE); break; case FILE_BUTTON: { int i = shareInfo->fileCnt; if (FileAddDlg(this, shareMng, shareInfo, cfg)) for (i; i < shareInfo->fileCnt; i++) AddList(i); } break; case FOLDER_BUTTON: if (BrowseDirDlg(this, GetLoadStrU8(IDS_FOLDERATTACH), cfg->lastOpenDir, cfg->lastOpenDir)) { if (shareMng->AddFileShare(shareInfo, cfg->lastOpenDir)) { AddList(shareInfo->fileCnt -1); cfg->WriteRegistry(CFG_GENERAL); } } break; case DEL_BUTTON: { for (int i=shareInfo->fileCnt-1; i >= 0; i--) { if (!shareListView.IsSelected(i)) continue; DelList(i); } } break; default: break; } return TRUE; }
BOOL TShareDlg::FileAddDlg(TDlg *dlg, ShareMng *shareMng, ShareInfo *shareInfo, Cfg *cfg) { char buf[MAX_BUF_EX] = "", path[MAX_BUF_EX]; if (!OpenFileDlg(dlg, OpenFileDlg::MULTI_OPEN).Exec(buf, GetLoadStrU8(IDS_ADDFILE), GetLoadStrAsFilterU8(IDS_OPENFILEALLFLTR), cfg->lastOpenDir)) return FALSE; cfg->WriteRegistry(CFG_GENERAL); int dirlen = strlen(cfg->lastOpenDir); if (buf[dirlen]) return shareMng->AddFileShare(shareInfo, buf); for (char *fname=buf+dirlen+1; *fname; fname += strlen(fname) +1) { if (MakePath(path, buf, fname) >= MAX_PATH_U8) continue; shareMng->AddFileShare(shareInfo, path); } return TRUE; }
BOOL TRecvDlg::RecvFile(void) { int wresid = (int)(fileObj->offset - fileObj->woffset); _int64 remain = fileObj->curFileInfo.Size() - fileObj->offset; int size = 0; if (remain > cfg->TransMax - wresid) remain = cfg->TransMax - wresid; if ((size = ::recv(fileObj->conInfo->sd, fileObj->recvBuf + wresid, (int)remain, 0)) <= 0) return FALSE; if (fileObj->hFile == INVALID_HANDLE_VALUE) if (OpenRecvFile() == FALSE) return FALSE; wresid += size; if (fileObj->offset + size >= fileObj->curFileInfo.Size() || cfg->TransMax == wresid) { DWORD wsize; if (::WriteFile(fileObj->hFile, fileObj->recvBuf, wresid, &wsize, 0) != TRUE || wresid != (int)wsize) return MessageBoxU8(GetLoadStrU8(IDS_WRITEFAIL)), FALSE; fileObj->woffset += wresid; } fileObj->offset += size; DWORD nowTick = ::GetTickCount(); if (nowTick - fileObj->conInfo->lastTick >= 1000) { fileObj->conInfo->lastTick = nowTick; PostMessage(WM_RECVDLG_FILEBUTTON, 0, 0); } if (fileObj->offset >= fileObj->curFileInfo.Size()) fileObj->status = fileObj->isDir ? FS_ENDFILE : FS_COMPLETE; return TRUE; }
void THistDlg::SetTitle() { SetWindowTextU8(FmtStr(GetLoadStrU8(openedMode ? IDS_OPENINFO : IDS_UNOPENINFO), openedMode ? (histHash.GetRegisterNum() - unOpenedNum) : unOpenedNum, histHash.GetRegisterNum())); }
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; }
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; }
/* Menu Event CallBack */ BOOL TRecvDlg::EventInitMenu(UINT uMsg, HMENU hMenu, UINT uPos, BOOL fSystemMenu) { switch (uMsg) { case WM_INITMENU: { ModifyMenuU8(hMenu, MENU_SAVEPOS, MF_BYCOMMAND|(cfg->RecvSavePos ? MF_CHECKED : 0), MENU_SAVEPOS, GetLoadStrU8(IDS_SAVEPOS)); } return TRUE; } return FALSE; }
int TSaveCommonDlg::Exec(void) { modalFlg = TRUE; char fname[MAX_BUF], last_dir[MAX_BUF], buf[MAX_BUF], *ext; // 最終保存ディレクトリが無くなっている場合、少しさかのぼる for (int i=0; i < 5; i++) { if (*cfg->lastSaveDir && GetFileAttributesU8(cfg->lastSaveDir) == 0xffffffff) if (!PathToDir(cfg->lastSaveDir, cfg->lastSaveDir)) break; } strcpy(last_dir, *cfg->lastSaveDir ? cfg->lastSaveDir : "."); while (1) { FileInfo *fileInfo = shareInfo->fileInfo[offset]; MakePath(fname, last_dir, fileInfo->Fname()); // ファイルダイアログ TApp::GetApp()->AddWin(this); BOOL ret = OpenFileDlg(parentWin, OpenFileDlg::NODEREF_SAVE, (LPOFNHOOKPROC)TApp::WinProc).Exec(fname, GetLoadStrU8(IDS_SAVEFILE), GetLoadStrAsFilterU8(IDS_OPENFILEALLFLTR), last_dir); TApp::GetApp()->DelWin(this); hWnd = NULL; if (!ret) return FALSE; // shortcut の場合は、リンク先に飛ぶ if (!isLinkFile && (ext = strrchr(fname, '.')) && stricmp(ext, ".lnk") == 0) { char arg[MAX_BUF]; if (ReadLinkU8(fname, last_dir, arg)) { if ((GetFileAttributesU8(last_dir) & FILE_ATTRIBUTE_DIRECTORY) == 0) GetParentDir(last_dir, last_dir); } continue; } fileInfo = shareInfo->fileInfo[offset]; PathToDir(fname, last_dir); ForcePathToFname(fname, fname); fileInfo->SetSelected(TRUE); // 上書き確認 for (int i=0; i < shareInfo->fileCnt; i++) { if (!shareInfo->fileInfo[i]->IsSelected()) continue; MakePath(buf, last_dir, offset == i ? fname : shareInfo->fileInfo[i]->Fname()); if (GetFileAttributesU8(buf) != 0xffffffff) { ret = parentWin->MessageBoxU8(GetLoadStrU8(IDS_OVERWRITE), GetLoadStrU8(IDS_ATTENTION), MB_OKCANCEL|MB_ICONEXCLAMATION); if (ret != IDOK) { for (int j=0; j < shareInfo->fileCnt; j++) shareInfo->fileInfo[j]->SetSelected(FALSE); } break; } } if (ret) { fileInfo->SetFname(fname); strcpy(cfg->lastSaveDir, last_dir); cfg->WriteRegistry(CFG_GENERAL); return TRUE; } } // not reach }
void TRecvDlg::SetMainMenu(HMENU hMenu) { AppendMenuU8(hMenu, MF_POPUP, (UINT)::LoadMenu(TApp::GetInstance(), (LPCSTR)RECVFONT_MENU), GetLoadStrU8(IDS_FONTSET)); AppendMenuU8(hMenu, MF_POPUP, (UINT)::LoadMenu(TApp::GetInstance(), (LPCSTR)SIZE_MENU), GetLoadStrU8(IDS_SIZESET)); AppendMenuU8(hMenu, MF_STRING, MENU_SAVEPOS, GetLoadStrU8(IDS_SAVEPOS)); }
BOOL TRecvDlg::RecvDirFile(void) { #define BIG_ALLOC 50 #define PEEK_SIZE 8 if (fileObj->status == FS_DIRFILESTART || fileObj->status == FS_TRANSINFO) { int size; if (fileObj->infoLen == 0) { if ((size = ::recv(fileObj->conInfo->sd, fileObj->info + (int)fileObj->offset, PEEK_SIZE - (int)fileObj->offset, 0)) <= 0) return FALSE; if ((fileObj->offset += size) < PEEK_SIZE) return TRUE; fileObj->info[fileObj->offset] = 0; if ((fileObj->infoLen = strtoul(fileObj->info, 0, 16)) >= sizeof(fileObj->info) -1 || fileObj->infoLen <= 0) return FALSE; // too big or small } if (fileObj->offset < fileObj->infoLen) { if ((size = ::recv(fileObj->conInfo->sd, fileObj->info + (int)fileObj->offset, fileObj->infoLen - (int)fileObj->offset, 0)) <= 0) return FALSE; fileObj->offset += size; } if (fileObj->offset == fileObj->infoLen) { fileObj->info[fileObj->infoLen] = 0; if (DecodeDirEntry(fileObj->info, &fileObj->curFileInfo, fileObj->u8fname) == FALSE) return FALSE; // Illegal entry fileObj->offset = fileObj->infoLen = 0; // 初期化 if (GET_MODE(fileObj->curFileInfo.Attr()) == IPMSG_FILE_DIR) { char buf[MAX_BUF]; const char *fname = fileObj->dirCnt == 0 ? fileObj->fileInfo->Fname() : fileObj->curFileInfo.Fname(); if (MakePath(buf, fileObj->path, fname) >= MAX_PATH_U8) return MessageBoxU8(buf, GetLoadStrU8(IDS_PATHTOOLONG)), FALSE; if (IsSafePath(buf, fname) == FALSE) return FALSE; if (CreateDirectoryU8(buf, NULL) == FALSE) return FALSE; strncpyz(fileObj->path, buf, MAX_PATH_U8); fileObj->dirCnt++; } else if (GET_MODE(fileObj->curFileInfo.Attr()) == IPMSG_FILE_RETPARENT) { if (fileObj->curFileInfo.Mtime()) // directory の time stamp をあわせる(NT系のみ) { FILETIME ft; HANDLE hFile; UnixTime2FileTime(fileObj->curFileInfo.Mtime(), &ft); if ((hFile = CreateFileU8(fileObj->path, GENERIC_WRITE, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0)) != INVALID_HANDLE_VALUE) { ::SetFileTime(hFile, NULL, NULL, &ft); ::CloseHandle(hFile); } } if (fileObj->curFileInfo.Attr() & IPMSG_FILE_RONLYOPT) SetFileAttributesU8(fileObj->path, FILE_ATTRIBUTE_READONLY); if (--fileObj->dirCnt <= 0) { fileObj->status = FS_COMPLETE; return TRUE; } if (PathToDir(fileObj->path, fileObj->path) == FALSE) return FALSE; } else { if (fileObj->dirCnt == 0) return FALSE; if (fileObj->curFileInfo.Size() == 0) // 0byte file { if (OpenRecvFile()) // 0byteの場合は作成失敗を無視 CloseRecvFile(TRUE); } fileObj->status = fileObj->curFileInfo.Size() ? FS_TRANSFILE : FS_TRANSINFO; } return TRUE; } } if (fileObj->status == FS_TRANSFILE) { if (RecvFile() != TRUE) { CloseRecvFile(); return FALSE; } if (fileObj->status == FS_ENDFILE) { CloseRecvFile(TRUE); fileObj->status = FS_TRANSINFO; } } return TRUE; }
BOOL TSetupSheet::EvCommand(WORD wNotifyCode, WORD wID, LPARAM hWndCtl) { char buf[MAX_PATH_U8] = "", buf2[MAX_PATH_U8] = "", protocol[MAX_LISTBUF] = ""; int i; UrlObj *obj; if (resId == SETUP_SHEET1) { switch (wID) { case ADD_BUTTON: if (GetDlgItemText(BROADCAST_EDIT, buf, sizeof(buf)) <= 0) return TRUE; if (ResolveAddr(buf) == 0) return MessageBox(GetLoadStr(IDS_CANTRESOLVE)), TRUE; for (i=0; SendDlgItemMessage(BROADCAST_LIST, LB_GETTEXT, i, (LPARAM)buf2) != LB_ERR; i++) { if (stricmp(buf, buf2) == 0) return TRUE; } SendDlgItemMessage(BROADCAST_LIST, LB_ADDSTRING, 0, (LPARAM)buf); SetDlgItemText(BROADCAST_EDIT, ""); return TRUE; case DEL_BUTTON: while ((int)SendDlgItemMessage(BROADCAST_LIST, LB_GETSELCOUNT, 0, 0) > 0) { if (SendDlgItemMessage(BROADCAST_LIST, LB_GETSELITEMS, 1, (LPARAM)&i) != 1) break; SendDlgItemMessage(BROADCAST_LIST, LB_GETTEXT, (WPARAM)i, (LPARAM)buf); SetDlgItemText(BROADCAST_EDIT, buf); if (SendDlgItemMessage(BROADCAST_LIST, LB_DELETESTRING, (WPARAM)i, (LPARAM)buf) == LB_ERR) break; } return TRUE; } } else if (resId == SETUP_SHEET2) { switch (wID) { case MAINICON_BUTTON: case REVICON_BUTTON: OpenFileDlg(this).Exec(wID == MAINICON_BUTTON ? MAINICON_EDIT : REVICON_EDIT, GetLoadStrU8(IDS_OPENFILEICON), GetLoadStrAsFilterU8(IDS_OPENFILEICONFLTR)); return TRUE; } } else if (resId == SETUP_SHEET3) { switch (wID) { case SENDDETAIL_BUTTON: { TSortDlg(cfg, this).Exec(); return TRUE; } case SOUNDFILE_BUTTON: GetWindowsDirectoryU8(buf, sizeof(buf)); strcat(buf, "\\Media"); GetCurrentDirectoryU8(sizeof(buf2), buf2); OpenFileDlg(this).Exec(SOUND_EDIT, GetLoadStrU8(IDS_OPENFILESND), GetLoadStrAsFilterU8(IDS_OPENFILESNDFLTR), buf); SetCurrentDirectoryU8(buf2); return TRUE; case SOUNDPLAY_BUTTON: if (GetDlgItemTextU8(SOUND_EDIT, buf, sizeof(buf)) > 0) { PlaySoundU8(buf, 0, SND_FILENAME|SND_ASYNC); } return TRUE; } } else if (resId == SETUP_SHEET4) { switch (wID) { case LOGFILE_BUTTON: OpenFileDlg(this, OpenFileDlg::SAVE).Exec(LOG_EDIT, GetLoadStrU8(IDS_OPENFILELOG), GetLoadStrAsFilterU8(IDS_OPENFILELOGFLTR)); return TRUE; } } else if (resId == SETUP_SHEET6) { switch (wID) { case ADD_BUTTON: if ((i = (int)SendDlgItemMessage(URL_LIST, LB_GETCURSEL, 0, 0)) != LB_ERR && SendDlgItemMessage(URL_LIST, LB_GETTEXT, (WPARAM)i, (LPARAM)protocol) != LB_ERR && (obj = SearchUrlObj(&tmpUrlList, protocol))) { wsprintf(buf, GetLoadStrU8(IDS_EXECPROGRAM), protocol); OpenFileDlg(this).Exec(URL_EDIT, buf, GetLoadStrAsFilterU8(IDS_OPENFILEPRGFLTR)); } return TRUE; case URL_LIST: if ((i = (int)SendDlgItemMessage(URL_LIST, LB_GETCURSEL, 0, 0)) != LB_ERR && SendDlgItemMessage(URL_LIST, LB_GETTEXT, (WPARAM)i, (LPARAM)protocol) != LB_ERR && (obj = SearchUrlObj(&tmpUrlList, protocol))) { SetDlgItemTextU8(URL_EDIT, obj->program); } return TRUE; } } return FALSE; }
BOOL TInstDlg::Install(void) { char buf[MAX_PATH_U8], setupDir[MAX_PATH_U8], setupPath[MAX_PATH_U8]; char installPath[MAX_PATH_U8]; BOOL extract_only = IsDlgButtonChecked(EXTRACT_CHECK); // 現在、起動中の ipmsg を終了 int st = extract_only ? 0 : TerminateIPMsg(); if (st == 1) return FALSE; // インストールパス設定 GetDlgItemTextU8(FILE_EDIT, setupDir, sizeof(setupDir)); if (IsWinVista() && !::IsUserAnAdmin() && TIsEnableUAC() && TIsVirtualizedDirW(U8toWs(setupDir))) { if (MessageBox(GetLoadStr(IDS_REQUIREADMIN), INSTALL_STR, MB_OKCANCEL|MB_ICONINFORMATION) != IDOK) return FALSE; return RunAsAdmin(hWnd, TRUE); } CreateDirectoryU8(setupDir, NULL); DWORD attr = GetFileAttributesU8(setupDir); if (attr == 0xffffffff || (attr & FILE_ATTRIBUTE_DIRECTORY) == 0) return MessageBox(GetLoadStr(IDS_NOTCREATEDIR), INSTALL_STR), FALSE; MakePath(setupPath, setupDir, IPMSG_EXENAME); if (st == 2) { MessageBox(GetLoadStr(IDS_CANTTERMINATE), INSTALL_STR); return FALSE; } if (!runasImm && MessageBox(GetLoadStr(IDS_START), INSTALL_STR, MB_OKCANCEL|MB_ICONINFORMATION) != IDOK) { return FALSE; } runasImm = FALSE; // ファイル生成 for (int i=0; SetupFiles[i]; i++) { MakePath(installPath, setupDir, SetupFiles[i]); CreateStatus cs = CreateFileBySelf(installPath, SetupFiles[i]); if (cs == CS_BROKEN) { MessageBox(GetLoadStr(IDS_BROKENARCHIVE), INSTALL_STR); return FALSE; } else if (cs == CS_ACCESS) { const char *msg = Fmt("%s\r\n%s", GetLoadStrU8(IDS_NOTCREATEFILE), installPath); MessageBoxU8(msg, INSTALL_STR); return FALSE; } } // 展開のみ if (extract_only) { ShellExecuteW(NULL, NULL, U8toWs(setupDir), 0, 0, SW_SHOW); return TRUE; } // スタートアップ&デスクトップに登録 TRegistry reg(HKEY_CURRENT_USER); if (reg.OpenKey(REGSTR_SHELLFOLDERS)) { char *regStr[] = { REGSTR_STARTUP, REGSTR_PROGRAMS, REGSTR_DESKTOP, NULL }; BOOL resId[] = { STARTUP_CHECK, PROGRAM_CHECK, DESKTOP_CHECK, NULL }; for (int i=0; regStr[i]; i++) { if (reg.GetStr(regStr[i], buf, sizeof(buf))) { if (i != 0 || !RemoveSameLink(buf, buf)) ::wsprintf(buf + strlen(buf), "\\%s", IPMSG_SHORTCUT_NAME); if (IsDlgButtonChecked(resId[i])) SymLink(setupPath, buf); else DeleteLink(buf); } } reg.CloseKey(); } // レジストリにアプリケーション情報を登録 reg.ChangeTopKey(HKEY_LOCAL_MACHINE); if (reg.OpenKey(REGSTR_PATH_APPPATHS)) { if (reg.CreateKey(IPMSG_EXENAME)) { reg.SetStr(NULL, setupPath); reg.SetStr(REGSTR_PATH, setupDir); reg.CloseKey(); } reg.CloseKey(); } // レジストリにアンインストール情報を登録 if (reg.OpenKey(REGSTR_PATH_UNINSTALL)) { if (reg.CreateKey(IPMSG_NAME)) { MakePath(buf, setupDir, SETUP_EXENAME); strcat(buf, " /r"); reg.SetStr(REGSTR_VAL_UNINSTALLER_DISPLAYNAME, IPMSG_FULLNAME); reg.SetStr(REGSTR_VAL_UNINSTALLER_COMMANDLINE, buf); reg.CloseKey(); } reg.CloseKey(); } // コピーしたアプリケーションを起動 const char *msg = GetLoadStr(IDS_SETUPCOMPLETE); int flg = MB_OKCANCEL|MB_ICONINFORMATION; // if (IsWinVista() && ::IsUserAnAdmin() && TIsEnableUAC()) { // msg = Fmt("%s%s", msg, GetLoadStr(IDS_COMPLETE_UACADD)); // flg |= MB_DEFBUTTON2; // } TLaunchDlg dlg(msg, this); if (dlg.Exec() == IDOK) { if (runasWnd) { Wstr wbuf(setupDir); if (::SendDlgItemMessageW(runasWnd, FILE_EDIT, WM_SETTEXT, 0, (LPARAM)wbuf.Buf())) { ::PostMessage(runasWnd, WM_IPMSG_QUIT, 1, 0); runasWnd = NULL; } } else { AppKick(); } } else { HWND hHelp = ShowHelpU8(0, setupDir, GetLoadStrU8(IDS_IPMSGHELP), "#history"); if (hHelp) { Show(SW_HIDE); while (::IsWindow(hHelp)) { this->Sleep(100); } } } if (runasWnd) { ::PostMessage(runasWnd, WM_IPMSG_QUIT, 0, 0); runasWnd = NULL; } // ShellExecuteU8(NULL, NULL, setupDir, 0, 0, SW_SHOW); ::PostQuitMessage(0); return TRUE; }