From 2516e8192daf3080586a479f911043273da9ceb1 Mon Sep 17 00:00:00 2001 From: eliboa Date: Mon, 23 Jul 2018 20:37:54 +0200 Subject: [PATCH] Use relative paths for favorites --- TegraRcmGUI/DialogTab01.cpp | 26 +++--- TegraRcmGUI/TegraRcm.cpp | 152 +++++++++++++++++++++++++++++++- TegraRcmGUI/TegraRcm.h | 3 +- TegraRcmGUI/TegraRcmGUI.vcxproj | 4 +- 4 files changed, 170 insertions(+), 15 deletions(-) diff --git a/TegraRcmGUI/DialogTab01.cpp b/TegraRcmGUI/DialogTab01.cpp index ad24990..7b39265 100644 --- a/TegraRcmGUI/DialogTab01.cpp +++ b/TegraRcmGUI/DialogTab01.cpp @@ -107,21 +107,25 @@ BOOL DialogTab01::OnInitDialog() for (int i = 0; i < m_TegraRcm->Favorites.GetCount(); i++) { CListBox*pListBox = (CListBox*)GetDlgItem(IDC_LIST1); - - int nIndex = m_TegraRcm->Favorites[i].ReverseFind(_T('\\')); + CString fav = m_TegraRcm->Favorites[i]; + int nIndex = fav.ReverseFind(_T('\\')); + CString csFilename, csPath, Item; if (nIndex > 0) { - CString csFilename, csPath, Item; - csFilename = m_TegraRcm->Favorites[i].Right(m_TegraRcm->Favorites[i].GetLength() - nIndex - 1); - csPath = m_TegraRcm->Favorites[i].Left(nIndex); + csFilename = fav.Right(fav.GetLength() - nIndex - 1); + csPath = fav.Left(nIndex); Item = csFilename + _T(" (") + csPath + _T(")"); - pListBox->AddString(_tcsdup(Item)); + } + else + { + Item = fav; + } + pListBox->AddString(_tcsdup(Item)); - wstring wcsPath(csPath); - string scsPath(wcsPath.begin(), wcsPath.end()); - m_TegraRcm->AppendLog("Add favorites to listbox"); - m_TegraRcm->AppendLog(scsPath); - } + wstring wcsPath(csPath); + string scsPath(wcsPath.begin(), wcsPath.end()); + m_TegraRcm->AppendLog("Add favorites to listbox"); + m_TegraRcm->AppendLog(scsPath); } CFont* pFont = GetFont(); diff --git a/TegraRcmGUI/TegraRcm.cpp b/TegraRcmGUI/TegraRcm.cpp index d0ef332..49ccec8 100644 --- a/TegraRcmGUI/TegraRcm.cpp +++ b/TegraRcmGUI/TegraRcm.cpp @@ -24,7 +24,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - +#include #include "stdafx.h" #include "TegraRcm.h" @@ -370,6 +370,27 @@ void TegraRcm::GetFavorites() string sfav(wfav.begin(), wfav.end()); AppendLog("Append new favorite : "); AppendLog(sfav); + + // For relative path + int nIndex = fav.ReverseFind(_T(':')); + if (nIndex <= 0) + { + // Get current directory + CString csPath; + TCHAR szPath[_MAX_PATH]; + VERIFY(::GetModuleFileName(AfxGetApp()->m_hInstance, szPath, _MAX_PATH)); + CString csPathf(szPath); + int nIndex = csPathf.ReverseFind(_T('\\')); + if (nIndex > 0) csPath = csPathf.Left(nIndex); + csPath.Append(_T("\\")); + csPath.Append(fav); + fav = csPath; + // Get absolute path + TCHAR buffer[4096] = TEXT(""); + GetFullPathName(fav, 4096, buffer, NULL); + fav = buffer; + } + Favorites.Add(fav); } } @@ -379,6 +400,28 @@ void TegraRcm::GetFavorites() } void TegraRcm::AddFavorite(CString value) { + // Get current directory + CString csPath; + TCHAR szPath[_MAX_PATH]; + VERIFY(::GetModuleFileName(AfxGetApp()->m_hInstance, szPath, _MAX_PATH)); + CString csPathf(szPath); + int nIndex = csPathf.ReverseFind(_T('\\')); + if (nIndex > 0) csPath = csPathf.Left(nIndex); + else csPath.Empty(); + + CT2A pPath(csPath.GetBuffer(csPath.GetLength())); + CT2A pvalue(value.GetBuffer(value.GetLength())); + char* rvalue = GetRelativeFilename(pPath, pvalue); + value = rvalue; + + /* + if (value.Find(csPath) != -1) + { + csPath.Append(_T("\\")); + value.Replace(csPath, _T("")); + } + */ + CString CoutLine(value + _T('\n')); CT2CA pszConvertedAnsiString(CoutLine); std::string outLine = pszConvertedAnsiString; @@ -792,3 +835,110 @@ TCHAR* TegraRcm::GetAbsolutePath(TCHAR* relative_path, DWORD dwFlags) return _T(""); */ } + + +// GetRelativeFilename(), by Rob Fisher. +// rfisher@iee.org +// http://come.to/robfisher +// defines +#define MAX_FILENAME_LEN 512 +// The number of characters at the start of an absolute filename. e.g. in DOS, +// absolute filenames start with "X:\" so this value should be 3, in UNIX they start +// with "\" so this value should be 1. +#define ABSOLUTE_NAME_START 3 +// set this to '\\' for DOS or '/' for UNIX +#define SLASH '\\' +// Given the absolute current directory and an absolute file name, returns a relative file name. +// For example, if the current directory is C:\foo\bar and the filename C:\foo\whee\text.txt is given, +// GetRelativeFilename will return ..\whee\text.txt. +char* TegraRcm::GetRelativeFilename(char *currentDirectory, char *absoluteFilename) +{ + // declarations - put here so this should work in a C compiler + int afMarker = 0, rfMarker = 0; + int cdLen = 0, afLen = 0; + int i = 0; + int levels = 0; + static char relativeFilename[MAX_FILENAME_LEN + 1]; + cdLen = strlen(currentDirectory); + afLen = strlen(absoluteFilename); + + // make sure the names are not too long or too short + if (cdLen > MAX_FILENAME_LEN || cdLen < ABSOLUTE_NAME_START + 1 || + afLen > MAX_FILENAME_LEN || afLen < ABSOLUTE_NAME_START + 1) + { + return NULL; + } + + // Handle DOS names that are on different drives: + if (currentDirectory[0] != absoluteFilename[0]) + { + // not on the same drive, so only absolute filename will do + strcpy(relativeFilename, absoluteFilename); + return relativeFilename; + } + // they are on the same drive, find out how much of the current directory + // is in the absolute filename + i = ABSOLUTE_NAME_START; + while (i < afLen && i < cdLen && currentDirectory[i] == absoluteFilename[i]) + { + i++; + } + if (i == cdLen && (absoluteFilename[i] == SLASH || absoluteFilename[i - 1] == SLASH)) + { + // the whole current directory name is in the file name, + // so we just trim off the current directory name to get the + // current file name. + if (absoluteFilename[i] == SLASH) + { + // a directory name might have a trailing slash but a relative + // file name should not have a leading one... + i++; + } + strcpy(relativeFilename, &absoluteFilename[i]); + return relativeFilename; + } + // The file is not in a child directory of the current directory, so we + // need to step back the appropriate number of parent directories by + // using "..\"s. First find out how many levels deeper we are than the + // common directory + afMarker = i; + levels = 1; + // count the number of directory levels we have to go up to get to the + // common directory + while (i < cdLen) + { + i++; + if (currentDirectory[i] == SLASH) + { + // make sure it's not a trailing slash + i++; + if (currentDirectory[i] != '\0') + { + levels++; + } + } + } + // move the absolute filename marker back to the start of the directory name + // that it has stopped in. + while (afMarker > 0 && absoluteFilename[afMarker - 1] != SLASH) + { + afMarker--; + } + // check that the result will not be too long + if (levels * 3 + afLen - afMarker > MAX_FILENAME_LEN) + { + return NULL; + } + + // add the appropriate number of "..\"s. + rfMarker = 0; + for (i = 0; i < levels; i++) + { + relativeFilename[rfMarker++] = '.'; + relativeFilename[rfMarker++] = '.'; + relativeFilename[rfMarker++] = SLASH; + } + // copy the rest of the filename into the result string + strcpy(&relativeFilename[rfMarker], &absoluteFilename[afMarker]); + return relativeFilename; +} \ No newline at end of file diff --git a/TegraRcmGUI/TegraRcm.h b/TegraRcmGUI/TegraRcm.h index 9a2a70f..b8e14eb 100644 --- a/TegraRcmGUI/TegraRcm.h +++ b/TegraRcmGUI/TegraRcm.h @@ -40,7 +40,8 @@ public: void BitmapDisplay(int IMG); void LookUp(); int Smasher(TCHAR args[]); - + char* GetRelativeFilename(char *currentDirectory, char *absoluteFilename); + BOOL CmdShow = TRUE; // Notify Icon NOTIFYICONDATA m_NID; diff --git a/TegraRcmGUI/TegraRcmGUI.vcxproj b/TegraRcmGUI/TegraRcmGUI.vcxproj index 1f824fe..28ca1d5 100644 --- a/TegraRcmGUI/TegraRcmGUI.vcxproj +++ b/TegraRcmGUI/TegraRcmGUI.vcxproj @@ -90,7 +90,7 @@ Use Level3 Disabled - WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + WIN32;_WINDOWS;_CRT_SECURE_NO_WARNINGS;_DEBUG;%(PreprocessorDefinitions) true $(LIBUSBK_DIR)\includes\;%(AdditionalIncludeDirectories) @@ -145,7 +145,7 @@ MaxSpeed true true - WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + WIN32;_WINDOWS;_CRT_SECURE_NO_WARNINGS;NDEBUG;%(PreprocessorDefinitions) true $(LIBUSBK_DIR)\includes\;%(AdditionalIncludeDirectories)