// Build Recent File menu entries from given TCHAR *BuildMenuFileName(TCHAR *buffer, int len, int pos, const TCHAR *filename) { buffer[0] = 0; TCHAR *itr = buffer; TCHAR *end = buffer + MAX_PATH - 1; if (pos < 9) { *itr++ = '&'; *itr++ = '1' + (TCHAR)pos; } else if (pos == 9) { *itr++ = '1'; *itr++ = '&'; *itr++ = '0'; } else { wsprintf(itr, TEXT("%d"), pos+1); itr = itr + lstrlen(itr); } *itr++ = ':'; *itr++ = ' '; if (len > 0) { TCHAR cnvName[MAX_PATH*2]; convertFileName(cnvName, filename); ::PathCompactPathEx(itr, filename, len - (itr-buffer), 0); } else { TCHAR cnvName[MAX_PATH]; const TCHAR *s1; if (len == 0) s1 = PathFindFileName(filename); else // (len < 0) s1 = filename; int len = lstrlen(s1); if (len < (end-itr)) { lstrcpy(cnvName, s1); } else { int n = (len-3-(itr-buffer))/2; generic_strncpy(cnvName, s1, n); lstrcpy(cnvName+n, TEXT("...")); lstrcat(cnvName, s1 + lstrlen(s1) - n); } convertFileName(itr, cnvName); } return buffer; }
TCHAR *BuildMenuFileName(TCHAR *buffer, int len, int pos, const TCHAR *filename) { TCHAR cwd[MAX_PATH]; buffer[0] = 0; GetCurrentDirectory(_countof(cwd), cwd); lstrcat(cwd, TEXT("\\")); TCHAR *itr = buffer; TCHAR *end = buffer + len - 1; if (pos < 9) { *itr++ = '&'; *itr++ = '1' + (TCHAR)pos; } else if (pos == 9) { *itr++ = '1'; *itr++ = '&'; *itr++ = '0'; } else { wsprintf(itr, TEXT("%d"), pos+1); itr = itr + lstrlen(itr); } *itr++ = ':'; *itr++ = ' '; if (0 == generic_strnicmp(filename, cwd, lstrlen(cwd))) { TCHAR cnvName[MAX_PATH]; const TCHAR *s1 = PathFindFileName(filename); int len = lstrlen(s1); if (len < (end-itr)) { lstrcpy(cnvName, s1); } else { int n = (len-3-(itr-buffer))/2; generic_strncpy(cnvName, s1, n); lstrcpy(cnvName+n, TEXT("...")); lstrcat(cnvName, s1 + lstrlen(s1) - n); } convertFileName(itr, cnvName); } else { TCHAR cnvName[MAX_PATH*2]; convertFileName(cnvName, filename); PathCompactPathEx(itr, filename, len - (itr-buffer), 0); } return buffer; }
// Build Recent File menu entries from given generic_string BuildMenuFileName(int filenameLen, unsigned int pos, const generic_string &filename) { generic_string strTemp; if (pos < 9) { strTemp.push_back('&'); strTemp.push_back('1' + (TCHAR)pos); } else if (pos == 9) { strTemp.append(TEXT("1&0")); } else { strTemp.append(uintToString(pos + 1)); } strTemp.append(TEXT(": ")); if (filenameLen > 0) { std::vector<TCHAR> vt(filenameLen + 1); //--FLS: W removed from PathCompactPathExW due to compiler errors for ANSI version. PathCompactPathEx(&vt[0], filename.c_str(), filenameLen + 1, 0); strTemp.append(convertFileName(vt.begin(), vt.begin() + lstrlen(&vt[0]))); } else { // (filenameLen < 0) generic_string::const_iterator it = filename.begin(); if (filenameLen == 0) it += PathFindFileName(filename.c_str()) - filename.c_str(); // MAX_PATH is still here to keep old trimming behaviour. if (filename.end() - it < MAX_PATH) { strTemp.append(convertFileName(it, filename.end())); } else { strTemp.append(convertFileName(it, it + MAX_PATH / 2 - 3)); strTemp.append(TEXT("...")); strTemp.append(convertFileName(filename.end() - MAX_PATH / 2, filename.end())); } } return strTemp; }
void BSAFile::load(const string& fileName) { auto bsaPath = convertFileName(fileName); ifstream stream(bsaPath, ios::binary | ios::in); if (!stream.is_open()) { cerr << "Cannot open " << bsaPath << endl; return; } in.setStream(std::move(stream)); in.jump(12); uint32_t nbFolders, nbFiles, foldersNameLen; in >> m_flags >> nbFolders >> nbFiles >> foldersNameLen >> m_filesNameLen; m_archiveCompressed = (m_flags & BSA_ARCHIVE_COMPRESSED) != 0; in.jump(4); m_folders.resize(nbFolders); in >> m_folders; }