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; }
/* ファイル共有(添付)情報をデコード 注意:破壊読出し。使用が終わり次第 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; }