/*++ Copyright (c) 1996 Microsoft Corporation Module Name : useropt.h Abstract: Global user options class and help class implementations. This class can only instantiate by CLinkCheckerMgr. Therefore, a single instance of this class will live inside CLinkCheckerMgr. You can access the this instance by calling GetLinkCheckMgr().GetUserOptions(). Author: Michael Cheuk (mcheuk) Project: Link Checker Revision History: --*/ #include "stdafx.h" #include "useropt.h" #include "lcmgr.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif //------------------------------------------------------------------ // CVirtualDirInfo // void CVirtualDirInfo::PreProcessAlias( ) /*++ Routine Description: Preprocess the current virtual directory alias. The alias will be in the form of / or /dir/ Arguments: N/A Return Value: N/A --*/ { // Change everything to lower case m_strAlias.MakeLower(); // Change '\' to '/' CLinkCheckerMgr::ChangeBackSlash(m_strAlias); // Make sure strAlias is in the form of / or /dir/ if( m_strAlias.GetAt( m_strAlias.GetLength() - 1 ) != _TCHAR('/') ) { m_strAlias += _TCHAR('/'); } } // CVirtualDirInfo::PreProcessAlias void CVirtualDirInfo::PreProcessPath( ) /*++ Routine Description: Preprocess the current virtual directory path. The alias will be in the form of c:\ or c:\dir\ Arguments: N/A Return Value: N/A --*/ { // Change everything to lower case m_strPath.MakeLower(); // Make sure strPath is in the form of \ or \dir\ if( m_strPath.GetAt( m_strPath.GetLength() - 1 ) != _TCHAR('\\') ) { m_strPath += _TCHAR('\\'); } } // CVirtualDirInfo::PreProcessPath //------------------------------------------------------------------ // CBrowserInfoList // POSITION CBrowserInfoList::GetHeadSelectedPosition( ) const /*++ Routine Description: Get the first selected browser. It works like GetHeadPosition() Arguments: N/A Return Value: POSITION - A POSITION value that can be used for iteration or object pointer retrieval; NULL if the list is empty --*/ { POSITION Pos = GetHeadPosition(); while(Pos) { POSITION PosCurrent = Pos; if(GetNext(Pos).IsSelected()) { return PosCurrent; break; } } return NULL; } // CBrowserInfoList::GetHeadSelectedPosition CBrowserInfo& CBrowserInfoList::GetNextSelected( POSITION& Pos ) /*++ Routine Description: Get next selected browser. It works like GetNext() Arguments: Pos - A reference to a POSITION value returned by a previous GetHeadSelectedPosition, GetNextSelected Return Value: CBrowserInfo& - returns a reference to an element of the list --*/ { CBrowserInfo& Info = GetNext(Pos); while(Pos) { POSITION PosCurrent = Pos; if(GetNext(Pos).IsSelected()) { Pos = PosCurrent; break; } } return Info; } // CBrowserInfoList::GetNextSelected //------------------------------------------------------------------ // CLanguageInfoList // POSITION CLanguageInfoList::GetHeadSelectedPosition( ) const /*++ Routine Description: Get the first selected browser. It works like GetHeadPosition() Arguments: N/A Return Value: POSITION - A POSITION value that can be used for iteration or object pointer retrieval; NULL if the list is empty --*/ { POSITION Pos = GetHeadPosition(); while(Pos) { POSITION PosCurrent = Pos; if(GetNext(Pos).IsSelected()) { return PosCurrent; break; } } return NULL; } // CLanguageInfo::GetHeadSelectedPosition CLanguageInfo& CLanguageInfoList::GetNextSelected( POSITION& Pos ) /*++ Routine Description: Get next selected language. It works like GetNext() Arguments: Pos - A reference to a POSITION value returned by a previous GetNext, GetHeadPosition, GetNextSelected, or other member function call Return Value: CLanguageInfo& - returns a reference to an element of the list --*/ { CLanguageInfo& Info = GetNext(Pos); while(Pos) { POSITION PosCurrent = Pos; if(GetNext(Pos).IsSelected()) { Pos = PosCurrent; break; } } return Info; } // CLanguageInfoList::GetNextSelected //------------------------------------------------------------------ // CUserOptions // void CUserOptions::AddDirectory( const CVirtualDirInfo& Info ) /*++ Routine Description: Add this virtual directory to the link list. Arguments: Info - virtual directory infomation to add Return Value: N/A --*/ { // Finally, add it to the array try { m_VirtualDirInfoList.AddTail(Info); } catch(CMemoryException* pEx) { pEx->Delete(); } } // CUserOptions::AddDirectory void CUserOptions::AddURL( LPCTSTR lpszURL ) /*++ Routine Description: Add this URL to the link list. Arguments: lpszURL - URL to add Return Value: N/A --*/ { CString strURL(lpszURL); // Change '\' to '/' CLinkCheckerMgr::ChangeBackSlash(strURL); try { m_strURLList.AddTail(strURL); } catch(CMemoryException* pEx) { pEx->Delete(); } } // CUserOptions::AddURL void CUserOptions::AddAvailableBrowser( const CBrowserInfo& Info ) /*++ Routine Description: Add this browser information to the available list. Arguments: Info - Browser information to add Return Value: N/A --*/ { try { m_BrowserInfoList.AddTail(Info); } catch(CMemoryException* pEx) { pEx->Delete(); } } // CUserOptions::AddAvailableBrowser void CUserOptions::AddAvailableLanguage( const CLanguageInfo& Info ) /*++ Routine Description: Add this language information to the available list. Arguments: Info - Language information to add Return Value: N/A --*/ { try { m_LanguageInfoList.AddTail(Info); } catch(CMemoryException* pEx) { pEx->Delete(); } } // CUserOptions::AddAvailableLanguage void CUserOptions::SetOptions( BOOL fCheckLocalLinks, BOOL fCheckRemoteLinks, BOOL fLogToFile, const CString& strLogFilename, BOOL fLogToEventMgr ) /*++ Routine Description: Set the user options in the main dialog Arguments: N/A Return Value: N/A --*/ { m_fCheckLocalLinks = fCheckLocalLinks; m_fCheckRemoteLinks = fCheckRemoteLinks; m_fLogToFile= fLogToFile; m_strLogFilename = strLogFilename; m_fLogToEventMgr = fLogToEventMgr; } // CUserOptions::SetOptions void CUserOptions::SetAthenication( const CString& strNTUsername, const CString& strNTPassword, const CString& strBasicUsername, const CString& strBasicPassword ) /*++ Routine Description: Set NTLM & HTTP basic athenications. Arguments: N/A Return Value: N/A --*/ { m_strNTUsername = strNTUsername; m_strNTPassword = strNTPassword; m_strBasicUsername = strBasicUsername; m_strBasicPassword = strBasicPassword; } // CUserOptions::SetAthenication // Get the hostname const CString& CUserOptions::GetHostName( ) /*++ Routine Description: Get the hostname. Arguments: N/A Return Value: N/A --*/ { // If the hostname does not exists, it means the user pass in // a list of URL to link checker. (Server nane is not required for // this case.) Now, we can get the hostname from the URL if(m_strHostName.IsEmpty() && m_strURLList.GetCount() > 0) { // Set up the current hostname string LPTSTR lpszHostName = m_strHostName.GetBuffer(INTERNET_MAX_HOST_NAME_LENGTH); URL_COMPONENTS urlcomp; memset(&urlcomp, 0, sizeof(urlcomp)); urlcomp.dwStructSize = sizeof(urlcomp); urlcomp.lpszHostName = lpszHostName; urlcomp.dwHostNameLength = INTERNET_MAX_HOST_NAME_LENGTH; // Crack it VERIFY(CWininet::InternetCrackUrlA( m_strURLList.GetHead(), m_strURLList.GetHead().GetLength(), NULL, &urlcomp)); m_strHostName.ReleaseBuffer(); } return m_strHostName; } // CUserOptions::GetHostName void CUserOptions::PreProcessServerName( ) /*++ Routine Description: Preprocess the server name such that for server "\\hostname" - GetServerName() return \\hostname - GetHostName() return hostname Arguments: N/A Return Value: N/A --*/ { // Change everything to lower case m_strHostName.MakeLower(); // Change '\' to '/' CLinkCheckerMgr::ChangeBackSlash(m_strHostName); // Make sure m_strHostName is not in front of localhost const CString strBackSlash(_T("//")); if( m_strHostName.Find(strBackSlash) == 0 ) { m_strHostName = m_strHostName.Mid(strBackSlash.GetLength()); } } // CUserOptions::PreProcessServerName