/* リンクの解決 あらかじめ、CoInitialize(NULL); を実行しておくこと */ BOOL ReadLinkU8(LPCSTR src, LPSTR dest, LPSTR arg) { IShellLink *shellLink; IPersistFile *persistFile; WCHAR wbuf[MAX_PATH]; BOOL ret = FALSE; if (SUCCEEDED(CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLinkW, (void **)&shellLink))) { if (SUCCEEDED(shellLink->QueryInterface(IID_IPersistFile, (void **)&persistFile))) { U8toW(src, wbuf, wsizeof(wbuf)); if (SUCCEEDED(persistFile->Load(wbuf, STGM_READ))) { if (SUCCEEDED(shellLink->GetPath((char *)wbuf, MAX_PATH, NULL, SLGP_SHORTPATH))) { WtoU8(wbuf, dest, MAX_PATH_U8); shellLink->GetArguments((char *)wbuf, MAX_PATH); WtoU8(wbuf, arg, MAX_PATH_U8); ret = TRUE; } } persistFile->Release(); } shellLink->Release(); } return ret; }
BOOL GetOpenFileNameU8Core(LPOPENFILENAME ofn, BOOL (WINAPI *ofn_func)(OPENFILENAMEW*)) { OPENFILENAMEW ofn_w; Wstr filter_w(MAX_PATH), cfilter_w(ofn->nMaxCustFilter), file_w(ofn->nMaxFile), ftitle_w(ofn->nMaxFileTitle), idir_w(MAX_PATH), title_w(MAX_PATH), defext_w(MAX_PATH), template_w(MAX_PATH); memcpy(&ofn_w, ofn, sizeof(OPENFILENAME)); WCHAR *wp=filter_w.Buf(); for (const char *p=ofn->lpstrFilter; p && *p; p+=strlen(p)+1) { wp += U8toW(p, wp, (int)(MAX_PATH - (wp - filter_w.Buf()))) + 1; } *wp = 0; U8toW(ofn->lpstrCustomFilter, cfilter_w.Buf(), ofn->nMaxCustFilter); U8toW(ofn->lpstrFile, file_w.Buf(), ofn->nMaxFile); U8toW(ofn->lpstrFileTitle, ftitle_w.Buf(), ofn->nMaxFileTitle); U8toW(ofn->lpstrInitialDir, idir_w.Buf(), MAX_PATH); U8toW(ofn->lpstrTitle, title_w.Buf(), MAX_PATH); U8toW(ofn->lpstrDefExt, defext_w.Buf(), MAX_PATH); U8toW(ofn->lpTemplateName, template_w.Buf(), MAX_PATH); if (ofn->lpstrFilter) ofn_w.lpstrFilter = filter_w.s(); if (ofn->lpstrCustomFilter) ofn_w.lpstrCustomFilter = cfilter_w.Buf(); if (ofn->lpstrFile) ofn_w.lpstrFile = file_w.Buf(); if (ofn->lpstrFileTitle) ofn_w.lpstrFileTitle = ftitle_w.Buf(); if (ofn->lpstrInitialDir) ofn_w.lpstrInitialDir = idir_w.s(); if (ofn->lpstrTitle) ofn_w.lpstrTitle = title_w.s(); if (ofn->lpstrDefExt) ofn_w.lpstrDefExt = defext_w.s(); if (ofn->lpTemplateName) ofn_w.lpTemplateName = template_w.s(); BOOL ret = ofn_func(&ofn_w); if (ofn->lpstrCustomFilter) { WtoU8(cfilter_w.s(), ofn->lpstrCustomFilter, ofn->nMaxCustFilter); } if (ofn->lpstrFileTitle) { WtoU8(ftitle_w.s(), ofn->lpstrFileTitle, ofn->nMaxFileTitle); } if (ofn->lpstrFile) { if (ofn_w.Flags & OFN_ALLOWMULTISELECT) { const WCHAR *wp=file_w.s(); char *p; for (p=ofn->lpstrFile; wp && *wp; wp+=wcslen(wp)+1) { p += WtoU8(wp, p, (int)(ofn->nMaxFile - (p - ofn->lpstrFile))) + 1; } *p = 0; } else { WtoU8(file_w.s(), ofn->lpstrFile, ofn->nMaxFile); } } // if (ofn_w.lpstrFile[ofn_w.nFileOffset]) ofn->nFileOffset = ::WideCharToMultiByte(CP_UTF8, 0, ofn_w.lpstrFile, ofn_w.nFileOffset, 0, 0, 0, 0); return ret; }
char *WtoU8(const WCHAR *src, int max_len) { char *buf = NULL; int len = WtoU8(src, NULL, 0, max_len) + 1; if (len > 0) { buf = new char [len]; WtoU8(src, buf, len, max_len); } return buf; }
void WIN32_FIND_DATA_WtoU8(const WIN32_FIND_DATAW *fdat_w, WIN32_FIND_DATA_U8 *fdat_u8, BOOL include_fname) { memcpy(fdat_u8, fdat_w, offsetof(WIN32_FIND_DATAW, cFileName)); if (include_fname) { WtoU8(fdat_w->cFileName, fdat_u8->cFileName, sizeof(fdat_u8->cFileName)); WtoU8(fdat_w->cAlternateFileName, fdat_u8->cAlternateFileName, sizeof(fdat_u8->cAlternateFileName)); } }
/* リンク あらかじめ、CoInitialize(NULL); を実行しておくこと */ BOOL SymLink(LPCSTR src, LPSTR dest, LPCSTR arg) { IShellLink *shellLink; IPersistFile *persistFile; Wstr wsrc(src), wdest(dest), warg(arg); BOOL ret = FALSE; char buf[MAX_PATH_U8]; if (SUCCEEDED(CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLinkW, (void **)&shellLink))) { shellLink->SetPath((char *)wsrc.Buf()); shellLink->SetArguments((char *)warg.Buf()); GetParentDirU8(src, buf); shellLink->SetWorkingDirectory((char *)U8toWs(buf)); if (SUCCEEDED(shellLink->QueryInterface(IID_IPersistFile, (void **)&persistFile))) { if (SUCCEEDED(persistFile->Save(wdest.s(), TRUE))) { ret = TRUE; GetParentDirU8(WtoU8(wdest.s()), buf); ::SHChangeNotify(SHCNE_UPDATEDIR, SHCNF_PATH|SHCNF_FLUSH, U8toAs(buf), NULL); } persistFile->Release(); } shellLink->Release(); } return ret; }
DWORD GetFullPathNameU8(const char *path, DWORD size, char *buf, char **fname) { Wstr wpath(path), wbuf(size); WCHAR *wfname=NULL; DWORD ret = ::GetFullPathNameW(wpath, size, wbuf.Buf(), &wfname); if (ret == 0 || ret > size) return ret; int fname_len = wfname ? WtoU8(wfname, buf, size) : 0; int path_len = WtoU8(wbuf, buf, size); *fname = wfname ? (buf + path_len - fname_len) : NULL; return ret; }
/* ディレクトリダイアログ用汎用ルーチン */ BOOL BrowseDirDlg(TWin *parentWin, const char *title, const char *defaultDir, char *buf) { IMalloc *iMalloc = NULL; BROWSEINFOW brInfo; LPITEMIDLIST pidlBrowse; BOOL ret = FALSE; Wstr buf_w(MAX_PATH), defaultDir_w(MAX_PATH), title_w(title); if (!SUCCEEDED(SHGetMalloc(&iMalloc))) return FALSE; U8toW(defaultDir, defaultDir_w.Buf(), MAX_PATH); brInfo.hwndOwner = parentWin->hWnd; brInfo.pidlRoot = 0; brInfo.pszDisplayName = buf_w.Buf(); brInfo.lpszTitle = title_w; brInfo.ulFlags = BIF_RETURNONLYFSDIRS; brInfo.lpfn = BrowseDirDlgProc; brInfo.lParam = (LPARAM)defaultDir_w.Buf(); brInfo.iImage = 0; if ((pidlBrowse = SHBrowseForFolderV((BROWSEINFO *)&brInfo))) { ret = SHGetPathFromIDListV(pidlBrowse, buf_w.Buf()); iMalloc->Free(pidlBrowse); if (ret) WtoU8(buf_w, buf, MAX_PATH_U8); } iMalloc->Release(); return ret; }
int TWin::GetWindowTextU8(char *text, int len) { Wstr wbuf(len); wbuf[0] = 0; if (::GetWindowTextW(hWnd, wbuf.Buf(), len) < 0) return -1; return WtoU8(wbuf.s(), text, len); }
DWORD GetWindowsDirectoryU8(char *dir, DWORD size) { Wstr dir_w(size); DWORD ret = ::GetWindowsDirectoryW(dir_w.Buf(), size); if (ret > 0) { ret = WtoU8(dir_w.s(), dir, size); } return ret; }
DWORD GetCurrentDirectoryU8(DWORD size, char *dir) { Wstr dir_w(size); DWORD ret = ::GetCurrentDirectoryW(size, dir_w.Buf()); if (ret > 0) { ret = WtoU8(dir_w.s(), dir, size); } return ret; }
char *WtoU8(const WCHAR *src, BOOL noStatic) { static char *_buf = NULL; char *tmp = NULL; char *&buf = noStatic ? tmp : _buf; if (buf) { delete [] buf; buf = NULL; } int len; if ((len = WtoU8(src, NULL, 0)) > 0) { buf = new char [len + 1]; WtoU8(src, buf, len); } return buf; }
int TWin::GetWindowTextLengthU8(void) { int len = ::GetWindowTextLengthW(hWnd); Wstr wbuf(len + 1); if (::GetWindowTextW(hWnd, wbuf.Buf(), len + 1) <= 0) return 0; return WtoU8(wbuf.s(), NULL, 0); }
UINT TWin::GetDlgItemTextU8(int ctlId, char *buf, int len) { Wstr wbuf(len); *buf = 0; GetDlgItemTextW(ctlId, wbuf.Buf(), len); return WtoU8(wbuf.s(), buf, len); }
BOOL TBrowseDirDlg::SetFileBuf(LPARAM list) { Wstr wbuf(MAX_PATH); BOOL ret = ::SHGetPathFromIDListW((LPITEMIDLIST)list, wbuf.Buf()); if (ret) { WtoU8(wbuf.s(), fileBuf, MAX_PATH_U8); } return ret; }
/*========================================================================= Win32(W) API UTF8 wrapper =========================================================================*/ BOOL GetMenuStringU8(HMENU hMenu, UINT uItem, char *buf, int bufsize, UINT flags) { WCHAR *wbuf = new WCHAR [bufsize]; BOOL ret = ::GetMenuStringW(hMenu, uItem, wbuf, bufsize, flags); if (ret) { WtoU8(wbuf, buf, bufsize); } delete [] wbuf; return ret; }
MsgMng::MsgMng(ULONG nicAddr, int portNo, Cfg *_cfg) { status = FALSE; packetNo = (ULONG)Time(); udp_sd = tcp_sd = INVALID_SOCKET; hAsyncWnd = 0; local.addr = nicAddr; local.portNo = Thtons(portNo); cfg = _cfg; if (!WSockInit(cfg ? TRUE : FALSE)) return; WCHAR wbuf[128]; DWORD size = sizeof(wbuf); if (!::GetComputerNameW(wbuf, &size)) { GetLastErrorMsg("GetComputerName()"); return; } WtoU8(wbuf, local.hostName, sizeof(local.hostName)); WtoA(wbuf, localA.hostName, sizeof(localA.hostName)); if (nicAddr == INADDR_ANY) { char host[MAX_BUF]; if (::Tgethostname(host, sizeof(host)) == -1) strcpy(host, local.hostName); hostent *ent = ::Tgethostbyname(host); if (ent) local.addr = *(ULONG *)ent->h_addr_list[0]; } size = sizeof(wbuf); if (!::GetUserNameW(wbuf, &size)) { GetLastErrorMsg("GetUserName()"); return; } WtoU8(wbuf, local.userName, sizeof(local.userName)); WtoA(wbuf, localA.userName, sizeof(localA.userName)); orgLocal = local; status = TRUE; }
BOOL SHGetSpecialFolderPathU8(HWND hWnd, char *path, int csidl, BOOL fCreate) { Wstr path_w(MAX_PATH); if (!::SHGetSpecialFolderPathW(hWnd, path_w.Buf(), csidl, fCreate)) { return FALSE; } WtoU8(path_w.s(), path, MAX_PATH_U8); return TRUE; }
DWORD GetModuleFileNameU8(HMODULE hModule, char *buf, DWORD bufsize) { WCHAR *wbuf = new WCHAR [bufsize]; DWORD ret = ::GetModuleFileNameW(hModule, wbuf, bufsize); if (ret) { WtoU8(wbuf, buf, bufsize); } delete [] wbuf; return ret; }
char *AtoU8(const char *src, int max_len) { WCHAR *wsrc = AtoW(src, max_len); char *buf = NULL; if (wsrc) { buf = WtoU8(wsrc, max_len); } delete [] wsrc; return buf; }
char *WtoU8s(const WCHAR *src, int max_len) { static char *buf[MAX_STATIC_ARRAY]; static u_long idx; char *&cur_buf = buf[idx++ % MAX_STATIC_ARRAY]; if (cur_buf) { delete [] cur_buf; } return (cur_buf = WtoU8(src, max_len)); }
UINT DragQueryFileU8(HDROP hDrop, UINT iFile, char *buf, UINT cb) { Wstr wbuf(cb); UINT ret = ::DragQueryFileW(hDrop, iFile, wbuf.Buf(), cb); if (ret > 0 && buf) { ret = WtoU8(wbuf.s(), buf, cb); } return ret; }
BOOL TRecvDlg::DecodeDirEntry(char *buf, FileInfo *info, char *u8fname) { char *tok, *ptr, *p; ConvertShareMsgEscape(buf); // "::" -> ';' if ((tok = separate_token(buf, ':', &p)) == NULL) // header size return FALSE; if ((tok = separate_token(NULL, ':', &p)) == NULL) // fname return FALSE; WCHAR wbuf[MAX_PATH]; AtoW(tok, wbuf, MAX_PATH); WtoU8(wbuf, u8fname, MAX_PATH_U8); info->SetFnameExt(u8fname); while ((ptr = strchr(tok, '?')) != NULL) // UNICODE までの暫定 *ptr = '_'; if (strlen(tok) >= MAX_PATH_U8) return FALSE; if ((tok = separate_token(NULL, ':', &p)) == NULL) // size return FALSE; info->SetSize(hex2ll(tok)); if ((tok = separate_token(NULL, ':', &p)) == NULL) // attr return FALSE; info->SetAttr(strtoul(tok, 0, 16)); while ((tok = separate_token(NULL, ':', &p)) != NULL) // exattr { if ((ptr = strchr(tok, '=')) == NULL) continue; *ptr = 0; UINT exattr = strtoul(tok, 0, 16); UINT val = strtoul(ptr + 1, 0, 16); switch (exattr) { case IPMSG_FILE_MTIME: info->SetMtime(val); break; // case IPMSG_FILE_CREATETIME: info->SetCrtime(val); break; 現状では使わない // case IPMSG_FILE_ATIME: info->SetAtime(val); break; 現状では使わない default: break; } } return TRUE; }
char *AtoU8(const char *src, BOOL noStatic) { static char *_buf = NULL; char *tmp = NULL; char *&buf = noStatic ? tmp : _buf; if (buf) { delete [] buf; buf = NULL; } WCHAR *wsrc = AtoW(src, TRUE); if (wsrc) { buf = WtoU8(wsrc, TRUE); } delete [] wsrc; return buf; }
BOOL Cfg::WriteIni(void) { ini.StartUpdate(); ini.SetSection(MAIN_SECTION); ini.SetInt(INI_VERSION_KEY, iniVersion); ini.KeyToTop(INI_VERSION_KEY); ini.SetInt(BUFSIZE_KEY, bufSize); ini.SetInt(MAXRUNNUM_KEY, maxRunNum); ini.SetInt(MAXTRANSSIZE_KEY, maxTransSize); ini.SetInt(MAXOVLNUM_KEY, maxOvlNum); // ini.SetInt(MAXOVLSIZE_KEY, maxOvlSize); // ini.SetInt(MAXOPENFILES_KEY, maxOpenFiles); ini.SetInt(NONBUFMINSIZENTFS_KEY, nbMinSizeNtfs); ini.SetInt(NONBUFMINSIZEFAT_KEY, nbMinSizeFat); ini.SetInt(TIMEDIFFGRACE_KEY, timeDiffGrace); ini.SetInt(ISREADOSBUF_KEY, isReadOsBuf); //ini.SetInt(WRITESHAREOPEN_KEY, isWShareOpen); ini.SetInt(MAX_HISTORY_KEY, maxHistoryNext); ini.SetInt(COPYMODE_KEY, copyMode); // ini.SetInt(COPYFLAGS_KEY, copyFlags); // ini.SetInt(COPYUNFLAGS_KEY, copyUnFlags); ini.SetInt(SKIPEMPTYDIR_KEY, skipEmptyDir); ini.SetInt(IGNORE_ERR_KEY, ignoreErr); ini.SetInt(ESTIMATE_KEY, estimateMode); ini.SetInt(DISKMODE_KEY, diskMode); ini.SetInt(NETDRVMODE_KEY, netDrvMode); // ini.SetInt(ACLRESET_KEY, aclReset); ini.SetInt(ISTOPLEVEL_KEY, isTopLevel); ini.SetInt(ISERRLOG_KEY, isErrLog); ini.SetInt(ISUTF8LOG_KEY, isUtf8Log); ini.SetInt(FILELOGMODE_KEY, fileLogMode); ini.SetInt(FILELOGFLAGS_KEY, fileLogFlags); ini.SetInt(ACLERRLOG_KEY, aclErrLog); ini.SetInt(STREAMERRLOG_KEY, streamErrLog); // ini.SetInt(DEBUGFLAGS_KEY, debugFlags); // ini.SetInt(ISRUNASBUTTON_KEY, isRunasButton); ini.SetInt(ISSAMEDIRRENAME_KEY, isSameDirRename); ini.SetInt(SHEXTAUTOCLOSE_KEY, shextAutoClose); ini.SetInt(SHEXTTASKTRAY_KEY, shextTaskTray); ini.SetInt(SHEXTNOCONFIRM_KEY, shextNoConfirm); ini.SetInt(SHEXTNOCONFIRMDEL_KEY, shextNoConfirmDel); ini.SetInt(EXECCONRIM_KEY, execConfirm); ini.SetInt(FORCESTART_KEY, forceStart); ini.SetInt(LCID_KEY, lcid); // ini.SetInt(WAITTICK_KEY, waitTick); // ini.SetInt(ISAUTOSLOWIO_KEY, isAutoSlowIo); ini.SetInt(SPEEDLEVEL_KEY, speedLevel); // ini.SetInt(ALWAYSLOWIO_KEY, alwaysLowIo); ini.SetInt(OWDEL_KEY, enableOwdel); ini.SetInt(ACL_KEY, enableAcl); ini.SetInt(STREAM_KEY, enableStream); ini.SetInt(VERIFY_KEY, enableVerify); ini.SetInt(USEOVERLAPIO_KEY, useOverlapIo); // ini.SetInt(USEMD5_KEY, usingMD5); ini.SetInt(NSA_KEY, enableNSA); ini.SetInt(DELDIR_KEY, delDirWithFilter); ini.SetInt(MOVEATTR_KEY, enableMoveAttr); ini.SetInt(SERIALMOVE_KEY, serialMove); ini.SetInt(SERIALVERIFYMOVE_KEY, serialVerifyMove); ini.SetInt(REPARSE_KEY, isReparse); // ini.SetInt(LINKDEST_KEY, isLinkDest); // int.SetInt(MAXLINKHASH_KEY, maxLinkHash); // int.SetInt(ALLOWCONTFSIZE_KEY, allowContFsize); // ini.SetInt(RECREATE_KEY, isReCreate); ini.SetInt(EXTENDFILTER_KEY, isExtendFilter); ini.SetInt(TASKBARMODE_KEY, taskbarMode); ini.SetInt(FINISHNOTIFY_KEY, finishNotify); // ini.SetInt(FINISHNOTIFYTOUT_KEY, finishNotifyTout); ini.SetInt(INFOSPAN_KEY, infoSpan); char val[256]; sprintf(val, "%d,%d,%d,%d", winpos.x, winpos.y, winsize.cx, winsize.cy); ini.SetStr(WINPOS_KEY, val); ini.SetStr(DRIVEMAP_KEY, driveMap); WtoU8(statusFont, val, sizeof(val)); ini.SetStr(STATUSFONT_KEY, val); ini.SetInt(STATUSFONTSIZE_KEY, statusFontSize); char *section_array[] = { SRC_HISTORY, DST_HISTORY, DEL_HISTORY, INC_HISTORY, EXC_HISTORY, FROMDATE_HISTORY, TODATE_HISTORY, MINSIZE_HISTORY, MAXSIZE_HISTORY }; WCHAR ***history_array[] = { &srcPathHistory, &dstPathHistory, &delPathHistory, &includeHistory, &excludeHistory, &fromDateHistory, &toDateHistory, &minSizeHistory, &maxSizeHistory }; int i, j; char key[100]; DynBuf buf(MAX_HISTORY_CHAR_BUF); for (i=0; i < sizeof(section_array) / sizeof(char *); i++) { char *§ion = section_array[i]; WCHAR **&history = *history_array[i]; ini.SetSection(section); for (j=0; j < maxHistory; j++) { wsprintf(key, "%d", j); WtoU8(history[j], buf, MAX_HISTORY_CHAR_BUF); if (j < maxHistoryNext) ini.SetStr(key, buf); else ini.DelKey(key); } } for (i=0; i < jobMax; i++) { wsprintf(buf, FMT_JOB_KEY, i); Job *job = jobArray[i]; ini.SetSection(buf); WtoU8(job->title, buf, MAX_HISTORY_CHAR_BUF); ini.SetStr(TITLE_KEY, buf); WtoU8(job->src, buf, MAX_HISTORY_CHAR_BUF); ini.SetStr(SRC_KEY, buf); WtoU8(job->dst, buf, MAX_HISTORY_CHAR_BUF); ini.SetStr(DST_KEY, buf); WtoU8(job->cmd, buf, MAX_HISTORY_CHAR_BUF); ini.SetStr(CMD_KEY, buf); WtoU8(job->includeFilter, buf, MAX_HISTORY_CHAR_BUF); ini.SetStr(INCLUDE_KEY, buf); WtoU8(job->excludeFilter, buf, MAX_HISTORY_CHAR_BUF); ini.SetStr(EXCLUDE_KEY, buf); WtoU8(job->fromDateFilter, buf, MAX_HISTORY_CHAR_BUF); ini.SetStr(FROMDATE_KEY, buf); WtoU8(job->toDateFilter, buf, MAX_HISTORY_CHAR_BUF); ini.SetStr(TODATE_KEY, buf); WtoU8(job->minSizeFilter, buf, MAX_HISTORY_CHAR_BUF); ini.SetStr(MINSIZE_KEY, buf); WtoU8(job->maxSizeFilter, buf, MAX_HISTORY_CHAR_BUF); ini.SetStr(MAXSIZE_KEY, buf); ini.SetInt(ESTIMATE_KEY, job->estimateMode); ini.SetInt(DISKMODE_KEY, job->diskMode); ini.SetInt(IGNORE_ERR_KEY, job->ignoreErr); ini.SetInt(OWDEL_KEY, job->enableOwdel); ini.SetInt(ACL_KEY, job->enableAcl); ini.SetInt(STREAM_KEY, job->enableStream); ini.SetInt(VERIFY_KEY, job->enableVerify); ini.SetInt(FILTER_KEY, job->isFilter); ini.SetInt(BUFSIZE_KEY, job->bufSize); } wsprintf(buf, FMT_JOB_KEY, i); ini.DelSection(buf); for (i=0; i < finActMax; i++) { wsprintf(buf, FMT_FINACT_KEY, i); FinAct *finAct = finActArray[i]; ini.SetSection(buf); WtoU8(finAct->title, buf, MAX_HISTORY_CHAR_BUF); ini.SetStr(TITLE_KEY, buf); WtoU8(finAct->sound, buf, MAX_HISTORY_CHAR_BUF); ini.SetStr(SOUND_KEY, buf); WtoU8(finAct->command, buf, MAX_HISTORY_CHAR_BUF); ini.SetStr(CMD_KEY, buf); ini.SetInt(SHUTDOWNTIME_KEY, finAct->shutdownTime); ini.SetInt(FLAGS_KEY, finAct->flags); } wsprintf(buf, FMT_FINACT_KEY, i); ini.DelSection(buf); return ini.EndUpdate(); }