FileInfo *ShareMng::SetFileInfo(char *fname) { WIN32_FIND_DATA_U8 fdat; if (!GetFileInfomationU8(fname, &fdat)) return FALSE; FileInfo *info = new FileInfo; UINT attr = (fdat.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? IPMSG_FILE_DIR : IPMSG_FILE_REGULAR; attr |= (fdat.dwFileAttributes & FILE_ATTRIBUTE_READONLY) ? IPMSG_FILE_RONLYOPT : 0; attr |= (fdat.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM) ? IPMSG_FILE_SYSTEMOPT : 0; info->SetAttr(attr); info->SetFname(fname); if (GET_MODE(info->Attr()) == IPMSG_FILE_DIR) { info->SetSize(0); strncpyz(cfg->lastOpenDir, fname, MAX_PATH_U8); } else { info->SetSize((_int64)fdat.nFileSizeHigh << 32 | fdat.nFileSizeLow); PathToDir(fname, cfg->lastOpenDir); } info->SetMtime(FileTime2UnixTime(&fdat.ftLastWriteTime)); info->SetCrtime(FileTime2UnixTime(&fdat.ftCreationTime)); info->SetAtime(FileTime2UnixTime(&fdat.ftLastAccessTime)); return info; }
/* ファイル共有(添付)情報をデコード 注意:破壊読出し。使用が終わり次第 FreeDecodeShareMsg を呼び出すこと。 */ ShareInfo *DecodeShareMsg(char *buf, BOOL enable_clip) { ShareInfo *shareInfo = new ShareInfo; FileInfo *fileInfo = NULL; char *tok, *p, *p2, *p3; char *file = separate_token(buf, FILELIST_SEPARATOR, &p); for (int i=0; file; i++, file=separate_token(NULL, FILELIST_SEPARATOR, &p)) { ConvertShareMsgEscape(file); // "::" -> ';' if ((tok = separate_token(file, ':', &p2)) == NULL) break; fileInfo = new FileInfo(atoi(tok)); if ((tok = separate_token(NULL, ':', &p2)) == NULL || strlen(tok) >= MAX_FILENAME) break; while ((p3 = strchr(tok, '?'))) // UNICODE 対応までの暫定 *p3 = '_'; if (!IsValidFileName(tok)) break; fileInfo->SetFname(tok); if ((tok = separate_token(NULL, ':', &p2)) == NULL) break; fileInfo->SetSize(hex2ll(tok)); if ((tok = separate_token(NULL, ':', &p2)) == NULL) break; fileInfo->SetMtime(strtoul(tok, 0, 16)); if ((tok = separate_token(NULL, ':', &p2))) { fileInfo->SetAttr(strtoul(tok, 0, 16)); u_int attr_type = GET_MODE(fileInfo->Attr()); if (attr_type != IPMSG_FILE_DIR && attr_type != IPMSG_FILE_REGULAR && (!enable_clip || attr_type != IPMSG_FILE_CLIPBOARD)) { delete fileInfo; fileInfo = NULL; continue; } if (attr_type == IPMSG_FILE_CLIPBOARD) { if ((tok = separate_token(NULL, ':', &p2))) { if (strtoul(tok, 0, 16) == IPMSG_FILE_CLIPBOARDPOS) { if (separate_token(tok, '=', &p3) && (tok = separate_token(NULL, '=', &p3))) { fileInfo->SetPos(strtoul(tok, 0, 16)); } } } } } else fileInfo->SetAttr(IPMSG_FILE_REGULAR); if ((shareInfo->fileCnt % BIG_ALLOC) == 0) shareInfo->fileInfo = (FileInfo **)realloc(shareInfo->fileInfo, (shareInfo->fileCnt + BIG_ALLOC) * sizeof(FileInfo *)); shareInfo->fileInfo[shareInfo->fileCnt++] = fileInfo; fileInfo = NULL; } if (fileInfo) // デコード中に抜けた delete fileInfo; if (shareInfo->fileCnt <= 0) { delete shareInfo; return NULL; } return shareInfo; }