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; }
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; }
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; }
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 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; }